elanous 0.2.22 → 0.2.23
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/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-b23d2e92161d11fd.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-fbef064c213b2b18.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-d5341ac96203a983.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-0160ab83c8685a12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-55c631c032dcc47e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ad3bd8084048bee4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e6784759a2531031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5c5d0e370f495ef6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-c325e21543cd48a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/{page-80ed511e02c81412.js → page-6168a7c43e6ef8f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-31417d3604154a6d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-e9606dc0bdec9305.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-a648bc464c9dc754.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25bb425afdb27541.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-32d72fdef1afe11a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27b794c8ba76bbb.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-2bd9ce9c020d02d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a34096245e63b9f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-22170f4f00a15496.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-4cc66d22ca4ec502.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83b14c729fcea837.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-6e2781c523dad761.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-26dd415c8f13f341.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-ccdb83ed40c8d724.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-7ad3de8fa06fdea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-015c02c4fec4023e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-6b0ae5b5c42f6d2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-786111f30b6f0969.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-48fb31810693c357.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e17cce5e2ed0fee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-cb154acadb025414.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-16258e956ea93fc2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-c2dd2b19c93f90ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-85f35dd1dd96ae87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-d3c007c8a0ddd7ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7837ce2aacb97b04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7350ee93f4fe1033.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-00723458575f2b19.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-745d9b6c015076f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-736d33c7414a8a1a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-119be9a0444d2482.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-fa806c018833e332.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-c782041b5f5199ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-d431fbdea6ad93dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-0c056abff82b9891.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-242d668e4fbf72c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-847c3de6ca8a4416.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-81dd0d8ae923ed72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-74e69ba2c8e970d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-70038f41ae7cf931.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/5619d59e87eddf66.css +1 -0
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +1 -0
- package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → rfkMm4movqkqMebBrCXiR}/_buildManifest.js +1 -1
- 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/graphs/log-horizon/log-horizon-watch.yaml +25 -0
- package/graphs/log-horizon/recipes.yaml +3 -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/bench-report.ts +82 -3
- package/scripts/ci-typecheck-changed.ts +10 -1
- package/scripts/hq/hq-fence-wrapper.sh +148 -0
- package/scripts/lib/typecheck-ratchet.ts +51 -0
- package/scripts/openai-relay-server.ts +5 -1
- package/scripts/release-loop/docs-node.ts +258 -43
- package/scripts/release-loop/gate-method.ts +59 -0
- package/scripts/release-loop/gate-node.ts +73 -7
- 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 +34 -4
- package/scripts/release-loop/resume.ts +53 -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 +8 -1
- package/scripts/rhythm/daily.ts +51 -2
- package/scripts/rhythm/weekly.ts +3 -2
- package/scripts/tsc-main-safety-net.ts +189 -0
- package/scripts/usage-rollup.ts +8 -4
- package/src/acp/codex-plugins.ts +48 -6
- package/src/agent/monad-agent-turn.ts +67 -5
- package/src/agent/run-context.ts +10 -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 +1 -1
- package/src/agent-mission/pr-review-watch.ts +6 -2
- package/src/agent-mission/review-loop.ts +33 -5
- package/src/agent-substrate/acp-reviewer.ts +17 -8
- package/src/agent-substrate/pr-reviewer.ts +164 -28
- package/src/agent-substrate/review-intent.ts +6 -4
- package/src/agent-substrate/self-review-cli.ts +111 -16
- 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/pr-manager.ts +12 -3
- 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/chat/index.ts +12 -3
- package/src/cli/agent-cli.ts +20 -0
- package/src/cli/brief-cli.ts +27 -21
- package/src/cli/cli-user-error.ts +9 -2
- package/src/cli/log-event-names.ts +3 -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 +30 -2
- package/src/cli/pr-land-overlap-evidence.ts +131 -0
- package/src/cli/release-cli.ts +53 -11
- package/src/cli/self-update.ts +173 -10
- package/src/cli/skills-cli.ts +12 -3
- package/src/cli/tasks-cli.ts +133 -27
- 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 +86 -2
- package/src/dashboard/chat-fold.ts +20 -0
- package/src/dashboard/first-screen-band.ts +151 -1
- package/src/dashboard/index.ts +27 -5
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +5 -3
- package/src/dashboard/stale-install-check.ts +13 -2
- package/src/dashboard/turn-stream-formatter.ts +25 -0
- package/src/debug/log-diet.ts +159 -0
- package/src/debug/log.ts +52 -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 +119 -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/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 +1 -0
- package/src/graph-runner/runner.ts +54 -5
- package/src/harness/dispatch-backpressure.ts +259 -0
- package/src/harness/harness-cli-command.ts +107 -28
- package/src/harness/harness-seams.ts +2 -20
- package/src/harness/harness-substrate-default.ts +72 -1
- package/src/harness/nested-elanous-policy.ts +4 -2
- package/src/hq/fence-wrapper.ts +7 -0
- package/src/hq/hq.ts +33 -2
- package/src/hq/lease.ts +13 -0
- package/src/hq/seats.ts +114 -18
- package/src/index.ts +163 -64
- 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/intelligence-map/model-alias.ts +6 -0
- package/src/intelligence-map/model-catalog.ts +41 -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-provider.ts +175 -0
- package/src/llm/bedrock.ts +345 -0
- package/src/llm/provider-credentials.ts +3 -1
- package/src/llm.ts +306 -35
- package/src/loops/budget.ts +150 -0
- 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/mcp/mcp-oauth.ts +136 -17
- package/src/model-tier/llm-tier-map.ts +48 -4
- package/src/models/prompts.ts +22 -1
- package/src/mss/logging/horizon-watch.ts +168 -0
- package/src/mss/logging/log-store.ts +204 -15
- 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/outbound-report.ts +8 -3
- package/src/nexus/api/telegram-trigger-bot.ts +6 -3
- package/src/nexus/index.ts +10 -0
- package/src/nexus/outbound/format.ts +2 -0
- package/src/nexus/outbound/router.ts +198 -13
- package/src/oauth/codex-account-rotation.ts +16 -18
- package/src/oauth/codex-account-store.ts +134 -5
- package/src/oauth/fallback-chain.ts +28 -6
- package/src/onboarding.ts +2 -1
- 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 +10 -6
- package/src/prompt-cache/openrouter.ts +94 -0
- package/src/prompt-enhance/enhance.ts +46 -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 +91 -22
- 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/retro/daily.ts +23 -9
- package/src/seat-loop/seat-loop.ts +34 -1
- 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 +67 -3
- package/src/self-dev/dev-pipeline.ts +4 -6
- package/src/self-dev/draft-residue.ts +463 -0
- package/src/self-dev/draft-sweep.ts +151 -10
- package/src/self-dev/draft-triage-rules.ts +27 -1
- 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 +57 -2
- package/src/self-dev/orchestrate-summary-line.ts +13 -0
- package/src/self-dev/orchestrate.ts +8 -135
- 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 +3 -22
- package/src/self-dev/run-types.ts +178 -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 +2 -4
- package/src/self-implement/blocked-draft-policy.ts +3 -19
- package/src/self-implement/draft-on-stop-mode.ts +18 -0
- package/src/self-implement/follow-up-goals.ts +114 -38
- 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.ts +24 -4
- package/src/self-implement/goal-digest.ts +19 -0
- package/src/self-implement/graph-overlay-condition.ts +4 -0
- package/src/self-implement/headless-elanous-driver.ts +11 -9
- 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 +133 -16
- 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/seams.ts +36 -3
- package/src/self-implement/self-implement-cli.ts +3 -1
- 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/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 +20 -9
- package/src/steward/triage.ts +4 -2
- package/src/storage/file-lock.ts +8 -1
- package/src/task-agent/actions.ts +4 -0
- package/src/task-agent/card-evidence.ts +59 -13
- package/src/task-agent/judge.ts +4 -3
- package/src/task-agent/land-worktree.ts +201 -0
- package/src/task-agent/live-move-history.ts +133 -0
- package/src/task-agent/live-moves.ts +106 -19
- package/src/task-agent/parent-host.ts +117 -8
- package/src/task-agent/rejudge-on-head.ts +297 -0
- package/src/task-agent/review-result-capture.ts +218 -0
- package/src/task-agent/shadow.ts +103 -7
- package/src/task-agent/task-hand.ts +136 -11
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +29 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +6 -3
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +16 -2
- package/src/task-orchestrator/surfaces/pod-image-source.ts +212 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +93 -12
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +25 -2
- package/src/task-orchestrator/surfaces/pod-pool.ts +66 -14
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +259 -36
- package/src/task-orchestrator/surfaces/self-implement.ts +6 -2
- 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/user-config.ts +132 -24
- 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/scheduler.ts +1 -0
- 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 → rfkMm4movqkqMebBrCXiR}/_ssgManifest.js +0 -0
|
@@ -20,6 +20,7 @@ export interface BriefWeeklyActions extends BriefActionCount {
|
|
|
20
20
|
export type BriefDomain = (typeof BRIEF_DOMAINS)[number];
|
|
21
21
|
export type BriefPriority = (typeof BRIEF_PRIORITIES)[number];
|
|
22
22
|
export type BriefSlot = (typeof BRIEF_SLOTS)[number];
|
|
23
|
+
export type BriefSendSlot = BriefSlot | 'realtime';
|
|
23
24
|
|
|
24
25
|
const KST = 'Asia/Seoul';
|
|
25
26
|
|
|
@@ -95,6 +96,12 @@ function needsDecision(item: BriefItem, today: string): boolean {
|
|
|
95
96
|
return item.priority === 'P0' || (item.deadline !== null && deadlineDate(item.deadline) === today);
|
|
96
97
|
}
|
|
97
98
|
|
|
99
|
+
/** Unsent decisions needing immediate delivery, using the same KST deadline rule as slot pages. */
|
|
100
|
+
export function pendingRealtime(items: readonly BriefItem[], now: Date): BriefItem[] {
|
|
101
|
+
const today = dateKey(now, { timeZone: KST });
|
|
102
|
+
return items.filter(item => item.sent_at === null && needsDecision(item, today));
|
|
103
|
+
}
|
|
104
|
+
|
|
98
105
|
/**
|
|
99
106
|
* One briefing page. Item text is copied verbatim.
|
|
100
107
|
* Order: decisions due (P0, then a deadline of today) → domain groups →
|
|
@@ -105,13 +112,13 @@ export function composeBriefMarkdown(items: readonly BriefItem[], slot: BriefSlo
|
|
|
105
112
|
}
|
|
106
113
|
|
|
107
114
|
/** The ids are exactly the rows represented by the composed page, after deduplication. */
|
|
108
|
-
export function composeBriefPage(items: readonly BriefItem[], slot:
|
|
115
|
+
export function composeBriefPage(items: readonly BriefItem[], slot: BriefSendSlot, now: Date): { markdown: string; ids: number[] } {
|
|
109
116
|
const today = dateKey(now, { timeZone: KST });
|
|
110
117
|
// A duplicate left out of a delivered page stays unsent in the ledger, but must not reappear on a later page.
|
|
111
118
|
// A new undeliverable observation after a sent page is a new occurrence, not an old duplicate.
|
|
112
119
|
const deliveredClaims = new Set(items.filter(item => item.sent_at !== null).map(item => normalizeClaim(item.text)));
|
|
113
|
-
const
|
|
114
|
-
|
|
120
|
+
const candidates = slot === 'realtime' ? pendingRealtime(items, now) : items.filter(item => item.sent_at === null && beforeSlot(item.created_at, slot, now));
|
|
121
|
+
const eligible = candidates.filter(item => item.source === 'outbound.undeliverable' || !deliveredClaims.has(normalizeClaim(item.text)));
|
|
115
122
|
// Duplicate claims keep the copy that needs a decision today (P0 or due today), then the higher priority, then the earliest (ACP must-fix).
|
|
116
123
|
const rank = (item: BriefItem) => [needsDecision(item, today) ? 0 : 1, BRIEF_PRIORITIES.indexOf(item.priority), item.id];
|
|
117
124
|
const better = (a: BriefItem, b: BriefItem) => { const x = rank(a), y = rank(b); return x[0]! - y[0]! || x[1]! - y[1]! || x[2]! - y[2]!; };
|
|
@@ -354,6 +361,7 @@ export class BriefItemsLedger {
|
|
|
354
361
|
* requirement funnel contributes ephemeral lines without adding ledger rows.
|
|
355
362
|
*/
|
|
356
363
|
compose(slot: string): string {
|
|
364
|
+
if (!(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
357
365
|
return this.composeWithIds(slot).markdown;
|
|
358
366
|
}
|
|
359
367
|
|
|
@@ -361,7 +369,7 @@ export class BriefItemsLedger {
|
|
|
361
369
|
return db.query('SELECT id, text, domain, priority, deadline, evidence, source, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items ORDER BY id').all() as BriefItem[];
|
|
362
370
|
}
|
|
363
371
|
|
|
364
|
-
private pageFromDb(db: Database, slot:
|
|
372
|
+
private pageFromDb(db: Database, slot: BriefSendSlot): { markdown: string; ids: number[] } {
|
|
365
373
|
const items = this.itemsFromDb(db);
|
|
366
374
|
const now = this.now();
|
|
367
375
|
const morningCutoff = Date.parse(`${dateKey(now, { timeZone: KST })}T08:30:00+09:00`);
|
|
@@ -383,26 +391,26 @@ export class BriefItemsLedger {
|
|
|
383
391
|
const composed = composeBriefPage([...items, ...funnelItems], slot, now);
|
|
384
392
|
// Ephemeral funnel lines appear on the page but have no ledger row to mark sent.
|
|
385
393
|
const page = { markdown: composed.markdown, ids: composed.ids.filter(id => id > 0) };
|
|
386
|
-
const candidates = items.filter(item => item.sent_at === null && beforeSlot(item.created_at, slot, now)).length;
|
|
394
|
+
const candidates = (slot === 'realtime' ? pendingRealtime(items, now) : items.filter(item => item.sent_at === null && beforeSlot(item.created_at, slot, now))).length;
|
|
387
395
|
this.log('briefing.items', 'composed', { slot, candidates, bytes: Buffer.byteLength(page.markdown) });
|
|
388
396
|
return page;
|
|
389
397
|
}
|
|
390
398
|
|
|
391
399
|
/** Read-only page and the exact ledger item ids printed on it (after deduplication). */
|
|
392
400
|
composeWithIds(slot: string): { markdown: string; ids: number[] } {
|
|
393
|
-
if (!(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
394
|
-
return this.using(db => this.pageFromDb(db, slot as
|
|
401
|
+
if (slot !== 'realtime' && !(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
402
|
+
return this.using(db => this.pageFromDb(db, slot as BriefSendSlot));
|
|
395
403
|
}
|
|
396
404
|
|
|
397
405
|
/** Hold the ledger's SQLite writer lock from selecting unsent rows through delivery and marking.
|
|
398
406
|
* A failed delivery rolls back and releases the lock; the next sender can retry.
|
|
399
407
|
*/
|
|
400
|
-
withSendLock<T>(slot: string, work: (page: { markdown: string; ids: number[] }, markSent: (ids: readonly number[], slot:
|
|
401
|
-
if (!(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
408
|
+
withSendLock<T>(slot: string, work: (page: { markdown: string; ids: number[] }, markSent: (ids: readonly number[], slot: BriefSendSlot) => number) => T): T {
|
|
409
|
+
if (slot !== 'realtime' && !(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
402
410
|
return this.using(db => {
|
|
403
411
|
db.exec('BEGIN IMMEDIATE');
|
|
404
412
|
try {
|
|
405
|
-
const page = this.pageFromDb(db, slot as
|
|
413
|
+
const page = this.pageFromDb(db, slot as BriefSendSlot);
|
|
406
414
|
const result = work(page, (ids, sentSlot) => {
|
|
407
415
|
if (sentSlot !== slot || ids.length !== page.ids.length || ids.some((id, index) => id !== page.ids[index])) {
|
|
408
416
|
throw new BriefItemsInputError('marked ids must match composed page');
|
|
@@ -418,7 +426,7 @@ export class BriefItemsLedger {
|
|
|
418
426
|
});
|
|
419
427
|
}
|
|
420
428
|
|
|
421
|
-
private markSentInDb(db: Database, ids: readonly number[], slot:
|
|
429
|
+
private markSentInDb(db: Database, ids: readonly number[], slot: BriefSendSlot): number {
|
|
422
430
|
const at = this.now().toISOString();
|
|
423
431
|
const insert = db.query('INSERT INTO sends (item_id, slot, sent_at) VALUES (?, ?, ?)');
|
|
424
432
|
let count = 0;
|
|
@@ -431,8 +439,8 @@ export class BriefItemsLedger {
|
|
|
431
439
|
* Records that these items went out in a slot (append-only); later composes leave them out (ACP must-fix).
|
|
432
440
|
* Only an actual sender calls this — compose itself stays read-only (no flag marks items it did not send).
|
|
433
441
|
*/
|
|
434
|
-
markSent(ids: readonly number[], slot:
|
|
435
|
-
if (!(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
442
|
+
markSent(ids: readonly number[], slot: BriefSendSlot): number {
|
|
443
|
+
if (slot !== 'realtime' && !(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
436
444
|
return this.using(db => db.transaction(() => this.markSentInDb(db, ids, slot))());
|
|
437
445
|
}
|
|
438
446
|
}
|
package/src/chat/index.ts
CHANGED
|
@@ -55,7 +55,8 @@ export interface CursorSink {
|
|
|
55
55
|
* tests can inject a fake. */
|
|
56
56
|
export interface ModalSink {
|
|
57
57
|
pushModal(surface: ModalSurface): { id: string; dispose: () => void };
|
|
58
|
-
/** F-E2 —
|
|
58
|
+
/** F-E2 — ask the coordinator to repaint the modal overlay (a plain
|
|
59
|
+
* dirty frame — NOT force; see TUI-SLASH-FLICKER). Chat
|
|
59
60
|
* calls this after every keystroke so the picker's paint closure
|
|
60
61
|
* re-evaluates `getFiltered()` / `getItems()` — without it, the
|
|
61
62
|
* picker handle stays mounted but its filter output doesn't flow
|
|
@@ -345,11 +346,19 @@ export function createTextInputRenderActions(opts: {
|
|
|
345
346
|
if (opts.shouldRequestModalRender?.() === false) return;
|
|
346
347
|
if (debug.enabled) {
|
|
347
348
|
debug.log('chat.modal.requestRender', 'user-mutation', {
|
|
348
|
-
force:
|
|
349
|
+
force: false,
|
|
349
350
|
painted,
|
|
350
351
|
});
|
|
351
352
|
}
|
|
352
|
-
|
|
353
|
+
// TUI-SLASH-FLICKER (2026-10-09) — ⛔ NOT `force: true`. A forced
|
|
354
|
+
// frame reaches tui.ts::render as `\x1b[1;1H\x1b[J` + every row, so
|
|
355
|
+
// each keystroke / ↑↓ in the picker erased and repainted the WHOLE
|
|
356
|
+
// screen (visible flicker). The picker surfaces carry no paint-cache
|
|
357
|
+
// `generation`, so a plain dirty frame already re-runs their paint
|
|
358
|
+
// closure and the dashboard frame re-emits the overlay every flush;
|
|
359
|
+
// rows the picker vacates are invalidated by the coordinator's
|
|
360
|
+
// region tracking. Regression: src/ux-sim/slash-menu-frames.test.ts.
|
|
361
|
+
opts.modalSink?.requestRender?.();
|
|
353
362
|
};
|
|
354
363
|
return { repaintHost, repaintUserMutation };
|
|
355
364
|
}
|
package/src/cli/agent-cli.ts
CHANGED
|
@@ -668,6 +668,26 @@ export function buildCliAgentTools(
|
|
|
668
668
|
const shared = (require('../agent/shared-app-tools.js') as typeof import('../agent/shared-app-tools.js')).buildSharedAppTools(cfg);
|
|
669
669
|
for (const s of shared.specs) specs.push(s);
|
|
670
670
|
for (const name of shared.names) dispatchByName.set(name, async (args) => shared.dispatch(name, args));
|
|
671
|
+
// Installed knowledge is queryable in CLI chat as well as the dashboard runtime.
|
|
672
|
+
// No installed packs => preserve the existing CLI tool list and avoid creating a KGS database.
|
|
673
|
+
const { kgsDefaultDbPath } = require('../knowledge/kgs/sqlite-store.js') as typeof import('../knowledge/kgs/sqlite-store.js');
|
|
674
|
+
const { existsSync } = require('node:fs') as typeof import('node:fs');
|
|
675
|
+
let hasInstalledPacks = false;
|
|
676
|
+
try {
|
|
677
|
+
if (existsSync(kgsDefaultDbPath())) {
|
|
678
|
+
const { listInstalledPacks } = require('../knowledge/query.js') as typeof import('../knowledge/query.js');
|
|
679
|
+
hasInstalledPacks = listInstalledPacks().length > 0;
|
|
680
|
+
}
|
|
681
|
+
} catch (err) {
|
|
682
|
+
// An unreadable/corrupt KGS store must not break chat tool assembly for turns that never query knowledge.
|
|
683
|
+
debug.log('cli.agent', 'knowledge-query.tool-skipped', { reason: err instanceof Error ? err.message : String(err) });
|
|
684
|
+
}
|
|
685
|
+
if (hasInstalledPacks) {
|
|
686
|
+
const { buildKnowledgeQueryTool, dispatchKnowledgeQuery } = require('../knowledge/tools/knowledge-query.js') as typeof import('../knowledge/tools/knowledge-query.js');
|
|
687
|
+
const knowledgeSpec = buildKnowledgeQueryTool();
|
|
688
|
+
specs.push(knowledgeSpec);
|
|
689
|
+
dispatchByName.set(knowledgeSpec.name, async (args) => dispatchKnowledgeQuery(args));
|
|
690
|
+
}
|
|
671
691
|
if (harnessPlan) {
|
|
672
692
|
specs.push(buildPlanTool(), buildMarkStepDoneTool());
|
|
673
693
|
const planCtx = {
|
package/src/cli/brief-cli.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
-
import { BRIEF_DOMAINS, BRIEF_PRIORITIES, BRIEF_REACTIONS, BRIEF_SLOTS, BriefItemsInputError, BriefItemsLedger, type BriefDomain, type BriefPriority, type BriefReaction, type
|
|
2
|
+
import { BRIEF_DOMAINS, BRIEF_PRIORITIES, BRIEF_REACTIONS, BRIEF_SLOTS, BriefItemsInputError, BriefItemsLedger, type BriefDomain, type BriefPriority, type BriefReaction, type BriefSendSlot } from '../briefing/brief-items.js';
|
|
3
3
|
import { kindRouteTarget } from '../domains/telegram-kind-route.js';
|
|
4
4
|
import { sendTelegramReturningId } from '../autopilot/mission-notify.js';
|
|
5
5
|
import { getUserConfig } from '../user-config.js';
|
|
@@ -31,6 +31,20 @@ export function registerBriefCommands(program: Command, deps: BriefCliDeps = {})
|
|
|
31
31
|
output(`이번 주 브리핑 중 대표가 움직인 것 ${acted}/${total}`);
|
|
32
32
|
} catch (cause) { fail('', cause); }
|
|
33
33
|
});
|
|
34
|
+
const deliver = (slot: BriefSendSlot): string => ledger().withSendLock(slot, ({ markdown, ids }, markSent) => {
|
|
35
|
+
if (ids.length === 0) return '(보낼 항목 없음)';
|
|
36
|
+
const send = deps.send ?? ((text: string) => {
|
|
37
|
+
const target = kindRouteTarget(getUserConfig(), 'ops-report');
|
|
38
|
+
if (!target) return null;
|
|
39
|
+
return sendTelegramReturningId(target.botToken, target.chatId, text);
|
|
40
|
+
});
|
|
41
|
+
const messageId = send(markdown);
|
|
42
|
+
if (typeof messageId !== 'number' || !Number.isFinite(messageId) || messageId <= 0) {
|
|
43
|
+
throw new Error('발송 실패: 양수 메시지 id 없음');
|
|
44
|
+
}
|
|
45
|
+
markSent(ids, slot);
|
|
46
|
+
return `sent ${messageId} (${ids.length} items)`;
|
|
47
|
+
});
|
|
34
48
|
|
|
35
49
|
brief.command('add')
|
|
36
50
|
.description('주장 한 줄을 원장에 추가한다 (원문 그대로)')
|
|
@@ -41,9 +55,11 @@ export function registerBriefCommands(program: Command, deps: BriefCliDeps = {})
|
|
|
41
55
|
.option('--deadline <deadline>', '마감 (YYYY-MM-DD 또는 ISO)')
|
|
42
56
|
.option('--evidence <evidence>', '근거 링크')
|
|
43
57
|
.option('--created-at <iso>', '작성 시각 (ISO, 생략 시 지금)')
|
|
58
|
+
.option('--send-now', 'P0 추가 직후 실시간 발송')
|
|
44
59
|
.option('--json', 'JSON 출력')
|
|
45
|
-
.action((opts: { text: string; domain: string; priority: string; source: string; deadline?: string; evidence?: string; createdAt?: string; json?: boolean }) => {
|
|
60
|
+
.action((opts: { text: string; domain: string; priority: string; source: string; deadline?: string; evidence?: string; createdAt?: string; sendNow?: boolean; json?: boolean }) => {
|
|
46
61
|
try {
|
|
62
|
+
if (opts.sendNow && opts.priority !== 'P0') throw new BriefItemsInputError('--send-now requires --priority P0');
|
|
47
63
|
const item = ledger().add({
|
|
48
64
|
text: opts.text,
|
|
49
65
|
domain: opts.domain as BriefDomain,
|
|
@@ -54,6 +70,7 @@ export function registerBriefCommands(program: Command, deps: BriefCliDeps = {})
|
|
|
54
70
|
...(opts.createdAt !== undefined ? { createdAt: opts.createdAt } : {}),
|
|
55
71
|
});
|
|
56
72
|
output(opts.json ? JSON.stringify(item) : `added ${item.id} [${item.priority}] ${item.domain}`);
|
|
73
|
+
if (opts.sendNow) output(deliver('realtime'));
|
|
57
74
|
} catch (cause) { fail('add', cause); }
|
|
58
75
|
});
|
|
59
76
|
|
|
@@ -95,31 +112,20 @@ export function registerBriefCommands(program: Command, deps: BriefCliDeps = {})
|
|
|
95
112
|
|
|
96
113
|
brief.command('send')
|
|
97
114
|
.description('슬롯 이전의 미발송 항목을 한 장 발송하고 성공한 항목만 표시한다')
|
|
98
|
-
.
|
|
115
|
+
.option('--slot <slot>', `슬롯 (${BRIEF_SLOTS.join('|')}, --realtime 시 불필요)`)
|
|
116
|
+
.option('--realtime', '미발송 P0 및 오늘 마감 항목을 즉시 한 장 발송한다')
|
|
99
117
|
.option('--dry-run', '한 장만 출력하고 발송·표시하지 않는다')
|
|
100
|
-
.action((opts: { slot
|
|
118
|
+
.action((opts: { slot?: string; realtime?: boolean; dryRun?: boolean }) => {
|
|
101
119
|
try {
|
|
102
|
-
|
|
120
|
+
if (opts.realtime && opts.slot !== undefined) throw new BriefItemsInputError('--realtime cannot be combined with --slot');
|
|
121
|
+
if (!opts.realtime && opts.slot === undefined) throw new BriefItemsInputError('--slot is required unless --realtime');
|
|
122
|
+
const slot = opts.realtime ? 'realtime' : opts.slot!;
|
|
103
123
|
if (opts.dryRun) {
|
|
104
|
-
const { markdown, ids } =
|
|
124
|
+
const { markdown, ids } = ledger().composeWithIds(slot);
|
|
105
125
|
output(ids.length === 0 ? '(보낼 항목 없음)' : markdown);
|
|
106
126
|
return;
|
|
107
127
|
}
|
|
108
|
-
|
|
109
|
-
if (ids.length === 0) return '(보낼 항목 없음)';
|
|
110
|
-
const send = deps.send ?? ((text: string) => {
|
|
111
|
-
const target = kindRouteTarget(getUserConfig(), 'ops-report');
|
|
112
|
-
if (!target) return null;
|
|
113
|
-
return sendTelegramReturningId(target.botToken, target.chatId, text);
|
|
114
|
-
});
|
|
115
|
-
const messageId = send(markdown);
|
|
116
|
-
if (typeof messageId !== 'number' || !Number.isFinite(messageId) || messageId <= 0) {
|
|
117
|
-
throw new Error('발송 실패: 양수 메시지 id 없음');
|
|
118
|
-
}
|
|
119
|
-
markSent(ids, opts.slot as BriefSlot);
|
|
120
|
-
return `sent ${messageId} (${ids.length} items)`;
|
|
121
|
-
});
|
|
122
|
-
output(result);
|
|
128
|
+
output(deliver(slot as BriefSendSlot));
|
|
123
129
|
} catch (cause) { fail('send', cause); }
|
|
124
130
|
});
|
|
125
131
|
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { HarnessCliInputError } from '../harness/harness-cli-command.js';
|
|
2
|
-
|
|
3
1
|
const cliUserErrorBrand = Symbol.for('elanous.cli.CliUserError');
|
|
4
2
|
const harnessCliInputErrorBrand = Symbol.for('elanous.cli.HarnessCliInputError');
|
|
5
3
|
|
|
@@ -11,6 +9,15 @@ export class CliUserError extends Error {
|
|
|
11
9
|
}
|
|
12
10
|
}
|
|
13
11
|
|
|
12
|
+
/** A command-line value was rejected before any harness work began. */
|
|
13
|
+
export class HarnessCliInputError extends Error {
|
|
14
|
+
constructor(message: string) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'HarnessCliInputError';
|
|
17
|
+
Object.defineProperty(this, harnessCliInputErrorBrand, { value: true });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
14
21
|
export function isCliUserError(err: unknown): err is Error & { hint?: string } {
|
|
15
22
|
return err instanceof HarnessCliInputError || err instanceof CliUserError || (
|
|
16
23
|
err instanceof Error && (
|
|
@@ -703,6 +703,9 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
703
703
|
"install-start",
|
|
704
704
|
"installed",
|
|
705
705
|
"instantiated",
|
|
706
|
+
"intent-stall-exhausted",
|
|
707
|
+
"intent-stall-provider-unresolved",
|
|
708
|
+
"intent-stall-reprompt",
|
|
706
709
|
"interceptor",
|
|
707
710
|
"interrupt",
|
|
708
711
|
"interview-round-classified",
|
package/src/cli/logs-cli.ts
CHANGED
|
@@ -36,6 +36,7 @@ import { LOG_LEVEL_ORDER, type LogLevel } from '../mss/logging/record.js';
|
|
|
36
36
|
import { isRenderCategory, RENDER_ORIENTED_PREFIXES } from '../mss/logging/render-categories.js';
|
|
37
37
|
import { readScopedRenderLogs } from '../mss/logging/scoped-level.js';
|
|
38
38
|
import { formatClock } from '../time/format.js';
|
|
39
|
+
import '../user-config.js'; // Register the saved timezone for standalone logs CLI formatting.
|
|
39
40
|
import { HARNESS_SPACE_KINDS } from '../harness/harness-space.js';
|
|
40
41
|
import { LOG_RETENTION_DEFAULTS, LogCursorNotFoundError, STORE_SAFETY_MAX } from '../mss/logging/log-store.js';
|
|
41
42
|
import { resolveDaemonEndpoint } from '../nexus/daemon-endpoint.js';
|
package/src/cli/mcp-login.ts
CHANGED
|
@@ -5,9 +5,11 @@ import { getUserConfig, reloadUserConfig, saveUserConfig, type McpServerSpec } f
|
|
|
5
5
|
import {
|
|
6
6
|
discoverMcpOAuth,
|
|
7
7
|
exchangeAuthorizationCode,
|
|
8
|
+
ensureClientRegistration,
|
|
8
9
|
loadStoredRegistration,
|
|
9
10
|
loopbackRedirectPort,
|
|
10
11
|
prepareMcpOAuthAuthorization,
|
|
12
|
+
authorizeMcpDevice,
|
|
11
13
|
type McpOAuthFetch,
|
|
12
14
|
} from '../mcp/mcp-oauth.js';
|
|
13
15
|
import { parseWwwAuthenticate } from '../mcp/client.js';
|
|
@@ -31,7 +33,15 @@ export interface McpLoginOpts {
|
|
|
31
33
|
out?: Output;
|
|
32
34
|
readConfigFn?: () => { mcp?: { servers: McpServerSpec[] } };
|
|
33
35
|
fetch?: McpOAuthFetch;
|
|
36
|
+
storePath?: string;
|
|
34
37
|
openBrowser?: (url: string) => Promise<void>;
|
|
38
|
+
/** Aside browser agent; failures fall back to the existing browser flow. */
|
|
39
|
+
approveBrowser?: (url: string) => Promise<void>;
|
|
40
|
+
/** How long to wait for the approval callback after aside returns before falling back to the browser. */
|
|
41
|
+
asideCallbackGraceMs?: number;
|
|
42
|
+
/** Device-poll timing seam (test only). */
|
|
43
|
+
deviceSleep?: (ms: number) => Promise<void>;
|
|
44
|
+
deviceNow?: () => number;
|
|
35
45
|
browserEnv?: NodeJS.ProcessEnv;
|
|
36
46
|
browserPlatform?: NodeJS.Platform;
|
|
37
47
|
createListener?: (handler: (req: IncomingMessage, res: ServerResponse) => void) => Server;
|
|
@@ -69,21 +79,58 @@ export async function runMcpLogin(opts: McpLoginOpts): Promise<McpLoginResult> {
|
|
|
69
79
|
|
|
70
80
|
let server: Server | undefined;
|
|
71
81
|
try {
|
|
72
|
-
const
|
|
73
|
-
|
|
82
|
+
const why = browserUnavailableReason(opts.browserEnv ?? process.env, opts.browserPlatform ?? process.platform);
|
|
83
|
+
const oauthOpts = { ...(opts.fetch ? { fetch: opts.fetch } : {}), ...(opts.storePath ? { storePath: opts.storePath } : {}) };
|
|
84
|
+
const early = why && !opts.createListener ? undefined : await listenForCallback(opts.createListener, 0);
|
|
85
|
+
server = early?.server;
|
|
74
86
|
const challenge = await requestChallenge(spec.url, opts.fetch);
|
|
75
87
|
if (!challenge.resourceMetadata) {
|
|
76
88
|
out.error(`✗ server '${opts.serverId}' did not provide a 401 Bearer resource_metadata challenge`);
|
|
77
89
|
return { exitCode: 1 };
|
|
78
90
|
}
|
|
91
|
+
const discovered = await discoverMcpOAuth(challenge.resourceMetadata, {
|
|
92
|
+
resourceUrl: spec.url, ...oauthOpts,
|
|
93
|
+
});
|
|
94
|
+
if ((why || !discovered.metadata.authorizationEndpoint) && discovered.metadata.deviceAuthorizationEndpoint) {
|
|
95
|
+
if (early?.server.listening) await closeServer(early.server);
|
|
96
|
+
if (why) out.log(why);
|
|
97
|
+
const stored = loadStoredRegistration(discovered.metadata.issuer, oauthOpts);
|
|
98
|
+
const deviceRegistration = await ensureClientRegistration(discovered.metadata, { ...oauthOpts, deviceCode: true });
|
|
99
|
+
const authorizeDevice = (registration: typeof deviceRegistration) => authorizeMcpDevice(discovered.metadata, registration, {
|
|
100
|
+
scope: challenge.scope,
|
|
101
|
+
resource: discovered.resource.resource,
|
|
102
|
+
...oauthOpts,
|
|
103
|
+
...(opts.deviceSleep ? { sleep: opts.deviceSleep } : {}),
|
|
104
|
+
...(opts.deviceNow ? { now: opts.deviceNow } : {}),
|
|
105
|
+
onDeviceCode: ({ userCode, verificationUri, verificationUriComplete }) => {
|
|
106
|
+
out.log(`Authorize '${opts.serverId}' at ${verificationUriComplete ?? verificationUri}`);
|
|
107
|
+
out.log(`Device code: ${userCode}`);
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
try {
|
|
111
|
+
await authorizeDevice(deviceRegistration);
|
|
112
|
+
} catch (error) {
|
|
113
|
+
// A reused client the server does not accept for the device grant (e.g. an old browser client stored
|
|
114
|
+
// without its loopback URI) gets one fresh device registration; anything else fails as before.
|
|
115
|
+
const reused = stored?.clientId === deviceRegistration.clientId;
|
|
116
|
+
if (!reused || !discovered.metadata.registrationEndpoint || !/\((?:unauthorized_client|invalid_client)\)/.test(String(error))) throw error;
|
|
117
|
+
await authorizeDevice(await ensureClientRegistration(discovered.metadata, { ...oauthOpts, deviceCode: true, forceReregister: true }));
|
|
118
|
+
}
|
|
119
|
+
out.log(`✓ credentials saved for '${opts.serverId}' (${discovered.metadata.issuer})`);
|
|
120
|
+
persistLoginDiscovery(opts, discovered.metadata, out);
|
|
121
|
+
return { exitCode: 0 };
|
|
122
|
+
}
|
|
123
|
+
const callbackListener = early ?? await listenForCallback(opts.createListener, 0);
|
|
124
|
+
server = callbackListener.server;
|
|
79
125
|
const opened = await openLoginListener({
|
|
80
|
-
early,
|
|
126
|
+
early: callbackListener,
|
|
81
127
|
serverId: opts.serverId,
|
|
82
128
|
resourceMetadataUrl: challenge.resourceMetadata,
|
|
83
129
|
...(challenge.scope ? { scope: challenge.scope } : {}),
|
|
84
130
|
resourceUrl: spec.url,
|
|
85
|
-
...
|
|
131
|
+
...oauthOpts,
|
|
86
132
|
...(opts.createListener ? { createListener: opts.createListener } : {}),
|
|
133
|
+
onListener: (openedServer) => { server = openedServer; },
|
|
87
134
|
});
|
|
88
135
|
const listener = opened.listener;
|
|
89
136
|
server = listener.server;
|
|
@@ -94,47 +141,39 @@ export async function runMcpLogin(opts: McpLoginOpts): Promise<McpLoginResult> {
|
|
|
94
141
|
void callbackPromise.catch(() => undefined);
|
|
95
142
|
out.log(`Open this URL to authorize '${opts.serverId}':`);
|
|
96
143
|
out.log(authorization.request.url);
|
|
97
|
-
const why = browserUnavailableReason(opts.browserEnv ?? process.env, opts.browserPlatform ?? process.platform);
|
|
98
144
|
if (why) {
|
|
99
145
|
out.log(why);
|
|
100
146
|
debug.log('browser.open', 'skipped', { reason: why.includes('ssh') ? 'ssh' : 'no-display' });
|
|
101
147
|
} else {
|
|
102
148
|
try {
|
|
103
|
-
|
|
149
|
+
if (opts.approveBrowser || !opts.openBrowser) {
|
|
150
|
+
await (opts.approveBrowser ?? approveWithAside)(authorization.request.url);
|
|
151
|
+
// A clean aside exit is not an approval: only the loopback callback is. If it has not arrived
|
|
152
|
+
// shortly after aside finished, fall back to the browser (the listener stays open for it).
|
|
153
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
154
|
+
const arrived = await Promise.race([
|
|
155
|
+
callbackPromise.then(() => true, () => true),
|
|
156
|
+
new Promise<boolean>((resolve) => { timer = setTimeout(() => resolve(false), opts.asideCallbackGraceMs ?? 15_000); }),
|
|
157
|
+
]);
|
|
158
|
+
if (timer) clearTimeout(timer);
|
|
159
|
+
if (!arrived) throw new Error('aside finished without an approval callback');
|
|
160
|
+
} else await opts.openBrowser(authorization.request.url);
|
|
104
161
|
} catch {
|
|
105
|
-
|
|
162
|
+
if (!opts.approveBrowser && opts.openBrowser) {
|
|
163
|
+
out.error('Could not open the default browser; open the URL above manually.');
|
|
164
|
+
} else {
|
|
165
|
+
try {
|
|
166
|
+
await (opts.openBrowser ?? openDefaultBrowser)(authorization.request.url);
|
|
167
|
+
} catch {
|
|
168
|
+
out.error('Could not open the default browser; open the URL above manually.');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
106
171
|
}
|
|
107
172
|
}
|
|
108
173
|
const callback = await callbackPromise;
|
|
109
|
-
await exchangeAuthorizationCode(authorization.metadata, authorization.request, callback,
|
|
110
|
-
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
111
|
-
});
|
|
174
|
+
await exchangeAuthorizationCode(authorization.metadata, authorization.request, callback, oauthOpts);
|
|
112
175
|
out.log(`✓ credentials saved for '${opts.serverId}' (${authorization.metadata.issuer})`);
|
|
113
|
-
|
|
114
|
-
//
|
|
115
|
-
// 초판은 issuer 를 «화면에 찍고 끝»이었다. 그런데 자격증명 저장소는
|
|
116
|
-
// issuer 를 «키»로 쓰고(`getValidAccessToken(issuer, …)`), 데몬은 그
|
|
117
|
-
// issuer 를 오직 config 의 `mcp.servers[].oauthIssuer` 에서만 얻는다
|
|
118
|
-
// (`register-mcp-clients.ts` 는 spec 에 «있을 때만» 넘기고,
|
|
119
|
-
// `McpClient.oauthAccessToken()` 은 `if (!this.oauthIssuer) return null`).
|
|
120
|
-
//
|
|
121
|
-
// ⇒ 그래서 `mcp login` 이 «성공하고 ✓ 를 찍어도» 사람이 config 를 손으로
|
|
122
|
-
// 고치지 않으면 그 토큰은 영영 안 쓰인다. 2026-09-10 에 krea 를 붙이며
|
|
123
|
-
// 실제로 그 두 줄을 손으로 박았다. 「로그인했는데 도구가 0개」의 원인이다.
|
|
124
|
-
const persist = (opts.persistDiscoveryFn ?? persistDiscoveredIssuer)({
|
|
125
|
-
serverId: opts.serverId,
|
|
126
|
-
issuer: authorization.metadata.issuer,
|
|
127
|
-
...(authorization.metadata.tokenEndpoint ? { tokenEndpoint: authorization.metadata.tokenEndpoint } : {}),
|
|
128
|
-
});
|
|
129
|
-
if (persist.error) {
|
|
130
|
-
// ⛔ 자격증명은 «이미 저장됐다» — 되쓰기 실패로 로그인 자체를 실패로 접으면
|
|
131
|
-
// 사람이 같은 브라우저 왕복을 또 한다. 경고로 내고 손 처방을 같이 준다.
|
|
132
|
-
out.error(`⚠ config 에 oauthIssuer 를 못 적었습니다: ${persist.error}`);
|
|
133
|
-
out.error(` 손으로: mcp.servers[] 의 '${opts.serverId}' 칸에 "oauthIssuer": "${authorization.metadata.issuer}" 를 더하세요.`);
|
|
134
|
-
} else if (persist.written) {
|
|
135
|
-
out.log(`✓ config 갱신 — '${opts.serverId}'.oauthIssuer = ${authorization.metadata.issuer}`);
|
|
136
|
-
}
|
|
137
|
-
out.log(` 도는 데몬에 반영하려면: elanous mcp reload`);
|
|
176
|
+
persistLoginDiscovery(opts, authorization.metadata, out);
|
|
138
177
|
return { exitCode: 0 };
|
|
139
178
|
} catch (error) {
|
|
140
179
|
const stage = loginFailureStage(error);
|
|
@@ -146,8 +185,29 @@ export async function runMcpLogin(opts: McpLoginOpts): Promise<McpLoginResult> {
|
|
|
146
185
|
out.error(`✗ MCP login failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
147
186
|
return { exitCode: 1 };
|
|
148
187
|
} finally {
|
|
149
|
-
if (server) await closeServer(server);
|
|
188
|
+
if (server?.listening) await closeServer(server);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function persistLoginDiscovery(
|
|
193
|
+
opts: McpLoginOpts,
|
|
194
|
+
metadata: { issuer: string; tokenEndpoint: string },
|
|
195
|
+
out: Output,
|
|
196
|
+
): void {
|
|
197
|
+
// ⭐⭐ issuer 를 config 에도 적어야 저장한 토큰을 데몬이 찾는다.
|
|
198
|
+
const persist = (opts.persistDiscoveryFn ?? persistDiscoveredIssuer)({
|
|
199
|
+
serverId: opts.serverId,
|
|
200
|
+
issuer: metadata.issuer,
|
|
201
|
+
tokenEndpoint: metadata.tokenEndpoint,
|
|
202
|
+
});
|
|
203
|
+
if (persist.error) {
|
|
204
|
+
// 자격은 이미 저장됐다. config 쓰기 실패는 경고로 남긴다.
|
|
205
|
+
out.error(`⚠ config 에 oauthIssuer 를 못 적었습니다: ${persist.error}`);
|
|
206
|
+
out.error(` 손으로: mcp.servers[] 의 '${opts.serverId}' 칸에 "oauthIssuer": "${metadata.issuer}" 를 더하세요.`);
|
|
207
|
+
} else if (persist.written) {
|
|
208
|
+
out.log(`✓ config 갱신 — '${opts.serverId}'.oauthIssuer = ${metadata.issuer}`);
|
|
150
209
|
}
|
|
210
|
+
out.log(` 도는 데몬에 반영하려면: elanous mcp reload`);
|
|
151
211
|
}
|
|
152
212
|
|
|
153
213
|
async function requestChallenge(url: string, fetchFn?: McpOAuthFetch): Promise<{ resourceMetadata?: string; scope?: string }> {
|
|
@@ -175,7 +235,9 @@ async function openLoginListener(opts: {
|
|
|
175
235
|
scope?: string;
|
|
176
236
|
resourceUrl: string;
|
|
177
237
|
fetch?: McpOAuthFetch;
|
|
238
|
+
storePath?: string;
|
|
178
239
|
createListener?: McpLoginOpts['createListener'];
|
|
240
|
+
onListener?: (server: Server) => void;
|
|
179
241
|
early: Awaited<ReturnType<typeof listenForCallback>>;
|
|
180
242
|
}): Promise<{ listener: Awaited<ReturnType<typeof listenForCallback>>; authorization: Awaited<ReturnType<typeof prepareMcpOAuthAuthorization>> }> {
|
|
181
243
|
const prior = await priorRegistration(opts);
|
|
@@ -189,6 +251,7 @@ async function openLoginListener(opts: {
|
|
|
189
251
|
redirectUri: listener.redirectUri,
|
|
190
252
|
resourceUrl: opts.resourceUrl,
|
|
191
253
|
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
254
|
+
...(opts.storePath ? { storePath: opts.storePath } : {}),
|
|
192
255
|
});
|
|
193
256
|
return { listener, authorization };
|
|
194
257
|
}
|
|
@@ -196,6 +259,7 @@ async function openLoginListener(opts: {
|
|
|
196
259
|
if (preferred !== null) {
|
|
197
260
|
try {
|
|
198
261
|
const listener = await listenForCallback(opts.createListener, preferred);
|
|
262
|
+
opts.onListener?.(listener.server);
|
|
199
263
|
debug.log('mcp.login', 'callback-port', { serverId: opts.serverId, source: 'registered' });
|
|
200
264
|
const authorization = await prepareMcpOAuthAuthorization({
|
|
201
265
|
resourceMetadataUrl: opts.resourceMetadataUrl,
|
|
@@ -203,6 +267,7 @@ async function openLoginListener(opts: {
|
|
|
203
267
|
redirectUri: listener.redirectUri,
|
|
204
268
|
resourceUrl: opts.resourceUrl,
|
|
205
269
|
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
270
|
+
...(opts.storePath ? { storePath: opts.storePath } : {}),
|
|
206
271
|
});
|
|
207
272
|
return { listener, authorization };
|
|
208
273
|
} catch (error) {
|
|
@@ -210,6 +275,7 @@ async function openLoginListener(opts: {
|
|
|
210
275
|
}
|
|
211
276
|
}
|
|
212
277
|
const listener = await listenForCallback(opts.createListener, 0);
|
|
278
|
+
opts.onListener?.(listener.server);
|
|
213
279
|
debug.log('mcp.login', 'callback-port', {
|
|
214
280
|
serverId: opts.serverId,
|
|
215
281
|
source: 'reregistered',
|
|
@@ -221,6 +287,7 @@ async function openLoginListener(opts: {
|
|
|
221
287
|
redirectUri: listener.redirectUri,
|
|
222
288
|
resourceUrl: opts.resourceUrl,
|
|
223
289
|
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
290
|
+
...(opts.storePath ? { storePath: opts.storePath } : {}),
|
|
224
291
|
forceReregister: true,
|
|
225
292
|
});
|
|
226
293
|
return { listener, authorization };
|
|
@@ -230,13 +297,14 @@ async function priorRegistration(opts: {
|
|
|
230
297
|
resourceMetadataUrl: string;
|
|
231
298
|
resourceUrl: string;
|
|
232
299
|
fetch?: McpOAuthFetch;
|
|
300
|
+
storePath?: string;
|
|
233
301
|
}): Promise<ReturnType<typeof loadStoredRegistration>> {
|
|
234
302
|
try {
|
|
235
303
|
const discovered = await discoverMcpOAuth(opts.resourceMetadataUrl, {
|
|
236
304
|
resourceUrl: opts.resourceUrl,
|
|
237
305
|
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
238
306
|
});
|
|
239
|
-
return loadStoredRegistration(discovered.metadata.issuer);
|
|
307
|
+
return loadStoredRegistration(discovered.metadata.issuer, opts);
|
|
240
308
|
} catch {
|
|
241
309
|
return null;
|
|
242
310
|
}
|
|
@@ -368,6 +436,12 @@ async function closeServer(server: Server): Promise<void> {
|
|
|
368
436
|
await new Promise<void>((resolve) => server.close(() => resolve()));
|
|
369
437
|
}
|
|
370
438
|
|
|
439
|
+
async function approveWithAside(url: string): Promise<void> {
|
|
440
|
+
// Aside decides how to interact with the provider page; only the state-checked
|
|
441
|
+
// loopback callback (not the agent's answer) can complete this login.
|
|
442
|
+
await execFileAsync('aside', ['exec', '--effort', 'low', `Open this OAuth authorization URL in your browser and approve access for elanous: ${url}. Do not reveal passwords, codes or tokens in your response.`], { timeout: 90_000 });
|
|
443
|
+
}
|
|
444
|
+
|
|
371
445
|
async function openDefaultBrowser(url: string): Promise<void> {
|
|
372
446
|
const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
|
|
373
447
|
const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
|
package/src/cli/plugin-cli.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
6
6
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
7
7
|
import { userConfigPath } from '../user-config.js';
|
|
8
8
|
import { debug, redactSecretText } from '../debug/log.js';
|
|
9
|
-
import { addMarket, listMarkets, MarketFetchError, updateMarket } from '../plugins/install/market-fetch.js';
|
|
9
|
+
import { addMarket, ensureInternalMarketIndex, listMarkets, MarketFetchError, updateMarket } from '../plugins/install/market-fetch.js';
|
|
10
10
|
import { emitDecision } from '../live/detail-switch.js';
|
|
11
11
|
import { OFFICIAL_INDEX_KEYS } from '../market/official-keys.js';
|
|
12
12
|
import { installPlugin, listInstalledPlugins, PluginInstallError, removePlugin, type InstallEvent } from '../plugins/install/plugin-install.js';
|
|
@@ -145,6 +145,26 @@ export function registerPluginCommands(program: Command): void {
|
|
|
145
145
|
}
|
|
146
146
|
});
|
|
147
147
|
const market = plugin.command('market').description('Manage signed plugin marketplaces');
|
|
148
|
+
market.command('internal <name> <enterpriseId>').description('Fetch signed entries from a configured internal HTTPS market for an allowed enterprise')
|
|
149
|
+
.option('--refresh', 'Refresh the signed internal market index')
|
|
150
|
+
.option('--json', 'Print verified knowledge packs and loop bundles as JSON')
|
|
151
|
+
.action(async (name: string, enterpriseId: string, opts: { refresh?: boolean; json?: boolean }) => {
|
|
152
|
+
try {
|
|
153
|
+
const root = elanousStateRoot();
|
|
154
|
+
const result = await ensureInternalMarketIndex(name, enterpriseId, {
|
|
155
|
+
root, marketDir: join(root, 'plugins', 'markets'), refresh: opts.refresh,
|
|
156
|
+
});
|
|
157
|
+
const entries = { name: result.market.name, enterpriseId, sequence: result.index.sequence,
|
|
158
|
+
knowledgePacks: result.index.knowledgePacks ?? [], loopBundles: result.index.loopBundles ?? [] };
|
|
159
|
+
debug.log('plugin.cli', 'market.internal', { name: result.market.name, sequence: result.index.sequence });
|
|
160
|
+
if (opts.json) stdout.write(JSON.stringify(entries) + '\n');
|
|
161
|
+
else console.log(`Fetched internal market ${entries.name} (sequence ${entries.sequence}): ${entries.knowledgePacks.length} knowledge packs, ${entries.loopBundles.length} loop bundles`);
|
|
162
|
+
} catch (error) {
|
|
163
|
+
if (opts.json) stdout.write(JSON.stringify({ event: 'failed', cause: safeCause(error) }) + '\n');
|
|
164
|
+
else console.error(`plugin market internal failed: ${safeCause(error)}`);
|
|
165
|
+
process.exitCode = 1;
|
|
166
|
+
}
|
|
167
|
+
});
|
|
148
168
|
market.command('add <name> <url>').description('Register a marketplace URL')
|
|
149
169
|
.action((name: string, url: string) => {
|
|
150
170
|
try {
|
package/src/cli/pod-cli.ts
CHANGED
|
@@ -33,6 +33,27 @@ const HELP = `elanous pod run [--pool <스펙>] [--skill <이름,…>] [--llm gr
|
|
|
33
33
|
하니스 없이 명령 하나를 Pod 에서 돌리고 산출 경로를 한 줄로 알린다.
|
|
34
34
|
--deadline 생략 시 ${POD_COMMAND_DEADLINE_SECONDS}초(기존 Pod Job 수명 상한).`;
|
|
35
35
|
|
|
36
|
+
/** clone 트리는 `bun install` 없이 뜨므로 `bun test`·`bun run` 은 «Cannot find package» 로 실패한다
|
|
37
|
+
* (실측 2026-10-10 21:47 node-b · `pod run --clone -- bun test src/steward/launch.test.ts` → 1 fail ·
|
|
38
|
+
* 설치만 붙여 다시 치니 58초 Completed). Pod 문제로 오인하기 쉬워 «발사 전»에 한 줄로 알린다 — 발사는 막지 않는다. */
|
|
39
|
+
export const POD_CLONE_WITHOUT_INSTALL_WARNING =
|
|
40
|
+
'⚠ --clone 트리에는 node_modules 가 없다 — 시험이면 sh -c "bun install --frozen-lockfile && <명령>" 꼴로 감싸라';
|
|
41
|
+
|
|
42
|
+
/** `--clone` ⊕ 명령 첫 낱말이 `bun` ⊕ 둘째가 `test`·`run` ⊕ 명령 어디에도 `install` 낱말(토큰)이 없으면 경고 대상이다. */
|
|
43
|
+
export function podCloneWithoutInstallWarning(
|
|
44
|
+
commandArgs: readonly string[],
|
|
45
|
+
clone: boolean | undefined,
|
|
46
|
+
): string | null {
|
|
47
|
+
if (!clone) return null;
|
|
48
|
+
const [argv0, argv1] = commandArgs;
|
|
49
|
+
if (argv0 !== 'bun') return null;
|
|
50
|
+
if (argv1 !== 'test' && argv1 !== 'run') return null;
|
|
51
|
+
// Exact argv token only: `installation.test.ts` or a single `install helper` argument is not an install
|
|
52
|
+
// (a shell string like `sh -c "bun install && …"` never reaches here — its argv0 is `sh`).
|
|
53
|
+
if (commandArgs.includes('install')) return null;
|
|
54
|
+
return POD_CLONE_WITHOUT_INSTALL_WARNING;
|
|
55
|
+
}
|
|
56
|
+
|
|
36
57
|
export function registerPodCommands(program: Command, deps: PodCliDeps = {}): void {
|
|
37
58
|
const io = deps.io ?? {
|
|
38
59
|
log: (line: string) => console.log(line),
|
|
@@ -148,6 +169,11 @@ export function registerPodCommands(program: Command, deps: PodCliDeps = {}): vo
|
|
|
148
169
|
}
|
|
149
170
|
}
|
|
150
171
|
const skills = (opts.skill ?? '').split(',').map((s) => s.trim()).filter(Boolean);
|
|
172
|
+
const cloneWarning = podCloneWithoutInstallWarning(commandArgs, opts.clone);
|
|
173
|
+
if (cloneWarning !== null) {
|
|
174
|
+
io.error(cloneWarning);
|
|
175
|
+
debug.log('pod.run', 'clone-without-install', { argv0: commandArgs[0], argv1: commandArgs[1] });
|
|
176
|
+
}
|
|
151
177
|
try {
|
|
152
178
|
const result = await run({
|
|
153
179
|
command: commandArgs,
|