elanous 0.2.32 → 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/{IVKr3AlRUVLKsw2fh7eXF → T1mBQqmkwKDLGtyisDCOd}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{997ce8a5-2ad501927003b41b.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/{5525.86debf231e181813.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/{7391.ebae168025c91b6a.js → 1674.2a65fd5668e1cc5f.js} +1 -1
- 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/{7947-d0759430f8042240.js → 1993-c0007b7ad0c0ef41.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{60fb96c9.360b01d8d4927b7b.js → 1c735de4.f993a30bbd3c57c4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5307.60f2209e809bd627.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/{3902.e1e71aaac850a045.js → 2625.5d870aa999f33db1.js} +1 -1
- 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/{4174.92ed04922709ac9e.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/3589.5444a06bcf6e775c.js +1 -0
- 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/{9398-6aed28f0a96d0d6f.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/{7371.80c05c653b08e907.js → 4346.8601952e73bf5803.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4441-875b97f5821ed58a.js +1 -0
- 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/{2940-619bfd8ef337c611.js → 4705-194e64e47ca0fbdb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1335-6731f392c35216eb.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/{7502.ccd5b8065545edd0.js → 5101.e32282718f99ed6f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{2001.6c7e0fd02190886c.js → 5154.a118f3957ed14e36.js} +1 -1
- 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/{5173-233188df2f42c626.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/{3267c0e6.d34854e7b3984a6e.js → 56d372f2.681ab4ec4c998fae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +287 -0
- 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/{6433.fc573af22bbc9ab7.js → 6236.e18cced2d5ba6afb.js} +17 -17
- 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/{6544cb48.a87fe20ddf137be2.js → 6b89c8bd.24df687a820500b3.js} +1 -1
- 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/{2871.0bca6137343b3f76.js → 7385.50a308a477bdfc21.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2985.39ccdecd36848b12.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/{8018.a32663f04a6fc5f9.js → 8219.baa715d1deee80e2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4111.2bfedbb233ad206b.js → 8256.e3ac8421a71f82f4.js} +1 -1
- 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/8437-8d5492094b166cfa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2213.2ccbada92c33ea0f.js → 8444.4c26b379ca2b9596.js} +17 -17
- 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/{6092.a7f99e68b188ca66.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/{3278.2e5d15b53a4091c8.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/{9221.7d22eaf353a2d4e7.js → 938.66ad1ef0e5abae1c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6157.0c9af021de4fb31b.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/{69-0a2c8209c6d4a158.js → 967-2aa39b2d04b4c690.js} +1 -1
- 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/{7862.30a8d6482bb238eb.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-a27b1e5a0d1b308f.js → page-406b47745b53f269.js} +1 -1
- 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-26e6c18a1a750cf6.js +1 -0
- 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-32866485913d6a04.js → page-47c5d4db587266bd.js} +1 -1
- 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-04d00ae9b0890349.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/{7a1887c4.f36b88fba31da8fd.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/{b313b242.cb1265eea908db61.js → cbe38a15.5a032598e39970c6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{409f1e57.d0649fc47691ebfe.js → d06f9160.a3d9062f95de8ad7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{0bb0ff36.b8d418980951e5ba.js → da5176c6.6773b6c5994e1d99.js} +7 -7
- 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 +10 -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 +5 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/default-loop.yaml +76 -5
- package/graphs/document-loop.yaml +71 -4
- package/graphs/implement-loop.yaml +59 -4
- package/graphs/journey/SCENARIOS.md +33 -0
- package/graphs/journey/recipes.yaml +1 -0
- package/graphs/journey/ta-journey.yaml +94 -0
- package/graphs/journey/units/author/author.yaml +20 -0
- package/graphs/journey/units/author/recipes.yaml +2 -0
- 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/journey/units/green/green.yaml +20 -0
- package/graphs/journey/units/green/recipes.yaml +2 -0
- package/graphs/journey/units/pr/pr.yaml +20 -0
- package/graphs/journey/units/pr/recipes.yaml +2 -0
- package/graphs/journey/units/remember/recipes.yaml +2 -0
- package/graphs/journey/units/remember/remember.yaml +20 -0
- package/graphs/operate-loop.yaml +71 -4
- package/graphs/overlays/stop-heal-ladder.yaml +1 -1
- package/graphs/release-rehearsal/recipes.yaml +1 -1
- package/graphs/release-rehearsal/release-rehearsal.yaml +2 -2
- package/graphs/research-loop.yaml +159 -4
- package/graphs/test-diet/test-diet.yaml +3 -0
- package/graphs/units/dispatch-pod/dispatch-pod.yaml +50 -0
- package/graphs/units/dispatch-pod/recipes.yaml +14 -0
- package/graphs/units/entry/entry.yaml +50 -0
- package/graphs/units/entry/recipes.yaml +14 -0
- package/graphs/units/harvest/harvest.yaml +25 -0
- package/graphs/units/harvest/recipes.yaml +4 -0
- package/graphs/units/land/land.yaml +45 -0
- package/graphs/units/land/recipes.yaml +3 -0
- package/graphs/units/recipes.yaml +7 -0
- package/graphs/units/recover.yaml +39 -0
- package/graphs/units/reflect/recipes.yaml +3 -0
- package/graphs/units/reflect/reflect.yaml +15 -0
- package/graphs/units/task-agent-recover-review.yaml +17 -0
- package/graphs/units/task-agent-recover-wait.yaml +17 -0
- package/graphs/units/verbs/make-doc.yaml +34 -0
- package/graphs/units/verbs/recipes.yaml +33 -0
- package/graphs/units/verbs/verify.yaml +55 -0
- package/graphs/work/recipes.yaml +2 -0
- package/graphs/work/research-report.yaml +28 -0
- package/package.json +1 -1
- package/scripts/ci-typecheck-changed.ts +69 -16
- package/scripts/coord-role-pack.ts +19 -6
- package/scripts/docs/generate-graph-anatomy.ts +19 -2
- package/scripts/graph-harvest-unit.ts +22 -0
- package/scripts/graph-units/journey-stub.ts +6 -0
- package/scripts/graph-units/land-enqueue.ts +78 -0
- package/scripts/graph-units/recover-plan.ts +15 -0
- package/scripts/graph-units/reflect-node.ts +88 -0
- package/scripts/graph-units/ta-journey-observe.ts +109 -0
- package/scripts/graph-units/verbs/headless-goal-loop.ts +152 -0
- package/scripts/graph-units/verbs/verify-stage.ts +75 -0
- package/scripts/graph-units/verbs-envelope.ts +139 -0
- package/scripts/hq/standby-snapshot.ts +30 -0
- package/scripts/public-export.ts +43 -1
- package/scripts/ratchets/train-side-invariants.sh +45 -0
- package/scripts/release-loop/auto-approve-node.ts +30 -16
- 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-closure.ts +5 -1
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-node.ts +675 -49
- package/scripts/release-loop/gate-partial.ts +68 -14
- package/scripts/release-loop/gate-radius-live.ts +177 -0
- package/scripts/release-loop/gate-radius-shadow.ts +138 -0
- package/scripts/release-loop/gate-traffic-mode.ts +128 -0
- package/scripts/release-loop/gate-triage-node.ts +5 -2
- package/scripts/release-loop/known-issues-0.2.33-approved.json +194 -0
- package/scripts/release-loop/known-issues-node.ts +77 -8
- package/scripts/release-loop/node-verdict.ts +12 -1
- package/scripts/release-loop/npm-publish-node.ts +66 -12
- package/scripts/release-loop/preflight.ts +93 -7
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
- package/scripts/release-loop/publish-node.ts +60 -9
- package/scripts/release-loop/pwa-remote.ts +166 -0
- package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
- package/scripts/release-loop/resume-cap.ts +56 -0
- package/scripts/release-loop/resume-release.ts +155 -19
- package/scripts/release-loop/resume.ts +24 -1
- package/scripts/release-loop/tui-sim-node.ts +8 -2
- package/scripts/release-loop/unattended-release.ts +10 -2
- 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/acp/core-turn-bridge.ts +20 -5
- package/src/acp/reasoning-thought-buffer.ts +45 -0
- package/src/agent/self-ambient-cache.ts +8 -0
- package/src/agent-substrate/acp-reviewer.ts +90 -15
- package/src/agent-substrate/pr-reviewer.ts +17 -0
- package/src/agent-substrate/review-finding-key.ts +53 -0
- package/src/agent-substrate/self-review-cli.ts +188 -18
- package/src/ask-user-question/pending-questions.ts +1 -1
- package/src/autopilot/pr-manager.ts +393 -65
- 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/chat/tool-render/dispatch.ts +62 -10
- package/src/cli/agent-cli.ts +13 -2
- package/src/cli/control-cli.ts +24 -7
- package/src/cli/doctor-cli.ts +4 -1
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/light-entry-route.ts +75 -0
- package/src/cli/llm-detect-cli.ts +23 -1
- package/src/cli/pod-cli.ts +77 -3
- package/src/cli/pr-cli.ts +81 -14
- package/src/cli/pr-land-base-read.ts +2 -0
- package/src/cli/pr-land-overlap-evidence.ts +154 -16
- package/src/cli/pr-land-pod-shadow-job.ts +3 -0
- package/src/cli/pr-land-recovery.ts +64 -0
- package/src/cli/pty-takeover-cli.ts +6 -5
- package/src/cli/release-checklist-read-cli.ts +79 -0
- package/src/cli/release-cli.ts +189 -132
- package/src/cli/release-run-if-ready.ts +29 -28
- package/src/cli/release-single-flight.ts +178 -0
- package/src/cli/remote-resolve.ts +1 -1
- package/src/cli/root-tui-entry.ts +48 -0
- package/src/cli/seat-cli.ts +37 -0
- package/src/cli/setup-cli.ts +40 -1
- package/src/cli/sim-cli.ts +22 -0
- package/src/cli/tasks-cli.ts +667 -14
- package/src/cli/usage-cli.ts +13 -11
- package/src/clipboard/history.ts +179 -13
- package/src/config.ts +8 -1
- package/src/control/control-status.ts +8 -3
- package/src/control-plane/ledger.ts +5 -3
- package/src/control-plane/server.ts +5 -3
- package/src/core-turn/short-question.ts +5 -1
- package/src/dashboard/chat/acp-chat.ts +8 -0
- package/src/dashboard/index.ts +114 -77
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +3 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/seat-autowake.ts +56 -3
- package/src/dashboard/render/theme-resolver.ts +33 -4
- package/src/dashboard/seat-boot-preamble.ts +1 -1
- package/src/dashboard/slash-runtime/ask-clarification.ts +48 -0
- package/src/dashboard/slash-runtime/dashboard-delegated-slashes.ts +68 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +62 -322
- package/src/dashboard/slash-runtime/dashboard-log-slash.ts +208 -0
- package/src/dashboard/turn-preamble.ts +47 -1
- package/src/dashboard/turn-stream-formatter.ts +34 -1
- package/src/dashboard/turn-stream-runtime.ts +2 -0
- package/src/dashboard/turn-typeahead-prompt-zone.ts +67 -0
- package/src/domains/guardian-tick.ts +54 -2
- package/src/domains/outbound-alert.ts +3 -2
- package/src/domains/schedule-registry.ts +16 -2
- package/src/extractors.ts +3 -1
- package/src/git-fs/idle-refresh.ts +76 -0
- package/src/git-fs/index.ts +18 -7
- package/src/git-fs/retry.ts +4 -0
- package/src/git-fs/runner.ts +2 -0
- package/src/git-fs/worktree.ts +42 -4
- package/src/graph-kinds/registry.ts +2 -2
- package/src/graph-runner/runner.ts +267 -54
- package/src/grok/credential.ts +15 -3
- package/src/harness/harness-cli-command.ts +151 -38
- package/src/harness/harness-incidents.ts +37 -0
- package/src/harness/harness-pod-dispatch.ts +38 -1
- package/src/harness/harness-salvage-cli.ts +14 -2
- 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 +683 -146
- package/src/intake-plane/already-built-hint.ts +91 -0
- package/src/intake-plane/requirement-funnel.ts +29 -1
- package/src/knowhow/pack.ts +199 -0
- package/src/light-cli.ts +111 -0
- 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 +268 -65
- package/src/loops/budget.ts +95 -0
- package/src/loops/msg-wake.ts +8 -2
- package/src/loops/orchestrator/traffic.ts +132 -1
- package/src/model-tier/llm-tier-map.ts +15 -1
- package/src/mss/logging/log-store.ts +4 -5
- package/src/native-tool-catalog.ts +15 -1
- package/src/nexus/api/graphs-api.ts +22 -3
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/loop-resources.ts +13 -1
- package/src/nexus/api/ops-api.ts +12 -0
- package/src/oauth/claude-pty-maturity.ts +66 -0
- package/src/oauth/codex-access-mirror.ts +55 -0
- package/src/oauth/codex.ts +7 -0
- package/src/oauth/fallback-chain.ts +1 -1
- package/src/onboarding/first-run.ts +5 -3
- package/src/onboarding/non-interactive.ts +64 -13
- package/src/onboarding.ts +10 -2
- package/src/ops/overview-collect.ts +54 -4
- package/src/ops/overview.ts +31 -7
- package/src/pr-tool/census.ts +282 -30
- package/src/pr-tool/inflight-registry.ts +160 -7
- package/src/prompt-library/gpt6-family-addendum.ts +14 -1
- package/src/pty-shell/herdr-agent-report.ts +442 -0
- package/src/pty-shell/pty-control-ipc.ts +5 -5
- package/src/pty-shell/pty-manifest.ts +7 -0
- package/src/pty-shell/pty-write-outcome.ts +24 -6
- package/src/pty-shell/tui-run-state.ts +117 -3
- package/src/release-loop/checklist.ts +103 -5
- package/src/release-loop/feature-store.ts +19 -2
- package/src/release-loop/landed-but-yellow.ts +129 -5
- package/src/release-loop/light-rc.ts +1 -0
- package/src/release-loop/placement.ts +10 -3
- package/src/release-loop/rehearsal.ts +205 -25
- package/src/release-loop/rubric.ts +16 -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 +188 -13
- 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 +11 -6
- package/src/self-dev/graph-journey-route.ts +60 -6
- package/src/self-dev/harness-run-cli.ts +3 -15
- package/src/self-dev/orchestrate-cli-text.ts +10 -0
- package/src/self-dev/orchestrate.ts +79 -3
- package/src/self-dev/review-provider-fallback.ts +35 -1
- package/src/self-dev/run-supervisor.ts +107 -12
- package/src/self-dev/run-types.ts +5 -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 +95 -12
- package/src/self-implement/gate-cli.ts +1 -0
- package/src/self-implement/gate-remote.ts +40 -25
- package/src/self-implement/goal-author-decompose.ts +275 -47
- package/src/self-implement/goal-author-identity.ts +66 -0
- package/src/self-implement/goal-author-preservation-obligation.ts +35 -0
- package/src/self-implement/goal-author.ts +254 -120
- 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 +28 -2
- package/src/self-implement/graph-unit-flatten.ts +103 -0
- package/src/self-implement/graph-unit-resolver.ts +107 -0
- package/src/self-implement/graph-yaml.ts +151 -1
- package/src/self-implement/headless-elanous-driver.ts +1 -0
- package/src/self-implement/knowhow-pack.ts +103 -0
- package/src/self-implement/orchestrator.ts +160 -45
- package/src/self-implement/pod-warm-pool-profile.ts +45 -0
- package/src/self-implement/review-mustfix-class.ts +203 -0
- package/src/self-implement/rework-budget-judgment.ts +5 -8
- package/src/self-implement/run-stop.ts +17 -2
- package/src/self-implement/running-runs.ts +29 -1
- package/src/self-implement/scope-adjacency.ts +113 -0
- package/src/self-implement/seams.ts +138 -4
- package/src/self-implement/stop-autoheal.ts +112 -2
- package/src/session/chat.ts +27 -0
- package/src/session-runtime/index.ts +1 -1
- package/src/session-runtime/retry-policy.ts +2 -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/skills/tools/schedule-wakeup.ts +66 -17
- package/src/steward/hold-hygiene.ts +24 -6
- package/src/steward/release-day.ts +7 -3
- package/src/steward/triage-budget.ts +194 -0
- package/src/steward/triage.ts +57 -7
- package/src/task-agent/actions.ts +69 -1
- package/src/task-agent/green-sweep.ts +4 -0
- package/src/task-agent/harvest-unit.ts +141 -0
- package/src/task-agent/live-moves.ts +257 -15
- package/src/task-agent/parent-host.ts +216 -6
- package/src/task-agent/postland-card.ts +80 -1
- package/src/task-agent/rejudge-on-head.ts +112 -26
- package/src/task-agent/repair-branch-cas.ts +4 -1
- package/src/task-agent/repair-cycle.ts +16 -3
- package/src/task-agent/run-identity.ts +4 -3
- package/src/task-agent/shadow.ts +19 -3
- package/src/task-agent/task-hand.ts +96 -36
- package/src/task-agent/tier-split.ts +127 -0
- package/src/task-agent/work-order-build.ts +24 -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 +72 -3
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-command-job.ts +47 -8
- 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-lifecycle-stages.ts +86 -8
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +8 -2
- package/src/task-orchestrator/surfaces/pod-pool.ts +73 -17
- package/src/task-orchestrator/surfaces/pod-provenance.ts +76 -0
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +72 -4
- package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +32 -5
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +3 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +421 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +2 -1
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +588 -71
- package/src/task-orchestrator/surfaces/self-implement.ts +106 -2
- package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
- package/src/tool-runtime/truncation-store.ts +4 -0
- 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/dashboard-session.ts +10 -1
- 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/coercion.ts +36 -0
- package/src/user-config.ts +22 -43
- 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/ux-sim/scenario.ts +72 -13
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +0 -62
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +0 -23
- package/apps/pwa/out/_next/static/chunks/1834-98b64172bc1efe77.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +0 -41
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2898.fd781bc7cf01a7b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +0 -115
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3541-ce3a5424ed5ad7f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +0 -36
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +0 -77
- package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5458-16cd7a2b51b74c8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5543.a438b8ab5a13ea47.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +0 -94
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +0 -90
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +0 -8
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9279-d28c5b7754d010ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9989.3694300e5f000b14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a9717a67c2eecbaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c0f1ca371f710b06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-46430d45a9e04eac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8ea49a4c6dd2c6e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0e5a41fac1c75396.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-31aaf1ed37c6df9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c69247e7134d329d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-66dc5cd3a0999abe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d256f5d5d9552823.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-ce8f1907b8a6101c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-7607cca9b84950c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eeab86176b03dc3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5b93dbae3432b996.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f47e768b5b242b5a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-95306f892aa2d0ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-940fb6c217f6b470.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-8c66a3b24a745630.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7b675dfd35c36fc9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8bd0d3cf7665bcfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-c219f2ed171131be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-40f8fa21bdae955b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-468f8313e4f1fbd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-4214b855d9233ea8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-936752c7aa58762e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-ec052ad359df1797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-fad650e4793adb65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +0 -122
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +0 -1
- package/src/cli/g6a-registration-probe.ts +0 -16
- /package/apps/pwa/out/_next/static/{IVKr3AlRUVLKsw2fh7eXF → T1mBQqmkwKDLGtyisDCOd}/_ssgManifest.js +0 -0
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import { debug } from '../debug/log.js';
|
|
3
|
+
import type { FrontNodeId } from './graph-front-nodes.js';
|
|
4
|
+
import type { PipelineNodeId } from '../self-implement/pipeline-shape.js';
|
|
3
5
|
import { GRAPH_SPECS, GRAPH_TEMPLATES, GRAPH_TEMPLATES_SOURCE, pipelineNodeEntryPayload, templateForGoalType, type GraphTemplate } from '../self-implement/graph-templates.js';
|
|
4
6
|
import type { GoalType } from '../self-implement/goal-author.js';
|
|
5
7
|
|
|
@@ -37,11 +39,14 @@ export const JOURNEY_NODE_IDS = [
|
|
|
37
39
|
'salvage',
|
|
38
40
|
'heal',
|
|
39
41
|
'next-move',
|
|
42
|
+
'decision-card',
|
|
40
43
|
'ready',
|
|
41
44
|
'pr-head-checkout',
|
|
42
45
|
'stopped',
|
|
43
46
|
] as const;
|
|
44
47
|
export type JourneyNodeId = typeof JOURNEY_NODE_IDS[number];
|
|
48
|
+
/** Existing author/front and self-implement pipeline nodes may use the same observation helpers. */
|
|
49
|
+
export type JourneyObservationNodeId = JourneyNodeId | FrontNodeId | PipelineNodeId;
|
|
45
50
|
|
|
46
51
|
export const JOURNEY_KEY_ENV = 'ELANOUS_JOURNEY_KEY';
|
|
47
52
|
const QUEUE_LAUNCH_ENV = 'ELANOUS_HARNESS_QUEUE_LAUNCH';
|
|
@@ -81,7 +86,7 @@ export interface JourneyObservation {
|
|
|
81
86
|
readonly data?: Readonly<Record<string, unknown>>;
|
|
82
87
|
}
|
|
83
88
|
|
|
84
|
-
function emit(entry: boolean, node:
|
|
89
|
+
function emit(entry: boolean, node: JourneyObservationNodeId, o: JourneyObservation): void {
|
|
85
90
|
try {
|
|
86
91
|
const template = journeyTemplate(node, o.goalType);
|
|
87
92
|
const runId = o.runId ?? process.env[RUN_ID_ENV]?.trim();
|
|
@@ -104,14 +109,14 @@ function emit(entry: boolean, node: JourneyNodeId, o: JourneyObservation): void
|
|
|
104
109
|
}
|
|
105
110
|
|
|
106
111
|
/** 노드 진입. */
|
|
107
|
-
export function enterJourneyNode(node:
|
|
112
|
+
export function enterJourneyNode(node: JourneyObservationNodeId, o: JourneyObservation): void {
|
|
108
113
|
emit(true, node, o);
|
|
109
114
|
}
|
|
110
115
|
|
|
111
116
|
/** 노드 출구 — `outcome` 이 그 노드에서 나간 간선의 라벨(YAML `map` 키)이다.
|
|
112
117
|
* ⭐ 그 라벨이 선언에서 종결 노드 `stopped` 로 가면 `stopped` 진입도 남긴다 — 거절·포기 런이 «선언된 종결점»에서 끝난다.
|
|
113
118
|
* `outcome: 'error'` = 노드 안 작업이 예외를 던졌다(예외는 호출자에게 그대로 간다). */
|
|
114
|
-
export function exitJourneyNode(node:
|
|
119
|
+
export function exitJourneyNode(node: JourneyObservationNodeId, o: JourneyObservation & { readonly outcome: string }): void {
|
|
115
120
|
emit(false, node, o);
|
|
116
121
|
if (node !== 'stopped' && journeyEdgeTarget(node, o.outcome) === 'stopped') {
|
|
117
122
|
const { outcome: _outcome, ...rest } = o;
|
|
@@ -130,7 +135,7 @@ export function journeyEdgeTarget(from: string, label: string): string | undefin
|
|
|
130
135
|
}
|
|
131
136
|
|
|
132
137
|
/** 노드 안 작업을 감싼다 — 예외면 출구 `error` 를 남기고 다시 던진다(진입 뒤 출구가 빠지지 않게). */
|
|
133
|
-
export function withJourneyNode<T>(node:
|
|
138
|
+
export function withJourneyNode<T>(node: JourneyObservationNodeId, o: JourneyObservation, work: () => Promise<T>): Promise<T> {
|
|
134
139
|
const onError = (error: unknown): void => {
|
|
135
140
|
exitJourneyNode(node, { ...o, outcome: 'error', data: { ...o.data, error: error instanceof Error ? error.message : String(error) } });
|
|
136
141
|
};
|
|
@@ -144,7 +149,7 @@ export function withJourneyNode<T>(node: JourneyNodeId, o: JourneyObservation, w
|
|
|
144
149
|
}
|
|
145
150
|
|
|
146
151
|
/** 동기 판. */
|
|
147
|
-
export function withJourneyNodeSync<T>(node:
|
|
152
|
+
export function withJourneyNodeSync<T>(node: JourneyObservationNodeId, o: JourneyObservation, work: () => T): T {
|
|
148
153
|
try { return work(); }
|
|
149
154
|
catch (error) {
|
|
150
155
|
exitJourneyNode(node, { ...o, outcome: 'error', data: { ...o.data, error: error instanceof Error ? error.message : String(error) } });
|
|
@@ -153,7 +158,7 @@ export function withJourneyNodeSync<T>(node: JourneyNodeId, o: JourneyObservatio
|
|
|
153
158
|
}
|
|
154
159
|
|
|
155
160
|
/** 진입·출구를 한 번에 — 판정만 하는 노드(대기 없는 관문)용. */
|
|
156
|
-
export function passJourneyNode(node:
|
|
161
|
+
export function passJourneyNode(node: JourneyObservationNodeId, o: JourneyObservation & { readonly outcome: string }): void {
|
|
157
162
|
enterJourneyNode(node, o);
|
|
158
163
|
exitJourneyNode(node, o);
|
|
159
164
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { debug } from '../debug/log.js';
|
|
2
2
|
import { GRAPH_SPECS } from '../self-implement/graph-templates.js';
|
|
3
3
|
import { applyGraphOverlays, defaultOverlaysDir, loadGraphOverlays, selectOverlays, type GraphOverlaySpec } from '../self-implement/graph-overlay-yaml.js';
|
|
4
|
-
import type
|
|
4
|
+
import { L1_PROTECTED_ROUTE_NODES, type GraphTemplateSpec } from '../self-implement/graph-yaml.js';
|
|
5
|
+
import { evaluateOverlayCondition } from '../self-implement/graph-overlay-condition.js';
|
|
5
6
|
import { journeyJoinFields } from './graph-journey-nodes.js';
|
|
6
7
|
|
|
7
8
|
/** ⭐ HARNESS-FULL-GRAPH 2판 — 「다음 노드」를 코드가 아니라 «그래프»가 정한다.
|
|
@@ -21,6 +22,13 @@ export interface JourneyRoute {
|
|
|
21
22
|
readonly to: string | null;
|
|
22
23
|
readonly source: 'graph' | 'code-default';
|
|
23
24
|
readonly overlays: readonly string[];
|
|
25
|
+
readonly via?: 'outcome' | 'when';
|
|
26
|
+
readonly condition?: string;
|
|
27
|
+
readonly ambiguousConditions?: readonly string[];
|
|
28
|
+
readonly unobservedConditions?: readonly string[];
|
|
29
|
+
readonly skippedNode?: string;
|
|
30
|
+
readonly skipCondition?: string;
|
|
31
|
+
readonly skippedNodes?: readonly { readonly node: string; readonly condition: string }[];
|
|
24
32
|
}
|
|
25
33
|
|
|
26
34
|
/** ⛔ 캐시하지 않는다 — 여러 런을 처리하는 프로세스(데몬·대기열 tick)가 다음 발사에서 오버레이 변경을 봐야 한다.
|
|
@@ -65,12 +73,46 @@ export function readJourneyEdge(
|
|
|
65
73
|
): JourneyRoute {
|
|
66
74
|
const { spec, applied } = journeySpec(state, deps.base ?? GRAPH_SPECS['self-implement'], deps.overlays ?? launchOverlays());
|
|
67
75
|
let route: JourneyRoute = { from, on: null, label, to: null, source: 'code-default', overlays: applied };
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
const outgoing = (spec?.edges ?? []).filter(edge => edge.from === from);
|
|
77
|
+
const protectedFrom = L1_PROTECTED_ROUTE_NODES.has(from) || spec?.nodes.some(node => node.nodeId === from && node.kind === 'gate') ||
|
|
78
|
+
spec?.terminalNodes.includes(from);
|
|
79
|
+
const conditions = outgoing.filter(edge => edge.when !== undefined && !protectedFrom).map(edge => ({ edge, verdict: evaluateOverlayCondition(edge.when, state) }));
|
|
80
|
+
const matching = conditions.filter(({ verdict }) => verdict.kind === 'applies').map(({ edge }) => edge);
|
|
81
|
+
const unobservedConditions = conditions.filter(({ verdict }) => verdict.kind === 'key-absent').map(({ edge }) => edge.when!);
|
|
82
|
+
if (matching.length === 1 && unobservedConditions.length === 0 && matching[0]!.to !== undefined) {
|
|
83
|
+
route = { from, on: null, label, to: matching[0]!.to!, source: 'graph', overlays: applied,
|
|
84
|
+
via: 'when', condition: matching[0]!.when };
|
|
85
|
+
} else {
|
|
86
|
+
const mapped = outgoing.find(edge => edge.when === undefined && edge.map !== undefined && Object.hasOwn(edge.map, label));
|
|
87
|
+
const defaultEdge = mapped ?? outgoing.find(edge => edge.when === undefined && edge.to !== undefined);
|
|
88
|
+
if (defaultEdge?.map !== undefined) route = { from, on: defaultEdge.on ?? null, label,
|
|
89
|
+
to: defaultEdge.map[label]!, source: 'graph', overlays: applied, via: 'outcome' };
|
|
90
|
+
else if (defaultEdge?.to !== undefined) route = { from, on: null, label,
|
|
91
|
+
to: defaultEdge.to, source: 'graph', overlays: applied, via: 'outcome' };
|
|
92
|
+
if (matching.length > 1) route = { ...route, ambiguousConditions: matching.map(edge => edge.when!) };
|
|
93
|
+
if (unobservedConditions.length > 0) route = { ...route, unobservedConditions };
|
|
94
|
+
}
|
|
95
|
+
// A skipped optional node needs one unambiguous unconditional successor. Otherwise retain
|
|
96
|
+
// the ordinary route; neither a missing observation nor a branching node is a skip proof.
|
|
97
|
+
if (route.to && spec) {
|
|
98
|
+
const skipped: { node: string; condition: string }[] = [];
|
|
99
|
+
const visited = new Set<string>();
|
|
100
|
+
while (route.to && !visited.has(route.to)) {
|
|
101
|
+
visited.add(route.to);
|
|
102
|
+
const next = spec.nodes.find(node => node.nodeId === route.to);
|
|
103
|
+
if (!next?.skipWhen || next.kind === 'gate' ||
|
|
104
|
+
L1_PROTECTED_ROUTE_NODES.has(next.nodeId) ||
|
|
105
|
+
spec.terminalNodes.includes(next.nodeId) ||
|
|
106
|
+
evaluateOverlayCondition(next.skipWhen, state).kind !== 'applies') break;
|
|
107
|
+
const successors = spec.edges.filter(edge => edge.from === next.nodeId);
|
|
108
|
+
if (successors.length !== 1 || successors[0]?.to === undefined ||
|
|
109
|
+
successors[0]?.when !== undefined || (successors[0]?.fallback?.length ?? 0) > 0 ||
|
|
110
|
+
visited.has(successors[0].to)) break;
|
|
111
|
+
skipped.push({ node: next.nodeId, condition: next.skipWhen });
|
|
112
|
+
route = { ...route, to: successors[0]!.to! };
|
|
73
113
|
}
|
|
114
|
+
if (skipped.length > 0) route = { ...route, skippedNode: skipped[0]!.node,
|
|
115
|
+
skipCondition: skipped[0]!.condition, skippedNodes: skipped };
|
|
74
116
|
}
|
|
75
117
|
return route;
|
|
76
118
|
}
|
|
@@ -78,6 +120,18 @@ export function readJourneyEdge(
|
|
|
78
120
|
/** 실제로 탄 간선을 남긴다 — `taken` 은 실제 다음 노드(그래프 답과 다르면 `honored: false` · 그 이유를 `reason` 에). */
|
|
79
121
|
export function recordJourneyEdge(route: JourneyRoute, taken: string, reason?: string): void {
|
|
80
122
|
try {
|
|
123
|
+
if (route.ambiguousConditions?.length) debug.log('self-implement', 'edge-ambiguous', {
|
|
124
|
+
graphId: 'self-implement', from: route.from, conditions: route.ambiguousConditions,
|
|
125
|
+
fallback: taken, ...journeyJoinFields(),
|
|
126
|
+
});
|
|
127
|
+
if (route.unobservedConditions?.length) debug.log('self-implement', 'edge-unobserved', {
|
|
128
|
+
graphId: 'self-implement', from: route.from, conditions: route.unobservedConditions,
|
|
129
|
+
fallback: taken, ...journeyJoinFields(),
|
|
130
|
+
});
|
|
131
|
+
if (route.to === taken) for (const skipped of route.skippedNodes ?? []) debug.log('self-implement', 'node-skipped', {
|
|
132
|
+
graphId: 'self-implement', node: skipped.node, reason: 'condition', condition: skipped.condition,
|
|
133
|
+
...journeyJoinFields(),
|
|
134
|
+
});
|
|
81
135
|
debug.log('self-implement', 'graph-edge-taken', {
|
|
82
136
|
graphId: 'self-implement', ...route, taken, honored: route.to === null || route.to === taken,
|
|
83
137
|
...(reason === undefined ? {} : { reason }), ...journeyJoinFields(),
|
|
@@ -1,28 +1,16 @@
|
|
|
1
1
|
import { buildHarnessRunDevSpec, runDevPipeline, type DevHarnessDispatchArgs, type DevPipelineDeps } from './dev-pipeline.js';
|
|
2
2
|
import type { SurfaceUxSource } from '../agent/surface-ux/build.js';
|
|
3
3
|
import { debug } from '../debug/log.js';
|
|
4
|
-
import { CLI_HARNESS_RUN_ENTRANCE,
|
|
4
|
+
import { CLI_HARNESS_RUN_ENTRANCE, retiredEntranceNotice } from './entrance-registry.js';
|
|
5
|
+
import { HARNESS_RUN_REPLACEMENT } from './cli-help-text.js';
|
|
6
|
+
export { HARNESS_RUN_REPLACEMENT, HARNESS_RUN_DEPRECATION_HELP } from './cli-help-text.js';
|
|
5
7
|
|
|
6
8
|
/** `elanous logs --category`로 레거시 입구의 제거 안전시점을 조회하는 브레드크럼. */
|
|
7
9
|
export const HARNESS_RUN_DEPRECATION_LOG_CATEGORY = 'harness-cli.deprecated';
|
|
8
|
-
export const HARNESS_RUN_REPLACEMENT = 'elanous harness say <objective>';
|
|
9
10
|
/** 실행 «중»에 사람에게 내는 한 줄. ⛔ `--help` 용은 아래 HARNESS_RUN_DEPRECATION_HELP 다 —
|
|
10
11
|
* 그쪽은 레지스트리가 은퇴 표시와 «갈 곳»을 이미 붙이므로 여기서 그것을 되풀이하지 않는다. */
|
|
11
12
|
export const HARNESS_RUN_DEPRECATION_NOTICE = `ℹ️ \`elanous harness run\`은 deprecated 입구입니다 — \`${HARNESS_RUN_REPLACEMENT}\`로 이행하세요.`;
|
|
12
13
|
|
|
13
|
-
/** `--help` 머리에 붙는 은퇴 표시.
|
|
14
|
-
*
|
|
15
|
-
* ⛔⭐ **문면을 «손으로 짓지 않는다»** — 레지스트리가 낸다(RFC-one-door-many-entrances P2).
|
|
16
|
-
* 📏 2026-08-20 실측: 은퇴로 «선언»된 입구 셋 중 `--help` 가 그 사실을 말한 것은 하나뿐이었고,
|
|
17
|
-
* ***그 하나(여기)조차 문면을 레지스트리와 «따로» 들고 있었다.***
|
|
18
|
-
* ⇒ 🔑 선언과 표면이 «두 곳»에 살면 한쪽만 고쳐지고 다른 쪽이 조용히 늙는다.
|
|
19
|
-
* ⚠️ 상수 «이름»은 유지한다 — 시험과 index.ts 가 이 이름으로 읽는다(뜻이 좁아지지 않는다). */
|
|
20
|
-
export const HARNESS_RUN_DEPRECATION_HELP = describeEntranceCommand(
|
|
21
|
-
CLI_HARNESS_RUN_ENTRANCE,
|
|
22
|
-
HARNESS_RUN_REPLACEMENT,
|
|
23
|
-
'이 입구는 더 이상 실행되지 않습니다.',
|
|
24
|
-
).trimEnd();
|
|
25
|
-
|
|
26
14
|
/** ⭐ 진행 릴레이를 «단 곳» — 하니스 시퀀서가 스테이지마다 내는 progress 를 CLI 부모 stdout 까지 잇는다.
|
|
27
15
|
*
|
|
28
16
|
* ⛔ **왜 `ctx` 가 아니라 `deps.uxSource` 인가**: `dispatchRunDevHarness` 의 detached 가드가
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Shared, dependency-free text rules for both orchestrate CLI entrances. */
|
|
2
|
+
export function splitOrchestrateGoalTexts(parts: readonly string[]): string[] {
|
|
3
|
+
const joined = parts.join(' ');
|
|
4
|
+
return (joined.includes(';;') ? joined.split(';;') : parts).map((goal) => goal.trim()).filter(Boolean);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function normalizeOrchestrateRequest(input: readonly string[] | string): string {
|
|
8
|
+
const joined = typeof input === 'string' ? input : input.join(' ');
|
|
9
|
+
return joined.replace(/;;/g, ' ').trim();
|
|
10
|
+
}
|
|
@@ -29,7 +29,7 @@ import { availableParallelism, cpus } from 'node:os';
|
|
|
29
29
|
import { selfDevRunsDir } from './run-store.js';
|
|
30
30
|
import { HARNESS_RUN_ID_ENV, normalizeRunId } from '../harness/harness-space.js';
|
|
31
31
|
import { plannedSelfImplBranch } from '../harness/worktree-branch-prefix.js';
|
|
32
|
-
import { parseGoalId } from '../self-implement/goal-author.js';
|
|
32
|
+
import { inspectGoalDoneBoundary, parseGoalId } from '../self-implement/goal-author.js';
|
|
33
33
|
import { isTransientExecutionFailure } from './execution-transient.js';
|
|
34
34
|
import type { AbandonedClassification } from '../self-implement/abandoned-classification.js';
|
|
35
35
|
import type { JobKind, SelfDevGoal, SelfDevJobResult } from './run-types.js';
|
|
@@ -204,7 +204,7 @@ interface SelfDevTerminalOutcome {
|
|
|
204
204
|
stage: string | null;
|
|
205
205
|
merged: boolean | null;
|
|
206
206
|
prUrl: string | null;
|
|
207
|
-
blockReason?: 'parent-unlanded';
|
|
207
|
+
blockReason?: 'parent-unlanded' | 'dependency-needs-human';
|
|
208
208
|
parentPrNumber?: number | null;
|
|
209
209
|
parentNoPr?: true;
|
|
210
210
|
}
|
|
@@ -493,6 +493,7 @@ export function classifyFailure(
|
|
|
493
493
|
preflightWarning: PreflightWarningObservation = 'unknown',
|
|
494
494
|
): FailureKind | null {
|
|
495
495
|
if (result.blockReason === 'parent-unlanded') return 'parent-unlanded';
|
|
496
|
+
if (result.blockReason === 'dependency-needs-human' || result.error?.code === 'GOAL_DONE_BOUNDARY_MISSING') return 'awaiting-human';
|
|
496
497
|
const ledgerKind = result.failureClassification === undefined
|
|
497
498
|
? undefined
|
|
498
499
|
: result.failureClassification === 'run-deadline-exceeded'
|
|
@@ -767,6 +768,8 @@ export function resolveOrchestrateConcurrency(
|
|
|
767
768
|
|
|
768
769
|
export interface OrchestrateSelfDevOptions {
|
|
769
770
|
goals: SelfDevGoal[];
|
|
771
|
+
/** TA 카드 출처. 생략하면 발사 환경의 ELANOUS_TASK_CARD_ID를 읽는다. */
|
|
772
|
+
taskCardId?: string;
|
|
770
773
|
/** Original composite request. Multi-shard runs carry it to each child; omitted
|
|
771
774
|
* keeps legacy callers and non-decomposed goal lists byte-for-byte unchanged. */
|
|
772
775
|
parentRequest?: string;
|
|
@@ -947,6 +950,77 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
947
950
|
const now = opts.now ?? Date.now;
|
|
948
951
|
const runId = opts.runId ?? process.env[HARNESS_RUN_ID_ENV];
|
|
949
952
|
if (runId && runId !== normalizeRunId(runId)) throw new Error(`invalid self-dev run ID: ${runId}`);
|
|
953
|
+
const taskCardId = opts.taskCardId ?? process.env.ELANOUS_TASK_CARD_ID;
|
|
954
|
+
const boundaryResults: SelfDevJobResult[] = [];
|
|
955
|
+
if (taskCardId?.trim()) {
|
|
956
|
+
const parentBoundary = inspectGoalDoneBoundary(opts.parentRequest ?? '');
|
|
957
|
+
const inherited: Array<{ index: number; labels: string[] }> = [];
|
|
958
|
+
opts = { ...opts, goals: opts.goals.map((goal, index) => {
|
|
959
|
+
if (goal.kind && goal.kind !== 'dev') return goal;
|
|
960
|
+
const missing = inspectGoalDoneBoundary(goal.feature).missing;
|
|
961
|
+
const lines = missing.flatMap((label) => parentBoundary.values[label] ? [`- ${label}: ${parentBoundary.values[label]}`] : []);
|
|
962
|
+
if (lines.length === 0) return goal;
|
|
963
|
+
inherited.push({ index: index + 1, labels: missing.filter((label) => parentBoundary.values[label]) });
|
|
964
|
+
return { ...goal, feature: `${goal.feature.trimEnd()}\n${lines.join('\n')}` };
|
|
965
|
+
}) };
|
|
966
|
+
if (inherited.length > 0) {
|
|
967
|
+
try { debug.log('self-dev.orchestrate', 'done-boundary-inherited', { taskCardId, inherited }); } catch { /* fail-soft */ }
|
|
968
|
+
}
|
|
969
|
+
const boundaryMissing = opts.goals.flatMap((goal, index) => {
|
|
970
|
+
if (goal.kind && goal.kind !== 'dev') return [];
|
|
971
|
+
const boundary = inspectGoalDoneBoundary(goal.feature);
|
|
972
|
+
return boundary.missing.length ? [{ index: index + 1, goal: goal.id ?? goal.feature.split(/\r?\n/, 1)[0]?.slice(0, 80) ?? '', missing: boundary.missing }] : [];
|
|
973
|
+
});
|
|
974
|
+
if (boundaryMissing.length > 0) {
|
|
975
|
+
const blockedGoalIndexes = new Set<number>(boundaryMissing.map(({ index }) => index - 1));
|
|
976
|
+
const blockedByBoundaryId = new Set(boundaryMissing.map(({ index }) => {
|
|
977
|
+
const goal = opts.goals[index - 1]!;
|
|
978
|
+
return goal.id ?? String(index - 1);
|
|
979
|
+
}));
|
|
980
|
+
const blockedDependents = new Map<number, string>();
|
|
981
|
+
let changed = true;
|
|
982
|
+
while (changed) {
|
|
983
|
+
changed = false;
|
|
984
|
+
opts.goals.forEach((goal, index) => {
|
|
985
|
+
if (blockedDependents.has(index)) return;
|
|
986
|
+
const goalId = goal.id ?? String(index);
|
|
987
|
+
const predecessor = (goal.dependsOn ?? []).find((id) => id !== goalId && blockedByBoundaryId.has(id));
|
|
988
|
+
if (!predecessor) return;
|
|
989
|
+
blockedGoalIndexes.add(index);
|
|
990
|
+
blockedByBoundaryId.add(goalId);
|
|
991
|
+
blockedDependents.set(index, predecessor);
|
|
992
|
+
changed = true;
|
|
993
|
+
});
|
|
994
|
+
}
|
|
995
|
+
for (const item of boundaryMissing.filter(({ index }) => !blockedDependents.has(index - 1))) {
|
|
996
|
+
const goal = opts.goals[item.index - 1]!;
|
|
997
|
+
boundaryResults.push({
|
|
998
|
+
taskId: `boundary:${taskCardId}:needs-human:${item.index}`,
|
|
999
|
+
feature: goal.feature,
|
|
1000
|
+
status: 'failed',
|
|
1001
|
+
stage: 'needs-human',
|
|
1002
|
+
stopReason: 'needs-human',
|
|
1003
|
+
error: { code: 'GOAL_DONE_BOUNDARY_MISSING', message: item.missing.join(' · ') },
|
|
1004
|
+
});
|
|
1005
|
+
}
|
|
1006
|
+
for (const [index, predecessor] of blockedDependents) {
|
|
1007
|
+
const goal = opts.goals[index]!;
|
|
1008
|
+
boundaryResults.push({
|
|
1009
|
+
taskId: `boundary:${taskCardId}:blocked:${index + 1}`,
|
|
1010
|
+
feature: goal.feature,
|
|
1011
|
+
status: 'blocked',
|
|
1012
|
+
blockReason: 'dependency-needs-human',
|
|
1013
|
+
stopReason: 'needs-human',
|
|
1014
|
+
error: { code: 'DEPENDENCY_NEEDS_HUMAN', message: `선행 needs-human: ${predecessor}` },
|
|
1015
|
+
});
|
|
1016
|
+
}
|
|
1017
|
+
const withheld = [...blockedGoalIndexes].map((index) => index + 1);
|
|
1018
|
+
try { debug.log('self-dev.orchestrate', 'done-boundary-missing', { taskCardId, boundaryMissing, withheld, action: 'needs-human', eligibleToLaunch: opts.goals.length - blockedGoalIndexes.size }); } catch { /* fail-soft */ }
|
|
1019
|
+
opts = { ...opts, goals: opts.goals.flatMap((goal, index) => blockedGoalIndexes.has(index)
|
|
1020
|
+
? []
|
|
1021
|
+
: [{ ...goal, id: goal.id ?? String(index) }]) };
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
950
1024
|
const pidPath = runId ? join(opts.runsDir ?? selfDevRunsDir(), runId, 'pid.json') : undefined;
|
|
951
1025
|
// Only the real run directory gets a host-wide binding by default — an overridden runsDir is an isolated test.
|
|
952
1026
|
const registryDir = opts.launchRegistryDir !== undefined ? opts.launchRegistryDir : opts.runsDir === undefined ? launchRegistryDir() : null;
|
|
@@ -1388,7 +1462,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1388
1462
|
// state (with disposition merged when the job has settled). Reused by
|
|
1389
1463
|
// both `finish()` and the mid-run checkpoint.
|
|
1390
1464
|
const buildResults = (): SelfDevJobResult[] => {
|
|
1391
|
-
const out: SelfDevJobResult[] = [...resumedResults];
|
|
1465
|
+
const out: SelfDevJobResult[] = [...resumedResults, ...boundaryResults];
|
|
1392
1466
|
for (const [taskId, goal] of taskByGoal) {
|
|
1393
1467
|
const status = graph.getTask(taskId)?.status ?? 'failed';
|
|
1394
1468
|
const resumeDisposition = resumeDispositionByGoal.get(goal);
|
|
@@ -1420,6 +1494,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1420
1494
|
...(disp?.providerErrors ? { providerErrors: disp.providerErrors } : {}),
|
|
1421
1495
|
...(disp?.rework ? { rework: disp.rework } : {}),
|
|
1422
1496
|
...(disp?.mustFix ? { reviewMustFix: disp.mustFix } : {}),
|
|
1497
|
+
...(disp?.mustFix && goal.hotPaths?.length ? { targetPaths: [...goal.hotPaths] } : {}),
|
|
1423
1498
|
...(goalCauseObservedFromFailureClassification(disp?.failureClassification) === true
|
|
1424
1499
|
? { goalCauseObserved: true } : {}),
|
|
1425
1500
|
...(disp?.runId ? { runId: disp.runId } : {}),
|
|
@@ -1496,6 +1571,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1496
1571
|
unclassified: failureKinds.unclassified,
|
|
1497
1572
|
mainSyncBlocked: failureKinds.mainSyncBlocked,
|
|
1498
1573
|
parentUnlanded: out.filter((r) => r.blockReason === 'parent-unlanded').length,
|
|
1574
|
+
dependencyNeedsHuman: out.filter((r) => r.blockReason === 'dependency-needs-human').length,
|
|
1499
1575
|
failures,
|
|
1500
1576
|
blockedParents: out.filter((r) => r.blockReason === 'parent-unlanded').map((r) => ({ taskId: r.taskId, blockReason: r.blockReason, parentPrNumber: r.parentPrNumber ?? null, ...(r.parentNoPr ? { parentNoPr: true } : {}) })),
|
|
1501
1577
|
...(unionDiff ? { unionDiff } : {}),
|
|
@@ -107,6 +107,36 @@ export function parseTeamclaudeBaseUrl(stdout: string): string | undefined {
|
|
|
107
107
|
return match?.[1];
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
export interface TeamclaudeReviewRoute {
|
|
111
|
+
/** Present only when teamclaude printed its proxy base URL: the cct ACP spawn (billing scrub ⊕ base-url). */
|
|
112
|
+
spawn?: ReturnType<typeof subscriptionReviewerSpawn>;
|
|
113
|
+
reason: 'teamclaude-base-url' | 'teamclaude-no-base-url' | 'teamclaude-unavailable';
|
|
114
|
+
exit?: number | null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* ACP-REVIEW-VIA-TEAMCLAUDE (0.2.35): the explicit `--acp-backend claude` review reuses the cct route of the
|
|
119
|
+
* subscription lane — `teamclaude env --no-mitm` → base URL → `subscriptionReviewerSpawn` — without the quota gate
|
|
120
|
+
* (an explicit flag is the operator's choice). teamclaude missing or silent = no spawn; the caller keeps its prior path.
|
|
121
|
+
*/
|
|
122
|
+
export function resolveTeamclaudeReviewRoute(
|
|
123
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
124
|
+
runStatus: NonNullable<SubscriptionReviewerDeps['runStatus']> = (command, args, cleanEnv) =>
|
|
125
|
+
spawnSync(command, args, { env: { ...cleanEnv, NODE_ENV: process.env.NODE_ENV }, encoding: 'utf8', timeout: 5_000 }),
|
|
126
|
+
): TeamclaudeReviewRoute {
|
|
127
|
+
const spec: SubscriptionReviewerSpec = { provider: 'claude-acp', executor: 'cct' };
|
|
128
|
+
try {
|
|
129
|
+
const proxy = runStatus('teamclaude', ['env', '--no-mitm'], subscriptionReviewerSpawn(spec, env).env);
|
|
130
|
+
// Bun reports a missing binary as `status: undefined` (Node: null) — both mean «no teamclaude here».
|
|
131
|
+
if (proxy.status == null) return { reason: 'teamclaude-unavailable' };
|
|
132
|
+
const baseUrl = proxy.status === 0 ? parseTeamclaudeBaseUrl(String(proxy.stdout ?? '')) : undefined;
|
|
133
|
+
if (!baseUrl) return { reason: 'teamclaude-no-base-url', exit: proxy.status };
|
|
134
|
+
return { spawn: subscriptionReviewerSpawn(spec, env, baseUrl), reason: 'teamclaude-base-url' };
|
|
135
|
+
} catch {
|
|
136
|
+
return { reason: 'teamclaude-unavailable' };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
110
140
|
/** Guard the ACP review before spawning. An unmeasured quota never authorizes subscription use. */
|
|
111
141
|
export function subscriptionReviewerAvailability(
|
|
112
142
|
spec: SubscriptionReviewerSpec,
|
|
@@ -291,7 +321,7 @@ export interface ReviewFallbackObservation {
|
|
|
291
321
|
export async function runReviewWithFallback(
|
|
292
322
|
attempts: readonly ReviewProviderAttempt[],
|
|
293
323
|
call: (attempt: ReviewProviderAttempt, observeResolvedProvider: (provider?: string) => void) => Promise<string>,
|
|
294
|
-
observe: (event: 'attempt' | 'resolved' | 'fallback' | 'exhausted', data: ReviewFallbackObservation) => void = () => {},
|
|
324
|
+
observe: (event: 'attempt' | 'resolved' | 'completed' | 'fallback' | 'exhausted', data: ReviewFallbackObservation) => void = () => {},
|
|
295
325
|
): Promise<{ text: string; used: ReviewProviderAttempt; attemptIndex: number }> {
|
|
296
326
|
if (attempts.length === 0) throw new Error('review fallback: no attempts configured');
|
|
297
327
|
let lastError: unknown;
|
|
@@ -318,6 +348,10 @@ export async function runReviewWithFallback(
|
|
|
318
348
|
if (resolvedProvider) {
|
|
319
349
|
try { observe('resolved', { ...base, resolvedProvider }); } catch { /* fail-soft */ }
|
|
320
350
|
}
|
|
351
|
+
// Provider calls are attempts; only a non-empty artifact completes a logical review round.
|
|
352
|
+
if (text.trim()) {
|
|
353
|
+
try { observe('completed', { ...base, ...(resolvedProvider ? { resolvedProvider } : {}) }); } catch { /* fail-soft */ }
|
|
354
|
+
}
|
|
321
355
|
return { text, used: attempt, attemptIndex: i };
|
|
322
356
|
} catch (error) {
|
|
323
357
|
lastError = error;
|
|
@@ -12,7 +12,10 @@ import { sweepFrozenMerges } from '../self-implement/frozen-merges.js';
|
|
|
12
12
|
import { routeSupervisorVerdict } from './supervisor-verdict-edges.js';
|
|
13
13
|
import { recordTaskAgentShadowMove, runCardFor, type TaskAgentShadowInput } from '../task-agent/shadow.js';
|
|
14
14
|
import { cardPrNumber, taskAgentStatePath } from '../task-agent/task-hand.js';
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
classifyMustFixRound, inferMustFixEvidence, judgeMustFixScope, proposeMustFixSplit,
|
|
17
|
+
type MustFixRoundClassification, type MustFixRoundObservation, type MustFixScope, type MustFixScopeJudgement, type MustFixSplitProposal,
|
|
18
|
+
} from '../self-implement/review-mustfix-class.js';
|
|
16
19
|
|
|
17
20
|
export interface SupervisorRound {
|
|
18
21
|
round: number;
|
|
@@ -115,6 +118,16 @@ export interface SupervisorDecision {
|
|
|
115
118
|
mustFix?: MustFixRoundClassification;
|
|
116
119
|
/** REVIEW-MUSTFIX-CLASSIFY — every oscillating task's measured class, so a mixed round keeps each task's decision. */
|
|
117
120
|
mustFixByTask?: Record<string, MustFixRoundClassification>;
|
|
121
|
+
/**
|
|
122
|
+
* REVIEW-MUSTFIX-CLASSIFY 범위 축 — must-fix 한 줄마다 (가) in-scope / (나) split / (다) ask-owner.
|
|
123
|
+
* split 은 같은 런 재수리에서 빠지고 «중간 착지 ⊕ 연결 골» 제안을 싣는다(파일·칸 쓰기는 다음 조각 — 이번엔 결정 칸까지).
|
|
124
|
+
* ask-owner 는 칸 주인 HITL 제안. 진동 경로에서 must-fix 를 잰 조각만 — 없으면 생략(지금 동작 그대로).
|
|
125
|
+
*/
|
|
126
|
+
mustFixScope?: {
|
|
127
|
+
byTask: Record<string, MustFixScopeJudgement[]>;
|
|
128
|
+
split?: Array<{ taskId: string; action: '중간 착지 ⊕ 연결 골'; proposals: MustFixSplitProposal[] }>;
|
|
129
|
+
askOwner?: Array<{ taskId: string; hitl: string; items: string[] }>;
|
|
130
|
+
};
|
|
118
131
|
oscillation?: { taskIds: string[]; helper: 'review-oscillation'; signature: string; repairGoals?: Record<string, string>; heldTaskIds?: string[] };
|
|
119
132
|
pendingDecision?: 'attempt-care-escalation';
|
|
120
133
|
}
|
|
@@ -262,11 +275,70 @@ function classifyTaskMustFix(result: SupervisorJobResult, preceding: SupervisorR
|
|
|
262
275
|
}
|
|
263
276
|
|
|
264
277
|
/**
|
|
265
|
-
* Classes that hold a task out of this round's same-run repair
|
|
266
|
-
*
|
|
267
|
-
*
|
|
278
|
+
* Classes/scopes that hold a task out of this round's same-run repair: ② post-land-evidence, and (나) split when
|
|
279
|
+
* every must-fix item of the task is split (③ recurring items are split). A partly split task is repaired with its
|
|
280
|
+
* non-split items only.
|
|
281
|
+
*/
|
|
282
|
+
const MUST_FIX_HELD = new Set<MustFixRoundClassification['class'] | MustFixScope>(['post-land-evidence', 'split']);
|
|
283
|
+
// ⚠️ 'post-land-evidence' 는 보류 «사유» 문면에만 쓰인다 — 보류 여부는 줄 단위 'split'(② 줄 포함)이 정한다.
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* REVIEW-MUSTFIX-CLASSIFY 범위 축 — 한 조각의 must-fix 를 줄마다 범위 판정한다. `prevItems` 는 앞 회차 원장의 같은
|
|
287
|
+
* 조각(또는 수리 계보) 지적 — 앞 회차가 must-fix 를 안 쟀으면 undefined(new-axis 신호를 안 낸다).
|
|
268
288
|
*/
|
|
269
|
-
|
|
289
|
+
function judgeTaskMustFixScope(
|
|
290
|
+
result: SupervisorJobResult, preceding: SupervisorRound | undefined, classification: MustFixRoundClassification,
|
|
291
|
+
): MustFixScopeJudgement[] {
|
|
292
|
+
const items = mustFixFromResults([result]).items ?? [];
|
|
293
|
+
const pairIds = new Set([result.taskId, ...(result.oscillationRepairOf ? [result.oscillationRepairOf] : [])]);
|
|
294
|
+
const precedingItems = preceding?.mustFix?.items;
|
|
295
|
+
const prevItems = precedingItems === undefined ? undefined
|
|
296
|
+
: precedingItems.filter((item) => item.taskId !== undefined && pairIds.has(item.taskId));
|
|
297
|
+
return items.map((item) => judgeMustFixScope(item, {
|
|
298
|
+
...(result.changedFiles ? { changedFiles: result.changedFiles } : {}),
|
|
299
|
+
...(result.targetPaths ? { targetPaths: result.targetPaths } : {}),
|
|
300
|
+
...(result.prNumber !== undefined ? { prNumber: result.prNumber } : {}),
|
|
301
|
+
...(result.rework?.rounds !== undefined ? { reviewRound: result.rework.rounds } : {}),
|
|
302
|
+
...(prevItems !== undefined ? { prevItems } : {}),
|
|
303
|
+
...(classification.recurring ? { recurring: classification.recurring } : {}),
|
|
304
|
+
}));
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* 범위 판정을 결정 칸으로 접고 줄마다 관측을 남긴다 — (나) 는 «중간 착지 ⊕ 연결 골» 제안, (다) 는 칸 주인 HITL 제안.
|
|
309
|
+
* 실제 연결 골 파일·칸 근거 쓰기·intent 자동 주입 실행은 다음 조각.
|
|
310
|
+
*/
|
|
311
|
+
function mustFixScopeDecision(
|
|
312
|
+
oscillating: readonly SupervisorJobResult[],
|
|
313
|
+
taskClasses: ReadonlyMap<string, MustFixRoundClassification>,
|
|
314
|
+
taskScopes: ReadonlyMap<string, MustFixScopeJudgement[]>,
|
|
315
|
+
): SupervisorDecision['mustFixScope'] {
|
|
316
|
+
const byTask: Record<string, MustFixScopeJudgement[]> = {};
|
|
317
|
+
const split: NonNullable<NonNullable<SupervisorDecision['mustFixScope']>['split']> = [];
|
|
318
|
+
const askOwner: NonNullable<NonNullable<SupervisorDecision['mustFixScope']>['askOwner']> = [];
|
|
319
|
+
for (const result of oscillating) {
|
|
320
|
+
const judged = taskScopes.get(result.taskId) ?? [];
|
|
321
|
+
if (judged.length === 0 || byTask[result.taskId]) continue;
|
|
322
|
+
byTask[result.taskId] = judged;
|
|
323
|
+
const cls = taskClasses.get(result.taskId)?.class ?? 'unmeasured';
|
|
324
|
+
for (const j of judged) {
|
|
325
|
+
const action = j.scope === 'split' ? 'split-link-goal' : j.scope === 'ask-owner' ? 'ask-owner-hitl' : 'fix-same-run';
|
|
326
|
+
try { debug.log('self-dev.supervisor', 'mustfix-scope', { taskId: result.taskId, class: cls, scope: j.scope, signals: j.signals, action }); } catch { /* fail-open */ }
|
|
327
|
+
}
|
|
328
|
+
const splits = judged.filter((j) => j.scope === 'split');
|
|
329
|
+
if (splits.length) {
|
|
330
|
+
split.push({ taskId: result.taskId, action: '중간 착지 ⊕ 연결 골',
|
|
331
|
+
proposals: splits.map((j) => proposeMustFixSplit(j)) });
|
|
332
|
+
}
|
|
333
|
+
const asks = judged.filter((j) => j.scope === 'ask-owner');
|
|
334
|
+
if (asks.length) {
|
|
335
|
+
askOwner.push({ taskId: result.taskId, items: asks.map((j) => j.text),
|
|
336
|
+
hitl: `칸 주인에게 묻는다 — must-fix ${asks.length}건 범위 판단 불가(${[...new Set(asks.map((j) => j.reason))].join(' · ')})` });
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (Object.keys(byTask).length === 0) return undefined;
|
|
340
|
+
return { byTask, ...(split.length ? { split } : {}), ...(askOwner.length ? { askOwner } : {}) };
|
|
341
|
+
}
|
|
270
342
|
|
|
271
343
|
export function decideNextRun(input: {
|
|
272
344
|
results: readonly SupervisorJobResult[];
|
|
@@ -557,30 +629,52 @@ export function decideNextRun(input: {
|
|
|
557
629
|
// REVIEW-MUSTFIX-CLASSIFY — 슈퍼바이저는 추이 대신 회차 분류를 먼저 본다(대표 10-12 «노하우가 아니라 로직으로» · 임의 임계 없음).
|
|
558
630
|
// ① new-defect — 그대로 수렴(진동 수리 유지).
|
|
559
631
|
// ② post-land-evidence — 증거는 착지 뒤에만 난다 ⇒ 같은 런 재수리 0, «그림자 착지 → 관측 → live» 쪼개기 결정.
|
|
560
|
-
// ③ recurring — 수리 뒤 같은 지적 ⇒
|
|
632
|
+
// ③ recurring — 수리 뒤 같은 지적 ⇒ 교차 리뷰 제안을 결정에 싣고, 그 줄은 범위 축에서 (나) split 으로 같은 런 수리에서 뺀다.
|
|
561
633
|
// unmeasured — 분류 불가 ⇒ 지금 동작 그대로. 분류는 조각마다 — 한 조각의 분류가 다른 조각의 수리를 끊지 않는다.
|
|
562
634
|
const taskClasses = new Map(oscillating.map((result) => [result.taskId, classifyTaskMustFix(result, preceding)]));
|
|
563
|
-
|
|
635
|
+
// 범위 축 — must-fix 한 줄마다 (가)/(나)/(다). 모든 줄이 (나) 면 조각을 보류하고, 일부면 (나) 를 뺀 줄로만 수리한다.
|
|
636
|
+
const taskScopes = new Map(oscillating.map((result) => [result.taskId,
|
|
637
|
+
judgeTaskMustFixScope(result, preceding, taskClasses.get(result.taskId)!)]));
|
|
638
|
+
const allSplit = (taskId: string): boolean => {
|
|
639
|
+
const judged = taskScopes.get(taskId) ?? [];
|
|
640
|
+
return judged.length > 0 && judged.every((j) => j.scope === 'split');
|
|
641
|
+
};
|
|
642
|
+
// 보류는 줄 단위 범위로만 가른다 — ② 줄은 범위 축에서 늘 split 이므로 ② 회차(모든 줄이 착지 뒤 증거)는 allSplit 와 같고,
|
|
643
|
+
// 한 줄이라도 (가)/(다) 가 남으면 그 줄은 수리 골로 간다(조각 통째 보류 금지).
|
|
644
|
+
const isClassHeld = (taskId: string): boolean => MUST_FIX_HELD.has('split') && allSplit(taskId);
|
|
645
|
+
const fresh = oscillating.filter((result) => !isRepaired(result) && !isClassHeld(result.taskId));
|
|
564
646
|
const classes = [...taskClasses.values()];
|
|
565
647
|
// Decision-level class: ② (the only acting class) first, then observed ③, else ①.
|
|
566
648
|
const mustFixClass = classes.find((c) => c.class === 'post-land-evidence') ?? classes.find((c) => c.class === 'recurring')
|
|
567
649
|
?? classes.find((c) => c.class === 'new-defect');
|
|
568
|
-
// Held = already repaired once, or
|
|
650
|
+
// Held = already repaired once, classified ②, or every must-fix item is (나) split — none rides this round's rerun.
|
|
569
651
|
const classHeld = [...new Set(oscillating.filter((result) => !isRepaired(result)
|
|
570
|
-
&&
|
|
652
|
+
&& isClassHeld(result.taskId)).map((result) => result.taskId))];
|
|
571
653
|
const held = [...new Set([...oscillating.filter(isRepaired).map((result) => result.taskId), ...classHeld])];
|
|
572
654
|
const repairedHeld = held.filter((id) => !classHeld.includes(id));
|
|
573
655
|
// Every task's measured class survives in the decision — a mixed round keeps ② split and the observed ③ cross-review suggestion both.
|
|
574
656
|
const mustFixByTask: Record<string, MustFixRoundClassification> = Object.fromEntries(
|
|
575
657
|
[...taskClasses].filter(([, c]) => c.class !== 'unmeasured'));
|
|
576
|
-
const heldReasons = [...new Set(
|
|
658
|
+
const heldReasons = [...new Set([
|
|
659
|
+
// 사유는 실제로 분류·범위로 보류된 조각에서만 — 수리되거나 이미 수리해 보류된 조각의 ② 사유는 싣지 않는다.
|
|
660
|
+
...classHeld.map((id) => taskClasses.get(id)!).filter((c) => MUST_FIX_HELD.has(c.class)).map((c) => c.reason),
|
|
661
|
+
...(classHeld.some((id) => !MUST_FIX_HELD.has(taskClasses.get(id)!.class))
|
|
662
|
+
? ['must-fix 가 전부 (나) 범위 밖 — 같은 런 재수리 0, 중간 착지 ⊕ 연결 골'] : []),
|
|
663
|
+
])];
|
|
577
664
|
const heldReasonSuffix = heldReasons.length ? ` · ${heldReasons.join(' · ')}` : '';
|
|
665
|
+
// (나) split 줄은 같은 런 수리 골에서 뺀다 — 수리는 (가)·(다) 줄로만.
|
|
666
|
+
const repairMustFix = (result: SupervisorJobResult): string[] => {
|
|
667
|
+
const splitTexts = new Set((taskScopes.get(result.taskId) ?? []).filter((j) => j.scope === 'split').map((j) => j.text));
|
|
668
|
+
return (result.reviewMustFix ?? []).filter((text) => !splitTexts.has(text));
|
|
669
|
+
};
|
|
578
670
|
const repairGoals: Record<string, string> = Object.fromEntries(fresh.flatMap((result) => {
|
|
579
|
-
const
|
|
671
|
+
const mustFix = repairMustFix(result);
|
|
672
|
+
const goal = result.prNumber && mustFix.length
|
|
580
673
|
? authorRepairGoal({ pr: result.prNumber, category: 'review-oscillation', originalRequest: result.feature,
|
|
581
|
-
mustFix
|
|
674
|
+
mustFix }) : null;
|
|
582
675
|
return goal ? [[result.taskId, goal]] : [];
|
|
583
676
|
}));
|
|
677
|
+
const mustFixScope = mustFixScopeDecision(oscillating, taskClasses, taskScopes);
|
|
584
678
|
// A caller that declares it cannot run the authored goal (false), or one that can but has no goal for every fresh
|
|
585
679
|
// oscillating task, would turn add-repair-task into a same-strategy relaunch — stop for a human instead.
|
|
586
680
|
// Undefined is the pure decision (caller unknown): it names the first repair as the goal contract asks.
|
|
@@ -606,6 +700,7 @@ export function decideNextRun(input: {
|
|
|
606
700
|
...(action === 'stop' ? { stopReason: 'review-oscillating' as const } : {}),
|
|
607
701
|
...(mustFixClass ? { mustFix: mustFixClass } : {}),
|
|
608
702
|
...(Object.keys(mustFixByTask).length ? { mustFixByTask } : {}),
|
|
703
|
+
...(mustFixScope ? { mustFixScope } : {}),
|
|
609
704
|
oscillation: { taskIds, helper: 'review-oscillation', signature, ...(Object.keys(repairGoals).length ? { repairGoals } : {}),
|
|
610
705
|
...(action === 'add-repair-task' && held.length ? { heldTaskIds: held } : {}) },
|
|
611
706
|
pendingDecision: 'attempt-care-escalation',
|
|
@@ -98,7 +98,7 @@ export interface SelfDevJobResult {
|
|
|
98
98
|
/** Commits this child added against its own `--base`. 0 is not completion progress. */
|
|
99
99
|
commitsAheadOfBase?: number;
|
|
100
100
|
/** A dependency is done but its result is not on main; no child was launched. */
|
|
101
|
-
blockReason?: 'parent-unlanded';
|
|
101
|
+
blockReason?: 'parent-unlanded' | 'dependency-needs-human';
|
|
102
102
|
parentPrNumber?: number;
|
|
103
103
|
/** The upstream completed in a worktree without opening a PR. */
|
|
104
104
|
parentNoPr?: true;
|
|
@@ -127,6 +127,10 @@ export interface SelfDevJobResult {
|
|
|
127
127
|
oscillationRepairOf?: string;
|
|
128
128
|
/** Verbatim final reviewer must-fix items for a bounded helper repair. */
|
|
129
129
|
reviewMustFix?: string[];
|
|
130
|
+
/** REVIEW-MUSTFIX-CLASSIFY 범위 축 — PR 변경 파일. undefined = 안 쟀다(범위 판정은 ask-owner 로 기운다 · 생산자는 다음 조각). */
|
|
131
|
+
changedFiles?: string[];
|
|
132
|
+
/** REVIEW-MUSTFIX-CLASSIFY 범위 축 — 골 대상 경로(goal.hotPaths). undefined = 골이 선언하지 않았다. */
|
|
133
|
+
targetPaths?: string[];
|
|
130
134
|
/** Whether the child review actually ran; omitted preserves legacy producers. */
|
|
131
135
|
reviewed?: boolean;
|
|
132
136
|
/** Why the child did not run review; omitted preserves legacy review-unobserved handling. */
|
|
@@ -329,17 +329,7 @@ type OrchestrateRunIdentityResolver = (input: { explicit?: string; inherited?: s
|
|
|
329
329
|
type OrchestrateResumeDisposition = 'skip' | 'rerun' | 'rerun-duplicate-risk';
|
|
330
330
|
type OrchestrateResumeDispositionClassifier<T> = (result: T) => OrchestrateResumeDisposition;
|
|
331
331
|
|
|
332
|
-
|
|
333
|
-
export function splitOrchestrateGoalTexts(parts: readonly string[]): string[] {
|
|
334
|
-
const joined = parts.join(' ');
|
|
335
|
-
return (joined.includes(';;') ? joined.split(';;') : parts).map((goal) => goal.trim()).filter(Boolean);
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/** `harness orchestrate` 와 `self orchestrate` 가 공유하는 `;;` 요청 문자열 결합 규칙. */
|
|
339
|
-
export function normalizeOrchestrateRequest(input: readonly string[] | string): string {
|
|
340
|
-
const joined = typeof input === 'string' ? input : input.join(' ');
|
|
341
|
-
return joined.replace(/;;/g, ' ').trim();
|
|
342
|
-
}
|
|
332
|
+
export { splitOrchestrateGoalTexts, normalizeOrchestrateRequest } from './orchestrate-cli-text.js';
|
|
343
333
|
|
|
344
334
|
/** `harness orchestrate` 와 `self orchestrate` 가 공유하는 분해 준비 인자 조립 규칙. */
|
|
345
335
|
export function buildOrchestrateDecomposePrepareArgs<
|