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
|
@@ -1,6 +1,111 @@
|
|
|
1
|
+
import { debug } from '../debug/log.js';
|
|
2
|
+
import { resolveCurrentInstance } from '../instance/current.js';
|
|
3
|
+
import { resolveDaemonEndpoint, type DaemonEndpoint } from '../nexus/daemon-endpoint.js';
|
|
4
|
+
|
|
5
|
+
export type TuiDaemonLink =
|
|
6
|
+
| { readonly status: 'checking' }
|
|
7
|
+
| { readonly status: 'connected'; readonly address: string }
|
|
8
|
+
| { readonly status: 'absent' | 'unhealthy'; readonly startCommand: string }
|
|
9
|
+
| { readonly status: 'error'; readonly stage: 'endpoint' | 'health' | 'identity' };
|
|
10
|
+
|
|
11
|
+
export interface TuiDaemonLinkDeps {
|
|
12
|
+
readonly endpoint?: () => Pick<DaemonEndpoint, 'baseUrl' | 'healthUrl' | 'source'> | null;
|
|
13
|
+
readonly probe?: (url: string, init: RequestInit) => Promise<Response>;
|
|
14
|
+
readonly universe?: () => 'test' | 'prod';
|
|
15
|
+
/** An explicitly chosen test root (`--test=<root>` / parent stamp); bare `--test` cannot name it. */
|
|
16
|
+
readonly testRoot?: () => string | undefined;
|
|
17
|
+
readonly observe?: (data: {
|
|
18
|
+
status: TuiDaemonLink['status'];
|
|
19
|
+
stage: 'endpoint' | 'health' | 'identity';
|
|
20
|
+
universe: 'test' | 'prod' | 'unknown';
|
|
21
|
+
source: 'registry' | 'lifecycle' | 'none';
|
|
22
|
+
}) => void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// C0/C1 controls incl. ESC (ANSI sequences), newline and DEL.
|
|
26
|
+
const CONTROL_CHARS = /[\u0000-\u001f\u007f-\u009f]/;
|
|
27
|
+
|
|
28
|
+
function shellQuote(value: string): string {
|
|
29
|
+
return /^[A-Za-z0-9_./:=@%+-]+$/.test(value) ? value : `'${value.replaceAll("'", `'\\''`)}'`;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Probe the write target in this universe only; never use a watch/production fallback. */
|
|
33
|
+
export async function resolveTuiDaemonLink(deps: TuiDaemonLinkDeps = {}): Promise<TuiDaemonLink> {
|
|
34
|
+
const universe = deps.universe ?? (() => resolveCurrentInstance().kind === 'test' ? 'test' : 'prod');
|
|
35
|
+
const observe = deps.observe ?? ((data) => debug.log('dashboard.tui-daemon-link', 'resolved', data));
|
|
36
|
+
let kind: 'test' | 'prod' | 'unknown' = 'unknown';
|
|
37
|
+
let source: 'registry' | 'lifecycle' | 'none' = 'none';
|
|
38
|
+
const finish = (result: TuiDaemonLink, stage: 'endpoint' | 'health' | 'identity'): TuiDaemonLink => {
|
|
39
|
+
try { observe({ status: result.status, stage, universe: kind, source }); } catch { /* observation is fail-soft */ }
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
try {
|
|
43
|
+
kind = universe();
|
|
44
|
+
} catch {
|
|
45
|
+
return finish({ status: 'error', stage: 'identity' }, 'identity');
|
|
46
|
+
}
|
|
47
|
+
let explicitRoot: string | undefined;
|
|
48
|
+
if (kind === 'test') {
|
|
49
|
+
try {
|
|
50
|
+
// An injected identity comes with its own root (or none); only the real identity reads the real root.
|
|
51
|
+
explicitRoot = (deps.testRoot ?? (deps.universe ? () => undefined : () => {
|
|
52
|
+
const resolution = resolveCurrentInstance();
|
|
53
|
+
return resolution.layer === 'explicit-flag' || resolution.layer === 'parent-stamp' ? resolution.root : undefined;
|
|
54
|
+
}))();
|
|
55
|
+
} catch {
|
|
56
|
+
return finish({ status: 'error', stage: 'identity' }, 'identity');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// The start command must name *this* universe: a custom test root is passed as one literal shell argument.
|
|
60
|
+
// A root with control characters cannot be shown safely (it would rewrite the screen): name no command at all.
|
|
61
|
+
const startCommand = kind === 'test'
|
|
62
|
+
? explicitRoot ? (CONTROL_CHARS.test(explicitRoot) ? '' : `elanous --test=${shellQuote(explicitRoot)} nexus run --hmr`) : 'elanous --test nexus run --hmr'
|
|
63
|
+
: 'elanous nexus run --hmr';
|
|
64
|
+
let endpoint: ReturnType<NonNullable<TuiDaemonLinkDeps['endpoint']>>;
|
|
65
|
+
try {
|
|
66
|
+
endpoint = (deps.endpoint ?? (() => resolveDaemonEndpoint({ purpose: 'write' })))();
|
|
67
|
+
if (!endpoint) return finish({ status: 'absent', startCommand }, 'endpoint');
|
|
68
|
+
source = endpoint.source;
|
|
69
|
+
} catch {
|
|
70
|
+
return finish({ status: 'error', stage: 'endpoint' }, 'endpoint');
|
|
71
|
+
}
|
|
72
|
+
let address: string;
|
|
73
|
+
let healthAddress: string;
|
|
74
|
+
try {
|
|
75
|
+
const url = new URL(endpoint.baseUrl);
|
|
76
|
+
const healthUrl = new URL(endpoint.healthUrl);
|
|
77
|
+
if (!['http:', 'https:'].includes(url.protocol) || !url.hostname || url.username || url.password
|
|
78
|
+
|| url.pathname !== '/' || url.search || url.hash || healthUrl.origin !== url.origin
|
|
79
|
+
|| healthUrl.username || healthUrl.password || healthUrl.pathname !== '/v1/health'
|
|
80
|
+
|| healthUrl.search || healthUrl.hash) {
|
|
81
|
+
return finish({ status: 'error', stage: 'endpoint' }, 'endpoint');
|
|
82
|
+
}
|
|
83
|
+
address = url.origin;
|
|
84
|
+
healthAddress = `${address}/v1/health`;
|
|
85
|
+
} catch {
|
|
86
|
+
return finish({ status: 'error', stage: 'endpoint' }, 'endpoint');
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
const response = await (deps.probe ?? fetch)(healthAddress, { signal: AbortSignal.timeout(1500) });
|
|
90
|
+
if (!response.ok) return finish({ status: 'unhealthy', startCommand }, 'health');
|
|
91
|
+
const body: unknown = await response.json();
|
|
92
|
+
if (!body || typeof body !== 'object' || !('ok' in body) || body.ok !== true) {
|
|
93
|
+
return finish({ status: 'unhealthy', startCommand }, 'health');
|
|
94
|
+
}
|
|
95
|
+
// «Connected» is a claim about *this* universe: the daemon must state its universe and it must match.
|
|
96
|
+
if (!('testUniverse' in body) || typeof body.testUniverse !== 'boolean' || body.testUniverse !== (kind === 'test')) {
|
|
97
|
+
return finish({ status: 'error', stage: 'identity' }, 'identity');
|
|
98
|
+
}
|
|
99
|
+
return finish({ status: 'connected', address }, 'health');
|
|
100
|
+
} catch {
|
|
101
|
+
return finish({ status: 'error', stage: 'health' }, 'health');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
1
105
|
export interface FirstScreenBandInput {
|
|
2
106
|
readonly width: number;
|
|
3
107
|
readonly daemon: boolean;
|
|
108
|
+
readonly link?: TuiDaemonLink;
|
|
4
109
|
readonly pwa?: {
|
|
5
110
|
readonly tailnet?: string | null;
|
|
6
111
|
readonly lan?: string | null;
|
|
@@ -8,6 +113,31 @@ export interface FirstScreenBandInput {
|
|
|
8
113
|
};
|
|
9
114
|
}
|
|
10
115
|
|
|
116
|
+
// The link row contains Hangul (two terminal cells per syllable); count display cells, not UTF-16 units.
|
|
117
|
+
function cellWidth(text: string): number {
|
|
118
|
+
let width = 0;
|
|
119
|
+
for (const char of text) {
|
|
120
|
+
const point = char.codePointAt(0)!;
|
|
121
|
+
if (point >= 0x1100 && (point <= 0x115f || point >= 0x2329 && point <= 0x232a
|
|
122
|
+
|| point >= 0x2e80 && point <= 0xa4cf || point >= 0xac00 && point <= 0xd7a3
|
|
123
|
+
|| point >= 0xf900 && point <= 0xfaff || point >= 0xfe10 && point <= 0xfe6f
|
|
124
|
+
|| point >= 0xff01 && point <= 0xff60 || point >= 0xffe0 && point <= 0xffe6
|
|
125
|
+
|| point >= 0x1f000 && point <= 0x1ffff)) width += 2;
|
|
126
|
+
else if (point >= 0x300 && point <= 0x36f || point >= 0xfe00 && point <= 0xfe0f) continue;
|
|
127
|
+
else width++;
|
|
128
|
+
}
|
|
129
|
+
return width;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function fitCells(text: string, limit: number): string {
|
|
133
|
+
let result = '';
|
|
134
|
+
for (const char of text) {
|
|
135
|
+
if (cellWidth(result + char) > limit) break;
|
|
136
|
+
result += char;
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
|
|
11
141
|
/** A startup transcript band; never includes credentials or a partial address. */
|
|
12
142
|
export function buildFirstScreenBand(input: FirstScreenBandInput): string[] {
|
|
13
143
|
const width = Number.isFinite(input.width) ? Math.max(0, Math.floor(input.width)) : 0;
|
|
@@ -27,8 +157,28 @@ export function buildFirstScreenBand(input: FirstScreenBandInput): string[] {
|
|
|
27
157
|
const fallback = input.pwa === undefined ? 'PWA: not checked' : 'PWA: unavailable';
|
|
28
158
|
const addressLine = address ? `PWA: ${address}` : fallback;
|
|
29
159
|
|
|
160
|
+
const daemonLine = (() => {
|
|
161
|
+
const link = input.link;
|
|
162
|
+
if (!link) return `elanous | daemon: ${input.daemon ? 'online' : 'offline'}`;
|
|
163
|
+
if (link.status === 'checking') return 'elanous | 데몬: 확인 중';
|
|
164
|
+
if (link.status === 'connected') {
|
|
165
|
+
let address: string;
|
|
166
|
+
try {
|
|
167
|
+
const url = new URL(link.address);
|
|
168
|
+
address = ['http:', 'https:'].includes(url.protocol) && url.hostname ? url.origin : '';
|
|
169
|
+
} catch { address = ''; }
|
|
170
|
+
const line = `elanous | 데몬: 연결됨${address ? ` (${address})` : ''}`;
|
|
171
|
+
return cellWidth(line) <= width ? line : 'elanous | 데몬: 연결됨';
|
|
172
|
+
}
|
|
173
|
+
if (link.status === 'error') return `elanous | 데몬: ${link.stage} 조회 오류`;
|
|
174
|
+
const bare = `elanous | 데몬: ${link.status === 'absent' ? '없음' : '응답 없음'}`;
|
|
175
|
+
if (!link.startCommand || CONTROL_CHARS.test(link.startCommand)) return bare;
|
|
176
|
+
const line = `${bare} · 시작: ${link.startCommand}`;
|
|
177
|
+
return cellWidth(line) <= width ? line : bare;
|
|
178
|
+
})();
|
|
179
|
+
|
|
30
180
|
return [
|
|
31
|
-
|
|
181
|
+
input.link ? fitCells(daemonLine, width) : fit(daemonLine),
|
|
32
182
|
addressLine.length <= width ? addressLine : fit(address ? 'PWA: address available' : fallback),
|
|
33
183
|
fit('Type a message to begin | /help for commands'),
|
|
34
184
|
];
|
package/src/dashboard/index.ts
CHANGED
|
@@ -6,285 +6,31 @@
|
|
|
6
6
|
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
7
7
|
import { join } from 'path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
|
-
import { createStaleInstallCheck, readCurrentInstalledCommit, readDashboardBootCommit, STALE_INSTALL_CHECK_INTERVAL_MS, versionedDashboardInstallDir } from './stale-install-check.js';
|
|
9
|
+
import { createStaleInstallCheck, formatStaleInstallNotice, readCurrentInstalledCommit, readDashboardBootCommit, STALE_INSTALL_CHECK_INTERVAL_MS, versionedDashboardInstallDir } from './stale-install-check.js';
|
|
10
10
|
import { spawn, spawnSync } from 'node:child_process';
|
|
11
11
|
import { $ } from 'bun';
|
|
12
12
|
import { LOCAL_SKILLS_DIR, SERVICE_NAMES, DATA_DIR, OBSIDIAN_VAULT } from '../config.js';
|
|
13
13
|
import { dispatchDashboardSessionRuntimeTool } from './session-runtime-dispatch.js';
|
|
14
|
-
import { buildAdRunSetup } from '../ad-pipeline/ad-run-setup.js';
|
|
15
14
|
import { nextChatScrollOffset } from '../chat/log-scroll-key.js';
|
|
16
|
-
import type { CommandRunner } from '../ad-pipeline/higgsfield-backend.js';
|
|
17
|
-
import type { ShootRunOptions } from '../ad-pipeline/shoot-run.js';
|
|
18
|
-
import type { QcThresholds } from '../ad-pipeline/qc.js';
|
|
19
|
-
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
20
15
|
import { suggestProjectForFolder } from '../project/project-store.js';
|
|
21
16
|
import { createProjectSuggester } from '../project/project-suggestion.js';
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
'captionFontPath',
|
|
40
|
-
'musicBedPath',
|
|
41
|
-
'qcThresholds',
|
|
42
|
-
'voiceover',
|
|
43
|
-
'soundtrack',
|
|
44
|
-
'referenceAssets',
|
|
45
|
-
'shootRunOptions',
|
|
46
|
-
'ground',
|
|
47
|
-
'invariants',
|
|
48
|
-
] as const;
|
|
49
|
-
|
|
50
|
-
export interface DashboardAdAssetPreset {
|
|
51
|
-
readonly captionFontPath?: string;
|
|
52
|
-
readonly musicBedPath?: string;
|
|
53
|
-
readonly referenceAssets?: Readonly<Record<string, string[]>>;
|
|
54
|
-
readonly shootRunOptions?: ShootRunOptions;
|
|
55
|
-
readonly qcThresholds?: QcThresholds;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/** Operator-owned, instance-scoped optional asset preset; never a repository asset path. */
|
|
59
|
-
export function dashboardAdAssetPresetPath(stateRoot = elanousStateRoot()): string {
|
|
60
|
-
return join(stateRoot, 'ad-assets.json');
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** Reads optional operator-owned asset paths without inventing local defaults. */
|
|
64
|
-
export function loadDashboardAdAssetPreset(path: string): DashboardAdAssetPreset {
|
|
65
|
-
let raw: string;
|
|
66
|
-
try {
|
|
67
|
-
raw = readFileSync(path, 'utf8');
|
|
68
|
-
} catch (error) {
|
|
69
|
-
if ((error as NodeJS.ErrnoException).code === 'ENOENT') return {};
|
|
70
|
-
throw new Error(`dashboard ad asset preset unreadable at ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
let parsed: unknown;
|
|
74
|
-
try {
|
|
75
|
-
parsed = JSON.parse(raw);
|
|
76
|
-
} catch (error) {
|
|
77
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
78
|
-
}
|
|
79
|
-
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
80
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: expected an object`);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const preset = parsed as Record<string, unknown>;
|
|
84
|
-
for (const key of ['captionFontPath', 'musicBedPath'] as const) {
|
|
85
|
-
if (preset[key] !== undefined && typeof preset[key] !== 'string') {
|
|
86
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: ${key} must be a string`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
if (preset.referenceAssets !== undefined && (
|
|
90
|
-
preset.referenceAssets === null
|
|
91
|
-
|| typeof preset.referenceAssets !== 'object'
|
|
92
|
-
|| Array.isArray(preset.referenceAssets)
|
|
93
|
-
|| Object.values(preset.referenceAssets).some((value) => !Array.isArray(value) || value.some((entry) => typeof entry !== 'string'))
|
|
94
|
-
)) {
|
|
95
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: referenceAssets must be a record of string arrays`);
|
|
96
|
-
}
|
|
97
|
-
if (preset.shootRunOptions !== undefined && (
|
|
98
|
-
preset.shootRunOptions === null
|
|
99
|
-
|| typeof preset.shootRunOptions !== 'object'
|
|
100
|
-
|| Array.isArray(preset.shootRunOptions)
|
|
101
|
-
)) {
|
|
102
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: shootRunOptions must be an object`);
|
|
103
|
-
}
|
|
104
|
-
const shootRunOptions = preset.shootRunOptions as Record<string, unknown> | undefined;
|
|
105
|
-
for (const key of ['pollIntervalMs', 'maxPollsPerJob', 'maxPollElapsedMs', 'submitStaggerMs', 'submitRetries'] as const) {
|
|
106
|
-
if (shootRunOptions?.[key] !== undefined && (typeof shootRunOptions[key] !== 'number' || !Number.isFinite(shootRunOptions[key]))) {
|
|
107
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: shootRunOptions.${key} must be a finite number`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
if (preset.qcThresholds !== undefined && (
|
|
111
|
-
preset.qcThresholds === null
|
|
112
|
-
|| typeof preset.qcThresholds !== 'object'
|
|
113
|
-
|| Array.isArray(preset.qcThresholds)
|
|
114
|
-
)) {
|
|
115
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: qcThresholds must be an object`);
|
|
116
|
-
}
|
|
117
|
-
const qcThresholds = preset.qcThresholds as Record<string, unknown> | undefined;
|
|
118
|
-
for (const key of ['dialogueLufsTolerance', 'colorDistance', 'frameDiffVariance'] as const) {
|
|
119
|
-
if (qcThresholds?.[key] !== undefined && (typeof qcThresholds[key] !== 'number' || !Number.isFinite(qcThresholds[key]))) {
|
|
120
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: qcThresholds.${key} must be a finite number`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
if (qcThresholds?.durationRanges !== undefined && (
|
|
124
|
-
qcThresholds.durationRanges === null
|
|
125
|
-
|| typeof qcThresholds.durationRanges !== 'object'
|
|
126
|
-
|| Array.isArray(qcThresholds.durationRanges)
|
|
127
|
-
)) {
|
|
128
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: qcThresholds.durationRanges must be an object`);
|
|
129
|
-
}
|
|
130
|
-
const durationRanges = qcThresholds?.durationRanges as Record<string, unknown> | undefined;
|
|
131
|
-
for (const scope of ['cut', 'master'] as const) {
|
|
132
|
-
if (durationRanges?.[scope] !== undefined && (
|
|
133
|
-
durationRanges[scope] === null
|
|
134
|
-
|| typeof durationRanges[scope] !== 'object'
|
|
135
|
-
|| Array.isArray(durationRanges[scope])
|
|
136
|
-
)) {
|
|
137
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: qcThresholds.durationRanges.${scope} must be an object`);
|
|
138
|
-
}
|
|
139
|
-
const range = durationRanges?.[scope] as Record<string, unknown> | undefined;
|
|
140
|
-
if (range !== undefined) {
|
|
141
|
-
const minimumSeconds = range.minimumSeconds;
|
|
142
|
-
const maximumSeconds = range.maximumSeconds;
|
|
143
|
-
if (typeof minimumSeconds !== 'number' || !Number.isFinite(minimumSeconds)) {
|
|
144
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: qcThresholds.durationRanges.${scope}.minimumSeconds must be a finite number`);
|
|
145
|
-
}
|
|
146
|
-
if (typeof maximumSeconds !== 'number' || !Number.isFinite(maximumSeconds)) {
|
|
147
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: qcThresholds.durationRanges.${scope}.maximumSeconds must be a finite number`);
|
|
148
|
-
}
|
|
149
|
-
if (minimumSeconds > maximumSeconds) {
|
|
150
|
-
throw new Error(`dashboard ad asset preset malformed at ${path}: qcThresholds.durationRanges.${scope}.minimumSeconds must be less than or equal to maximumSeconds`);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return {
|
|
155
|
-
...(typeof preset.captionFontPath === 'string' ? { captionFontPath: preset.captionFontPath } : {}),
|
|
156
|
-
...(typeof preset.musicBedPath === 'string' ? { musicBedPath: preset.musicBedPath } : {}),
|
|
157
|
-
...(preset.referenceAssets === undefined ? {} : { referenceAssets: preset.referenceAssets as Record<string, string[]> }),
|
|
158
|
-
...(shootRunOptions === undefined ? {} : { shootRunOptions: shootRunOptions as ShootRunOptions }),
|
|
159
|
-
...(qcThresholds === undefined ? {} : { qcThresholds: qcThresholds as QcThresholds }),
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export const dashboardAdCommandRunner: CommandRunner = {
|
|
164
|
-
async run(argv, options) {
|
|
165
|
-
const process = Bun.spawn([...argv], {
|
|
166
|
-
stdout: 'pipe',
|
|
167
|
-
stderr: 'pipe',
|
|
168
|
-
...(options?.timeoutMs ? { timeout: options.timeoutMs } : {}),
|
|
169
|
-
});
|
|
170
|
-
const [raw, stderr, exitCode] = await Promise.all([
|
|
171
|
-
new Response(process.stdout).bytes(),
|
|
172
|
-
new Response(process.stderr).text(),
|
|
173
|
-
process.exited,
|
|
174
|
-
]);
|
|
175
|
-
return { stdout: new TextDecoder().decode(raw), stderr, exitCode, raw };
|
|
176
|
-
},
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
export function createDashboardAdRunSetupFactory(input: {
|
|
180
|
-
readonly home: string;
|
|
181
|
-
readonly date: string;
|
|
182
|
-
readonly contractsJson: string;
|
|
183
|
-
readonly runner: CommandRunner;
|
|
184
|
-
readonly assetPresetPath?: string;
|
|
185
|
-
}): (allowSpend: boolean) => ReturnType<typeof buildAdRunSetup> {
|
|
186
|
-
let runSequence = 0;
|
|
187
|
-
let activeRunSlug: string | undefined;
|
|
188
|
-
|
|
189
|
-
return (allowSpend) => {
|
|
190
|
-
if (!allowSpend) {
|
|
191
|
-
const runStart = new Date();
|
|
192
|
-
const time = [runStart.getHours(), runStart.getMinutes(), runStart.getSeconds()]
|
|
193
|
-
.map((part) => String(part).padStart(2, '0'))
|
|
194
|
-
.join('');
|
|
195
|
-
activeRunSlug = `dashboard-ad-${time}-${++runSequence}`;
|
|
196
|
-
}
|
|
197
|
-
const slug = activeRunSlug ?? (() => {
|
|
198
|
-
const runStart = new Date();
|
|
199
|
-
const time = [runStart.getHours(), runStart.getMinutes(), runStart.getSeconds()]
|
|
200
|
-
.map((part) => String(part).padStart(2, '0'))
|
|
201
|
-
.join('');
|
|
202
|
-
return `dashboard-ad-${time}-${++runSequence}`;
|
|
203
|
-
})();
|
|
204
|
-
const assetPreset = input.assetPresetPath === undefined ? {} : loadDashboardAdAssetPreset(input.assetPresetPath);
|
|
205
|
-
let setup = buildAdRunSetup({
|
|
206
|
-
home: input.home,
|
|
207
|
-
slug,
|
|
208
|
-
date: input.date,
|
|
209
|
-
version: 1,
|
|
210
|
-
aspect: '9x16',
|
|
211
|
-
contractsJson: input.contractsJson,
|
|
212
|
-
runner: input.runner,
|
|
213
|
-
...assetPreset,
|
|
214
|
-
referenceAssets: assetPreset.referenceAssets ?? {},
|
|
215
|
-
shootRunOptions: { ...dashboardDefaultShootRunOptions, ...assetPreset.shootRunOptions },
|
|
216
|
-
soundtrack: input.runner,
|
|
217
|
-
voiceover: { runner: input.runner, lines: [] },
|
|
218
|
-
allowSpend,
|
|
219
|
-
});
|
|
220
|
-
if (!('error' in setup) && setup.production) {
|
|
221
|
-
const production = {
|
|
222
|
-
...setup.production,
|
|
223
|
-
assemblyMaterials: { options: { workDir: setup.workDir, outputName: setup.outputName } },
|
|
224
|
-
};
|
|
225
|
-
setup = {
|
|
226
|
-
...setup,
|
|
227
|
-
production,
|
|
228
|
-
missingProductionInputs: dashboardOptionalProductionInputs.filter((key) => production[key] === undefined),
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
return setup;
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/** Builds the /ad runtime bindings used by showDashboard for each invocation's spend intent. */
|
|
236
|
-
export function createDashboardAdRunSetupBindings(
|
|
237
|
-
buildDashboardAdRunSetup: ReturnType<typeof createDashboardAdRunSetupFactory>,
|
|
238
|
-
) {
|
|
239
|
-
let adRunSetup: ReturnType<typeof buildAdRunSetup> | undefined;
|
|
240
|
-
let outputSetupError: string | undefined;
|
|
241
|
-
try {
|
|
242
|
-
adRunSetup = buildDashboardAdRunSetup(false);
|
|
243
|
-
outputSetupError = 'error' in adRunSetup ? adRunSetup.error : undefined;
|
|
244
|
-
} catch (error) {
|
|
245
|
-
outputSetupError = error instanceof Error ? error.message : String(error);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
return {
|
|
249
|
-
production: adRunSetup && !('error' in adRunSetup) ? adRunSetup.production : undefined,
|
|
250
|
-
productionForSpend: (allowSpend: boolean) => {
|
|
251
|
-
try {
|
|
252
|
-
const setup = buildDashboardAdRunSetup(allowSpend);
|
|
253
|
-
if ('error' in setup) {
|
|
254
|
-
outputSetupError = setup.error;
|
|
255
|
-
return undefined;
|
|
256
|
-
}
|
|
257
|
-
return setup.production;
|
|
258
|
-
} catch (error) {
|
|
259
|
-
outputSetupError = error instanceof Error ? error.message : String(error);
|
|
260
|
-
return undefined;
|
|
261
|
-
}
|
|
262
|
-
},
|
|
263
|
-
missingProductionInputs: adRunSetup && !('error' in adRunSetup) ? adRunSetup.missingProductionInputs : undefined,
|
|
264
|
-
get outputSetupError() {
|
|
265
|
-
return outputSetupError;
|
|
266
|
-
},
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/** Connects the dashboard's setup state to the actual /ad runtime. */
|
|
271
|
-
export function createDashboardAdSlashRuntime(
|
|
272
|
-
input: Omit<DashboardAdSlashRuntimeDeps, 'production' | 'productionForSpend' | 'missingProductionInputs' | 'outputSetupError'> & {
|
|
273
|
-
readonly adRunSetupBindings?: ReturnType<typeof createDashboardAdRunSetupBindings>;
|
|
274
|
-
readonly adRunSetupError?: string;
|
|
275
|
-
},
|
|
276
|
-
): DashboardAdSlashRuntime {
|
|
277
|
-
const { adRunSetupBindings, adRunSetupError, ...deps } = input;
|
|
278
|
-
return createAdSlashRuntime({
|
|
279
|
-
...deps,
|
|
280
|
-
production: adRunSetupBindings?.production,
|
|
281
|
-
productionForSpend: adRunSetupBindings?.productionForSpend,
|
|
282
|
-
missingProductionInputs: adRunSetupBindings?.missingProductionInputs,
|
|
283
|
-
get outputSetupError() {
|
|
284
|
-
return adRunSetupBindings?.outputSetupError ?? adRunSetupError;
|
|
285
|
-
},
|
|
286
|
-
});
|
|
287
|
-
}
|
|
17
|
+
import {
|
|
18
|
+
createDashboardAdRunSetupBindings,
|
|
19
|
+
createDashboardAdRunSetupFactory,
|
|
20
|
+
createDashboardAdSlashRuntime,
|
|
21
|
+
dashboardAdAssetPresetPath,
|
|
22
|
+
dashboardAdCommandRunner,
|
|
23
|
+
} from './ad-run-setup-bindings.js';
|
|
24
|
+
export {
|
|
25
|
+
dashboardOptionalProductionInputs,
|
|
26
|
+
type DashboardAdAssetPreset,
|
|
27
|
+
dashboardAdAssetPresetPath,
|
|
28
|
+
loadDashboardAdAssetPreset,
|
|
29
|
+
dashboardAdCommandRunner,
|
|
30
|
+
createDashboardAdRunSetupFactory,
|
|
31
|
+
createDashboardAdRunSetupBindings,
|
|
32
|
+
createDashboardAdSlashRuntime,
|
|
33
|
+
} from './ad-run-setup-bindings.js';
|
|
288
34
|
|
|
289
35
|
export interface DashboardGlobalKeyRegistration {
|
|
290
36
|
id: string;
|
|
@@ -896,7 +642,7 @@ import { inspectActiveProvider } from '../provider-summary.js';
|
|
|
896
642
|
import { activeCodexAccountView } from '../oauth/codex-account-store.js';
|
|
897
643
|
import { buildDashboardStatusLines } from './dashboard-status-lines.js';
|
|
898
644
|
import { readSlashContextNow, seatsNowLine } from '../context-bus/context-now-surfaces.js';
|
|
899
|
-
import { buildFirstScreenBand } from './first-screen-band.js';
|
|
645
|
+
import { buildFirstScreenBand, resolveTuiDaemonLink, type TuiDaemonLink } from './first-screen-band.js';
|
|
900
646
|
import { runNexusShow, type NexusShowResult } from '../cli/nexus-show.js';
|
|
901
647
|
import {
|
|
902
648
|
workingDirSegment, sessionCwdSegment, modelSegment, gitSegment,
|
|
@@ -1005,11 +751,7 @@ import { createDashboardControlSignalSlashRuntime } from './control-signal-slash
|
|
|
1005
751
|
import { createDashboardBrowserCdpSlashRuntime } from './browser-cdp-slash-runtime.js';
|
|
1006
752
|
import { collectGroundingFactsViaCdp } from '../product-grounding/cdp-collect.js';
|
|
1007
753
|
import { createDashboardSimSlashRuntime } from './sim-slash-runtime.js';
|
|
1008
|
-
import {
|
|
1009
|
-
createDashboardAdSlashRuntime as createAdSlashRuntime,
|
|
1010
|
-
type DashboardAdSlashRuntime,
|
|
1011
|
-
type DashboardAdSlashRuntimeDeps,
|
|
1012
|
-
} from './ad-slash-runtime.js';
|
|
754
|
+
import type { DashboardAdSlashRuntime } from './ad-slash-runtime.js';
|
|
1013
755
|
import { openDashboardLocalSimulationWebCockpit } from './sim-web-cockpit-runtime.js';
|
|
1014
756
|
import { createDashboardCompanionFeedbackRuntime } from './companion-feedback-runtime.js';
|
|
1015
757
|
import { resolveDashboardMediaSlash } from './media-slash-runtime.js';
|
|
@@ -2128,15 +1870,22 @@ export function renderDashboardFirstScreenBand(input: {
|
|
|
2128
1870
|
readonly draw: () => void;
|
|
2129
1871
|
readonly observe: (data: { daemon: boolean; hasPwa: boolean; hasTailnet: boolean }) => void;
|
|
2130
1872
|
readonly show?: () => Promise<Pick<NexusShowResult, 'status' | 'urls'>>;
|
|
1873
|
+
readonly daemonLink?: () => Promise<TuiDaemonLink>;
|
|
2131
1874
|
}): Promise<void> {
|
|
2132
1875
|
if (input.history.some((message) => message.role !== 'system')) return Promise.resolve();
|
|
2133
|
-
const band = buildFirstScreenBand({ width: input.width, daemon: false });
|
|
1876
|
+
const band = buildFirstScreenBand({ width: input.width, daemon: false, link: { status: 'checking' } });
|
|
2134
1877
|
input.lines.unshift(...band);
|
|
1878
|
+
const daemonLink = input.daemonLink ?? resolveTuiDaemonLink;
|
|
1879
|
+
const linkPending = Promise.resolve().then(() => daemonLink()).catch((): TuiDaemonLink => ({ status: 'error', stage: 'health' })).then((link) => {
|
|
1880
|
+
if (input.lines[0] !== band[0]) return;
|
|
1881
|
+
input.lines[0] = buildFirstScreenBand({ width: input.width, daemon: false, link })[0]!;
|
|
1882
|
+
try { input.draw(); } catch { /* screen may have closed */ }
|
|
1883
|
+
});
|
|
2135
1884
|
const show = input.show ?? (() => runNexusShow({ format: 'json', out: { log: () => {}, error: () => {} } }));
|
|
2136
1885
|
const observe = (data: { daemon: boolean; hasPwa: boolean; hasTailnet: boolean }): void => {
|
|
2137
1886
|
try { input.observe(data); } catch { /* observation cannot interrupt the transcript */ }
|
|
2138
1887
|
};
|
|
2139
|
-
|
|
1888
|
+
const pwaPending = Promise.resolve().then(show).then((result) => {
|
|
2140
1889
|
const daemon = result.status !== 'absent';
|
|
2141
1890
|
const pwa = result.urls?.pwa;
|
|
2142
1891
|
const hasPwa = !!pwa;
|
|
@@ -2148,6 +1897,7 @@ export function renderDashboardFirstScreenBand(input: {
|
|
|
2148
1897
|
}).catch(() => {
|
|
2149
1898
|
observe({ daemon: false, hasPwa: false, hasTailnet: false });
|
|
2150
1899
|
});
|
|
1900
|
+
return Promise.all([linkPending, pwaPending]).then(() => {});
|
|
2151
1901
|
}
|
|
2152
1902
|
|
|
2153
1903
|
export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
|
|
@@ -4361,13 +4111,27 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4361
4111
|
now: Date.now,
|
|
4362
4112
|
});
|
|
4363
4113
|
if (versionDir) {
|
|
4114
|
+
let staleNoticeIndex = -1;
|
|
4115
|
+
let staleNoticeLine: string | undefined;
|
|
4116
|
+
let staleNoticeCount = 0;
|
|
4364
4117
|
const checkInstall = (): void => {
|
|
4365
4118
|
const result = staleInstallCheck.check();
|
|
4366
4119
|
debug.log('dashboard.version', 'install-check', {
|
|
4367
4120
|
state: result.state, bootCommit: result.bootCommit, installedCommit: result.installedCommit,
|
|
4368
4121
|
});
|
|
4369
4122
|
if (staleInstallCheck.shouldNotify(result)) {
|
|
4370
|
-
|
|
4123
|
+
staleNoticeCount++;
|
|
4124
|
+
const notice = C.warning(formatStaleInstallNotice(result, staleNoticeCount));
|
|
4125
|
+
if (chatLines[staleNoticeIndex] !== staleNoticeLine || staleNoticeLine === undefined) {
|
|
4126
|
+
staleNoticeIndex = staleNoticeLine === undefined ? -1 : chatLines.indexOf(staleNoticeLine);
|
|
4127
|
+
}
|
|
4128
|
+
if (staleNoticeIndex < 0) {
|
|
4129
|
+
chatLines.push(notice);
|
|
4130
|
+
staleNoticeIndex = chatLines.length - 1;
|
|
4131
|
+
} else {
|
|
4132
|
+
chatLines[staleNoticeIndex] = notice;
|
|
4133
|
+
}
|
|
4134
|
+
staleNoticeLine = notice;
|
|
4371
4135
|
chatScrollOffset = -1;
|
|
4372
4136
|
try { draw(); } catch { /* TUI torn down */ }
|
|
4373
4137
|
}
|
|
@@ -343,7 +343,7 @@ import { terminalModalRouter } from '../input/terminal-modal-router.js';
|
|
|
343
343
|
import { termSize, stripAnsi } from '../../tui.js';
|
|
344
344
|
import { SLASH_COMMANDS } from '../../chat/index.js';
|
|
345
345
|
import { buildEssentialHelpLines } from './help-from-registry.js';
|
|
346
|
-
import { HUMAN_MODEL_WORDS, MODEL_CODE_NAMES, modelChangeLine, modelOverviewLines, resolveModelChoice } from './model-choices.js';
|
|
346
|
+
import { HUMAN_MODEL_WORDS, MODEL_CODE_NAMES, humanWordForModel, modelChangeLine, modelOverviewLines, resolveModelChoice } from './model-choices.js';
|
|
347
347
|
import type { FoldMode } from '../../log-entry.js';
|
|
348
348
|
import { resolveDashboardChatMainLogCommand } from '../input/chat-main-log-command.js';
|
|
349
349
|
import {
|
|
@@ -6197,8 +6197,10 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
6197
6197
|
const curModel = curCfg.llm.model;
|
|
6198
6198
|
const curReasoning = effectiveReasoningLevel(curCfg.llm, curProvider, curModel);
|
|
6199
6199
|
if (!arg) {
|
|
6200
|
-
const [
|
|
6201
|
-
|
|
6200
|
+
const [, codes] = modelOverviewLines(curProvider, curModel, curReasoning);
|
|
6201
|
+
// A model outside the 빠름/보통/깊음 map (codename or custom) says so explicitly instead of dropping the tier slot.
|
|
6202
|
+
const tierName = humanWordForModel(curProvider, curModel, curReasoning) ?? '단계 밖';
|
|
6203
|
+
ctx.chatLines.push(`지금: ${curModel?.trim() || '기본 모델'} (${tierName} · 생각 ${curReasoning}) · 고르기: /model ${HUMAN_MODEL_WORDS.join(' | ')}`);
|
|
6202
6204
|
ctx.chatLines.push(ctx.muted(codes));
|
|
6203
6205
|
ctx.setChatScrollOffset(-1);
|
|
6204
6206
|
return;
|
|
@@ -12,6 +12,22 @@ export type StaleInstallResult = {
|
|
|
12
12
|
|
|
13
13
|
export const STALE_INSTALL_CHECK_INTERVAL_MS = 60_000;
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* Builds the command that relaunches the TUI on the same daemon session: `elanous --resume <id>` boots the dashboard,
|
|
17
|
+
* loads that session (ACP session/load) and replays its turns (src/index.ts resumeSessionId · dashboard acp-boot).
|
|
18
|
+
* The user-facing hint and its key binding land with the dashboard wiring slice (`r` is the render toggle today).
|
|
19
|
+
* Intentional wiring boundary: the dashboard owns the key binding and executes this command;
|
|
20
|
+
* this scoped helper only constructs it and does not spawn a child process.
|
|
21
|
+
*/
|
|
22
|
+
export function buildStaleInstallRelaunchCommand(sessionId: string): string {
|
|
23
|
+
return `elanous --resume ${JSON.stringify(sessionId)}`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function formatStaleInstallNotice(result: StaleInstallResult, notifiedCount: number): string {
|
|
27
|
+
const message = `새 판이 깔렸습니다 (부팅 판 ${result.bootCommit!.slice(0, 7)} → 지금 ${result.installedCommit!.slice(0, 7)}) · TUI 를 다시 띄우면 새 판으로 돕니다`;
|
|
28
|
+
return notifiedCount >= 2 ? `${message} · 이 TUI 가 뜬 뒤 ${notifiedCount}번째 새 판` : message;
|
|
29
|
+
}
|
|
30
|
+
|
|
15
31
|
/** Identify the immutable installed version containing this module, never the session cwd. */
|
|
16
32
|
export function versionedDashboardInstallDir(
|
|
17
33
|
codeRoot: string,
|
|
@@ -21,8 +37,14 @@ export function versionedDashboardInstallDir(
|
|
|
21
37
|
const packageRoot = realpathSync(codeRoot);
|
|
22
38
|
if (basename(packageRoot) !== 'elanous' || basename(dirname(packageRoot)) !== 'node_modules') return undefined;
|
|
23
39
|
const versionDir = dirname(dirname(packageRoot));
|
|
24
|
-
|
|
25
|
-
|
|
40
|
+
let canonicalInstallRoot: string;
|
|
41
|
+
try { canonicalInstallRoot = realpathSync(installRoot); }
|
|
42
|
+
catch { canonicalInstallRoot = resolve(installRoot); }
|
|
43
|
+
if (dirname(versionDir) !== join(canonicalInstallRoot, 'versions')) return undefined;
|
|
44
|
+
const requestedVersionDir = dirname(dirname(resolve(codeRoot)));
|
|
45
|
+
return dirname(requestedVersionDir) === resolve(installRoot, 'versions')
|
|
46
|
+
&& realpathSync(requestedVersionDir) === versionDir
|
|
47
|
+
? requestedVersionDir : versionDir;
|
|
26
48
|
} catch {
|
|
27
49
|
return undefined;
|
|
28
50
|
}
|
|
@@ -20,6 +20,7 @@ import type { ToolRenderModel } from '../chat/tool-render/types.js';
|
|
|
20
20
|
import { toolOperationKind, type FoldMode } from '../log-entry.js';
|
|
21
21
|
import { stripAnsi } from '../tui.js';
|
|
22
22
|
import type { TurnStreamPresentationEvent } from './turn-stream-presentation-applier.js';
|
|
23
|
+
import { buildFoldedTailLine, splitNoSynthesisTail } from './chat-fold.js';
|
|
23
24
|
|
|
24
25
|
/** Drop leading/trailing blank (whitespace-only, ANSI-stripped) rows
|
|
25
26
|
* from a rendered assistant block. Codex-family models frequently
|
|
@@ -181,6 +182,7 @@ export function createTurnStreamFormatter(
|
|
|
181
182
|
const toolArgsByCallId = new Map<string, Record<string, unknown>>();
|
|
182
183
|
const nonGenericCallIds = new Set<string>();
|
|
183
184
|
let toolCallCount = 0;
|
|
185
|
+
let noSynthesisTailCount = 0;
|
|
184
186
|
|
|
185
187
|
const emitAssistantBlock = (): void => {
|
|
186
188
|
deps.thinking.update('Streaming');
|
|
@@ -219,6 +221,29 @@ export function createTurnStreamFormatter(
|
|
|
219
221
|
}
|
|
220
222
|
if (chunk === '') {
|
|
221
223
|
// Path 2 — authoritative replacement (W5-E/F/G force-synthesis).
|
|
224
|
+
const split = splitNoSynthesisTail(accumulated);
|
|
225
|
+
if (split) {
|
|
226
|
+
perRoundText = split.head;
|
|
227
|
+
emitAssistantBlock();
|
|
228
|
+
closeRound();
|
|
229
|
+
deps.emit({ type: 'assistant.commit' });
|
|
230
|
+
const callId = `no-synthesis-tail-${++noSynthesisTailCount}`;
|
|
231
|
+
const expandedLines = trimBlankEdges(
|
|
232
|
+
deps.formatResponse(split.tail, deps.termCols() - 6, deps.wrapOpts),
|
|
233
|
+
).map(deps.text);
|
|
234
|
+
const collapsedLines = [buildFoldedTailLine(expandedLines.length)];
|
|
235
|
+
if (debug.enabled) {
|
|
236
|
+
debug.log('dashboard.chat.stream', 'formatter.noSynthesisTail.folded', {
|
|
237
|
+
callId,
|
|
238
|
+
headLen: split.head.length,
|
|
239
|
+
tailLen: split.tail.length,
|
|
240
|
+
expandedLineCount: expandedLines.length,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
deps.emit({ type: 'tool.appendBlock', callId, lines: collapsedLines, args: {} });
|
|
244
|
+
deps.emit({ type: 'tool.replaceBlock', callId, collapsedLines, expandedLines });
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
222
247
|
perRoundText = accumulated;
|
|
223
248
|
} else {
|
|
224
249
|
// Path 3 — streaming delta. accumulated 무시 (cross-turn fullText).
|