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
|
@@ -11,21 +11,22 @@
|
|
|
11
11
|
import { spawnSync } from 'node:child_process';
|
|
12
12
|
import { randomUUID } from 'node:crypto';
|
|
13
13
|
import { githubAutomationToken } from '../auth/github-app-token.js';
|
|
14
|
-
import { debug } from '../debug/log.js';
|
|
14
|
+
import { debug, redactSecretText } from '../debug/log.js';
|
|
15
15
|
import { POD_GITHUB_CREDENTIAL_TOKEN_ENV, POD_GITHUB_CREDENTIAL_URL_ENV } from '../nexus/api/pod-credential-api.js';
|
|
16
16
|
import { runGitWithRetry } from '../git-fs/retry.js';
|
|
17
17
|
import { DEFAULT_BRANCH_WORKTREE_BASE } from '../git-fs/worktree.js';
|
|
18
18
|
import { isElanousRuntimeArtifactPath } from '../self-implement/gate-scope.js';
|
|
19
19
|
import { isTransientExecutionFailure } from '../self-dev/execution-transient.js';
|
|
20
20
|
import { withGhRestFallback } from './gh-rest-fallback.js';
|
|
21
|
-
import { cardIdFromBody, cellIdFromBody, guardNewPr, hasCardMarker, parseDiffHunks, readOpenPrs, recordGuardUnmeasured, type GuardVerdict, type HunkOverlapMode, type Seat } from '../pr-tool/census.js';
|
|
21
|
+
import { cardIdFromBody, cellIdFromBody, guardNewPr, hasCardMarker, parseDiffHunks, readOpenPrs, recordGuardUnmeasured, sharedCensusDiffCache, sliceMarkerFromBody, spawnParallelCommands, type GuardVerdict, type HunkOverlapMode, type PrToolParallelCommand, type Seat } from '../pr-tool/census.js';
|
|
22
22
|
import { labelsForAxis, PR_LABEL_NAMES } from '../github/pr-labels.js';
|
|
23
23
|
import { getUserConfig } from '../user-config.js';
|
|
24
|
+
import { runSuffixKey } from '../self-implement/salvage-branches.js';
|
|
24
25
|
|
|
25
26
|
/** ★ stderr 캡처(대표 2026-07-21·관측 갭) — 종전엔 stdout 만 담아 git/gh 실패 사유가 소실됐다
|
|
26
27
|
* (705308: makePr 실패가 bare null 로 뭉뚱그려져 triage 가 "인증·네트워크"로 환각 오라우팅).
|
|
27
28
|
* 이제 err 에 stderr 를 담아 upsertPr 가 실패 단계·사유를 구조화해 반환한다. */
|
|
28
|
-
export interface CmdResult { ok: boolean; out: string; err?: string }
|
|
29
|
+
export interface CmdResult { ok: boolean; out: string; err?: string; /** 실제 종료 코드 — defaultCmdRunner 만 채운다(스텁은 ok 로만 판정). */ rc?: number }
|
|
29
30
|
/** 명령 실행 추상화(주입형·테스트 스텁) — git/gh 를 실제로 돌리지 않고 로직 검증. */
|
|
30
31
|
export type CmdRunner = (cmd: string, args: readonly string[], opts?: { cwd?: string }) => CmdResult;
|
|
31
32
|
|
|
@@ -77,7 +78,10 @@ export const defaultCmdRunner: CmdRunner = (cmd, args, opts) => {
|
|
|
77
78
|
// never read an overflow as success.
|
|
78
79
|
const r = spawnSync(cmd, [...args], { encoding: 'utf-8', timeout: 120_000, maxBuffer: 256 * 1024 * 1024, env, ...(opts?.cwd ? { cwd: opts.cwd } : {}) });
|
|
79
80
|
const overflow = (r.error as NodeJS.ErrnoException | undefined)?.code === 'ENOBUFS';
|
|
80
|
-
|
|
81
|
+
const result: CmdResult = { ok: r.status === 0 && !overflow, out: (r.stdout ?? '').trim(), err: [(r.stderr ?? '').trim(), overflow ? 'output exceeded 256MiB (ENOBUFS)' : ''].filter(Boolean).join('\n') };
|
|
82
|
+
// Keep the historical enumerable result shape while making the exit code available to PR incidents.
|
|
83
|
+
if (typeof r.status === 'number') Object.defineProperty(result, 'rc', { value: r.status, enumerable: false });
|
|
84
|
+
return result;
|
|
81
85
|
} catch (e) { return { ok: false, out: '', err: e instanceof Error ? e.message : String(e) }; }
|
|
82
86
|
};
|
|
83
87
|
|
|
@@ -90,6 +94,8 @@ export function extractPrNumber(prUrl: string): number | null {
|
|
|
90
94
|
export interface UpsertPrInput {
|
|
91
95
|
/** 안정 브랜치명(se/…-<phaseHex>) — 재활용 키. */
|
|
92
96
|
branch: string;
|
|
97
|
+
/** Owning self-implement run; used to keep temporary upload refs inside its Pod push fence. */
|
|
98
|
+
runId?: string;
|
|
93
99
|
/** 격리 worktree 경로(git cwd). */
|
|
94
100
|
worktreePath: string;
|
|
95
101
|
title: string;
|
|
@@ -122,7 +128,8 @@ export interface UpsertPrResult { url: string; reused: boolean }
|
|
|
122
128
|
export type UpsertPrOutcome =
|
|
123
129
|
| { ok: true; url: string; reused: boolean; labelsApplied?: boolean; labelsOmitted?: boolean;
|
|
124
130
|
supersededPr?: number }
|
|
125
|
-
| { ok: false; reason: 'add' | 'commit' | 'base' | 'noop' | 'push' | 'gh' | 'guard'; detail: string
|
|
131
|
+
| { ok: false; reason: 'add' | 'commit' | 'base' | 'noop' | 'push' | 'gh' | 'guard'; detail: string;
|
|
132
|
+
incident?: PrCreateFailureIncident };
|
|
126
133
|
|
|
127
134
|
/** 관측된 문면 두 가지:
|
|
128
135
|
* could not add label: 'auto-review' not found
|
|
@@ -181,7 +188,7 @@ function readPrMergeState(run: CmdRunner, prNumber: number, cwd?: string): Merge
|
|
|
181
188
|
export type FindPrForBranchOutcome =
|
|
182
189
|
| { status: 'ok OUTPUT'; url: string }
|
|
183
190
|
| { status: 'ok EMPTY'; url: null }
|
|
184
|
-
| { status: 'FAILED'; url: null }
|
|
191
|
+
| { status: 'FAILED'; url: null; rc?: number; stderrTail?: string }
|
|
185
192
|
| { status: 'SKIPPED'; url: null };
|
|
186
193
|
|
|
187
194
|
export interface PrManager {
|
|
@@ -319,18 +326,102 @@ function isTransientPushFailure(detail: string): boolean {
|
|
|
319
326
|
return isTransientExecutionFailure(pushFailureMessageForTransientCheck(detail));
|
|
320
327
|
}
|
|
321
328
|
|
|
329
|
+
// ── 칸 PR-CREATE-FAIL-OBSERVE-FU — PR 생성 실패 incident(관측 단위) ──────────────
|
|
330
|
+
// run-7308cfbf·run-fabc2564·run-32bca71e·run-42876ab6 의 draft PR 생성 실패가
|
|
331
|
+
// outcome 원장만으로는 push·gh create·인증·원격 충돌 중 어느 단계인지 못 가렸다.
|
|
332
|
+
// 하나의 incident 가 push 와 gh 단계를 각각 식별해 rc·stderr 꼬리·branch/remote·push 성패를 남긴다.
|
|
333
|
+
/** PR 생성 경로에서 실패 관측 대상인 단계. */
|
|
334
|
+
export type PrCreateStageId = 'push' | 'gh';
|
|
335
|
+
/** 단계별 관측: 실행 여부 · 종료 코드 · (자격증명 제거된) stderr 꼬리 · push 성공 여부. */
|
|
336
|
+
export interface PrCreateStageObservation {
|
|
337
|
+
stage: PrCreateStageId;
|
|
338
|
+
ran: boolean;
|
|
339
|
+
rc?: number;
|
|
340
|
+
stderrTail?: string;
|
|
341
|
+
/** push 단계 전용 — force-push 최종 성공 여부. */
|
|
342
|
+
ok?: boolean;
|
|
343
|
+
}
|
|
344
|
+
/** PR 생성 실패 한 건 — push/gh 두 단계 관측을 하나의 기록에. */
|
|
345
|
+
export interface PrCreateFailureIncident {
|
|
346
|
+
runId?: string;
|
|
347
|
+
branch: string;
|
|
348
|
+
remote: string;
|
|
349
|
+
push: PrCreateStageObservation;
|
|
350
|
+
gh: PrCreateStageObservation;
|
|
351
|
+
}
|
|
352
|
+
/** stderr 꼬리로 남기는 최대 글자 수. */
|
|
353
|
+
export const PR_CREATE_STDERR_TAIL_CHARS = 400;
|
|
354
|
+
|
|
355
|
+
/** 토큰·URL 자격증명을 기록 전에 지운다(원문 꼬리는 살리고 비밀만 뭉개기). */
|
|
356
|
+
const CREDENTIAL_REDACTION_PATTERNS: readonly { pattern: RegExp; replacement: string }[] = [
|
|
357
|
+
// GitHub token prefixes(ghp_/gho_/ghu_/ghs_/ghr_/github_pat_ …) — secret 부분만 치환.
|
|
358
|
+
{ pattern: /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{16,}/g, replacement: '[REDACTED]' },
|
|
359
|
+
{ pattern: /\bgithub_pat_[A-Za-z0-9_]{20,}/g, replacement: '[REDACTED]' },
|
|
360
|
+
// URL userInfo(https://user:pass@host · ssh://user:pass@host) — 스킴은 살리고 자격증명만.
|
|
361
|
+
{ pattern: /((?:https?|ssh|git\+ssh):\/\/)[^\s/@]+:[^\s/@]+@/g, replacement: '$1[REDACTED]@' },
|
|
362
|
+
];
|
|
363
|
+
|
|
364
|
+
/** stderr 텍스트에서 토큰·URL 자격증명을 제거한다. */
|
|
365
|
+
export function sanitizeCredentialText(text: string): string {
|
|
366
|
+
let out = text;
|
|
367
|
+
for (const { pattern, replacement } of CREDENTIAL_REDACTION_PATTERNS) out = out.replace(pattern, replacement);
|
|
368
|
+
return redactSecretText(out);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/** stderr 를 자격증명 제거 뒤 꼬리(기본 400자)만 남긴다. 비면 undefined. */
|
|
372
|
+
export function stderrTailOf(err: string | undefined, chars: number = PR_CREATE_STDERR_TAIL_CHARS): string | undefined {
|
|
373
|
+
const sanitized = sanitizeCredentialText(err ?? '').trim();
|
|
374
|
+
return sanitized ? sanitized.slice(-chars) : undefined;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/** PR 생성 실패 incident 를 원장(debug.log)에 남긴다. 성공 경로는 기록하지 않는다. */
|
|
378
|
+
export function recordPrCreateFailureIncident(incident: PrCreateFailureIncident): PrCreateFailureIncident {
|
|
379
|
+
const safe: PrCreateFailureIncident = {
|
|
380
|
+
...(incident.runId ? { runId: sanitizeCredentialText(incident.runId) } : {}),
|
|
381
|
+
branch: sanitizeCredentialText(incident.branch),
|
|
382
|
+
remote: sanitizeCredentialText(incident.remote),
|
|
383
|
+
push: { ...incident.push, ...(incident.push.stderrTail ? { stderrTail: stderrTailOf(incident.push.stderrTail) } : {}) },
|
|
384
|
+
gh: { ...incident.gh, ...(incident.gh.stderrTail ? { stderrTail: stderrTailOf(incident.gh.stderrTail) } : {}) },
|
|
385
|
+
};
|
|
386
|
+
debug.log('autopilot.pr-manager', 'pr-create-failure-incident', safe);
|
|
387
|
+
return safe;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function prCreateFailureOutcome(input: UpsertPrInput, reason: 'push' | 'gh' | 'guard', detail: string,
|
|
391
|
+
push: PrCreateStageObservation, gh: PrCreateStageObservation, targetBranch = input.branch): UpsertPrOutcome {
|
|
392
|
+
const incident = recordPrCreateFailureIncident({
|
|
393
|
+
...(input.runId ? { runId: input.runId } : {}), branch: targetBranch, remote: 'origin', push, gh,
|
|
394
|
+
});
|
|
395
|
+
const safeDetail = sanitizeCredentialText(detail).slice(0, 300);
|
|
396
|
+
// The production caller carries detail into its child failure record.
|
|
397
|
+
return input.runId
|
|
398
|
+
? { ok: false, reason, detail: `${safeDetail}\npr-create-incident=${JSON.stringify(incident)}`, incident }
|
|
399
|
+
: { ok: false, reason, detail: safeDetail };
|
|
400
|
+
}
|
|
401
|
+
|
|
322
402
|
function seatFromEnvironment(): Seat | null {
|
|
323
403
|
// Production launchers stamp this in harness-pod-dispatch.ts and harness-cli-command.ts.
|
|
324
404
|
const value = process.env.ELANOUS_HARNESS_SEAT;
|
|
325
405
|
return value === 'OP' || value === 'TC' || value === 'MK' || value === 'UX' ? value : null;
|
|
326
406
|
}
|
|
327
407
|
|
|
408
|
+
function sameCellGuardDetail(verdict: GuardVerdict, candidateCardId: string | null): string {
|
|
409
|
+
const reasons = verdict.reasons.map(reason => `${reason.code}: ${reason.detail}${reason.prs?.length ? ` (${reason.prs.map(number => `#${number}`).join(', ')})` : ''}`).join('; ');
|
|
410
|
+
return verdict.sameCellConflicts?.length
|
|
411
|
+
? `${reasons}; candidateCardId=${candidateCardId ?? 'unknown'}; blockers=${verdict.sameCellConflicts.map(({ pr, cardId }) => `#${pr}:${cardId ?? 'unknown'}`).join(',')}`
|
|
412
|
+
: reasons;
|
|
413
|
+
}
|
|
414
|
+
|
|
328
415
|
/** PR-GUARD-HUNK-WARN: config `prTool.hunkOverlap` — 'refuse' 만 옛 거부, 없거나 그 밖은 'warn'. */
|
|
329
416
|
export function configuredHunkOverlapMode(raw: Record<string, unknown> | undefined = getUserConfig().raw): HunkOverlapMode {
|
|
330
417
|
const prTool = raw?.prTool as { hunkOverlap?: unknown } | undefined;
|
|
331
418
|
return prTool?.hunkOverlap === 'refuse' ? 'refuse' : 'warn';
|
|
332
419
|
}
|
|
333
420
|
|
|
421
|
+
/** PR-CENSUS-PARALLEL: the guard's `gh pr diff` fan-out, with the same gh credentials as {@link defaultCmdRunner}. */
|
|
422
|
+
export const defaultCensusParallelRunner: PrToolParallelCommand = (calls, concurrency) =>
|
|
423
|
+
spawnParallelCommands(calls, { concurrency, env: ghAutomationEnv(process.env) });
|
|
424
|
+
|
|
334
425
|
function defaultPrCreateGuard(input: { cwd: string; base: string | undefined; seat: Seat | null; body: string }, run: CmdRunner): GuardVerdict {
|
|
335
426
|
if (!input.base) return guardNewPr({ files: null, seat: input.seat }, { status: 'unknown', reason: '비교 base 없음' });
|
|
336
427
|
const diff = run('git', ['-C', input.cwd, 'diff', '--name-only', '-z', `${input.base}...HEAD`]);
|
|
@@ -340,8 +431,10 @@ function defaultPrCreateGuard(input: { cwd: string; base: string | undefined; se
|
|
|
340
431
|
const boundRaw = process.env.ELANOUS_TASK_BOUND_PR;
|
|
341
432
|
const boundPrNumber = boundRaw && /^[1-9]\d*$/.test(boundRaw) ? Number(boundRaw) : undefined;
|
|
342
433
|
return guardNewPr({ files, seat: input.seat, cellId: cellIdFromBody(input.body), cardId: cardIdFromBody(input.body),
|
|
434
|
+
slice: sliceMarkerFromBody(input.body),
|
|
343
435
|
...(boundPrNumber && Number.isSafeInteger(boundPrNumber) ? { boundPrNumber } : {}),
|
|
344
|
-
hunks: parseDiffHunks(patch.out), hunkOverlap: configuredHunkOverlapMode() }, readOpenPrs(run, { cwd: input.cwd, ...(files ? { candidateFiles: files } : {})
|
|
436
|
+
hunks: parseDiffHunks(patch.out), hunkOverlap: configuredHunkOverlapMode() }, readOpenPrs(run, { cwd: input.cwd, ...(files ? { candidateFiles: files } : {}),
|
|
437
|
+
runParallel: defaultCensusParallelRunner, diffCache: sharedCensusDiffCache }));
|
|
345
438
|
}
|
|
346
439
|
|
|
347
440
|
function editExistingPr(run: CmdRunner, input: UpsertPrInput, url: string): UpsertPrOutcome {
|
|
@@ -375,7 +468,12 @@ function editExistingPr(run: CmdRunner, input: UpsertPrInput, url: string): Upse
|
|
|
375
468
|
* checked again after the inventory snapshot; an ambiguous or moved PR stays refused. */
|
|
376
469
|
function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullable<GuardVerdict['sameCellReuse']>, recheck: () => GuardVerdict): UpsertPrOutcome {
|
|
377
470
|
const cwd = input.worktreePath;
|
|
378
|
-
const
|
|
471
|
+
const pushEvidence = { ref: `refs/heads/${target.branch}`, remoteHead: target.headSha, cardId: target.cardId };
|
|
472
|
+
const fail = (detail: string): UpsertPrOutcome => {
|
|
473
|
+
const safeDetail = sanitizeCredentialText(detail).slice(0, 300);
|
|
474
|
+
debug.log('autopilot.pr-manager', 'same-cell-push-decision', { ...pushEvidence, outcome: 'refused', reason: safeDetail }, { level: 'warn' });
|
|
475
|
+
return { ok: false, reason: 'guard', detail: `same-cell reuse: ${safeDetail}` };
|
|
476
|
+
};
|
|
379
477
|
if (!/^[0-9a-f]{40}$/i.test(target.headSha) || !Number.isSafeInteger(target.number) || target.number < 1
|
|
380
478
|
|| cellIdFromBody(input.body) !== target.cellId || cardIdFromBody(input.body) !== target.cardId)
|
|
381
479
|
return fail('candidate identity mismatch');
|
|
@@ -389,6 +487,8 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
|
|
|
389
487
|
if (pr.state !== 'OPEN' || pr.isCrossRepository !== false || pr.headRefOid !== target.headSha
|
|
390
488
|
|| pr.headRefName !== target.branch || typeof pr.body !== 'string'
|
|
391
489
|
|| cellIdFromBody(pr.body) !== target.cellId
|
|
490
|
+
|| (sliceMarkerFromBody(input.body)?.slice ?? null) !== (sliceMarkerFromBody(pr.body)?.slice ?? null)
|
|
491
|
+
|| (sliceMarkerFromBody(input.body)?.total ?? null) !== (sliceMarkerFromBody(pr.body)?.total ?? null)
|
|
392
492
|
|| (target.legacyBound ? hasCardMarker(pr.body) || process.env.ELANOUS_TASK_BOUND_PR !== String(target.number)
|
|
393
493
|
: cardIdFromBody(pr.body) !== target.cardId)
|
|
394
494
|
|| typeof pr.url !== 'string' || extractPrNumber(pr.url) !== target.number)
|
|
@@ -429,7 +529,9 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
|
|
|
429
529
|
if (!localHead.ok || !/^[0-9a-f]{40}$/i.test(localHead.out.trim())) return fail('new run head unreadable');
|
|
430
530
|
// Upload the commit through a unique scratch ref. GitHub's create-ref API then
|
|
431
531
|
// atomically refuses a concurrent writer of the intended branch name.
|
|
432
|
-
const
|
|
532
|
+
const runKey = input.runId ? runSuffixKey(input.runId) : null;
|
|
533
|
+
if (!runKey) return fail(input.runId ? 'new run id invalid for scratch ref' : 'run id required for scratch ref');
|
|
534
|
+
const scratch = `self-impl/pr-create-r${runKey}-${randomUUID()}`;
|
|
433
535
|
const scratchRef = `refs/heads/${scratch}`;
|
|
434
536
|
const uploaded = run('git', ['-C', cwd, 'push', 'origin', `HEAD:${scratchRef}`]);
|
|
435
537
|
if (!uploaded.ok) return fail(`new run object upload failed: ${(uploaded.err || uploaded.out).slice(0, 220)}`);
|
|
@@ -466,6 +568,8 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
|
|
|
466
568
|
if (!finalView.ok || finalPr.state !== 'OPEN' || finalPr.isCrossRepository !== false
|
|
467
569
|
|| finalPr.headRefOid !== target.headSha || finalPr.headRefName !== target.branch
|
|
468
570
|
|| typeof finalPr.body !== 'string' || cellIdFromBody(finalPr.body) !== target.cellId
|
|
571
|
+
|| (sliceMarkerFromBody(input.body)?.slice ?? null) !== (sliceMarkerFromBody(finalPr.body)?.slice ?? null)
|
|
572
|
+
|| (sliceMarkerFromBody(input.body)?.total ?? null) !== (sliceMarkerFromBody(finalPr.body)?.total ?? null)
|
|
469
573
|
|| (target.legacyBound ? hasCardMarker(finalPr.body) || process.env.ELANOUS_TASK_BOUND_PR !== String(target.number)
|
|
470
574
|
: cardIdFromBody(finalPr.body) !== target.cardId)
|
|
471
575
|
|| finalPr.url !== pr.url) return fail('PR changed before push');
|
|
@@ -478,8 +582,18 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
|
|
|
478
582
|
return fail('OPEN PR inventory changed before push');
|
|
479
583
|
// The result descends from the exact fetched head. The explicit lease binds the
|
|
480
584
|
// remote update to that head, so a delete or move between reads cannot be revived.
|
|
481
|
-
|
|
585
|
+
// The Pod hook receives these values for this one push only. It checks the Pod card,
|
|
586
|
+
// exact remote head and ancestry independently before allowing another run's ref.
|
|
587
|
+
const podReuseConfig = input.runId && process.env.ELANOUS_TASK_CARD_ID ? [
|
|
588
|
+
'-c', `elanous.sameCellReuseRef=${remoteRef}`,
|
|
589
|
+
'-c', `elanous.sameCellReuseHead=${target.headSha}`,
|
|
590
|
+
'-c', `elanous.sameCellReuseCard=${target.cardId}`,
|
|
591
|
+
] : [];
|
|
592
|
+
const pushed = run('git', ['-C', cwd,
|
|
593
|
+
...podReuseConfig,
|
|
594
|
+
'push', `--force-with-lease=${remoteRef}:${target.headSha}`, 'origin', `HEAD:${remoteRef}`]);
|
|
482
595
|
if (!pushed.ok) return fail(`fast-forward push refused: ${(pushed.err || pushed.out).slice(0, 220)}`);
|
|
596
|
+
debug.log('autopilot.pr-manager', 'same-cell-push-decision', { ...pushEvidence, outcome: 'allowed', reason: 'bound-card-pr-head-fast-forward' });
|
|
483
597
|
debug.log('autopilot.pr-manager', 'same-cell-reused', { pr: target.number, cellId: target.cellId, cardId: target.cardId, branch: target.branch });
|
|
484
598
|
return editExistingPr(run, input, pr.url);
|
|
485
599
|
}
|
|
@@ -509,7 +623,9 @@ export function makePrManager(
|
|
|
509
623
|
const r = run('gh', ['pr', 'list', '--head', branch, '--state', 'open', '--json', 'url', '--jq', '.[0].url // ""'], cwd ? { cwd } : undefined);
|
|
510
624
|
const url = r.out.trim() || null;
|
|
511
625
|
const outcome: FindPrForBranchOutcome = !r.ok
|
|
512
|
-
? { status: 'FAILED', url: null
|
|
626
|
+
? { status: 'FAILED', url: null,
|
|
627
|
+
...(typeof r.rc === 'number' ? { rc: r.rc } : {}),
|
|
628
|
+
...(stderrTailOf(r.err || r.out) ? { stderrTail: stderrTailOf(r.err || r.out) } : {}) }
|
|
513
629
|
: url
|
|
514
630
|
? { status: 'ok OUTPUT', url }
|
|
515
631
|
: { status: 'ok EMPTY', url: null };
|
|
@@ -525,21 +641,34 @@ export function makePrManager(
|
|
|
525
641
|
return {
|
|
526
642
|
findPrForBranch,
|
|
527
643
|
findPrForBranchOutcome,
|
|
528
|
-
upsertPr(
|
|
644
|
+
upsertPr(candidateInput) {
|
|
645
|
+
// ★ sibling-slice(쪼개기 정착) — composeSliceHandText(tier-split.ts)가 hand 문면에 표지를 쓰고
|
|
646
|
+
// prBody(orchestrator.ts)가 그 문면을 PR 본문에 보존한다. 조각 번호만 제목에 덧붙인다.
|
|
647
|
+
const candidateSlice = sliceMarkerFromBody(candidateInput.body);
|
|
648
|
+
const input: UpsertPrInput = candidateSlice
|
|
649
|
+
? { ...candidateInput,
|
|
650
|
+
title: `${candidateInput.title} · 조각 ${candidateSlice.slice}/${candidateSlice.total}`,
|
|
651
|
+
body: candidateInput.body }
|
|
652
|
+
: candidateInput;
|
|
653
|
+
const taskCardId = process.env.ELANOUS_TASK_CARD_ID;
|
|
654
|
+
if (taskCardId && (!hasCardMarker(input.body) || cardIdFromBody(input.body) !== taskCardId))
|
|
655
|
+
return { ok: false, reason: 'guard', detail: `task card PR body missing or conflicting card marker: expected=${taskCardId}` };
|
|
529
656
|
const cwd = input.worktreePath;
|
|
530
657
|
const opts = { cwd };
|
|
531
658
|
const runGitWrite = (args: string[]): CmdResult => {
|
|
659
|
+
let lastRc: number | undefined;
|
|
532
660
|
const result = runGitWithRetry(
|
|
533
661
|
args,
|
|
534
662
|
(gitArgs) => {
|
|
535
663
|
const command = run('git', gitArgs, opts);
|
|
536
|
-
|
|
664
|
+
lastRc = command.rc;
|
|
665
|
+
return { status: command.ok ? 0 : (command.rc && command.rc !== 0 ? command.rc : 1), stdout: command.out, stderr: command.err ?? '' };
|
|
537
666
|
},
|
|
538
667
|
(attempt) => debug.log('autopilot.pr-manager', 'git-write.retry-succeeded', { attempt, args }),
|
|
539
668
|
);
|
|
540
|
-
return { ok: result.status === 0, out: result.stdout, err: result.stderr };
|
|
669
|
+
return { ok: result.status === 0, out: result.stdout, err: result.stderr, rc: lastRc ?? (typeof result.status === 'number' ? result.status : undefined) };
|
|
541
670
|
};
|
|
542
|
-
const detailOf = (r: CmdResult) => (r.err || r.out || '').slice(0, 300);
|
|
671
|
+
const detailOf = (r: CmdResult) => sanitizeCredentialText(r.err || r.out || '').slice(0, 300);
|
|
543
672
|
// ★ gitignored 경로는 exclude pathspec 에서 뺀다(대표 2026-07-21·705308 근본). git add -A 는 gitignored
|
|
544
673
|
// (node_modules·apps/pwa/out 심링크)를 이미 자동 skip 하는데, `:(exclude)<ignored>` 로 명시 지목하면
|
|
545
674
|
// git 이 "paths ignored by .gitignore … use -f" 로 exit 1 을 뱉는다(staging 은 성공하지만 exit≠0).
|
|
@@ -651,16 +780,39 @@ export function makePrManager(
|
|
|
651
780
|
const earlyGuard = candidateCardId && checkCreate
|
|
652
781
|
? checkCreate({ cwd, base: comparisonBase, seat: input.seat ?? seatFromEnvironment(), body: input.body }, run)
|
|
653
782
|
: undefined;
|
|
783
|
+
// ★ sibling-slice 허용 분기 — 같은 칸의 «다른 조각» OPEN PR 은 충돌로 보지 않는다.
|
|
784
|
+
// 다른 조각 번호(같은 total) → same-cell 사유만 빼고 새 draft 허용 · 같은 조각 번호 → 기존
|
|
785
|
+
// 재사용/거부 그대로 · 후보에 표지 없음 → 기존 가드 그대로(siblingSliceAllowed 는 그대로 반환).
|
|
786
|
+
const siblingSliceAllowed = (verdict: GuardVerdict): GuardVerdict => {
|
|
787
|
+
// Injected guards may still use the old card-only reuse predicate. Never force-push
|
|
788
|
+
// one slice over another, even when the card lineage matches.
|
|
789
|
+
const reused = verdict.sameCellReuse;
|
|
790
|
+
const reusedConflict = reused && verdict.sameCellConflicts?.find(conflict => conflict.pr === reused.number);
|
|
791
|
+
const safeReuse = !reused || ((candidateSlice?.slice ?? null) === (reusedConflict?.slice?.slice ?? null)
|
|
792
|
+
&& (candidateSlice?.total ?? null) === (reusedConflict?.slice?.total ?? null));
|
|
793
|
+
const checkedVerdict = safeReuse ? verdict : { ...verdict, sameCellReuse: undefined };
|
|
794
|
+
if (!candidateSlice || checkedVerdict.status !== 'refuse' || checkedVerdict.sameCellReuse || !checkedVerdict.sameCellConflicts?.length)
|
|
795
|
+
return checkedVerdict;
|
|
796
|
+
const conflicts = checkedVerdict.sameCellConflicts;
|
|
797
|
+
if (conflicts.some(conflict => !conflict.slice || conflict.slice.slice === candidateSlice.slice)) return checkedVerdict;
|
|
798
|
+
if (!conflicts.every(conflict => conflict.slice!.total === candidateSlice.total)) return checkedVerdict;
|
|
799
|
+
debug.log('autopilot.pr-manager', 'same-cell-sibling-slice', {
|
|
800
|
+
cell: cellIdFromBody(input.body), slice: candidateSlice.slice, total: candidateSlice.total,
|
|
801
|
+
existingSlice: conflicts[0]!.slice!.slice, outcome: 'allowed' });
|
|
802
|
+
const reasons = checkedVerdict.reasons.filter(reason => reason.code !== 'same-cell');
|
|
803
|
+
return reasons.length ? { ...checkedVerdict, reasons } : { ...checkedVerdict, status: 'allow', reasons: [] };
|
|
804
|
+
};
|
|
805
|
+
const earlyVerdict = earlyGuard ? siblingSliceAllowed(earlyGuard) : undefined;
|
|
654
806
|
const freshGuard = () => checkCreate!({ cwd, base: comparisonBase, seat: input.seat ?? seatFromEnvironment(), body: input.body }, run);
|
|
655
|
-
if (
|
|
656
|
-
if (
|
|
657
|
-
const earlyInventoryUnknown = !!candidateCardId && (!checkCreate || (
|
|
658
|
-
&&
|
|
659
|
-
if (candidateCardId &&
|
|
807
|
+
if (earlyVerdict?.sameCellReuse) return reuseSameCellPr(run, input, earlyVerdict.sameCellReuse, freshGuard);
|
|
808
|
+
if (earlyVerdict?.status === 'refuse') return { ok: false, reason: 'guard', detail: sameCellGuardDetail(earlyVerdict, candidateCardId) };
|
|
809
|
+
const earlyInventoryUnknown = !!candidateCardId && (!checkCreate || (earlyVerdict?.status === 'unknown'
|
|
810
|
+
&& earlyVerdict.reasons.length === 1 && earlyVerdict.reasons[0]?.code === 'inventory-unknown'));
|
|
811
|
+
if (candidateCardId && earlyVerdict?.status !== 'allow' && !earlyInventoryUnknown)
|
|
660
812
|
return { ok: false, reason: 'guard', detail: 'candidate card inventory unmeasured before push' };
|
|
661
813
|
if (earlyInventoryUnknown) debug.log('pr-tool.open-guard', 'candidate-inventory-unmeasured', {
|
|
662
814
|
branch: input.branch, cardId: candidateCardId, stage: 'before-push',
|
|
663
|
-
reason:
|
|
815
|
+
reason: earlyVerdict?.reasons[0]?.detail ?? 'create guard unavailable',
|
|
664
816
|
});
|
|
665
817
|
if (candidateCardId) {
|
|
666
818
|
const branchPr = findPrForBranchOutcome(input.branch, cwd);
|
|
@@ -671,6 +823,17 @@ export function makePrManager(
|
|
|
671
823
|
// 있으면 GitHub 이 그 PR 을 자동 업데이트(닫고 새로 안 만듦). elanous 자체 SE 브랜치라 force 안전.
|
|
672
824
|
// 일시 원격 실패(5xx·연결 끊김 등)만 최대 3회. 영구 거부는 한 번에 끝낸다.
|
|
673
825
|
const waitForPushRetry = input.waitForPushRetry ?? defaultWaitForPushRetry;
|
|
826
|
+
// ★ 칸 PR-CREATE-FAIL-OBSERVE-FU — push/gh 단계 관측을 쌓아 실패 시 한 incident 로.
|
|
827
|
+
const pushStage: PrCreateStageObservation = { stage: 'push', ran: false };
|
|
828
|
+
const ghStage: PrCreateStageObservation = { stage: 'gh', ran: false };
|
|
829
|
+
const markGhRan = (r: CmdResult): CmdResult => {
|
|
830
|
+
ghStage.ran = true;
|
|
831
|
+
ghStage.rc = r.rc;
|
|
832
|
+
ghStage.stderrTail = stderrTailOf(r.err);
|
|
833
|
+
return r;
|
|
834
|
+
};
|
|
835
|
+
const failedCreate = (reason: 'push' | 'gh', detail: string): UpsertPrOutcome =>
|
|
836
|
+
prCreateFailureOutcome(input, reason, detail, pushStage, ghStage);
|
|
674
837
|
const pushArgs = candidateCardId
|
|
675
838
|
? ['-C', cwd, 'push', '-u', 'origin', input.branch]
|
|
676
839
|
: ['-C', cwd, 'push', '--force', '-u', 'origin', input.branch];
|
|
@@ -681,19 +844,32 @@ export function makePrManager(
|
|
|
681
844
|
pushR = runGitWrite(pushArgs);
|
|
682
845
|
pushAttempts += 1;
|
|
683
846
|
}
|
|
847
|
+
pushStage.ran = true;
|
|
848
|
+
pushStage.ok = pushR.ok;
|
|
849
|
+
pushStage.rc = pushR.rc;
|
|
850
|
+
pushStage.stderrTail = stderrTailOf(pushR.err);
|
|
684
851
|
if (!pushR.ok) {
|
|
685
852
|
const detail = pushAttempts > 1
|
|
686
853
|
? `push ${pushAttempts}/${MAX_PUSH_ATTEMPTS} failed: ${detailOf(pushR)}`
|
|
687
854
|
: detailOf(pushR);
|
|
688
|
-
return
|
|
855
|
+
return failedCreate('push', detail);
|
|
689
856
|
}
|
|
690
857
|
const existing = findPrForBranchOutcome(input.branch, cwd);
|
|
858
|
+
if (existing.status !== 'SKIPPED') {
|
|
859
|
+
ghStage.ran = true;
|
|
860
|
+
if (existing.status === 'FAILED') {
|
|
861
|
+
ghStage.rc = existing.rc;
|
|
862
|
+
ghStage.stderrTail = existing.stderrTail;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
691
865
|
if (existing.url) {
|
|
692
866
|
if (candidateCardId)
|
|
693
867
|
return { ok: false, reason: 'guard', detail: 'candidate run branch PR appeared after push; refuse edit' };
|
|
694
868
|
return editExistingPr(run, input, existing.url);
|
|
695
869
|
}
|
|
696
|
-
if (existing.status === 'FAILED')
|
|
870
|
+
if (existing.status === 'FAILED') {
|
|
871
|
+
return failedCreate('gh', 'existing PR branch lookup failed');
|
|
872
|
+
}
|
|
697
873
|
let guardUnmeasured = earlyInventoryUnknown;
|
|
698
874
|
let hunkOverlapWarning: { prs: readonly number[]; files: readonly string[] } | null = null;
|
|
699
875
|
if (checkCreate) {
|
|
@@ -701,28 +877,30 @@ export function makePrManager(
|
|
|
701
877
|
// Another run may open a PR after the early inventory and before this create.
|
|
702
878
|
// Read the complete OPEN inventory again after push, immediately before create.
|
|
703
879
|
const verdict = checkCreate({ cwd, base: comparisonBase, seat, body: input.body }, run);
|
|
704
|
-
|
|
880
|
+
// sibling-slice: 같은 칸의 다른 조각이 inventories 사이 열려도 생성은 허용한다(위 분기와 동일 규칙).
|
|
881
|
+
const siblingVerdict = siblingSliceAllowed(verdict);
|
|
882
|
+
if (siblingVerdict.sameCellReuse)
|
|
705
883
|
return { ok: false, reason: 'guard', detail: 'same-cell PR appeared after run branch push; retry from fresh inventory' };
|
|
706
|
-
const hunkWarn =
|
|
884
|
+
const hunkWarn = siblingVerdict.status === 'allow' ? siblingVerdict.warnings.find(warning => warning.code === 'hunk-overlap') : undefined;
|
|
707
885
|
if (hunkWarn) hunkOverlapWarning = { prs: hunkWarn.prs ?? [], files: hunkWarn.files ?? [] };
|
|
708
|
-
if (
|
|
886
|
+
if (siblingVerdict.status === 'unknown' && siblingVerdict.reasons.length === 1 && siblingVerdict.reasons[0]?.code === 'inventory-unknown') {
|
|
709
887
|
const inPod = process.env.ELANOUS_SUBSTRATE === 'pod'
|
|
710
888
|
|| Object.keys(process.env).some(key => key.startsWith('ELANOUS_POD_'));
|
|
711
889
|
if (inPod) {
|
|
712
890
|
// Pod state and mailbox are local to this Job. Count and alert only
|
|
713
891
|
// in the host parent, where the shared instance root is authoritative.
|
|
714
|
-
debug.log('pr-tool.open-guard', 'pod-unmeasured', { seat, reason:
|
|
892
|
+
debug.log('pr-tool.open-guard', 'pod-unmeasured', { seat, reason: siblingVerdict.reasons[0].detail });
|
|
715
893
|
} else {
|
|
716
|
-
const count = recordUnmeasured({ seat, reason:
|
|
894
|
+
const count = recordUnmeasured({ seat, reason: siblingVerdict.reasons[0].detail });
|
|
717
895
|
if (count.blocked) {
|
|
718
|
-
const alert = run('eln', ['msg', 'post', '--from', seat ?? 'HARNESS', '--to', 'OP', '--kind', 'alert', '--body', `PR open-guard 판정 불가 1시간 ${count.count}회 · ${candidateCardId ? '카드 후보는 draft 관측' : '새 PR 차단'} · ${count.reason ??
|
|
896
|
+
const alert = run('eln', ['msg', 'post', '--from', seat ?? 'HARNESS', '--to', 'OP', '--kind', 'alert', '--body', `PR open-guard 판정 불가 1시간 ${count.count}회 · ${candidateCardId ? '카드 후보는 draft 관측' : '새 PR 차단'} · ${count.reason ?? siblingVerdict.reasons[0].detail}`]);
|
|
719
897
|
if (!alert.ok) debug.log('pr-tool.open-guard', 'op-alert-failed', { seat, reason: alert.err || alert.out || 'eln msg post 실패' });
|
|
720
898
|
if (!candidateCardId) return { ok: false, reason: 'guard', detail: `inventory-unknown: 1시간 ${count.count}회 · 새 PR 차단${count.reason ? ` (${count.reason})` : ''}` };
|
|
721
899
|
}
|
|
722
900
|
}
|
|
723
901
|
guardUnmeasured = true;
|
|
724
|
-
} else if (
|
|
725
|
-
return { ok: false, reason: 'guard', detail:
|
|
902
|
+
} else if (siblingVerdict.status !== 'allow') {
|
|
903
|
+
return { ok: false, reason: 'guard', detail: sameCellGuardDetail(siblingVerdict, candidateCardId) };
|
|
726
904
|
}
|
|
727
905
|
}
|
|
728
906
|
const createArgs = ['pr', 'create', '--head', input.branch, '--title', input.title, '--body', input.body];
|
|
@@ -736,10 +914,10 @@ export function makePrManager(
|
|
|
736
914
|
const requestedLabels = [...new Set([...(input.labels ?? []), ...creatableLabels].map((label) => label.trim()).filter(Boolean))];
|
|
737
915
|
const labeledArgs = [...createArgs];
|
|
738
916
|
for (const label of requestedLabels) labeledArgs.push('--label', label);
|
|
739
|
-
let created = run('gh', labeledArgs, opts);
|
|
917
|
+
let created = markGhRan(run('gh', labeledArgs, opts));
|
|
740
918
|
if (!created.ok && creatableLabels.length && isLabelNotFoundFailure(created, creatableLabels)) {
|
|
741
919
|
for (const label of creatableLabels) run('gh', ['label', 'create', label, '--color', 'BFDADC'], opts);
|
|
742
|
-
created = run('gh', labeledArgs, opts);
|
|
920
|
+
created = markGhRan(run('gh', labeledArgs, opts));
|
|
743
921
|
}
|
|
744
922
|
const logHunkOverlapWarn = (url: string): void => {
|
|
745
923
|
if (hunkOverlapWarning) debug.log('pr-tool.guard', 'hunk-overlap-warn', { pr: extractPrNumber(url), files: hunkOverlapWarning.files, against: hunkOverlapWarning.prs });
|
|
@@ -759,7 +937,7 @@ export function makePrManager(
|
|
|
759
937
|
if (requestedLabels.length > 0 && isLabelNotFoundFailure(created, requestedLabels)) {
|
|
760
938
|
const retryArgs = [...createArgs];
|
|
761
939
|
for (const label of requiredLabels) retryArgs.push('--label', label);
|
|
762
|
-
const retry = run('gh', retryArgs, opts);
|
|
940
|
+
const retry = markGhRan(run('gh', retryArgs, opts));
|
|
763
941
|
if (retry.ok && retry.out) {
|
|
764
942
|
logHunkOverlapWarn(retry.out);
|
|
765
943
|
debug.log('autopilot.pr-manager', 'create.labels-omitted', {
|
|
@@ -770,9 +948,10 @@ export function makePrManager(
|
|
|
770
948
|
});
|
|
771
949
|
return { ok: true, url: retry.out, reused: false, labelsOmitted: true };
|
|
772
950
|
}
|
|
773
|
-
return
|
|
951
|
+
return failedCreate('gh', detailOf(retry) || 'gh pr create 실패');
|
|
774
952
|
}
|
|
775
|
-
|
|
953
|
+
// 여기까지 흘러내려왔으면 성공 return 을 못 만났다 — 실패 incident 로 마무리.
|
|
954
|
+
return failedCreate('gh', detailOf(created) || 'gh pr create 실패');
|
|
776
955
|
},
|
|
777
956
|
closePr(prUrl, comment) {
|
|
778
957
|
const n = extractPrNumber(prUrl);
|
package/src/chat/index.ts
CHANGED
|
@@ -1022,7 +1022,6 @@ export async function textInput(opts: {
|
|
|
1022
1022
|
modalSink: opts.modalSink,
|
|
1023
1023
|
picker,
|
|
1024
1024
|
getBufferView: bufView,
|
|
1025
|
-
writeTerminal,
|
|
1026
1025
|
getBounds: () => ({ row: getRow(), col, width: getWidth(), height: 1 }),
|
|
1027
1026
|
getInputZoneHeight: () => Math.min(lines.length, maxLines),
|
|
1028
1027
|
onDispatchResult: async (dispatched) => processPickerDispatch(dispatched),
|
|
@@ -1336,7 +1335,6 @@ export async function textInput(opts: {
|
|
|
1336
1335
|
}
|
|
1337
1336
|
pickerModalRuntime.syncFamily({
|
|
1338
1337
|
activeKind: activePickerKind(),
|
|
1339
|
-
clearRows: MAX_PICKER + 3,
|
|
1340
1338
|
debugLayout: { row: getRow(), col, width: getWidth() },
|
|
1341
1339
|
family: pickerModalFamily,
|
|
1342
1340
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { debug } from '../../debug/log.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { Key } from '../../tui.js';
|
|
3
3
|
import { createChatPickerModalFamily, type ChatPickerFamilySources, type ChatPickerModalBindings, type ChatPickerModalFamily, type PickerOnKey, type PickerOnRowClick } from './modals.js';
|
|
4
4
|
import { CHAT_PICKER_KINDS, type ChatPickerKind } from './kinds.js';
|
|
5
5
|
import type { ModalSink } from '../index.js';
|
|
@@ -10,7 +10,6 @@ export interface ChatPickerModalRuntimeDeps {
|
|
|
10
10
|
modalSink?: ModalSink;
|
|
11
11
|
picker: PickerState;
|
|
12
12
|
getBufferView: () => PickerBufferView;
|
|
13
|
-
writeTerminal: (s: string) => void;
|
|
14
13
|
getBounds: () => { row: number; col: number; width: number; height: number };
|
|
15
14
|
getInputZoneHeight: () => number;
|
|
16
15
|
onDispatchResult: (
|
|
@@ -26,30 +25,15 @@ interface PickerHandle {
|
|
|
26
25
|
interface SyncPickerModalSpec {
|
|
27
26
|
kind: ChatPickerKind;
|
|
28
27
|
active: boolean;
|
|
29
|
-
clearRows: number;
|
|
30
28
|
createSurface: () => ModalSurface;
|
|
31
29
|
}
|
|
32
30
|
|
|
33
31
|
interface SyncPickerFamilySpec {
|
|
34
32
|
activeKind: ChatPickerKind | null;
|
|
35
|
-
clearRows: number;
|
|
36
33
|
debugLayout?: { row: number; col: number; width: number };
|
|
37
34
|
family: ChatPickerModalFamily;
|
|
38
35
|
}
|
|
39
36
|
|
|
40
|
-
export function paintChatPickerClear(spec: {
|
|
41
|
-
bounds: { row: number; col: number };
|
|
42
|
-
rows: number;
|
|
43
|
-
inputZoneHeight: number;
|
|
44
|
-
}): string {
|
|
45
|
-
const out: string[] = [];
|
|
46
|
-
for (let i = 0; i < spec.rows; i++) {
|
|
47
|
-
const r = spec.bounds.row - spec.inputZoneHeight - 1 - i;
|
|
48
|
-
if (r >= 1) out.push(ansi.moveTo(r, spec.bounds.col) + '\x1b[2K');
|
|
49
|
-
}
|
|
50
|
-
return out.join('');
|
|
51
|
-
}
|
|
52
|
-
|
|
53
37
|
export function createChatPickerModalRuntime(deps: ChatPickerModalRuntimeDeps): {
|
|
54
38
|
dispatchKey: (input: { key: Key; source: 'onKey' | 'input-loop'; label: string }) => Promise<boolean>;
|
|
55
39
|
makePickerOnKey: (label: string) => PickerOnKey;
|
|
@@ -112,15 +96,15 @@ export function createChatPickerModalRuntime(deps: ChatPickerModalRuntimeDeps):
|
|
|
112
96
|
});
|
|
113
97
|
};
|
|
114
98
|
|
|
115
|
-
|
|
99
|
+
// TUI-DIRECT-WRITE-ROWS — no direct terminal clear here. The sink is the
|
|
100
|
+
// display coordinator, whose popModal marks every row dirty and forces the
|
|
101
|
+
// next frame (Q7 / F9), so the picker rows repaint through the frame cache.
|
|
102
|
+
// The old CUP+EL clear bypassed that cache and was off by one row: it
|
|
103
|
+
// erased the row above the picker band (ChatLog header) and left it blank
|
|
104
|
+
// until the forced repaint arrived.
|
|
105
|
+
const clearHandle = (kind: ChatPickerKind): void => {
|
|
116
106
|
const handle = handles.get(kind);
|
|
117
107
|
if (!handle) return;
|
|
118
|
-
const bounds = deps.getBounds();
|
|
119
|
-
deps.writeTerminal(paintChatPickerClear({
|
|
120
|
-
bounds,
|
|
121
|
-
rows: clearRows,
|
|
122
|
-
inputZoneHeight: deps.getInputZoneHeight(),
|
|
123
|
-
}));
|
|
124
108
|
handle.dispose();
|
|
125
109
|
handles.delete(kind);
|
|
126
110
|
};
|
|
@@ -133,7 +117,7 @@ export function createChatPickerModalRuntime(deps: ChatPickerModalRuntimeDeps):
|
|
|
133
117
|
return;
|
|
134
118
|
}
|
|
135
119
|
if (!spec.active && handle) {
|
|
136
|
-
clearHandle(spec.kind
|
|
120
|
+
clearHandle(spec.kind);
|
|
137
121
|
}
|
|
138
122
|
};
|
|
139
123
|
|
|
@@ -188,7 +172,6 @@ export function createChatPickerModalRuntime(deps: ChatPickerModalRuntimeDeps):
|
|
|
188
172
|
syncModal({
|
|
189
173
|
kind,
|
|
190
174
|
active: kind === input.activeKind && itemCount > 0,
|
|
191
|
-
clearRows: input.clearRows,
|
|
192
175
|
createSurface: () => input.family.createSurface(kind),
|
|
193
176
|
});
|
|
194
177
|
}
|
|
@@ -196,7 +179,7 @@ export function createChatPickerModalRuntime(deps: ChatPickerModalRuntimeDeps):
|
|
|
196
179
|
|
|
197
180
|
const clearAll = (): void => {
|
|
198
181
|
for (const kind of [...handles.keys()]) {
|
|
199
|
-
clearHandle(kind
|
|
182
|
+
clearHandle(kind);
|
|
200
183
|
}
|
|
201
184
|
};
|
|
202
185
|
|
package/src/cli/agent-cli.ts
CHANGED
|
@@ -57,6 +57,13 @@ export function emitHarnessFeedbackProgress(
|
|
|
57
57
|
type CliAgentDispatch = typeof import('../skills/tools/agent.js').dispatchAgent;
|
|
58
58
|
let cliAgentDispatchForTesting: CliAgentDispatch | undefined;
|
|
59
59
|
|
|
60
|
+
let cliRunTurnForTesting: typeof runTurn | undefined;
|
|
61
|
+
|
|
62
|
+
/** Test seam for exercising the real Commander and pipeline path without an LLM call. */
|
|
63
|
+
export function setCliRunTurnForTesting(runTurnForTesting: typeof runTurn | undefined): void {
|
|
64
|
+
cliRunTurnForTesting = runTurnForTesting;
|
|
65
|
+
}
|
|
66
|
+
|
|
60
67
|
export function setCliAgentDispatchForTesting(dispatch: CliAgentDispatch | undefined): void {
|
|
61
68
|
cliAgentDispatchForTesting = dispatch;
|
|
62
69
|
}
|
|
@@ -524,7 +531,11 @@ export async function runChatTurnCli(opts: {
|
|
|
524
531
|
...(modelFamily !== undefined ? { modelFamily } : {}),
|
|
525
532
|
...(enabledToolNames !== undefined ? { enabledTools: enabledToolNames } : {}),
|
|
526
533
|
});
|
|
527
|
-
const
|
|
534
|
+
const discipline = opts.goalLoop
|
|
535
|
+
? (require('../impl-discipline/index.js') as typeof import('../impl-discipline/index.js'))
|
|
536
|
+
.buildImplDisciplineSystemMessages({ text: opts.userText })
|
|
537
|
+
: [];
|
|
538
|
+
const joined = [...universal, ...discipline]
|
|
528
539
|
.map(m => (typeof m.content === 'string' ? m.content : ''))
|
|
529
540
|
.filter(s => s.length > 0)
|
|
530
541
|
.join('\n\n');
|
|
@@ -559,7 +570,7 @@ export async function runChatTurnCli(opts: {
|
|
|
559
570
|
}
|
|
560
571
|
let result: Awaited<ReturnType<typeof runTurn>>;
|
|
561
572
|
try {
|
|
562
|
-
result = await (opts.runTurn ?? runTurn)({
|
|
573
|
+
result = await (opts.runTurn ?? cliRunTurnForTesting ?? runTurn)({
|
|
563
574
|
userConfig: opts.cfg,
|
|
564
575
|
sessionId: session.id,
|
|
565
576
|
userText: opts.userText,
|
package/src/cli/doctor-cli.ts
CHANGED
|
@@ -222,6 +222,8 @@ export interface DoctorCliDeps extends DoctorOptions, Pick<DoctorFixDeps, 'home'
|
|
|
222
222
|
hostDoctorMachineResources?: () => Promise<ResourceView[]>;
|
|
223
223
|
/** `doctor visit`/`doctor status` 원장 디렉터리(시험 seam) — 기본 = `runLedgerDir()`. */
|
|
224
224
|
doctorVisitLedgerDir?: string;
|
|
225
|
+
/** `doctor visit` 사고 선례 연결 루트(시험 seam) — 기본 = `doctorVisitIncidentRoot()` · `null` 이면 건너뛴다. */
|
|
226
|
+
doctorVisitIncidentRoot?: string | null;
|
|
225
227
|
}
|
|
226
228
|
|
|
227
229
|
const repositoryRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../..');
|
|
@@ -1378,8 +1380,9 @@ export function registerDoctorCommand(program: Command, deps: DoctorCliDeps = {}
|
|
|
1378
1380
|
symptom: opts.symptom,
|
|
1379
1381
|
...(opts.evidence !== undefined ? { evidence: opts.evidence } : {}),
|
|
1380
1382
|
...(deps.doctorVisitLedgerDir !== undefined ? { dir: deps.doctorVisitLedgerDir } : {}),
|
|
1383
|
+
...(deps.doctorVisitIncidentRoot !== undefined ? { incidentRoot: deps.doctorVisitIncidentRoot } : {}),
|
|
1381
1384
|
});
|
|
1382
|
-
out.log(json ? JSON.stringify(visit) : `doctor visit recorded: runId=${runId} from=${opts.from} symptom=${opts.symptom}${visit.evidence !== undefined ? ` evidence=${visit.evidence}` : ''}`);
|
|
1385
|
+
out.log(json ? JSON.stringify(visit) : `doctor visit recorded: runId=${runId} from=${opts.from} symptom=${opts.symptom}${visit.evidence !== undefined ? ` evidence=${visit.evidence}` : ''}${visit.incidentPrecedents !== undefined ? ` incident-precedents=${visit.incidentPrecedents.length}` : ''}`);
|
|
1383
1386
|
} catch (error) {
|
|
1384
1387
|
const reason = error instanceof Error ? error.message : String(error);
|
|
1385
1388
|
if (json) out.log(JSON.stringify({ status: 'rejected', reason }));
|