elanous 0.2.19 → 0.2.21
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/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/MObU8ujkMciAKr6ljAV05/_buildManifest.js +1 -0
- package/apps/pwa/out/_next/static/chunks/088d8e8a.8069543d082bec12.js +160 -0
- package/apps/pwa/out/_next/static/chunks/1109.78a7a3288c0259d9.js +148 -0
- package/apps/pwa/out/_next/static/chunks/115.1c6690b8604f81c4.js +32 -0
- package/apps/pwa/out/_next/static/chunks/119fc678.6f591cdb84ca5791.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1262.76a3f08e67c5f816.js +309 -0
- package/apps/pwa/out/_next/static/chunks/{4323.c5dfb6f503304775.js → 1268.0840ff91e083fcbd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1307-c97eba9fb72a9a5e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1358d292.5c87f12cad6eaa91.js +122 -0
- package/apps/pwa/out/_next/static/chunks/1438.27a1a7b8f2308004.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1442.02d85cd88f4c1eac.js +79 -0
- package/apps/pwa/out/_next/static/chunks/1501-1aad662d82ba43f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1584.9e2dd53da6e6d4b1.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1586.b989b0614afb77e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1609.2ad355062870151f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1612-f6df0fc0eed7157b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1826-5d279da64bbbc2de.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1923.37f1d5fe7ebe3860.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1948.5f35b39eef222a94.js +5 -0
- package/apps/pwa/out/_next/static/chunks/195-fb1d7690bf30bab4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1986-33e13d648a9df765.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1993.3fd074a2a246234e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2977-e38442e86289f1d3.js → 211-9c9090c59e2c5907.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2140.d2daf9ee96e295d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2196-4700653d12a44b40.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2212.0359851457473efc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/224.583e562365a52f74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2328.0f37465646bafa7d.js +36 -0
- package/apps/pwa/out/_next/static/chunks/2372.bf71372184991937.js +286 -0
- package/apps/pwa/out/_next/static/chunks/2489-ff55a35b202c0f94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2537-6c289376caa88ca1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2549-a8515c86f9e8cb96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2655.72cc6a97276c5acc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2699-325cc923ba7b8631.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2743-ef6e8c3ced74cce5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2840-5458ad50c49cac6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2856.f75d5baef7f49b74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/311.e685738f92e6e2ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3194-807b212fb8eae065.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3324-d1d2979821dfa845.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3344.0de4b0ec5a454b7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/335.a13f339e97893437.js +94 -0
- package/apps/pwa/out/_next/static/chunks/3394.646348f34b2500be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3443.6276909b53d72d53.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3495.abd4254d808bf2dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3522-1de1319d028ac89c.js +25 -0
- package/apps/pwa/out/_next/static/chunks/3558-bbb5ab553a0471d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3721.ba5b82db0d9a5572.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3857-995ea9f5ef33d71e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3916-3d02dd1fc257dd3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3919.9ff7dc25afefee33.js +74 -0
- package/apps/pwa/out/_next/static/chunks/3998.bd9a69d9b50e9bd2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4003.ab6db1dc266576c9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4144-fad095b48a1862ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4216.e8ac94b9fe6b96ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4327.c44dc2b55cb43ee5.js +34 -0
- package/apps/pwa/out/_next/static/chunks/4401.94257d497b6d26bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4559.17ca2cdbaa8d414f.js +115 -0
- package/apps/pwa/out/_next/static/chunks/4565-3d7e3fdeb43686a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4588.ad3364cb7fb97ada.js +86 -0
- package/apps/pwa/out/_next/static/chunks/4706.97e734bd4c9816ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4795-f372490b178583fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4982.6e44352f751b9a1b.js +77 -0
- package/apps/pwa/out/_next/static/chunks/5342.49c5c5a530e62b50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5360-08a80abdf3a4da99.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5431.66c58ab1327ee0b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5717.bcfcb96e701b82e0.js +90 -0
- package/apps/pwa/out/_next/static/chunks/5755-30d102586789bf7f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5957.3f1a4012388dd962.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5977-59fedea50d13c762.js +1 -0
- package/apps/pwa/out/_next/static/chunks/602.9bf02ac8e9502598.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6020.3a1b347e2d2dfacc.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{4847.56f5bc454fbcc827.js → 6110.1297d4093fdfbb0d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6158.566c890adc06a459.js +2 -0
- package/apps/pwa/out/_next/static/chunks/6375.fce1d174ba6d0324.js +64 -0
- package/apps/pwa/out/_next/static/chunks/6546.92a828aef441271f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/658.957fdb0a8c6c6c8e.js +287 -0
- package/apps/pwa/out/_next/static/chunks/6706.323590aabb8b1293.js +226 -0
- package/apps/pwa/out/_next/static/chunks/6747.b67947f293a4c02d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6767.8e6c5f6e744fcd9f.js +38 -0
- package/apps/pwa/out/_next/static/chunks/6868.000b24a3045c5574.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6877-74399f69c7da1433.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6946.bba74e9c96050f30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7033.a558f1b2f6912a53.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7065.46029c26c53eac50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7087.6fae577d09249bc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7175-350f4ce2873bc038.js +1 -0
- package/apps/pwa/out/_next/static/chunks/722.de8d9801e0f6d414.js +41 -0
- package/apps/pwa/out/_next/static/chunks/{1470.98a6ab61ccb4131c.js → 726.83532d69452ee24b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7290-f09c928a06c52e2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6062-73e68343a9814f6a.js → 7327-2d69fb321ba73389.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7497.57981e9d7a75a52a.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7630.2b9a68659053ff4e.js +193 -0
- package/apps/pwa/out/_next/static/chunks/7672.4af122ad892117c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/771.6ab889a233e7dae7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7797-df5aa0381fdc078f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7899.597af4a9996c907f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/79b78388.663188133449d707.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8060-cc008cc6fedfa818.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8085-d065d0393c1760f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8096.f7da0776cfde6300.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8194.484f51e273d9abd2.js +217 -0
- package/apps/pwa/out/_next/static/chunks/8401-35e94e9091f5eb8d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8682-7061dd4fa7bd62ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8695-846034ce44852c70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8769.815ca69879f608b4.js +104 -0
- package/apps/pwa/out/_next/static/chunks/8857-f1762140ef9a96b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/88729267.9c6c000157c83f2f.js +62 -0
- package/apps/pwa/out/_next/static/chunks/8f835b4f.048eeb02299e3e12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9068.5f2764fccf86c1b2.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9070.067c106528ec1ae6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9103-60fbef33e66f0a46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9247-7581825d511a64c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7647.2fcd30d894d5ee30.js → 935.4ddaa99fc1d1126c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9451.ebfb0dcc9c02250f.js +23 -0
- package/apps/pwa/out/_next/static/chunks/9497-b0e758d1cd4ae8d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9559.e648369b1d57cf9a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/9832.2ab2e818013574c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/a9f2b54d-40c16bd0efdb04b8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c1a96669158471ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-937c92292a4ab4f0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-d781be3e3a9cfd74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b0a80997903852d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-2b1263165630d9c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ea998f7f5d156bea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-33c328b64ca508f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e2d6bed48ac20120.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-111cabe4d1fd69ae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-544dd4bd4847eeb7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-3ee191319bf97d87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e4bcb2c503dab04b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-300897dcbbd5ed76.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-a449f1ed472b81c2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-9045094d6d3b5cd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c1a96669158471ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-c06673596849ef45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-103fa3191c1b2e08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-9f81233f29dcd409.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/{page-b70cd005d9169e25.js → page-be8b4615c919e36c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-c685b104e0dfa609.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-8d693331cfbb6add.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-cef4f30a4c22fae1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66ea1b54fc83fa15.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-7a12f61be4a579d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-c85b0589591a99c9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-725a4da02dd129eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-8cc707bd09a497d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-90b55be1f15ce0e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cb16606e08be65db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-16dc64b74ed6a40a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-21bec4afeb2f0917.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-dc39ee7a36d26385.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-84ae759f76053672.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-3db58ddb61fe2be9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c5315e30f3528dc4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-2fe368efb6de3b6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8d04132dd0ac5e10.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c1a96669158471ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-f23484de467c9ea3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-c69762987b751174.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-5456692bda39aafb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d75f7cd65845ce98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-5603f5e568b25ce3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-d2cc0f4e89f42028.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a6eb73b8a4840f1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-c0a3f4d10edb83fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6c0b88068c143f15.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-7f8d7fcdf058a845.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-22163556cd38bc88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-141436fd26dd56fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/d70879db.c66c56a95a91efc6.js +66 -0
- package/apps/pwa/out/_next/static/chunks/{8046cadf-211ca3c0e00f2b72.js → f6231284-45726550aba08fca.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2ea96958.e8c7e112de50b067.js → f6b7c9ba.64a895b8b2fedbdc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/f8626309.a4e5d362b1d55e59.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-5c169757551134ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-59fe95fed40c7a01.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-4ca74dbbee7057c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-13a0a886df4d97a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-6af8591cd3a3f038.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-f2b4016b9b981bc8.js +1 -0
- package/apps/pwa/out/_next/static/css/{d3427996da11e480.css → b9d8151e48998417.css} +1 -1
- package/apps/pwa/out/_next/static/css/e81df11490b4413b.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 -24
- 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 +23 -23
- 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 -0
- package/apps/pwa/out/live-run/index.txt +35 -0
- 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/graphs/demo/editor-recipes.yaml +22 -0
- package/graphs/drafts/recipes.yaml +4 -4
- package/graphs/implement-loop.yaml +277 -5
- package/graphs/retro/daily.yaml +25 -0
- package/graphs/retro/recipes.yaml +24 -0
- package/package.json +1 -1
- package/scripts/ask-marker-check.ts +3 -1
- package/scripts/coord-channel-watch.sh +31 -4
- package/scripts/docs-lint.ts +4 -1
- package/scripts/land-global-checks.ts +89 -0
- package/scripts/lib/pch-regress-map.ts +2 -1
- package/scripts/marketing/generate-ax-brief.ts +18 -1
- package/scripts/measure-nl-routing-corpus.ts +11 -3
- package/scripts/release-loop/gate-node.ts +296 -25
- package/scripts/release-loop/gate-timing.ts +116 -7
- package/scripts/release-loop/preflight.ts +6 -4
- package/scripts/release-loop/publish-window.ts +141 -0
- package/scripts/release-loop/release-docs.ts +1 -4
- package/scripts/release-loop/release-universe.ts +38 -0
- package/scripts/release-loop/resume-release.ts +4 -1
- package/scripts/release-loop/shard-plan.ts +50 -5
- package/scripts/release-loop/unattended-release.ts +10 -2
- package/scripts/release-story/draft.ts +5 -1
- package/scripts/retro/shadow-compare.ts +71 -0
- package/scripts/rhythm/daily.ts +8 -2
- package/src/agent-mission/driver.ts +34 -6
- package/src/autopilot/build/llm-conflict-merge.ts +132 -7
- package/src/autopilot/build/merge-intent.ts +135 -7
- package/src/away/release-watch.ts +20 -3
- package/src/browser-cdp/client.ts +10 -5
- package/src/cli/config-drift.ts +513 -0
- package/src/cli/log-event-names.ts +4 -0
- package/src/cli/ops-cli.ts +11 -0
- package/src/cli/ops-overview-cli.ts +50 -0
- package/src/cli/pod-cli.ts +1 -0
- package/src/cli/pr-cli.ts +20 -0
- package/src/cli/release-cli.ts +20 -5
- package/src/cli/retro-cli.ts +78 -0
- package/src/cli/tasks-cli.ts +200 -8
- package/src/dashboard/index.ts +40 -4
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +5 -4
- package/src/dashboard/slash-runtime/help-from-registry.ts +57 -31
- package/src/domains/outbound-log-probe.ts +6 -1
- package/src/esc-abort-gate.ts +3 -1
- package/src/graph-runner/graph-cli.ts +57 -0
- package/src/graph-runner/graph-run-api.ts +218 -0
- package/src/graph-runner/runner.ts +11 -1
- package/src/graph-wizard/archetypes.ts +88 -0
- package/src/graph-wizard/generate.ts +545 -0
- package/src/graph-wizard/saved-steps.ts +120 -0
- package/src/graph-wizard/steps.ts +193 -0
- package/src/harness/harness-cli-command.ts +482 -59
- package/src/harness/harness-queue.ts +315 -25
- package/src/harness/harness-salvage-cli.ts +62 -0
- package/src/hq/fence-outcomes.ts +63 -0
- package/src/hq/fence-wrapper.ts +33 -0
- package/src/hq/hq.ts +11 -1
- package/src/index.ts +76 -10
- package/src/intake-plane/digest.ts +18 -11
- package/src/maturity/feature-maturity.ts +4 -3
- package/src/nexus/api/draft-metrics.ts +114 -0
- package/src/nexus/api/graph-kinds.ts +10 -4
- package/src/nexus/api/graph-wizard-api.ts +53 -0
- package/src/nexus/api/graphs-api.ts +220 -10
- package/src/nexus/api/harness-traversal.ts +205 -0
- package/src/nexus/api/http-server.ts +69 -3
- package/src/nexus/api/loop-edges.ts +4 -2
- package/src/nexus/api/ops-api.ts +22 -7
- package/src/nexus/api/ops-board-route.ts +48 -0
- package/src/nexus/outbound/router.ts +28 -8
- package/src/onboarding/entry-hints.ts +5 -0
- package/src/onboarding/first-run.ts +3 -0
- package/src/onboarding.ts +24 -6
- package/src/ops/overview-collect.ts +345 -0
- package/src/ops/overview-seat-era.ts +90 -0
- package/src/ops/overview.ts +223 -0
- package/src/release-loop/feature-store.ts +14 -11
- package/src/release-loop/gate-shards.ts +163 -0
- package/src/release-loop/release-schedule.ts +6 -2
- package/src/retro/daily.ts +372 -0
- package/src/seat-loop/op-decide.ts +173 -0
- package/src/seat-loop/seat-loop.ts +60 -3
- package/src/seat-loop/seat-report.ts +58 -3
- package/src/self-dev/ask-launch-flow.ts +9 -6
- package/src/self-dev/ask-launch-io.ts +52 -2
- package/src/self-dev/ask-path-candidates.ts +40 -2
- package/src/self-dev/draft-sweep.ts +371 -16
- package/src/self-dev/draft-triage-rules.ts +19 -4
- package/src/self-dev/graph-journey-nodes.ts +157 -0
- package/src/self-dev/graph-journey-route.ts +105 -0
- package/src/self-dev/launch-preflight.ts +43 -3
- package/src/self-dev/pr-preview.ts +84 -16
- package/src/self-dev/release-path-guard.ts +7 -4
- package/src/self-implement/blocked-draft-policy.ts +101 -0
- package/src/self-implement/execution-clarification.ts +11 -0
- package/src/self-implement/frozen-merges.ts +23 -0
- package/src/self-implement/gate-env-retry.ts +83 -0
- package/src/self-implement/goal-author.ts +14 -0
- package/src/self-implement/heal-intake.ts +3 -0
- package/src/self-implement/orchestrator.ts +234 -6
- package/src/self-implement/run-stop.ts +123 -0
- package/src/self-implement/run-ttl.ts +258 -0
- package/src/self-implement/salvage-retention.ts +123 -0
- package/src/self-implement/seams.ts +7 -0
- package/src/self-implement/self-implement-cli.ts +2 -0
- package/src/self-implement/self-implement-runtime.ts +12 -0
- package/src/self-implement/sibling-resync.ts +223 -0
- package/src/self-implement/stop-autoheal.ts +204 -0
- package/src/session-runtime/index.ts +5 -3
- package/src/shell-env-bootstrap.ts +17 -3
- package/src/task-agent/board.ts +1 -1
- package/src/task-agent/card-evidence.ts +105 -10
- package/src/task-agent/judge.ts +7 -0
- package/src/task-agent/live-moves.ts +120 -20
- package/src/task-agent/mission.ts +1 -1
- package/src/task-agent/parent-host.ts +315 -0
- package/src/task-agent/shadow.ts +10 -1
- package/src/task-agent/task-hand.ts +16 -4
- package/src/task-orchestrator/surfaces/pod-command-job.ts +60 -11
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +4 -0
- package/src/task-orchestrator/surfaces/pod-gate-deps.ts +123 -0
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +89 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +93 -10
- package/src/task-orchestrator/surfaces/pod-pool.ts +147 -34
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +58 -9
- package/src/telegram-commands.ts +41 -0
- package/src/testing/real-cli-spawn.ts +106 -0
- package/src/tool-runtime/browser-runtime.ts +87 -3
- package/src/tool-runtime/index.ts +1 -0
- package/src/user-config.ts +76 -7
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/J5H7BvqgSI8DUjtRRcA_S/_buildManifest.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1157-cba0e8553d35a980.js +0 -1
- package/apps/pwa/out/_next/static/chunks/171-23a877ed11720de9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2336-e830c777eb6bce04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2375-e061bb24cd2b5cde.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2415.ed6428ff334c7ce2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3094.67339318c7f72a3a.js +0 -2
- package/apps/pwa/out/_next/static/chunks/338-ceb956612dcfaa86.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3395-835e4ceaa6335ba4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +0 -5
- package/apps/pwa/out/_next/static/chunks/3441-be82e3595aef3a20.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3689-89905039bf3e7257.js +0 -1
- package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3822-6f268bc26c6a84ac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4457-d7df81c90f9d0268.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4551-77dadae76f6cbace.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4978.6fd93b974441e87f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5012-f746f6549b869f91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +0 -1
- package/apps/pwa/out/_next/static/chunks/62-5bfed1e23790b745.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6320-9bc8561fde416e07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/649-ca96d1c5d09e02b8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6726-85a7db59b288c53f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6735-33267c4630d0d963.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7633-141682015873beb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8067-143791231c99bd02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8430-a10cfba8ef282d4e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8870-9614a213b990b10b.js +0 -25
- package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9454-12c2f30dea62291c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/976-4a9b4ebdca7c739a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9989-15cdf568bafa9fc8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ae787e4c-e5b1ef00b2dbceca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-deef5ee191830f14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-b193da485f9a14b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b6e1a79df0e214f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-e84df4d907f703c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a5fb9a5db89ae4ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-1499f481d7fc52d6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-c7cf753aeb648790.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-4118469e514e10fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-e968f7630654332a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-505915052f947022.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c2f962fb4a3b06c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-7b5ed0bd8a589ec4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-cf8193250dd42dd4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-cf3f5dfa35dea8e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-5b29d9b06ceadade.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a15e7fcc283e9ca7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-d2915e7b70ff3d0e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2595f0eba29f57e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-c776322454156e36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-77bbd17f4435aa10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-049689e611ecc936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-85954a4fb09c44eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-e773e552e1068ee6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5633c4bfa7684b4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d829b92bd01b4994.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-061c317fc771becf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a45ece8865ed4b6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-0be990618c0d56bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-bfea4865dc244b73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d6ba8e337741484.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-76a88b55d816482e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-bba1542df59f61ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-4185c95689bb372e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-b699e1a8d5d34b8b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-c225e338c31bf274.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-449353f70507ca1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-90b889714102476d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f1ee7fbeb7f96ddc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-d59a95e1434dfaa0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-71491a23414d1a47.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-de7112bdb65fa4fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-feb4d0d88079660d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-f17d887b40dd6b1d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-8da77be2192bcd5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-72c3b9a5e9582b29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c3afe4c8d0c48c39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-b9308f2d8a931531.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-6f35f9d892fa630b.js +0 -1
- package/apps/pwa/out/_next/static/css/85f53c6f35d11382.css +0 -1
- /package/apps/pwa/out/_next/static/{J5H7BvqgSI8DUjtRRcA_S → MObU8ujkMciAKr6ljAV05}/_ssgManifest.js +0 -0
- /package/skills/project-onboarding/{skill.md → SKILL.md} +0 -0
|
@@ -23,13 +23,16 @@ import { isAbsolute } from 'node:path';
|
|
|
23
23
|
import { createProject, listProjects } from '../../project/project-store.js';
|
|
24
24
|
import { handleOutputsGet, type OutputsDeps } from './outputs-route.js';
|
|
25
25
|
import { buildGridData, type GridDeps } from './grid.js';
|
|
26
|
+
import { createDraftMetricsSource, type DraftMetricsSource } from './draft-metrics.js';
|
|
26
27
|
import { DECISIONS_PATH, handleDecisions, type DecisionsRouteDeps } from './decisions-route.js';
|
|
28
|
+
import { OPS_BOARD_PATH, handleOpsBoard, type OpsBoardDeps } from './ops-board-route.js';
|
|
27
29
|
import { CARD_FOLLOWUP_PATH, createCardFollowupJobs, type CardFollowupJobs } from './card-followup-route.js';
|
|
28
30
|
import { SKILL_EXEC_PATH, createSkillExecJobs, type SkillExecJobs } from './skill-exec-route.js';
|
|
29
31
|
import { compareTokenConstTime } from '../../acp/transport/auth.js';
|
|
30
32
|
import { ensureAuthToken } from '../../auth/acp-token.js';
|
|
31
33
|
import type { NexusState } from '../state/state.js';
|
|
32
34
|
import { DEFAULT_NEXUS_HTTP_PORT } from '../default-port.js';
|
|
35
|
+
|
|
33
36
|
export { DEFAULT_NEXUS_HTTP_PORT } from '../default-port.js';
|
|
34
37
|
import type { TabRegistry } from '../state/tab-registry.js';
|
|
35
38
|
import type { FeedbackEnvelope } from '../../feedback/envelope.js';
|
|
@@ -163,10 +166,12 @@ import {
|
|
|
163
166
|
} from './vault-api.js';
|
|
164
167
|
import { handleBuildsGet, parseBuildsPath } from './builds-api.js';
|
|
165
168
|
import { handleHarnessAskPost, handleHarnessAskStatusGet, handleHarnessRunEventsGet, handleHarnessRunScreenGet, handleHarnessRunsGet, handleHarnessStopPost } from './harness-api.js';
|
|
169
|
+
import { handleHarnessRunTraversalGet } from './harness-traversal.js';
|
|
166
170
|
import { handleLoopEdgesGet } from './loop-edges.js';
|
|
167
171
|
import { handleFabricPlans, type FabricPlansRouteOpts } from './fabric-plans.js';
|
|
168
172
|
import { dispatchPersonaRoute } from './personas.js';
|
|
169
|
-
import { handleMe } from './operator.js';
|
|
173
|
+
import { handleMe, operatorSignal } from './operator.js';
|
|
174
|
+
import { handleGraphRunRoute } from '../../graph-runner/graph-run-api.js';
|
|
170
175
|
import { handleOpsApi } from './ops-api.js';
|
|
171
176
|
import { handleRoleJudge } from './role-judge.js';
|
|
172
177
|
import { handleAudioStt } from './audio-stt.js';
|
|
@@ -363,8 +368,9 @@ import {
|
|
|
363
368
|
} from './workflows.js';
|
|
364
369
|
import { handleTriggersSnapshot } from './triggers.js';
|
|
365
370
|
import { handleWorkflowTemplatesList } from './workflow-templates.js';
|
|
366
|
-
import { handleGraphsGet, handleGraphsMutation } from './graphs-api.js';
|
|
371
|
+
import { handleGraphVersionsGet, handleGraphsGet, handleGraphsMutation } from './graphs-api.js';
|
|
367
372
|
import { handleGraphKindsGet, handleGraphsValidatePost } from './graph-kinds.js';
|
|
373
|
+
import { handleGraphWizardPost } from './graph-wizard-api.js';
|
|
368
374
|
import { syncInstalledPluginNodes } from '../../graph-kinds/installed-plugin-nodes.js';
|
|
369
375
|
import { elanousStateRoot } from '../../autopilot/state-paths.js';
|
|
370
376
|
import { handlePluginsIndexGet, handlePluginsGet, handlePluginsMarketRefresh, handlePluginsInstall, handlePluginsRemove } from './plugins-market.js';
|
|
@@ -424,6 +430,9 @@ import {
|
|
|
424
430
|
parseShowroomLayoutPath,
|
|
425
431
|
} from './showroom-layouts.js';
|
|
426
432
|
|
|
433
|
+
/** Process-wide DRAFT-METRIC cache (one background collection per TTL, shared by every page load). */
|
|
434
|
+
let sharedDraftMetrics: DraftMetricsSource | undefined;
|
|
435
|
+
|
|
427
436
|
export const NEXUS_HTTP_PORT_RANGE = 16; // try 31415..31430
|
|
428
437
|
/** Short timeout for the pre-bind localhost occupancy probe. */
|
|
429
438
|
export const NEXUS_PORT_PROBE_TIMEOUT_MS = 400;
|
|
@@ -478,12 +487,17 @@ export type NexusWsBridgeInit = Omit<WsBridgeOpts, 'hostname' | 'port'>;
|
|
|
478
487
|
export interface NexusHttpServerOpts {
|
|
479
488
|
/** Optional fabric-plan ledger and decomposition seam; production uses the instance root and existing fabric decomposer. */
|
|
480
489
|
fabricPlans?: FabricPlansRouteOpts;
|
|
490
|
+
/** GRAPH-WIZARD 시험 주입(LLM·템플릿 뿌리). 운영은 비워 둔다. */
|
|
491
|
+
graphWizard?: import('../../graph-wizard/generate.js').GraphWizardDeps;
|
|
481
492
|
/** Optional installer state root for isolated API consumers and tests. */
|
|
482
493
|
pluginStateRoot?: string;
|
|
483
494
|
outputs?: OutputsDeps;
|
|
484
495
|
/** Read-only grid measurement seam; omitted in production for live HQ and Pod pool reads. */
|
|
485
496
|
grid?: GridDeps;
|
|
497
|
+
/** DRAFT-METRIC cached source seam; omitted in production for the process-wide TTL cache. */
|
|
498
|
+
draftMetrics?: DraftMetricsSource;
|
|
486
499
|
decisions?: Pick<DecisionsRouteDeps, 'ledger'>;
|
|
500
|
+
opsBoard?: Pick<OpsBoardDeps, 'openStore'>;
|
|
487
501
|
cardFollowup?: CardFollowupJobs;
|
|
488
502
|
skillExec?: SkillExecJobs;
|
|
489
503
|
execRequests?: ExecRequestRunner;
|
|
@@ -938,6 +952,20 @@ export async function routeRequest(
|
|
|
938
952
|
}
|
|
939
953
|
return pitch.handlePitchApi(req, opts.metaApi);
|
|
940
954
|
}
|
|
955
|
+
// CGE-RUN — 편집기 «실행»은 운영자 전용이다: 사용자 그래프가 셸 노드를 부를 수 있으므로 같은 출처 무토큰 통과는 받지 않는다
|
|
956
|
+
// (운영자 프록시 헤더 · owner bearer 일치 · owner 가 발급한 짧은 임시 토큰만 — 명시 토큰은 언제나 필요).
|
|
957
|
+
if (/^\/v1\/graphs\/[^/]+\/(?:run|runs\/[^/]+)$/.test(pathname)) {
|
|
958
|
+
if (!opts.metaApi) return jsonResponse({ error: 'meta-api-not-wired' }, 503);
|
|
959
|
+
const signal = operatorSignal(req, opts.metaApi);
|
|
960
|
+
const credential = bearerCredential(req, opts.metaApi);
|
|
961
|
+
if (!signal.operator || (signal.operatorSource !== 'op-proxy' && credential !== 'bearer-match' && credential !== 'temp-token')) {
|
|
962
|
+
debug.log('graphs.run', 'refused', { path: pathname, source: signal.operatorSource });
|
|
963
|
+
return jsonResponse({ error: 'forbidden' }, 403);
|
|
964
|
+
}
|
|
965
|
+
const routed = handleGraphRunRoute(method, pathname);
|
|
966
|
+
if (routed) return routed;
|
|
967
|
+
return jsonResponse({ error: 'method-not-allowed' }, 405);
|
|
968
|
+
}
|
|
941
969
|
|
|
942
970
|
// Default-deny for every `/v1/` path that is not on PUBLIC_ROUTES.
|
|
943
971
|
// Reuses checkAuth (same-origin exemption + constant-time bearer).
|
|
@@ -1343,6 +1371,13 @@ export async function routeRequest(
|
|
|
1343
1371
|
return handleHarnessRunEventsGet(req, opts.metaApi);
|
|
1344
1372
|
}
|
|
1345
1373
|
|
|
1374
|
+
// HARNESS-RUN-LIVE-GRAPH — one run's ordered node steps ⊕ journey band (PWA /live-run).
|
|
1375
|
+
if (pathname === '/v1/harness/run-traversal' && method === 'GET') {
|
|
1376
|
+
if (!opts.metaApi) return jsonResponse({ error: 'meta-api-runtime-not-wired' }, 503);
|
|
1377
|
+
if (!checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1378
|
+
return handleHarnessRunTraversalGet(req);
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1346
1381
|
// Design direction is a write: check owner auth before the handler reads the body.
|
|
1347
1382
|
// Keep this POST ahead of the mutation fallback, and never make it a public route.
|
|
1348
1383
|
if (method === 'POST' && pathname === DESIGN_DIRECTION_PATH) {
|
|
@@ -1372,6 +1407,13 @@ export async function routeRequest(
|
|
|
1372
1407
|
return handleGraphsValidatePost(req, opts.metaApi);
|
|
1373
1408
|
}
|
|
1374
1409
|
|
|
1410
|
+
// GRAPH-WIZARD — 말 → 그래프 YAML(저장 안 함). 다른 /v1/graphs 쓰기와 같은 인증.
|
|
1411
|
+
if (method === 'POST' && pathname === '/v1/graphs/wizard') {
|
|
1412
|
+
if (!opts.metaApi) return jsonResponse({ error: 'meta-api-not-wired' }, 503);
|
|
1413
|
+
if (!checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1414
|
+
return handleGraphWizardPost(req, opts.graphWizard);
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1375
1417
|
if (pathname === '/v1/fabric/decompose' || pathname.startsWith('/v1/fabric/plans/')) {
|
|
1376
1418
|
if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1377
1419
|
return handleFabricPlans(req, opts.fabricPlans);
|
|
@@ -1392,6 +1434,21 @@ export async function routeRequest(
|
|
|
1392
1434
|
return (opts.cardFollowup ?? defaultCardFollowupJobs()).get(pathname.slice(CARD_FOLLOWUP_PATH.length + 1));
|
|
1393
1435
|
}
|
|
1394
1436
|
|
|
1437
|
+
if (pathname === OPS_BOARD_PATH && (method === 'GET' || method === 'POST')) {
|
|
1438
|
+
const peerAddress = (server as BunServerLike & { requestIP?: (request: Request) => { address: string } | null }).requestIP?.(req)?.address;
|
|
1439
|
+
const host = req.headers.get('host') ?? new URL(req.url).host;
|
|
1440
|
+
const tailnetPeer = peerAddress !== undefined && (/^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./.test(peerAddress)
|
|
1441
|
+
|| /^fd7a:115c:a1e0:/i.test(peerAddress));
|
|
1442
|
+
const localPeer = peerAddress === '127.0.0.1' || peerAddress === '::1';
|
|
1443
|
+
const tailnetHost = /^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\.\d{1,3}\.\d{1,3}(?::\d+)?$/.test(host)
|
|
1444
|
+
|| /^\[fd7a:115c:a1e0:[0-9a-f:]+\](?::\d+)?$/i.test(host) || /^[a-z0-9-]+(?:\.[a-z0-9-]+)*\.ts\.net(?::\d+)?$/i.test(host);
|
|
1445
|
+
const localHost = /^(?:localhost|127\.0\.0\.1)(?::\d+)?$/.test(host) || /^\[::1\](?::\d+)?$/.test(host);
|
|
1446
|
+
if ((!tailnetPeer && !localPeer) || (!tailnetHost && !localHost)) return jsonResponse({ error: 'forbidden' }, 403);
|
|
1447
|
+
return handleOpsBoard(req, {
|
|
1448
|
+
authorize: request => !!opts.metaApi && opts.metaApi.noAuth !== true && checkAuth(request, opts.metaApi),
|
|
1449
|
+
...opts.opsBoard,
|
|
1450
|
+
});
|
|
1451
|
+
}
|
|
1395
1452
|
if (method === 'GET' && pathname === DECISIONS_PATH) {
|
|
1396
1453
|
return handleDecisions(req, {
|
|
1397
1454
|
authorize: request => !!opts.metaApi && checkAuth(request, opts.metaApi),
|
|
@@ -1405,6 +1462,12 @@ export async function routeRequest(
|
|
|
1405
1462
|
if (method !== 'GET') return jsonResponse({ error: 'method-not-allowed', method }, 405);
|
|
1406
1463
|
return jsonResponse(buildGridData(opts.grid));
|
|
1407
1464
|
}
|
|
1465
|
+
// DRAFT-METRIC: answers from memory; a stale/cold cache starts one background collection (never per request).
|
|
1466
|
+
if (pathname === '/v1/drafts/metrics') {
|
|
1467
|
+
if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1468
|
+
if (method !== 'GET') return jsonResponse({ error: 'method-not-allowed', method }, 405);
|
|
1469
|
+
return jsonResponse((opts.draftMetrics ?? (sharedDraftMetrics ??= createDraftMetricsSource())).read());
|
|
1470
|
+
}
|
|
1408
1471
|
if (method === 'GET' && pathname === '/v1/outputs') {
|
|
1409
1472
|
if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1410
1473
|
return handleOutputsGet(req, opts.outputs);
|
|
@@ -1471,7 +1534,7 @@ export async function routeRequest(
|
|
|
1471
1534
|
if (!opts.metaApi) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1472
1535
|
return handlePluginsRemove(req, pluginRemove[1]!, opts.metaApi, opts.pluginStateRoot);
|
|
1473
1536
|
}
|
|
1474
|
-
if ((method === 'PUT' || method === 'POST') && pathname.startsWith('/v1/graphs/')) {
|
|
1537
|
+
if ((method === 'PUT' || method === 'POST') && (pathname.startsWith('/v1/graphs/') || pathname === '/v1/graphs')) {
|
|
1475
1538
|
if (!opts.metaApi) return jsonResponse({ error: 'meta-api-not-wired' }, 503);
|
|
1476
1539
|
if (!checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1477
1540
|
const mutated = await handleGraphsMutation(pathname, req);
|
|
@@ -2785,6 +2848,9 @@ export async function routeRequest(
|
|
|
2785
2848
|
if (method === 'GET' && (pathname === '/v1/graphs' || /^\/v1\/graphs\/[^/]+$/.test(pathname) || /^\/v1\/graphs\/[^/]+\/yaml$/.test(pathname))) {
|
|
2786
2849
|
return handleGraphsGet(pathname);
|
|
2787
2850
|
}
|
|
2851
|
+
if (method === 'GET' && /^\/v1\/graphs\/[^/]+\/versions$/.test(pathname)) {
|
|
2852
|
+
return handleGraphVersionsGet(pathname);
|
|
2853
|
+
}
|
|
2788
2854
|
// Archon-port T2.3 (2026-05-08) — workflow GET surface.
|
|
2789
2855
|
// (POST /validate · POST /:name/run · PUT/DELETE /:name landed
|
|
2790
2856
|
// inside the mutation block above.)
|
|
@@ -31,6 +31,8 @@ export interface LoopEdge {
|
|
|
31
31
|
tick?: string;
|
|
32
32
|
/** live claimed 뒤 handed·released 없이 N분 지남 = 발사 실패(끊긴 넘김). ref = 오케스트레이터 카드 id. */
|
|
33
33
|
broken?: true;
|
|
34
|
+
/** launch 간선만 — 그 카드에 묶인 런 원장 runId(ID 정규식). 못 묶으면 생략(PWA 가 10분 뒤 «유령»으로 본다). */
|
|
35
|
+
run?: string;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
/** 노드 접두 — 조율 루프는 레지스트리 행 `loop:orchestrator` 그대로 쓴다. `queue:` 는 대기열 대체 간선 자리(조각 A 밖). */
|
|
@@ -369,10 +371,10 @@ function taskAgentEdges(deps: LoopEdgesDeps, facts: readonly RunFact[], seats: R
|
|
|
369
371
|
if (typeof card.mission === 'string' && ID.test(card.mission)) journey.links.push({ from: card.id, to: card.mission, both: false });
|
|
370
372
|
if (Array.isArray(card.pieces)) journey.pieces.set(card.id, card.pieces.filter(piece => typeof piece === 'string' && ID.test(piece)));
|
|
371
373
|
const launches = launchesOf(card);
|
|
374
|
+
const runId = linkedRun(card, launches[0]?.at, launchedTexts, facts, childIds);
|
|
372
375
|
for (const launch of launches) {
|
|
373
|
-
if (seat(card.seat, seats) && inWindow(launch.at, since, now)) edges.push({ at: launch.at, kind: 'launch', from: TASK_AGENT_NODE, to: card.seat, ref: card.id });
|
|
376
|
+
if (seat(card.seat, seats) && inWindow(launch.at, since, now)) edges.push({ at: launch.at, kind: 'launch', from: TASK_AGENT_NODE, to: card.seat, ref: card.id, ...(runId ? { run: runId } : {}) });
|
|
374
377
|
}
|
|
375
|
-
const runId = linkedRun(card, launches[0]?.at, launchedTexts, facts, childIds);
|
|
376
378
|
if (runId) journey.links.push({ from: card.id, to: runId, both: true });
|
|
377
379
|
const green = object(card.greenProposal);
|
|
378
380
|
if (green && typeof green.at === 'string' && typeof green.checklistId === 'string' && ID.test(green.checklistId) && inWindow(green.at, since, now)) {
|
package/src/nexus/api/ops-api.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { lstatSync, readFileSync, readdirSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { debug, redactSecretText } from '../../debug/log.js';
|
|
4
|
-
import { effectiveInstanceRoot } from '../../instance/resolve.js';
|
|
4
|
+
import { effectiveInstanceRoot, releaseLedgerRoot } from '../../instance/resolve.js';
|
|
5
|
+
import { gateShardsPath, readGateShards, summarizeShards, type GateShardsFile, type GateShardsSummary } from '../../release-loop/gate-shards.js';
|
|
5
6
|
import { listChecklist } from '../../release-loop/checklist.js';
|
|
6
7
|
import { getSchedule } from '../../release-loop/release-schedule.js';
|
|
7
8
|
import { jsonResponse } from './json-response.js';
|
|
@@ -123,13 +124,25 @@ export function releaseNodeFacts(output: unknown): ReleaseNodeFacts {
|
|
|
123
124
|
}
|
|
124
125
|
export interface ReleaseRunView {
|
|
125
126
|
runId: string; status: string; startedAt: string; version: string | null; path: string[]; nodes: ReleaseRunNodeView[];
|
|
127
|
+
/** GATE-LIVE-OBS — 지금 gate 노드에 있는 런에만 싣는다(발행 원장 `gate-logs/cut/shards.json`). 파일이 없으면 생략. */
|
|
128
|
+
gateShards?: GateShardsFile & { summary: GateShardsSummary };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** 도는 gate 노드의 조각 표 — 다른 판의 파일을 붙이지 않게 version 이 같을 때만. */
|
|
132
|
+
function gateShardsFor(version: string | null, status: string, nodes: ReleaseRunNodeView[], ledgerRoot: string, now: number):
|
|
133
|
+
ReleaseRunView['gateShards'] | undefined {
|
|
134
|
+
if (!version || status !== 'running' || !nodes.some((node) => node.nodeId === 'gate' && node.ok === null)) return undefined;
|
|
135
|
+
const file = readGateShards(gateShardsPath(version, ledgerRoot));
|
|
136
|
+
if (!file || file.version !== version) return undefined;
|
|
137
|
+
return { ...file, shards: file.shards.map((shard) => shard.waitReason ? { ...shard, waitReason: redactSecretText(shard.waitReason) } : shard),
|
|
138
|
+
summary: summarizeShards(file, now) };
|
|
126
139
|
}
|
|
127
140
|
|
|
128
141
|
/** The release run ledger as `/v1/ops/release/runs` serves it (newest 20) — shared with Telegram /release and away mode
|
|
129
142
|
* so every surface reads the same verdicts. `'unavailable'` = the directory exists but cannot be read. */
|
|
130
143
|
export function readReleaseRuns(version: string | null = null,
|
|
131
144
|
dir: string = join(effectiveInstanceRoot(), 'graph-runs', 'release-loop'),
|
|
132
|
-
opts: { facts?: boolean } = {}): ReleaseRunView[] | 'unavailable' {
|
|
145
|
+
opts: { facts?: boolean; ledgerRoot?: string; now?: number } = {}): ReleaseRunView[] | 'unavailable' {
|
|
133
146
|
let filenames: string[];
|
|
134
147
|
try {
|
|
135
148
|
filenames = readdirSync(dir, { withFileTypes: true })
|
|
@@ -146,15 +159,17 @@ export function readReleaseRuns(version: string | null = null,
|
|
|
146
159
|
if (!run) return [];
|
|
147
160
|
const v = runVersion(run.input);
|
|
148
161
|
if (version !== null && v !== version) return [];
|
|
162
|
+
const nodes: ReleaseRunNodeView[] = [...run.nodes.filter((node) => node && typeof node.nodeId === 'string').map((node) => ({
|
|
163
|
+
nodeId: redactSecretText(node.nodeId), ok: typeof node.ok === 'boolean' ? node.ok : null,
|
|
164
|
+
summary: nodeSummary(node.output), ...nodeTimes(node),
|
|
165
|
+
...(opts.facts ? { facts: releaseNodeFacts(node.output) } : {}),
|
|
166
|
+
})), ...runningNode(run, run.nodes.length)];
|
|
167
|
+
const gateShards = gateShardsFor(v, run.status, nodes, opts.ledgerRoot ?? releaseLedgerRoot(), opts.now ?? Date.now());
|
|
149
168
|
return [{
|
|
150
169
|
runId: redactSecretText(filename.slice(0, -5)), status: redactSecretText(run.status),
|
|
151
170
|
startedAt: redactSecretText(run.startedAt), version: v,
|
|
152
171
|
path: run.path.filter((step): step is string => typeof step === 'string').map(redactSecretText),
|
|
153
|
-
nodes
|
|
154
|
-
nodeId: redactSecretText(node.nodeId), ok: typeof node.ok === 'boolean' ? node.ok : null,
|
|
155
|
-
summary: nodeSummary(node.output), ...nodeTimes(node),
|
|
156
|
-
...(opts.facts ? { facts: releaseNodeFacts(node.output) } : {}),
|
|
157
|
-
})), ...runningNode(run, run.nodes.length)],
|
|
172
|
+
nodes, ...(gateShards ? { gateShards } : {}),
|
|
158
173
|
}];
|
|
159
174
|
}).sort((a, b) => b.startedAt.localeCompare(a.startedAt)).slice(0, 20);
|
|
160
175
|
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { canonicalSeatId, openMsgStore, type Message, type MsgStore } from '../../msg/msg-store.js';
|
|
2
|
+
import { jsonResponse } from './json-response.js';
|
|
3
|
+
|
|
4
|
+
function ownerNotices(store: Pick<MsgStore, 'list'>): Message[] {
|
|
5
|
+
const notices: Message[] = [];
|
|
6
|
+
let after = 0;
|
|
7
|
+
let batch: Message[];
|
|
8
|
+
do {
|
|
9
|
+
batch = store.list('CEO', after, 1000);
|
|
10
|
+
notices.push(...batch.filter(message => message.from !== 'CEO'));
|
|
11
|
+
if (batch.length) after = batch[batch.length - 1]!.id;
|
|
12
|
+
} while (batch.length === 1000);
|
|
13
|
+
return notices;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const OPS_BOARD_PATH = '/v1/ops-board/notices';
|
|
17
|
+
|
|
18
|
+
export interface OpsBoardDeps {
|
|
19
|
+
authorize: (request: Request) => boolean;
|
|
20
|
+
openStore?: () => Pick<MsgStore, 'list' | 'post' | 'close'>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Owner reads the CEO inbox without acknowledging it; replies are addressed to the original sender. */
|
|
24
|
+
export async function handleOpsBoard(req: Request, deps: OpsBoardDeps): Promise<Response> {
|
|
25
|
+
if (!deps.authorize(req)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
26
|
+
if (req.method !== 'GET' && req.method !== 'POST') return jsonResponse({ error: 'method-not-allowed' }, 405);
|
|
27
|
+
const store = (deps.openStore ?? openMsgStore)();
|
|
28
|
+
try {
|
|
29
|
+
if (req.method === 'GET') {
|
|
30
|
+
const notices = ownerNotices(store);
|
|
31
|
+
return jsonResponse({ notices });
|
|
32
|
+
}
|
|
33
|
+
let body: unknown;
|
|
34
|
+
try { body = await req.json(); } catch { return jsonResponse({ error: 'bad_request' }, 400); }
|
|
35
|
+
if (!body || typeof body !== 'object' || Array.isArray(body)) return jsonResponse({ error: 'bad_request' }, 400);
|
|
36
|
+
const input = body as Record<string, unknown>;
|
|
37
|
+
if (!Number.isSafeInteger(input.noticeId) || (input.noticeId as number) < 1
|
|
38
|
+
|| typeof input.body !== 'string' || !input.body.trim() || input.body.length > 3000
|
|
39
|
+
|| Object.keys(input).some(key => key !== 'noticeId' && key !== 'body')) return jsonResponse({ error: 'bad_request' }, 400);
|
|
40
|
+
const notice: Message | undefined = ownerNotices(store).find(message => message.id === input.noticeId);
|
|
41
|
+
if (!notice) return jsonResponse({ error: 'not-found' }, 404);
|
|
42
|
+
const recipient = canonicalSeatId(notice.from);
|
|
43
|
+
const reply = store.post({ from: 'CEO', to: recipient, body: input.body.trim(), kind: 'reply' });
|
|
44
|
+
return jsonResponse({ reply }, 201);
|
|
45
|
+
} finally {
|
|
46
|
+
store.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
// { "type": "discord", "webhookUrl": "https://discord.com/api/webhooks/..." },
|
|
17
17
|
// { "type": "pushcut", "webhookUrl": "https://api.pushcut.io/.../notifications/..." }
|
|
18
18
|
// ],
|
|
19
|
-
// "routes": { "alert": ["telegram", "pushcut"], "report": ["telegram", "discord"] }
|
|
19
|
+
// "routes": { "alert": ["telegram", "pushcut"], "report": ["telegram", "discord"] },
|
|
20
|
+
// "awayRoutes": { "alert": ["discord"] }
|
|
20
21
|
// }
|
|
21
22
|
//
|
|
22
23
|
// Backward compat: when `outbound` is absent/malformed the resolved
|
|
@@ -27,6 +28,7 @@
|
|
|
27
28
|
// that boolean before falling back to direct Telegram).
|
|
28
29
|
|
|
29
30
|
import { createHash } from 'node:crypto';
|
|
31
|
+
import { readPresence } from '../../away/presence.js';
|
|
30
32
|
import { debug } from '../../debug/log.js';
|
|
31
33
|
import { sendTelegramReport } from '../../telegram-report.js';
|
|
32
34
|
import { getPushcutClient } from '../../pushcut/client.js';
|
|
@@ -58,6 +60,8 @@ export interface OutboundFanoutConfig {
|
|
|
58
60
|
* `routes.default`, then to ALL configured channels. An explicitly
|
|
59
61
|
* empty route (`"heartbeat": []`) suppresses that kind. */
|
|
60
62
|
routes?: Record<string, string[]>;
|
|
63
|
+
/** 외출 중 kind → channel types. 미지정 kind는 awayRoutes.default, 이것도 없으면 기존 routes를 유지한다. */
|
|
64
|
+
awayRoutes?: Record<string, string[]>;
|
|
61
65
|
}
|
|
62
66
|
|
|
63
67
|
export interface ChannelResult {
|
|
@@ -118,14 +122,17 @@ export function normalizeOutbound(raw: unknown): OutboundFanoutConfig | undefine
|
|
|
118
122
|
channels.push({ type, ...(webhookUrl ? { webhookUrl } : {}), ...(notification ? { notification } : {}) });
|
|
119
123
|
}
|
|
120
124
|
if (channels.length === 0) return undefined;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
routes = {};
|
|
124
|
-
for (const [kind, v] of Object.entries(
|
|
125
|
+
const parseRoutes = (value: unknown): Record<string, string[]> | undefined => {
|
|
126
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;
|
|
127
|
+
const routes: Record<string, string[]> = {};
|
|
128
|
+
for (const [kind, v] of Object.entries(value as Record<string, unknown>)) {
|
|
125
129
|
if (Array.isArray(v)) routes[kind] = v.filter((t): t is string => typeof t === 'string');
|
|
126
130
|
}
|
|
127
|
-
|
|
128
|
-
|
|
131
|
+
return routes;
|
|
132
|
+
};
|
|
133
|
+
const routes = parseRoutes(o.routes);
|
|
134
|
+
const awayRoutes = parseRoutes(o.awayRoutes);
|
|
135
|
+
return { channels, ...(routes ? { routes } : {}), ...(awayRoutes ? { awayRoutes } : {}) };
|
|
129
136
|
}
|
|
130
137
|
|
|
131
138
|
/** Resolve the channel list for one message kind. No/empty config →
|
|
@@ -219,7 +226,20 @@ export async function routeOutbound(cfg: UserConfig, msg: OutboundMsg, deps: Rou
|
|
|
219
226
|
} catch { /* 원장 조회 실패 — 억제 없이 진행 */ }
|
|
220
227
|
}
|
|
221
228
|
|
|
222
|
-
|
|
229
|
+
// 상태 파일이 없거나 읽기에 실패하면 기존 kind 경로를 그대로 사용한다.
|
|
230
|
+
let list = resolveChannels(outbound, msg.kind);
|
|
231
|
+
if (outbound?.awayRoutes) {
|
|
232
|
+
try {
|
|
233
|
+
if (readPresence().away) {
|
|
234
|
+
const awayRoute = outbound.awayRoutes[msg.kind] ?? outbound.awayRoutes.default;
|
|
235
|
+
// kind 도 default 도 없으면 기존 경로로 · 명시적인 빈 배열은 기존 routes 와 같은 규칙(채널 0)을 따른다.
|
|
236
|
+
if (awayRoute !== undefined) {
|
|
237
|
+
list = outbound.channels.filter(ch => awayRoute.includes(ch.type));
|
|
238
|
+
try { debug.log('outbound.send', 'away-route', { kind: msg.kind, channels: list.map(ch => ch.type) }); } catch { /* 관측 실패는 발송 결과에 영향 없음 */ }
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
} catch { /* 상태 조회 실패 — 기존 경로 유지 */ }
|
|
242
|
+
}
|
|
223
243
|
const channels = await Promise.all(list.map(async (ch): Promise<ChannelResult> => {
|
|
224
244
|
try {
|
|
225
245
|
if (ch.type === 'telegram') return await deliverTelegram(cfg, outMsg, deps);
|
|
@@ -5,4 +5,9 @@ export function unattendedSetupHint(): string {
|
|
|
5
5
|
return `unattended: \`${UNATTENDED_SETUP_COMMAND}\``;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
+
/** One-line next step printed after a non-TTY onboarding refusal (FIRST-CHAT-NONTTY). */
|
|
9
|
+
export function unattendedNextStepLine(): string {
|
|
10
|
+
return `next: ${unattendedSetupHint()}`;
|
|
11
|
+
}
|
|
12
|
+
|
|
8
13
|
export const SKILLS_LIST_DESCRIPTION = 'List elanous skills from configured skill directories (skills.activeSet / skills.dirs and packaged skills): subdirectories and the first non-heading line of each SKILL.md. Read-only.';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as readline from 'node:readline/promises';
|
|
2
2
|
import { detectProviders, type DetectedProvider } from '../llm/provider-detect.js';
|
|
3
3
|
import { debug } from '../debug/log.js';
|
|
4
|
+
import { unattendedNextStepLine } from './entry-hints.js';
|
|
4
5
|
import { resolveProviderCredential } from '../llm/provider-credentials.js';
|
|
5
6
|
import {
|
|
6
7
|
getUserConfig, saveUserConfig, userConfigPath,
|
|
@@ -57,6 +58,8 @@ export async function runFirstRun(deps: FirstRunDeps = {}): Promise<{
|
|
|
57
58
|
if (!provider) {
|
|
58
59
|
if ((deps.isTTY ?? process.stdin.isTTY) !== true) {
|
|
59
60
|
print('eln setup llm 으로 고르세요');
|
|
61
|
+
// FIRST-CHAT-NONTTY — bare `elanous` with no TTY gets the same one-line next step as the other entrances.
|
|
62
|
+
print(unattendedNextStepLine());
|
|
60
63
|
observe('needs-llm', 0);
|
|
61
64
|
return { outcome: 'needs-llm', inputs: 0 };
|
|
62
65
|
}
|
package/src/onboarding.ts
CHANGED
|
@@ -59,7 +59,7 @@ import type {
|
|
|
59
59
|
import { showStepOr, chooseFrom } from './onboarding/io-extended.js';
|
|
60
60
|
import { askWithHelp } from './onboarding/wire-helpers.js';
|
|
61
61
|
import { stepTransition } from './onboarding/transition.js';
|
|
62
|
-
import { unattendedSetupHint } from './onboarding/entry-hints.js';
|
|
62
|
+
import { unattendedNextStepLine, unattendedSetupHint } from './onboarding/entry-hints.js';
|
|
63
63
|
import { continueHereLines } from './onboarding/continue-here.js';
|
|
64
64
|
import type { NexusShowResult } from './cli/nexus-show.js';
|
|
65
65
|
import type { TailscaleProbe } from './nexus/onboarding/tailscale-probe.js';
|
|
@@ -1370,15 +1370,33 @@ export class OnboardingRefusedError extends Error {
|
|
|
1370
1370
|
}
|
|
1371
1371
|
}
|
|
1372
1372
|
|
|
1373
|
-
|
|
1374
|
-
|
|
1373
|
+
export interface OnboardingRefusalIO {
|
|
1374
|
+
printError: (line: string) => void;
|
|
1375
|
+
setExitCode: (code: number) => void;
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
const defaultRefusalIO: OnboardingRefusalIO = {
|
|
1379
|
+
printError: (line) => console.error(line),
|
|
1380
|
+
setExitCode: (code) => { process.exitCode = code; },
|
|
1381
|
+
};
|
|
1382
|
+
|
|
1383
|
+
/** Handle only typed refusals; the agent setup hint applies to its non-TTY path alone.
|
|
1384
|
+
* FIRST-CHAT-NONTTY: on the non-TTY path of any other entrance the refusal ends with a
|
|
1385
|
+
* one-line next step (`unattendedNextStepLine()`), so a script or app that called first knows
|
|
1386
|
+
* what to run. The exit code stays 2. */
|
|
1387
|
+
export function handleOnboardingRefusal(
|
|
1388
|
+
error: unknown,
|
|
1389
|
+
entrance: 'agent' | 'other',
|
|
1390
|
+
io: OnboardingRefusalIO = defaultRefusalIO,
|
|
1391
|
+
): boolean {
|
|
1375
1392
|
if (!(error instanceof OnboardingRefusedError) || error.code !== 'onboarding-refused') return false;
|
|
1376
1393
|
if (entrance === 'agent' && error.reason === 'non-tty') {
|
|
1377
|
-
|
|
1394
|
+
io.printError(`elanous agent needs a configured LLM. Run \`elanous onboarding\` in a terminal, or ${unattendedSetupHint()} for unattended setup.`);
|
|
1378
1395
|
} else {
|
|
1379
|
-
|
|
1396
|
+
io.printError(error.message);
|
|
1397
|
+
if (error.reason === 'non-tty') io.printError(unattendedNextStepLine());
|
|
1380
1398
|
}
|
|
1381
|
-
|
|
1399
|
+
io.setExitCode(2);
|
|
1382
1400
|
return true;
|
|
1383
1401
|
}
|
|
1384
1402
|
|