elanous 0.2.34 → 0.2.35
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/{L04y73dlwKeTW-GetaTF3 → T1mBQqmkwKDLGtyisDCOd}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{5014f970-22bef0b5210f7d60.js → 0368f25d-ad84af92fefee68f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +1 -0
- package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{2124.ed5bf480cea7f85b.js → 1530.0e612369b6fd7ea0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +41 -0
- package/apps/pwa/out/_next/static/chunks/1674.2a65fd5668e1cc5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +24 -0
- package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +74 -0
- package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8368.014caa8de2f5af34.js → 2018.a741297bce759490.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +148 -0
- package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +34 -0
- package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +77 -0
- package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +62 -0
- package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +90 -0
- package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1644.35dd25240ae24e4b.js → 3408.21d1570602f4b6c0.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3121.779fafe3e44612c5.js → 3589.5444a06bcf6e775c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/359-2250789a2d3499e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +36 -0
- package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9131-fce7256c4180c4a5.js → 3677-4215f826f6aa68e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +79 -0
- package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +122 -0
- package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4346.8601952e73bf5803.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6053-d893974de92e6198.js → 4441-875b97f5821ed58a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{1895-60ed0e341c658bd4.js → 4705-194e64e47ca0fbdb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5576-82d3703636d5c4b9.js → 4718-17d2af636796a330.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7431.3051e9b8a4372d2d.js → 5101.e32282718f99ed6f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{2987-30cf9c2eb7b8bdd5.js → 5483-dd5d7697f6bdb106.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +94 -0
- package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/56d372f2.681ab4ec4c998fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7386.5d8e7e42e818dfb6.js → 5852.db1f7449f4f74612.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +1 -0
- package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3110.0a7065f25c841818.js → 6236.e18cced2d5ba6afb.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +8 -0
- package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +93 -0
- package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +149 -0
- package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{7005.1623d2aea78eb85f.js → 7385.50a308a477bdfc21.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6086.913a69e6fa3e4a8b.js → 7644.17e37ba6f1d4226e.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7193-cf355cca5ba6c5d5.js → 8437-8d5492094b166cfa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2554.3b5e200f5f5cfcd6.js → 8444.4c26b379ca2b9596.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +226 -0
- package/apps/pwa/out/_next/static/chunks/8557-e7898769499cd56f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +64 -0
- package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2547.dd27303624cb4da8.js → 8637.47f5b35afcae5e6b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9550.d5f76828f972058c.js → 9214.63a510d39178e997.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +115 -0
- package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8548.036c344973968847.js → 938.66ad1ef0e5abae1c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3414.172ad4ca2d9b08e8.js → 9512.5a76207a730e0491.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6740.43de73fc427c9fe2.js → 9952.5daf5f94063a2b3e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/{page-d7bff0f0905a662c.js → page-26e6c18a1a750cf6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-47c5d4db587266bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-df3445b207ceceab.js → page-dc0a532f5b9196ec.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9a8cb466.cc9fc9e6e46038aa.js → b2f6ba4d.fb56fdbbf798df33.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/b6705a4f-b9a9047de9eecfd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4fa33ebd.21c1bd5b294496e6.js → cbe38a15.5a032598e39970c6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{abb4b98b.163e0f56e84ae35d.js → d06f9160.a3d9062f95de8ad7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9b48c871.204d5d13e7809bd0.js → da5176c6.6773b6c5994e1d99.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/bin/elanous.mjs +3 -2
- package/catalog/providers/opengateway.yaml +25 -0
- package/docs/goal-context/01-goal-authoring-checks.md +8 -0
- package/docs/goal-context/03-verification-menu.md +24 -0
- package/docs/goal-context/04-mock-scenarios.md +100 -0
- package/docs/goal-context/README.md +4 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/default-loop.yaml +57 -3
- package/graphs/document-loop.yaml +51 -3
- package/graphs/implement-loop.yaml +53 -4
- package/graphs/journey/ta-journey.yaml +11 -1
- package/graphs/journey/units/author-dialogue/author-dialogue.yaml +42 -0
- package/graphs/journey/units/author-dialogue/observe.ts +96 -0
- package/graphs/journey/units/author-dialogue/recipes.yaml +10 -0
- package/graphs/operate-loop.yaml +51 -3
- package/graphs/research-loop.yaml +137 -3
- package/graphs/test-diet/test-diet.yaml +3 -0
- package/package.json +1 -1
- package/scripts/coord-role-pack.ts +19 -6
- package/scripts/hq/standby-snapshot.ts +17 -12
- package/scripts/release-loop/docs-land-node.ts +21 -5
- package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
- package/scripts/release-loop/gate-node.ts +181 -22
- package/scripts/release-loop/gate-partial.ts +65 -11
- package/scripts/release-loop/gate-radius-live.ts +177 -0
- package/scripts/release-loop/gate-radius-shadow.ts +1 -1
- package/scripts/release-loop/node-verdict.ts +12 -1
- package/scripts/release-loop/npm-publish-node.ts +66 -12
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
- package/scripts/release-loop/pwa-remote.ts +166 -0
- package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
- package/scripts/release-loop/resume-release.ts +41 -4
- package/scripts/release-loop/unattended-release.ts +2 -0
- package/scripts/test-diet/lib.ts +6 -1
- package/scripts/test-diet/node.ts +194 -13
- package/scripts/ux-sim.ts +39 -0
- package/src/agent/self-ambient-cache.ts +8 -0
- package/src/agent-substrate/acp-reviewer.ts +39 -4
- package/src/agent-substrate/pr-reviewer.ts +17 -0
- package/src/agent-substrate/self-review-cli.ts +62 -13
- package/src/autopilot/pr-manager.ts +215 -36
- package/src/budget/run-usage-rollup.ts +1 -0
- package/src/chat/index.ts +0 -2
- package/src/chat/pickers/modal-runtime.ts +10 -27
- package/src/cli/agent-cli.ts +13 -2
- package/src/cli/doctor-cli.ts +4 -1
- package/src/cli/light-entry-route.ts +46 -6
- package/src/cli/pod-cli.ts +77 -3
- package/src/cli/pr-cli.ts +5 -2
- package/src/cli/pr-land-pod-shadow-job.ts +3 -0
- package/src/cli/release-checklist-read-cli.ts +79 -0
- package/src/cli/release-cli.ts +72 -102
- package/src/cli/remote-resolve.ts +1 -1
- package/src/cli/root-tui-entry.ts +48 -0
- package/src/cli/sim-cli.ts +22 -0
- package/src/cli/tasks-cli.ts +540 -31
- package/src/cli/usage-cli.ts +13 -11
- package/src/clipboard/history.ts +179 -13
- package/src/config.ts +8 -1
- package/src/dashboard/chat/acp-chat.ts +8 -0
- package/src/dashboard/index.ts +78 -10
- package/src/dashboard/render/theme-resolver.ts +33 -4
- package/src/domains/schedule-registry.ts +16 -2
- package/src/git-fs/idle-refresh.ts +76 -0
- package/src/git-fs/index.ts +18 -7
- package/src/git-fs/worktree.ts +42 -4
- package/src/graph-kinds/registry.ts +2 -2
- package/src/graph-runner/runner.ts +153 -10
- package/src/grok/credential.ts +10 -3
- package/src/harness/harness-cli-command.ts +112 -28
- package/src/harness/harness-incidents.ts +33 -0
- package/src/harness/launch-utterance-ledger.ts +208 -0
- package/src/impl-discipline/detector.ts +16 -4
- package/src/impl-discipline/system-prompt.ts +11 -0
- package/src/impl-discipline/types.ts +2 -2
- package/src/index.ts +496 -143
- package/src/intake-plane/already-built-hint.ts +4 -2
- package/src/intake-plane/requirement-funnel.ts +29 -1
- package/src/light-cli.ts +27 -11
- package/src/llm/opengateway-models.ts +11 -0
- package/src/llm/provider-credentials.ts +14 -0
- package/src/llm/provider-detect.ts +8 -1
- package/src/llm/runtime-model-family.ts +2 -1
- package/src/llm.ts +213 -56
- package/src/model-tier/llm-tier-map.ts +15 -1
- package/src/native-tool-catalog.ts +15 -1
- package/src/nexus/api/loop-resources.ts +13 -1
- package/src/oauth/codex.ts +7 -0
- package/src/ops/overview-collect.ts +18 -3
- package/src/ops/overview.ts +20 -7
- package/src/pr-tool/census.ts +261 -27
- package/src/pty-shell/pty-manifest.ts +7 -0
- package/src/release-loop/checklist.ts +24 -0
- package/src/release-loop/landed-but-yellow.ts +129 -5
- package/src/release-loop/light-rc.ts +1 -0
- package/src/release-loop/rehearsal.ts +2 -2
- package/src/repl/index.ts +174 -17
- package/src/repl/ops-msg-bridge.ts +32 -0
- package/src/self-dev/ask-launch-flow.ts +44 -5
- package/src/self-dev/cli-help-text.ts +17 -0
- package/src/self-dev/dev-cli.ts +11 -9
- package/src/self-dev/draft-residue.ts +37 -1
- package/src/self-dev/draft-sweep.ts +137 -11
- package/src/self-dev/draft-triage-rules.ts +107 -0
- package/src/self-dev/fleet-reduce.ts +3 -2
- package/src/self-dev/graph-front-nodes.ts +112 -0
- package/src/self-dev/graph-journey-nodes.ts +1 -0
- package/src/self-dev/harness-run-cli.ts +3 -15
- package/src/self-dev/orchestrate-cli-text.ts +10 -0
- package/src/self-dev/review-provider-fallback.ts +35 -1
- package/src/self-dev/self-orchestrate-runtime.ts +1 -11
- package/src/self-dev/shard-aggregate.ts +42 -5
- package/src/self-dev/shard-run.ts +8 -1
- package/src/self-implement/blocked-draft-policy.ts +20 -0
- package/src/self-implement/classify-shadow.ts +3 -7
- package/src/self-implement/doctor-visit.ts +18 -1
- package/src/self-implement/gate-baseline.ts +56 -17
- package/src/self-implement/gate-cli.ts +1 -0
- package/src/self-implement/gate-remote.ts +31 -20
- package/src/self-implement/goal-author-decompose.ts +275 -47
- package/src/self-implement/goal-author.ts +250 -0
- package/src/self-implement/goal-elaborate.ts +295 -0
- package/src/self-implement/goal-refine.ts +270 -0
- package/src/self-implement/graph-overlay-yaml.ts +14 -3
- package/src/self-implement/orchestrator.ts +152 -45
- package/src/self-implement/rework-budget-judgment.ts +5 -8
- package/src/self-implement/run-stop.ts +10 -1
- package/src/self-implement/running-runs.ts +29 -1
- package/src/self-implement/scope-adjacency.ts +113 -0
- package/src/self-implement/seams.ts +127 -24
- package/src/self-implement/stop-autoheal.ts +87 -1
- package/src/session-runtime/index.ts +1 -1
- package/src/setup/llm-env-detect.ts +5 -0
- package/src/skills/tools/agent.ts +140 -14
- package/src/skills/tools/msg-ask.ts +100 -0
- package/src/skills/tools/ops-ledger.ts +2 -1
- package/src/steward/hold-hygiene.ts +24 -6
- package/src/steward/triage-budget.ts +194 -0
- package/src/steward/triage.ts +20 -3
- package/src/task-agent/actions.ts +69 -1
- package/src/task-agent/green-sweep.ts +4 -0
- package/src/task-agent/live-moves.ts +160 -4
- package/src/task-agent/parent-host.ts +123 -3
- package/src/task-agent/shadow.ts +7 -1
- package/src/task-agent/task-hand.ts +54 -41
- package/src/task-agent/tier-split.ts +127 -0
- package/src/task-agent/work-order-build.ts +2 -0
- package/src/task-agent/work-order.ts +3 -2
- package/src/task-orchestrator/generator-prompt.ts +60 -11
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +33 -0
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-command-job.ts +45 -7
- package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
- package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +8 -2
- package/src/task-orchestrator/surfaces/pod-provenance.ts +76 -0
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +18 -0
- package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +6 -2
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +3 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +37 -5
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +368 -36
- package/src/task-orchestrator/surfaces/self-implement.ts +23 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
- package/src/tui/README.md +2 -0
- package/src/tui/chat/background-job-status.ts +54 -0
- package/src/tui/chat/log-view.ts +80 -0
- package/src/tui/entry.ts +406 -0
- package/src/tui/input/composer.ts +144 -0
- package/src/tui/seat-mail-boot.ts +59 -0
- package/src/tui/slash/compact.ts +100 -0
- package/src/tui/slash/new-session.ts +35 -0
- package/src/tui-client/local-chat-turn.ts +239 -0
- package/src/tui-client/local-harness-command.ts +63 -0
- package/src/tui-client/local-provider-command.ts +184 -0
- package/src/user-config.ts +4 -2
- package/src/ux-sim/event-monkey.ts +378 -0
- package/src/ux-sim/fake-bin.ts +42 -7
- package/src/ux-sim/fault-nextmove-dispatch.ts +266 -0
- package/src/ux-sim/fault-pod-codex-503.ts +211 -0
- package/src/ux-sim/fault-scope-escape-lift.ts +189 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +0 -79
- package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +0 -94
- package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +0 -23
- package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +0 -115
- package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +0 -8
- package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3001-5a52788c813b6113.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3103.84470c8445962f04.js +0 -34
- package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3411-f87314c6c66ebc73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3498.cf2a15a8a9e5b926.js +0 -226
- package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3819.163d4777f0a597f6.js +0 -32
- package/apps/pwa/out/_next/static/chunks/3837.722e053fb9f321ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +0 -149
- package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +0 -64
- package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +0 -74
- package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5028-f0722e6114c313e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5249.96a848656b582a93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5446.edf141cff9ef647d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5489.ec2dd1b5272a19dc.js +0 -24
- package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +0 -1
- package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +0 -77
- package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +0 -90
- package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7448.478958ffbbba0ac0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7562.948255cbc3e79d33.js +0 -41
- package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +0 -27
- package/apps/pwa/out/_next/static/chunks/7952.b192c31b6a0e00cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +0 -36
- package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +0 -1
- package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8817.61bb7ffbba502ecb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +0 -93
- package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9739.8d5f36ac67a3b236.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-4fb31eb476dcbad3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-398c0faa173203f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +0 -122
- package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ffdc3a04.b9c23c1b28dd4a96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +0 -1
- /package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → T1mBQqmkwKDLGtyisDCOd}/_ssgManifest.js +0 -0
|
@@ -23,9 +23,64 @@ export function evidencePlan(rows: readonly LandedButYellowRow[]): Array<{ id: s
|
|
|
23
23
|
}));
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
interface PrIndex {
|
|
27
|
+
/** Shape of the list when indexed — a mismatch means the caller changed the array in place. */
|
|
28
|
+
length: number;
|
|
29
|
+
firstNumber: number | undefined;
|
|
30
|
+
lastNumber: number | undefined;
|
|
31
|
+
/** PR positions per body `칸:` line id — the whole-line label the matcher accepts. */
|
|
32
|
+
cellIds: Map<string, number[]>;
|
|
33
|
+
/** PR positions per maximal ASCII-alphanumeric run in the title or body. */
|
|
34
|
+
runs: Map<string, number[]>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const ALNUM_RUN = /[A-Za-z0-9]+/g;
|
|
38
|
+
const CELL_LINE = /^[ \t]*칸(?:[ \t]*:[ \t]*|[ \t]+)([A-Za-z0-9_-]+(?:[ \t]*,[ \t]*[A-Za-z0-9_-]+)*)[ \t]*$/;
|
|
39
|
+
const prIndexes = new WeakMap<readonly MergedChecklistPr[], PrIndex>();
|
|
40
|
+
|
|
41
|
+
function push(map: Map<string, number[]>, key: string, position: number): void {
|
|
42
|
+
const list = map.get(key);
|
|
43
|
+
if (!list) map.set(key, [position]);
|
|
44
|
+
else if (list[list.length - 1] !== position) list.push(position);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Built once per PR list (the open audit reuses one list across every version). Contract: callers treat the list as
|
|
49
|
+
* read-only after passing it. A cheap guard still re-indexes when the length or the first/last PR number changed;
|
|
50
|
+
* an in-place edit that keeps all three is not detected.
|
|
51
|
+
*/
|
|
52
|
+
function prIndex(prs: readonly MergedChecklistPr[]): PrIndex {
|
|
53
|
+
const cached = prIndexes.get(prs);
|
|
54
|
+
if (cached && cached.length === prs.length && cached.firstNumber === prs[0]?.number && cached.lastNumber === prs[prs.length - 1]?.number) return cached;
|
|
55
|
+
const index: PrIndex = { length: prs.length, firstNumber: prs[0]?.number, lastNumber: prs[prs.length - 1]?.number, cellIds: new Map(), runs: new Map() };
|
|
56
|
+
prs.forEach((pr, position) => {
|
|
57
|
+
const body = pr.body ?? '';
|
|
58
|
+
for (const line of body.split('\n')) {
|
|
59
|
+
const match = CELL_LINE.exec(line.endsWith('\r') ? line.slice(0, -1) : line);
|
|
60
|
+
for (const candidate of match?.[1]?.split(',') ?? []) push(index.cellIds, candidate.trim(), position);
|
|
61
|
+
}
|
|
62
|
+
for (const text of [pr.title, body]) for (const [run] of text.matchAll(ALNUM_RUN)) push(index.runs, run, position);
|
|
63
|
+
});
|
|
64
|
+
prIndexes.set(prs, index);
|
|
65
|
+
return index;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* PRs that can match `id` at all — a necessary condition, never a verdict. Every non-cell-line basis needs `id`
|
|
70
|
+
* in the title or body with no ASCII letter/digit on either side, so its leading alphanumeric run appears there
|
|
71
|
+
* as a maximal run. Ids that do not start with a letter or digit fall back to every PR.
|
|
72
|
+
*/
|
|
73
|
+
function candidatePositions(index: PrIndex, id: string, total: number): number[] {
|
|
74
|
+
const lead = /^[A-Za-z0-9]+/.exec(id)?.[0];
|
|
75
|
+
if (!lead) return Array.from({ length: total }, (_, position) => position);
|
|
76
|
+
const merged = new Set([...(index.cellIds.get(id) ?? []), ...(index.runs.get(lead) ?? [])]);
|
|
77
|
+
return [...merged].sort((a, b) => a - b);
|
|
78
|
+
}
|
|
79
|
+
|
|
26
80
|
/** Prefer a dedicated body cell line over title evidence; incidental mentions only qualify for long ids. */
|
|
27
81
|
export function landedButYellow(items: readonly ChecklistItem[], prs: readonly MergedChecklistPr[], { owner }: { owner?: string } = {}): LandedButYellowRow[] {
|
|
28
82
|
const rows: LandedButYellowRow[] = [];
|
|
83
|
+
const index = prIndex(prs);
|
|
29
84
|
for (const item of items) {
|
|
30
85
|
if (item.status !== 'yellow' && item.status !== 'red') continue;
|
|
31
86
|
if (owner !== undefined && !ownerMatches(item.owner, owner)) continue;
|
|
@@ -37,11 +92,10 @@ export function landedButYellow(items: readonly ChecklistItem[], prs: readonly M
|
|
|
37
92
|
: new RegExp(`^${id}(?:\\s|$)`);
|
|
38
93
|
const explicitTitle = new RegExp(`(?<![A-Za-z0-9])${id}\\s+(?:수확|(?:첫|둘째|셋째)\\s*조각)(?![A-Za-z0-9가-힣])|\\(${id}\\)`);
|
|
39
94
|
const rank: Record<PrMatchBasis, number> = { 'cell-line': 0, 'title-strong': 1, mention: 2 };
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
});
|
|
95
|
+
const cellLines = new Set(index.cellIds.get(item.id) ?? []);
|
|
96
|
+
const matched = candidatePositions(index, item.id, prs.length).flatMap((position) => {
|
|
97
|
+
const pr = prs[position]!;
|
|
98
|
+
const cellLine = cellLines.has(position);
|
|
45
99
|
const basis: PrMatchBasis | undefined = cellLine ? 'cell-line'
|
|
46
100
|
: titleStart.test(pr.title) || explicitTitle.test(pr.title) ? 'title-strong'
|
|
47
101
|
: !shortId && (word.test(pr.title) || word.test(pr.body ?? '')) ? 'mention' : undefined;
|
|
@@ -58,3 +112,73 @@ export function landedButYellow(items: readonly ChecklistItem[], prs: readonly M
|
|
|
58
112
|
}
|
|
59
113
|
return rows.sort((a, b) => Number(b.newer) - Number(a.newer));
|
|
60
114
|
}
|
|
115
|
+
|
|
116
|
+
export interface MergedPrRunResult { status: number | null; stdout: string; stderr: string }
|
|
117
|
+
/** One `gh` invocation; resolves when the process exits. */
|
|
118
|
+
export type MergedPrRunner = (command: string, args: readonly string[], cwd: string) => Promise<MergedPrRunResult>;
|
|
119
|
+
|
|
120
|
+
export const MERGED_PR_LIMIT = 400;
|
|
121
|
+
/** Concurrent `gh pr list` calls once the first page is full (LANDED-YELLOW-FAST · 10-21 prod: 24 sequential calls ≈ 145s). */
|
|
122
|
+
export const MERGED_PR_CONCURRENCY = 6;
|
|
123
|
+
const DAY_MS = 86_400_000;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Merged PRs since `since` (UTC date). One call answers when it returns fewer than the cap. Otherwise the range
|
|
127
|
+
* splits into UTC-day windows fetched with a concurrency cap; a full window is halved down to one second as before,
|
|
128
|
+
* and a full one-second window probes one extra row to tell exactly 400 from truncation.
|
|
129
|
+
* The returned set and the truncation flag match the former sequential bisection; only call shape and time differ.
|
|
130
|
+
*/
|
|
131
|
+
export async function fetchMergedChecklistPrs(since: string, now: Date, run: MergedPrRunner, cwd: string,
|
|
132
|
+
{ concurrency = MERGED_PR_CONCURRENCY }: { concurrency?: number } = {}): Promise<{ prs: MergedChecklistPr[]; truncated: boolean; calls: number }> {
|
|
133
|
+
let calls = 0;
|
|
134
|
+
const fetch = async (lower: string, upper?: string, limit = MERGED_PR_LIMIT): Promise<MergedChecklistPr[]> => {
|
|
135
|
+
const search = `merged:>=${lower}${upper ? ` merged:<${upper}` : ''}`;
|
|
136
|
+
calls++;
|
|
137
|
+
const r = await run('gh', ['pr', 'list', '--state', 'merged', '--search', search, '--limit', String(limit), '--json', 'number,title,body,mergedAt'], cwd);
|
|
138
|
+
if (r.status !== 0) throw new Error(`병합 PR 조회(gh) 실패 rc=${r.status}: ${(r.stderr || r.stdout).trim().slice(0, 400)}`);
|
|
139
|
+
const page = JSON.parse(r.stdout.trim()) as MergedChecklistPr[];
|
|
140
|
+
if (!Array.isArray(page)) throw new Error('병합 PR 조회(gh): 배열이 아니다');
|
|
141
|
+
return page;
|
|
142
|
+
};
|
|
143
|
+
const first = await fetch(since);
|
|
144
|
+
if (first.length < MERGED_PR_LIMIT) return { prs: first, truncated: false, calls };
|
|
145
|
+
// Bounded pool: at most `concurrency` gh processes at once; a failure stops new calls and rejects.
|
|
146
|
+
let active = 0;
|
|
147
|
+
let failed: unknown;
|
|
148
|
+
const waiting: Array<() => void> = [];
|
|
149
|
+
const limited = async <T>(task: () => Promise<T>): Promise<T> => {
|
|
150
|
+
while (active >= Math.max(1, concurrency) && failed === undefined) await new Promise<void>((resolve) => waiting.push(resolve));
|
|
151
|
+
if (failed !== undefined) throw failed;
|
|
152
|
+
active++;
|
|
153
|
+
try { return await task(); }
|
|
154
|
+
catch (error) { failed ??= error; throw error; }
|
|
155
|
+
finally { active--; if (failed !== undefined) for (const wake of waiting.splice(0)) wake(); else waiting.shift()?.(); }
|
|
156
|
+
};
|
|
157
|
+
let truncated = false;
|
|
158
|
+
const visit = async (start: number, end: number): Promise<MergedChecklistPr[]> => {
|
|
159
|
+
const from = new Date(start).toISOString();
|
|
160
|
+
const to = new Date(end).toISOString();
|
|
161
|
+
const page = await limited(() => fetch(from, to));
|
|
162
|
+
if (page.length < MERGED_PR_LIMIT) return page;
|
|
163
|
+
if (end - start <= 1000) {
|
|
164
|
+
// The second-precision search cannot be subdivided; probe one extra row to distinguish exactly 400 from a real truncation.
|
|
165
|
+
const probe = await limited(() => fetch(from, to, MERGED_PR_LIMIT + 1));
|
|
166
|
+
if (probe.length > MERGED_PR_LIMIT) truncated = true;
|
|
167
|
+
return probe.slice(0, MERGED_PR_LIMIT);
|
|
168
|
+
}
|
|
169
|
+
const middle = start + Math.floor((end - start) / 2000) * 1000;
|
|
170
|
+
const [left, right] = await Promise.all([visit(start, middle), visit(middle, end)]);
|
|
171
|
+
return [...left, ...right];
|
|
172
|
+
};
|
|
173
|
+
const lower = Date.parse(`${since}T00:00:00Z`);
|
|
174
|
+
const upper = Math.max(lower + 1000, Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() + 1));
|
|
175
|
+
const windows: Array<[number, number]> = [];
|
|
176
|
+
for (let start = lower; start < upper; start += DAY_MS) windows.push([start, Math.min(start + DAY_MS, upper)]);
|
|
177
|
+
const settled = await Promise.allSettled(windows.map(([start, end]) => visit(start, end)));
|
|
178
|
+
const rejected = settled.find((result): result is PromiseRejectedResult => result.status === 'rejected');
|
|
179
|
+
if (rejected) throw failed ?? rejected.reason;
|
|
180
|
+
// Chronological window order, first occurrence wins — the same de-duplication as before.
|
|
181
|
+
const unique = new Map<number, MergedChecklistPr>();
|
|
182
|
+
for (const result of settled) for (const pr of (result as PromiseFulfilledResult<MergedChecklistPr[]>).value) if (!unique.has(pr.number)) unique.set(pr.number, pr);
|
|
183
|
+
return { prs: [...unique.values()], truncated, calls };
|
|
184
|
+
}
|
|
@@ -209,6 +209,7 @@ export async function runLightRc(version: string, opts: LightRcOptions = {}, dep
|
|
|
209
209
|
};
|
|
210
210
|
const captured: Buffer[] = [];
|
|
211
211
|
const rc = await (deps.dispatch ?? dispatchHeavyCheck)({
|
|
212
|
+
// Keep the self-gate contract: an unavailable remote leaves this release check unmeasured; do not start a heavy gate locally.
|
|
212
213
|
tool: 'self-gate', repo: cwd, installPwa: true, refs: [base], json: true, commit: measuredCommit,
|
|
213
214
|
// The host re-runs this command with --local (and ELANOUS_GATE_REMOTE_CHILD=1), so it never recurses.
|
|
214
215
|
remoteArgv: (sha) => ['bun', 'bin/elanous.mjs', 'release', 'light-rc', '--version', version, '--base', sha(base), '--head', measuredCommit, '--shards', String(shards), ...(opts.fixedShardDistribution ? ['--fixed-shard-distribution'] : []), '--local', '--json', ...(opts.rehearsalTui ? ['--rehearsal-tui'] : [])],
|
|
@@ -15,6 +15,7 @@ import { LIGHT_RC_UNKNOWN_HOST, runLightRc, type LightRcResult } from './light-r
|
|
|
15
15
|
import { planRehearsalShards, type RehearsalShardPlan, type RehearsalShardPlanDeps } from './rehearsal-shard-plan.js';
|
|
16
16
|
import { listSchedules, type ReleaseSchedule } from './release-schedule.js';
|
|
17
17
|
import { SPAWN_SYNC_MAX_BUFFER } from '../util/spawn-sync-output.js';
|
|
18
|
+
import { hardRehearsalGateArgs } from '../../scripts/release-loop/gate-radius-live.js';
|
|
18
19
|
|
|
19
20
|
export type StepId = 'hard-mid' | 'rc-7h' | 'hard-5h' | 'rc-150m';
|
|
20
21
|
export type RehearsalOutcome = 'ok' | 'regression' | 'unmeasured' | 'error' | 'no-checkout' | 'checkout-dirty' | 'superseded' | 'interrupted';
|
|
@@ -200,8 +201,7 @@ async function runHardGate(version: string, checkout: string, sha: string, ledge
|
|
|
200
201
|
mkdirSync(dirname(logPath), { recursive: true });
|
|
201
202
|
const run = (() => {
|
|
202
203
|
const log = openSync(logPath, 'wx', 0o600);
|
|
203
|
-
try { return spawnSync('bun',
|
|
204
|
-
'--baseline-version', previous, '--executor', 'pod', '--pod-pool', pool, '--pod-shards', '12', '--json'], {
|
|
204
|
+
try { return spawnSync('bun', hardRehearsalGateArgs(version, runId, sha, previous, pool), {
|
|
205
205
|
cwd: checkout, encoding: 'utf8', stdio: ['ignore', log, log], timeout: 4 * 60 * 60_000,
|
|
206
206
|
env: { ...process.env, ELANOUS_STATE_DIR: ledgerRoot, ELANOUS_STATE_DIR_SOURCE: stateDirSourceForChild(ledgerRoot) },
|
|
207
207
|
}); } finally { closeSync(log); }
|
package/src/repl/index.ts
CHANGED
|
@@ -47,6 +47,46 @@ import { buildReplayTurnsFromSession } from './replay.js';
|
|
|
47
47
|
import type { LLMToolSpec, ContentBlock } from '../llm.js';
|
|
48
48
|
import { inspectActiveProvider } from '../provider-summary.js';
|
|
49
49
|
import { parse as parseYaml } from 'yaml';
|
|
50
|
+
import type { PendingTaskNotification } from '../agent/task-notification.js';
|
|
51
|
+
import { dispatchReplMessageTool, isReplMessageTool } from './ops-msg-bridge.js';
|
|
52
|
+
import { buildSeatBootSystemMessages, type SeatBootDeps } from '../dashboard/seat-boot-preamble.js';
|
|
53
|
+
|
|
54
|
+
/** Private side channel for the next TUI. Ordinary REPL JSONL stdout is unchanged. */
|
|
55
|
+
const NEXT_TUI_BG_PREFIX = 'ELANOUS_TUI_BG_STATUS\t';
|
|
56
|
+
|
|
57
|
+
export function createNextTuiBackgroundBridge(sessionId: string, bufferedCount: () => number) {
|
|
58
|
+
if (process.env.ELANOUS_NEXT_TUI_BG_STATUS !== '1') return null;
|
|
59
|
+
const { globalAgentRegistry } = require('../agent/registry.js') as typeof import('../agent/registry.js');
|
|
60
|
+
const { globalTaskNotificationQueue } = require('../agent/task-notification.js') as typeof import('../agent/task-notification.js');
|
|
61
|
+
const unregisteredPromises = new Set<string>();
|
|
62
|
+
let last = '';
|
|
63
|
+
const emit = () => {
|
|
64
|
+
const tasks = globalAgentRegistry.list();
|
|
65
|
+
for (const task of tasks) unregisteredPromises.delete(task.id);
|
|
66
|
+
const running = tasks.filter((task) => task.background && (task.state === 'pending' || task.state === 'running')).length;
|
|
67
|
+
const frame = JSON.stringify({ sessionId, promised: unregisteredPromises.size > 0, running, pending: globalTaskNotificationQueue.size + bufferedCount() });
|
|
68
|
+
if (frame === last) return;
|
|
69
|
+
last = frame;
|
|
70
|
+
process.stderr.write(`${NEXT_TUI_BG_PREFIX}${frame}\n`);
|
|
71
|
+
};
|
|
72
|
+
const done = globalAgentRegistry.onTaskDone(emit);
|
|
73
|
+
const timer = setInterval(emit, 250);
|
|
74
|
+
timer.unref();
|
|
75
|
+
emit();
|
|
76
|
+
return {
|
|
77
|
+
beginTurn() { emit(); },
|
|
78
|
+
observeToolResult(name: string, args: Record<string, unknown>, result: unknown) {
|
|
79
|
+
if (name !== 'Agent' || args.run_in_background !== true) return;
|
|
80
|
+
if (!result || typeof result !== 'object') return;
|
|
81
|
+
const spawned = result as { taskId?: unknown; background?: unknown };
|
|
82
|
+
if (spawned.background !== true || typeof spawned.taskId !== 'string') return;
|
|
83
|
+
unregisteredPromises.add(spawned.taskId);
|
|
84
|
+
emit();
|
|
85
|
+
},
|
|
86
|
+
emit,
|
|
87
|
+
dispose() { clearInterval(timer); done.dispose(); },
|
|
88
|
+
};
|
|
89
|
+
}
|
|
50
90
|
|
|
51
91
|
/** REPL public entry — wires whichever input source the caller chose
|
|
52
92
|
* to the shared turn dispatcher. The CLI command (in src/index.ts)
|
|
@@ -141,6 +181,11 @@ function buildReplTools(): {
|
|
|
141
181
|
})) {
|
|
142
182
|
specs.push(spec);
|
|
143
183
|
}
|
|
184
|
+
// The ops ledger is a runtime family, so the native-only catalog above
|
|
185
|
+
// cannot advertise it. Keep the REPL surface limited to seat mail.
|
|
186
|
+
const ledger = require('../skills/tools/ops-ledger.js') as typeof import('../skills/tools/ops-ledger.js');
|
|
187
|
+
const ask = require('../skills/tools/msg-ask.js') as typeof import('../skills/tools/msg-ask.js');
|
|
188
|
+
specs.push(ledger.buildMsgListTool(), ledger.buildMsgPostTool(), ask.buildMsgAskTool(), ledger.buildMsgAckTool());
|
|
144
189
|
const bashMod = require('../skills/tools/index.js') as typeof import('../skills/tools/index.js');
|
|
145
190
|
specs.push(bashMod.buildBashTool());
|
|
146
191
|
dispatchByName.set('Bash', async (args) => bashMod.dispatchBash(args, { cwd: process.cwd() }));
|
|
@@ -149,6 +194,7 @@ function buildReplTools(): {
|
|
|
149
194
|
try {
|
|
150
195
|
const direct = dispatchByName.get(name);
|
|
151
196
|
if (direct) return await direct(args);
|
|
197
|
+
if (isReplMessageTool(name)) return await dispatchReplMessageTool(name, args);
|
|
152
198
|
return await sr.dispatchSessionRuntimeTool(name, args, {
|
|
153
199
|
signal: undefined,
|
|
154
200
|
userText: '',
|
|
@@ -192,6 +238,59 @@ function buildAgentSystemPrompt(
|
|
|
192
238
|
}
|
|
193
239
|
}
|
|
194
240
|
|
|
241
|
+
/**
|
|
242
|
+
* 새 TUI REPL 의 시스템 프롬프트 «한 곳» — 범용 preamble ⊕ 자리 부트 카드(TUI-SESSION-BOOT).
|
|
243
|
+
*
|
|
244
|
+
* 새 TUI(`src/tui/entry.ts` → `src/tui-client/local-chat-turn.ts`)는 `elanous repl --json --stdin-jsonl`
|
|
245
|
+
* 자식으로 턴을 돌린다. 그래서 legacy 대시보드의 `buildDashboardTurnPreamble` 부트 경로는 지나지 않고
|
|
246
|
+
* «여기»만 지난다 — 자리 역할·미읽음 수를 첫 턴의 모델 입력에 싣는 자리도 여기 하나뿐이다.
|
|
247
|
+
*
|
|
248
|
+
* 카드는 `dashboard/seat-boot-preamble.ts` 의 `buildSeatBootSystemMessages` 를 그대로 쓴다(새 주입 로직 없음).
|
|
249
|
+
* 자리 판정이 서면 카드 한 장(대화마다 한 번 만든 같은 문면) · 자리가 아니면 빈 배열이라 주입 0건이다.
|
|
250
|
+
* 도구 표면이 꺼져 있으면(`enabledToolNames === undefined`) 종전처럼 범용 preamble 은 빠지고 카드만 남는다.
|
|
251
|
+
*/
|
|
252
|
+
export function buildReplSystemPrompt(ctx: {
|
|
253
|
+
cfg: UserConfig;
|
|
254
|
+
/** 도구 표면이 꺼져 있으면 undefined — 그때도 자리 부트 카드는 실린다. */
|
|
255
|
+
enabledToolNames: readonly string[] | undefined;
|
|
256
|
+
cwd: string;
|
|
257
|
+
sessionId?: string | undefined;
|
|
258
|
+
/** 시험·임베디드 호출부용 시임 — 기본은 실제 홈·msg 원장·process.env. */
|
|
259
|
+
seatBootDeps?: SeatBootDeps | undefined;
|
|
260
|
+
}): string | undefined {
|
|
261
|
+
const base = ctx.enabledToolNames === undefined
|
|
262
|
+
? undefined
|
|
263
|
+
: buildAgentSystemPrompt(ctx.cfg, ctx.enabledToolNames);
|
|
264
|
+
const card = buildSeatBootCardText(ctx);
|
|
265
|
+
if (card.length === 0) return base;
|
|
266
|
+
return base === undefined || base.length === 0 ? card : `${base}\n\n${card}`;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/** 자리 부트 카드 문면(system 메시지 0~1개를 이어 붙인 것). 자리가 아니면 ''. */
|
|
270
|
+
function buildSeatBootCardText(ctx: {
|
|
271
|
+
cwd: string;
|
|
272
|
+
sessionId?: string | undefined;
|
|
273
|
+
seatBootDeps?: SeatBootDeps | undefined;
|
|
274
|
+
}): string {
|
|
275
|
+
try {
|
|
276
|
+
return buildSeatBootSystemMessages(
|
|
277
|
+
{ cwd: ctx.cwd, ...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}) },
|
|
278
|
+
ctx.seatBootDeps ?? {},
|
|
279
|
+
)
|
|
280
|
+
.map((message) => (typeof message.content === 'string' ? message.content : ''))
|
|
281
|
+
.filter((text) => text.length > 0)
|
|
282
|
+
.join('\n\n');
|
|
283
|
+
} catch (error) {
|
|
284
|
+
// 카드 오류가 턴을 막지는 않지만, 조용히 자리 문맥을 잃지 않도록 실패를 기록한다.
|
|
285
|
+
debug.log('dashboard.seat-boot', 'card-error', {
|
|
286
|
+
cwd: ctx.cwd,
|
|
287
|
+
sessionId: ctx.sessionId,
|
|
288
|
+
error: error instanceof Error ? error.message : String(error),
|
|
289
|
+
});
|
|
290
|
+
return '';
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
195
294
|
function loadAttachment(rawPath: string, baseDir: string): PendingAttachment | null {
|
|
196
295
|
const resolved = isAbsolute(rawPath) ? rawPath : resolvePath(baseDir, rawPath);
|
|
197
296
|
if (!existsSync(resolved)) {
|
|
@@ -224,10 +323,12 @@ async function runOneTurn(
|
|
|
224
323
|
tools: ReturnType<typeof buildReplTools> | undefined,
|
|
225
324
|
systemPrompt: string | undefined,
|
|
226
325
|
jsonOutput: boolean,
|
|
326
|
+
nextTuiDelivery?: { pending: PendingTaskNotification[] },
|
|
327
|
+
onJsonDelta?: (delta: string) => void,
|
|
227
328
|
): Promise<{ reply: string; provider: string; model: string | null; durationMs: number; logPath: string | null }> {
|
|
228
329
|
const startedAt = Date.now();
|
|
229
330
|
const replyChunks: string[] = [];
|
|
230
|
-
const userImages = pendingAttachments.length > 0 ? pendingAttachments.map(a => a.block) :
|
|
331
|
+
const userImages = pendingAttachments.length > 0 ? pendingAttachments.map(a => a.block) : [];
|
|
231
332
|
if (!jsonOutput) {
|
|
232
333
|
process.stdout.write(' ');
|
|
233
334
|
}
|
|
@@ -238,14 +339,29 @@ async function runOneTurn(
|
|
|
238
339
|
const { applyToolPolicy } = require('../tool-runtime/tool-policy.js') as typeof import('../tool-runtime/tool-policy.js');
|
|
239
340
|
replToolSpecs = applyToolPolicy(replToolSpecs, { deny: cfg.chat.toolDeny }) ?? replToolSpecs;
|
|
240
341
|
}
|
|
342
|
+
// The classic dashboard has its own turn preamble. The next TUI's sticky
|
|
343
|
+
// REPL must deliver this child's completed tasks on the next parent turn.
|
|
344
|
+
let nextTuiNotifications = '';
|
|
345
|
+
if (nextTuiDelivery) {
|
|
346
|
+
const { globalTaskNotificationQueue, renderTaskNotificationsXml } =
|
|
347
|
+
require('../agent/task-notification.js') as typeof import('../agent/task-notification.js');
|
|
348
|
+
nextTuiDelivery.pending.push(...globalTaskNotificationQueue.drain());
|
|
349
|
+
nextTuiNotifications = renderTaskNotificationsXml(nextTuiDelivery.pending);
|
|
350
|
+
}
|
|
351
|
+
// Completion output is untrusted task data. Carry it as a user-role content
|
|
352
|
+
// block for this call, leaving the human prompt and system prompt intact.
|
|
353
|
+
if (nextTuiNotifications) userImages.unshift({ type: 'text', text: nextTuiNotifications });
|
|
241
354
|
const result = await runTurn({
|
|
242
355
|
userConfig: cfg,
|
|
243
356
|
sessionId,
|
|
244
357
|
userText,
|
|
245
358
|
systemPrompt,
|
|
246
|
-
userImages,
|
|
359
|
+
userImages: userImages.length > 0 ? userImages : undefined,
|
|
247
360
|
onDelta: (d) => {
|
|
248
|
-
if (jsonOutput)
|
|
361
|
+
if (jsonOutput) {
|
|
362
|
+
replyChunks.push(d);
|
|
363
|
+
onJsonDelta?.(d);
|
|
364
|
+
}
|
|
249
365
|
else process.stdout.write(d);
|
|
250
366
|
},
|
|
251
367
|
tools: replToolSpecs,
|
|
@@ -272,6 +388,8 @@ async function runOneTurn(
|
|
|
272
388
|
}
|
|
273
389
|
},
|
|
274
390
|
});
|
|
391
|
+
// A failed turn keeps the buffered notifications for the next JSONL prompt.
|
|
392
|
+
nextTuiDelivery?.pending.splice(0);
|
|
275
393
|
const reply = jsonOutput ? replyChunks.join('') : '';
|
|
276
394
|
const logPath = (() => {
|
|
277
395
|
try {
|
|
@@ -477,10 +595,24 @@ export async function runRepl(opts: ReplOpts): Promise<number> {
|
|
|
477
595
|
}
|
|
478
596
|
const sessionIdRef = { current: session.id };
|
|
479
597
|
|
|
480
|
-
const
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
598
|
+
const nextTuiDelivery = process.env.ELANOUS_NEXT_TUI_BG_STATUS === '1'
|
|
599
|
+
? { pending: [] as PendingTaskNotification[] } : undefined;
|
|
600
|
+
const backgroundBridge = createNextTuiBackgroundBridge(session.id, () => nextTuiDelivery?.pending.length ?? 0);
|
|
601
|
+
const baseTools = opts.enableTools ? buildReplTools() : undefined;
|
|
602
|
+
const tools = baseTools && backgroundBridge ? {
|
|
603
|
+
...baseTools,
|
|
604
|
+
dispatch: async (name: string, args: Record<string, unknown>) => {
|
|
605
|
+
const result = await baseTools.dispatch(name, args);
|
|
606
|
+
backgroundBridge.observeToolResult(name, args, result);
|
|
607
|
+
return result;
|
|
608
|
+
},
|
|
609
|
+
} : baseTools;
|
|
610
|
+
const systemPrompt = buildReplSystemPrompt({
|
|
611
|
+
cfg,
|
|
612
|
+
enabledToolNames: tools?.specs.map(s => s.name),
|
|
613
|
+
cwd: process.cwd(),
|
|
614
|
+
sessionId: session.id,
|
|
615
|
+
});
|
|
484
616
|
const pendingAttachments: PendingAttachment[] = [];
|
|
485
617
|
|
|
486
618
|
if (!opts.jsonOutput) {
|
|
@@ -548,6 +680,7 @@ export async function runRepl(opts: ReplOpts): Promise<number> {
|
|
|
548
680
|
ui.header(`turn ${turnId}${turn.rotate ? ` · ${turn.rotate}` : ''}`);
|
|
549
681
|
console.log(` ❯ ${turn.prompt}`);
|
|
550
682
|
}
|
|
683
|
+
backgroundBridge?.beginTurn();
|
|
551
684
|
const result = await runOneTurn(
|
|
552
685
|
cfg,
|
|
553
686
|
sessionIdRef.current,
|
|
@@ -556,7 +689,9 @@ export async function runRepl(opts: ReplOpts): Promise<number> {
|
|
|
556
689
|
tools,
|
|
557
690
|
systemPrompt,
|
|
558
691
|
opts.jsonOutput,
|
|
692
|
+
nextTuiDelivery,
|
|
559
693
|
);
|
|
694
|
+
backgroundBridge?.emit();
|
|
560
695
|
const failures = applyAsserts(result.reply, turn.asserts, sc.defaults?.asserts, turnId);
|
|
561
696
|
if (opts.jsonOutput) {
|
|
562
697
|
const out = {
|
|
@@ -577,7 +712,10 @@ export async function runRepl(opts: ReplOpts): Promise<number> {
|
|
|
577
712
|
}
|
|
578
713
|
assertFailures += failures.length;
|
|
579
714
|
}
|
|
580
|
-
if (opts.exitAfterScenario)
|
|
715
|
+
if (opts.exitAfterScenario) {
|
|
716
|
+
backgroundBridge?.dispose();
|
|
717
|
+
return assertFailures > 0 ? 2 : 0;
|
|
718
|
+
}
|
|
581
719
|
} // end if (scriptedScenario)
|
|
582
720
|
|
|
583
721
|
// Phase B — interactive (TTY) or JSONL stdin (pipe).
|
|
@@ -608,15 +746,29 @@ export async function runRepl(opts: ReplOpts): Promise<number> {
|
|
|
608
746
|
const att = loadAttachment(ap, process.cwd());
|
|
609
747
|
if (att) turnAttachments.push(att);
|
|
610
748
|
}
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
749
|
+
backgroundBridge?.beginTurn();
|
|
750
|
+
let result: Awaited<ReturnType<typeof runOneTurn>>;
|
|
751
|
+
try {
|
|
752
|
+
result = await runOneTurn(
|
|
753
|
+
cfg,
|
|
754
|
+
sessionIdRef.current,
|
|
755
|
+
turn.prompt,
|
|
756
|
+
turnAttachments,
|
|
757
|
+
tools,
|
|
758
|
+
systemPrompt,
|
|
759
|
+
true, // JSONL stream → always JSON output
|
|
760
|
+
nextTuiDelivery,
|
|
761
|
+
process.env.ELANOUS_NEXT_TUI_STREAM === '1' && typeof turn.id === 'string'
|
|
762
|
+
? (delta) => { process.stdout.write(`${JSON.stringify({ event: 'delta', turnId: turn.id, text: delta })}\n`); }
|
|
763
|
+
: undefined,
|
|
764
|
+
);
|
|
765
|
+
} catch (error) {
|
|
766
|
+
if (!backgroundBridge) throw error;
|
|
767
|
+
backgroundBridge.emit();
|
|
768
|
+
console.log(JSON.stringify({ sessionId: sessionIdRef.current, error: error instanceof Error ? error.message : String(error) }));
|
|
769
|
+
continue;
|
|
770
|
+
}
|
|
771
|
+
backgroundBridge?.emit();
|
|
620
772
|
const failures = applyAsserts(result.reply, turn.asserts, undefined, turn.id ?? 't?');
|
|
621
773
|
const out = {
|
|
622
774
|
turnId: turn.id ?? null,
|
|
@@ -630,6 +782,7 @@ export async function runRepl(opts: ReplOpts): Promise<number> {
|
|
|
630
782
|
};
|
|
631
783
|
console.log(JSON.stringify(out));
|
|
632
784
|
}
|
|
785
|
+
backgroundBridge?.dispose();
|
|
633
786
|
return 0;
|
|
634
787
|
}
|
|
635
788
|
|
|
@@ -709,6 +862,7 @@ export async function runRepl(opts: ReplOpts): Promise<number> {
|
|
|
709
862
|
}
|
|
710
863
|
// Ordinary prompt.
|
|
711
864
|
const turnAttachments = pendingAttachments.splice(0);
|
|
865
|
+
backgroundBridge?.beginTurn();
|
|
712
866
|
await runOneTurn(
|
|
713
867
|
cfg,
|
|
714
868
|
sessionIdRef.current,
|
|
@@ -717,10 +871,13 @@ export async function runRepl(opts: ReplOpts): Promise<number> {
|
|
|
717
871
|
tools,
|
|
718
872
|
systemPrompt,
|
|
719
873
|
opts.jsonOutput,
|
|
874
|
+
nextTuiDelivery,
|
|
720
875
|
);
|
|
876
|
+
backgroundBridge?.emit();
|
|
721
877
|
if (exitRequested) break;
|
|
722
878
|
rl.prompt();
|
|
723
879
|
}
|
|
880
|
+
backgroundBridge?.dispose();
|
|
724
881
|
return 0;
|
|
725
882
|
}
|
|
726
883
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { MsgLedgerDeps } from '../skills/tools/ops-ledger.js';
|
|
2
|
+
import type { MsgAskDeps } from '../skills/tools/msg-ask.js';
|
|
3
|
+
|
|
4
|
+
const MESSAGE_TOOL_NAMES = new Set(['MsgList', 'MsgPost', 'MsgAsk', 'MsgAck']);
|
|
5
|
+
|
|
6
|
+
/** The next TUI REPL can dispatch only its durable message tools directly.
|
|
7
|
+
* Other native runtimes keep the REPL's existing unavailable boundary. */
|
|
8
|
+
export function isReplMessageTool(name: string): boolean {
|
|
9
|
+
return MESSAGE_TOOL_NAMES.has(name);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export async function dispatchReplMessageTool(
|
|
13
|
+
name: string,
|
|
14
|
+
args: Record<string, unknown>,
|
|
15
|
+
deps: { ledger?: MsgLedgerDeps; ask?: MsgAskDeps; signal?: AbortSignal } = {},
|
|
16
|
+
): Promise<Record<string, unknown>> {
|
|
17
|
+
if (!isReplMessageTool(name)) throw new Error(`not a REPL message tool: ${name}`);
|
|
18
|
+
const { observeLedgerCall } = await import('../skills/tools/ops-ledger.js');
|
|
19
|
+
if (name === 'MsgAsk') {
|
|
20
|
+
const { dispatchMsgAsk } = await import('../skills/tools/msg-ask.js');
|
|
21
|
+
return observeLedgerCall(name, args,
|
|
22
|
+
() => dispatchMsgAsk(args, { ...deps.ask, signal: deps.signal ?? deps.ask?.signal }),
|
|
23
|
+
(a, r) => ({ from: a.from, to: a.to, ...(r ? { id: r.question.id, replied: r.reply !== null } : {}) }));
|
|
24
|
+
}
|
|
25
|
+
const { dispatchMsgList, dispatchMsgPost, dispatchMsgAck } = await import('../skills/tools/ops-ledger.js');
|
|
26
|
+
if (name === 'MsgList') return observeLedgerCall(name, args, () => dispatchMsgList(args, deps.ledger),
|
|
27
|
+
(a, r) => ({ to: a.to, ...(r ? { count: r.count, after: r.after } : {}) }));
|
|
28
|
+
if (name === 'MsgPost') return observeLedgerCall(name, args, () => dispatchMsgPost(args, deps.ledger),
|
|
29
|
+
(a, r) => ({ from: a.from, to: a.to, ...(r ? { id: r.message.id } : {}) }));
|
|
30
|
+
return observeLedgerCall(name, args, () => dispatchMsgAck(args, deps.ledger),
|
|
31
|
+
(a, r) => ({ to: a.to, id: a.id, ...(r ? { cursor: r.cursor } : {}) }));
|
|
32
|
+
}
|
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
type GoalClarificationSelfResolver,
|
|
45
45
|
} from '../self-implement/goal-author-clarification.js';
|
|
46
46
|
import { classifyReauthoredAsk, countMissingAuthoredConstraintMarkers, askGoalTypeDeclaration, declaredGoalType, parseGoalId } from '../self-implement/goal-author.js';
|
|
47
|
-
import { observeFrontNodeEntry } from './graph-front-nodes.js';
|
|
47
|
+
import { observeFrontNodeEntry, observeFrontNodeExit, observeFrontNodeUnit, type AuthorExitOutcome } from './graph-front-nodes.js';
|
|
48
48
|
import { emitDecision } from '../live/detail-switch.js';
|
|
49
49
|
import { decomposeSelfDevGoal, type SelfDevDecomposeOptions, type SelfDevDecomposition } from './decompose.js';
|
|
50
50
|
import { observeDecomposerSelection, readFabricDecomposeConfig, selectFabricDecomposer } from './self-orchestrate-runtime.js';
|
|
@@ -392,7 +392,7 @@ export async function recommendLaunchDecomposition(
|
|
|
392
392
|
...(input.runId === undefined ? {} : { runId: input.runId }),
|
|
393
393
|
...(decomposeGoalType === null ? {} : { goalType: decomposeGoalType }),
|
|
394
394
|
});
|
|
395
|
-
const result = await Promise.race([
|
|
395
|
+
const result = await observeFrontNodeUnit('decompose', input.runId ?? process.env.ELANOUS_RUN_ID, decomposeGoalType ?? undefined, () => Promise.race([
|
|
396
396
|
deps.decomposeGoal
|
|
397
397
|
? deps.decomposeGoal(document!)
|
|
398
398
|
: decomposeSelfDevGoal(document!, {
|
|
@@ -401,7 +401,7 @@ export async function recommendLaunchDecomposition(
|
|
|
401
401
|
observation: prelaunchDecompositionObservation(document!),
|
|
402
402
|
}),
|
|
403
403
|
timeout,
|
|
404
|
-
]);
|
|
404
|
+
]));
|
|
405
405
|
if (result === timedOut) {
|
|
406
406
|
// ⛔ 「시간 초과」를 「못 쟀다」로 뭉개지 않는다 — 분해기는 «아직 답하는 중»이고
|
|
407
407
|
// 그 답은 `prelaunch-decomposition` 이름으로 «따로» 내려앉는다(위 주석).
|
|
@@ -886,7 +886,7 @@ export async function runAskLaunchFlow(
|
|
|
886
886
|
if (launchPreflight === false) return { kind: 'stopped-before-authoring' };
|
|
887
887
|
|
|
888
888
|
await deps.beforeAuthoring?.();
|
|
889
|
-
const authorAndPreflight = async (authorAskText: string = input.askText, machineSuggestedTargetPaths: readonly string[] = []): Promise<{
|
|
889
|
+
const authorAndPreflight = async (authorAskText: string = input.askText, machineSuggestedTargetPaths: readonly string[] = [], attempt = 1): Promise<{
|
|
890
890
|
readonly goalFile: string;
|
|
891
891
|
readonly decision: ReturnType<typeof decideAskPreflight>;
|
|
892
892
|
}> => {
|
|
@@ -918,6 +918,12 @@ export async function runAskLaunchFlow(
|
|
|
918
918
|
})(),
|
|
919
919
|
...(launchPreflight === undefined ? {} : { launchPreflight }),
|
|
920
920
|
selfResolveClarifications: selfResolveClarifications.value,
|
|
921
|
+
}).catch((error: unknown) => {
|
|
922
|
+
// GRAPH-AUTHOR-FAIL-EDGE: 저작기가 던진 자리 = author `fail` 출구. ⛔ 관측만 하고 같은 오류를 그대로 다시 던진다.
|
|
923
|
+
observeFrontNodeExit({ node: 'author', outcome: 'fail' }, {
|
|
924
|
+
...frontObservation, attempt, reason: error instanceof Error ? error.message : String(error),
|
|
925
|
+
});
|
|
926
|
+
throw error;
|
|
921
927
|
});
|
|
922
928
|
deps.print(`[ask] 저작됨: ${authored.path}`);
|
|
923
929
|
// AUTHOR-TRACE: the authored goal file can be cleaned up later — keep path ⊕ sha256 ⊕ size in the run ledger and
|
|
@@ -1064,16 +1070,47 @@ export async function runAskLaunchFlow(
|
|
|
1064
1070
|
return { goalFile, decision };
|
|
1065
1071
|
};
|
|
1066
1072
|
|
|
1073
|
+
// GRAPH-AUTHOR-FAIL-EDGE ① — 저작 «끝»의 결과를 그래프 이름으로 남긴다(관측 · 다음 걸음은 아래 코드가 그대로 정한다).
|
|
1074
|
+
const authorNotGrounded = (decision: ReturnType<typeof decideAskPreflight>): boolean =>
|
|
1075
|
+
decision.result.blockers.length > 0 && decision.result.blockers.every((blocker) => blocker.kind === 'no-target-paths');
|
|
1076
|
+
const observeAuthorExit = (
|
|
1077
|
+
attempt: number,
|
|
1078
|
+
result: { readonly goalFile: string; readonly decision: ReturnType<typeof decideAskPreflight> },
|
|
1079
|
+
outcome: AuthorExitOutcome,
|
|
1080
|
+
taken?: { readonly node: string; readonly reason: string },
|
|
1081
|
+
): void => {
|
|
1082
|
+
const goalType = input.goalType ?? declaredGoalType(input.askText);
|
|
1083
|
+
observeFrontNodeExit({ node: 'author', outcome }, {
|
|
1084
|
+
attempt,
|
|
1085
|
+
goalFile: result.goalFile,
|
|
1086
|
+
...(input.runId === undefined ? {} : { runId: input.runId }),
|
|
1087
|
+
...(goalType === null ? {} : { goalType }),
|
|
1088
|
+
...(taken === undefined ? {} : { taken: taken.node, reason: taken.reason }),
|
|
1089
|
+
...(outcome === 'not-grounded' ? { blockers: result.decision.result.blockers } : {}),
|
|
1090
|
+
});
|
|
1091
|
+
};
|
|
1092
|
+
|
|
1067
1093
|
let authored = await authorAndPreflight();
|
|
1068
1094
|
let reauthored = false;
|
|
1069
1095
|
const retryableNoTargetPaths = !input.forceRequested
|
|
1070
1096
|
&& !authored.decision.shouldLaunch
|
|
1071
1097
|
&& authored.decision.result.blockers.length > 0
|
|
1072
1098
|
&& authored.decision.result.blockers.every((blocker) => blocker.kind === 'no-target-paths');
|
|
1099
|
+
if (authorNotGrounded(authored.decision)) {
|
|
1100
|
+
// 재시도 대상이면 그래프 답(re-ground) 그대로 · --force 로 재시도를 안 하면 코드가 간 곳을 실제 걸음으로 남긴다.
|
|
1101
|
+
observeAuthorExit(1, authored, 'not-grounded', retryableNoTargetPaths ? undefined : {
|
|
1102
|
+
node: authored.decision.shouldLaunch ? 'plan' : 'needs-human', reason: 'force-requested · no auto re-author',
|
|
1103
|
+
});
|
|
1104
|
+
} else {
|
|
1105
|
+
observeAuthorExit(1, authored, 'ok');
|
|
1106
|
+
}
|
|
1073
1107
|
if (retryableNoTargetPaths) {
|
|
1074
1108
|
const first = authored;
|
|
1075
1109
|
reauthored = true;
|
|
1076
1110
|
deps.print('[ask] ⑴ ⚠️ 대상 경로를 못 찾아 자동 재저작 한 번을 시도한다');
|
|
1111
|
+
observeFrontNodeExit({ node: 're-ground', outcome: 'retry' }, {
|
|
1112
|
+
attempt: 1, goalFile: first.goalFile, ...(input.runId === undefined ? {} : { runId: input.runId }),
|
|
1113
|
+
});
|
|
1077
1114
|
let candidates: ReturnType<typeof findAskPathCandidates> = { tokens: [], paths: [] };
|
|
1078
1115
|
if (parseAskTargetPathHintsResult(input.askText).labelMissing) {
|
|
1079
1116
|
try {
|
|
@@ -1107,7 +1144,9 @@ export async function runAskLaunchFlow(
|
|
|
1107
1144
|
recordPodAuthoring('ask-auto-reauthor', { candidatePathCount: candidates.paths.length, firstPathCount: first.decision.result.paths.length, outcome: 'started' });
|
|
1108
1145
|
authored = await authorAndPreflight(selectedPaths.length > 0
|
|
1109
1146
|
? `대상 경로: ${selectedPaths.join(' · ')}\n${input.askText}`
|
|
1110
|
-
: input.askText, selectedPaths);
|
|
1147
|
+
: input.askText, selectedPaths, 2);
|
|
1148
|
+
// 두 번째 not-grounded 는 re-ground 예산(max_visits 1)을 넘어 needs-human(근거 카드)으로 — 판정은 observeFrontNodeExit 가 선언에서 읽는다.
|
|
1149
|
+
observeAuthorExit(2, authored, !authored.decision.shouldLaunch && authorNotGrounded(authored.decision) ? 'not-grounded' : 're-authored');
|
|
1111
1150
|
deps.log('ask-auto-reauthor', {
|
|
1112
1151
|
candidatePathCount: candidates.paths.length,
|
|
1113
1152
|
firstGoalFile: first.goalFile,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CLI_HARNESS_RUN_ENTRANCE, describeEntranceCommand } from './entrance-registry.js';
|
|
2
|
+
|
|
3
|
+
/** Shared help text stays independent of the CLI execution graphs.
|
|
4
|
+
* The deprecated harness help comes from the entrance registry so its
|
|
5
|
+
* destination and status cannot drift from the declared entrance. */
|
|
6
|
+
export const HARNESS_RUN_REPLACEMENT = 'elanous harness say <objective>';
|
|
7
|
+
export const HARNESS_RUN_DEPRECATION_HELP = describeEntranceCommand(
|
|
8
|
+
CLI_HARNESS_RUN_ENTRANCE,
|
|
9
|
+
HARNESS_RUN_REPLACEMENT,
|
|
10
|
+
'이 입구는 더 이상 실행되지 않습니다.',
|
|
11
|
+
).trimEnd();
|
|
12
|
+
|
|
13
|
+
/** `dev --plan` help points to this one replacement. */
|
|
14
|
+
export const DEV_PLAN_REPLACEMENT = 'elanous harness say';
|
|
15
|
+
export function formatDevPlanOptionHelp(replacement: string = DEV_PLAN_REPLACEMENT): string {
|
|
16
|
+
return `은퇴한 staged 하니스 옵션 — 지정하면 명시적으로 거부됨 · 대응 문 \`${replacement}\``;
|
|
17
|
+
}
|