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,8 +1,8 @@
|
|
|
1
1
|
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
-
import { execFile } from 'node:child_process';
|
|
3
|
-
import { existsSync, linkSync, lstatSync, mkdirSync, readFileSync, readdirSync, readlinkSync, realpathSync, renameSync, rmdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { execFile, spawnSync } from 'node:child_process';
|
|
3
|
+
import { existsSync, linkSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, readlinkSync, realpathSync, renameSync, rmdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { dirname, join, resolve, sep } from 'node:path';
|
|
5
|
-
import {
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
6
|
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
7
7
|
import { getElanousConfigDir, getElanousConfigDirOverride } from '../elanous-config-dir.js';
|
|
8
8
|
import { debug } from '../debug/log.js';
|
|
@@ -17,13 +17,17 @@ import { recordFailureEvent } from '../self-implement/heal-intake.js';
|
|
|
17
17
|
import { growthApprovalRef, proposeGrowth, type GraphGrowth, type GrowthProposer, type GrowthRecipeEffect, type GrowthDecisionDeps, type GrowthCommand } from './graph-grow.js';
|
|
18
18
|
import { DecisionLedger, type DecisionEntry } from '../decisions/decision-ledger.js';
|
|
19
19
|
import { createLLMGrowthProposer } from './graph-grow-llm.js';
|
|
20
|
-
import { parseGraphTemplateYaml, type GraphEdgeSpec, type GraphNodeSpec, type GraphTemplateSpec } from '../self-implement/graph-yaml.js';
|
|
20
|
+
import { graphVersionHash, parseGraphTemplateYaml, type GraphEdgeSpec, type GraphNodeSpec, type GraphTemplateSpec } from '../self-implement/graph-yaml.js';
|
|
21
|
+
import { createGraphUnitResolver, resolveGraphUnit, UnitNotFoundError, type ResolvedGraphUnit } from '../self-implement/graph-unit-resolver.js';
|
|
22
|
+
import { flattenGraphUnits } from '../self-implement/graph-unit-flatten.js';
|
|
23
|
+
export { UnitNotFoundError } from '../self-implement/graph-unit-resolver.js';
|
|
21
24
|
import { createGraphVariant, type GraphVariantPlan } from '../self-implement/graph-variant.js';
|
|
22
25
|
import { psProcessStartMs, START_TOLERANCE_MS } from '../harness/harness-stop.js';
|
|
23
26
|
import { executeBashNode } from '../workflow-runtime/nodes/bash.js';
|
|
27
|
+
import { executeClassifyNode } from '../workflow-runtime/nodes/classify.js';
|
|
24
28
|
import { interpolate } from '../workflow-runtime/variables.js';
|
|
25
|
-
import type { BashNode, NodeExecContext, WorkflowDeps } from '../workflow-runtime/types.js';
|
|
26
|
-
import { releaseResumeAcceptedRegressions, releaseResumeGateExecutor, releaseResumeWaiver, type AcceptedRegression, type GateExecutorOverride } from '../../scripts/release-loop/resume.js';
|
|
29
|
+
import type { BashNode, ClassifyNode, NodeExecContext, NodeOutput, WorkflowDeps } from '../workflow-runtime/types.js';
|
|
30
|
+
import { releaseResumeAcceptedRegressions, releaseResumeGateExecutor, releaseResumeGatePodPool, releaseResumeWaiver, type AcceptedRegression, type GateExecutorOverride, type GatePodPoolOverride } from '../../scripts/release-loop/resume.js';
|
|
27
31
|
|
|
28
32
|
type BashRun = WorkflowDeps['runBash'];
|
|
29
33
|
const DEFAULT_BASH_TIMEOUT_MS = 5 * 60 * 1_000;
|
|
@@ -67,6 +71,61 @@ function assertReleaseCommandBinding(node: GraphNodeSpec, command: string | unde
|
|
|
67
71
|
}
|
|
68
72
|
}
|
|
69
73
|
|
|
74
|
+
const LOOP_TERMINAL_STATUS: Readonly<Record<string, Readonly<Record<string, 'done' | 'failed'>>>> = {
|
|
75
|
+
'ta-journey': { done: 'done', failed: 'failed', 'needs-human': 'failed', rework: 'failed' },
|
|
76
|
+
'default-loop': { landed: 'done', stopped: 'failed' },
|
|
77
|
+
'document-loop': { landed: 'done', 'document-blocked': 'failed', 'needs-human': 'failed' },
|
|
78
|
+
'operate-loop': { landed: 'done', 'operate-blocked': 'failed', 'needs-human': 'failed' },
|
|
79
|
+
'research-loop': { landed: 'done', 'needs-human': 'failed' },
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
function topLevelTerminalStatus(graphId: string, terminal: string): 'done' | 'failed' | undefined {
|
|
83
|
+
const aliases = Object.hasOwn(LOOP_TERMINAL_STATUS, graphId) ? LOOP_TERMINAL_STATUS[graphId] : undefined;
|
|
84
|
+
if (aliases) return Object.hasOwn(aliases, terminal) ? aliases[terminal] : undefined;
|
|
85
|
+
return terminal === 'done' || terminal === 'failed' ? terminal : undefined;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** HARNESS-FULL-GRAPH-LOOPS — the four goal loops are self-implement harness templates: their recipes are
|
|
89
|
+
* catalog roles (no `recipes.yaml` sidecar) and some edges branch on `changed-files`. `graph run` can only
|
|
90
|
+
* *plan* them: `--dry-run` walks the declared success route; a real run is refused (the harness owns effects). */
|
|
91
|
+
const HARNESS_LOOP_GRAPH_IDS: ReadonlySet<string> = new Set(['default-loop', 'document-loop', 'operate-loop', 'research-loop']);
|
|
92
|
+
|
|
93
|
+
type PlannedStep = { outcome?: string; to: string };
|
|
94
|
+
|
|
95
|
+
/** Shortest declared route (map/to edges only — fallbacks are not a success branch) to a terminal that maps to `done`.
|
|
96
|
+
* Ties keep the first declared outcome, so the plan follows the YAML's own order. A unit call only takes its first
|
|
97
|
+
* declared exit (the same stand-in a plain dry run uses) — its `rework` exit is a shortcut, not the success path. */
|
|
98
|
+
function planHarnessLoopRoute(graph: GraphTemplateSpec, unitSuccessExit: (nodeId: string) => string | undefined): Map<string, PlannedStep> {
|
|
99
|
+
const candidates = new Map<string, PlannedStep[]>();
|
|
100
|
+
for (const node of graph.nodes) {
|
|
101
|
+
const edge = graph.edges.find((e) => e.from === node.nodeId);
|
|
102
|
+
if (!edge) continue;
|
|
103
|
+
const exit = unitSuccessExit(node.nodeId);
|
|
104
|
+
candidates.set(node.nodeId, edge.to !== undefined ? [{ to: edge.to }]
|
|
105
|
+
: Object.entries(edge.map ?? {}).filter(([outcome]) => exit === undefined || outcome === exit).map(([outcome, to]) => ({ outcome, to })));
|
|
106
|
+
}
|
|
107
|
+
const distance = new Map<string, number>();
|
|
108
|
+
for (const terminal of graph.terminalNodes) if (topLevelTerminalStatus(graph.graphId, terminal) === 'done') distance.set(terminal, 0);
|
|
109
|
+
const route = new Map<string, PlannedStep>();
|
|
110
|
+
for (let changed = true; changed;) {
|
|
111
|
+
changed = false;
|
|
112
|
+
for (const [nodeId, steps] of candidates) {
|
|
113
|
+
if (graph.terminalNodes.includes(nodeId)) continue;
|
|
114
|
+
let best: { step: PlannedStep; d: number } | undefined;
|
|
115
|
+
for (const step of steps) {
|
|
116
|
+
const d = distance.get(step.to);
|
|
117
|
+
if (d !== undefined && (!best || d + 1 < best.d)) best = { step, d: d + 1 };
|
|
118
|
+
}
|
|
119
|
+
if (best && (distance.get(nodeId) ?? Infinity) > best.d) {
|
|
120
|
+
distance.set(nodeId, best.d);
|
|
121
|
+
route.set(nodeId, best.step);
|
|
122
|
+
changed = true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return route;
|
|
127
|
+
}
|
|
128
|
+
|
|
70
129
|
export interface GraphRunState {
|
|
71
130
|
graphId: string;
|
|
72
131
|
runId: string;
|
|
@@ -77,6 +136,8 @@ export interface GraphRunState {
|
|
|
77
136
|
activeNode?: { nodeId: string; pid: number; pidStartedAt: string };
|
|
78
137
|
stoppedAt?: string;
|
|
79
138
|
status: 'running' | 'done' | 'failed' | 'budget-exceeded' | 'awaiting-approval';
|
|
139
|
+
/** Original named terminal when status is its canonical done/failed mapping. */
|
|
140
|
+
reason?: string;
|
|
80
141
|
path: string[];
|
|
81
142
|
/** startedAt/endedAt (ISO) and seconds are written when the node runs; ledgers before GRAPH-NODE-TIMES (0.2.19) have none. */
|
|
82
143
|
nodes: Array<{ nodeId: string; ok: boolean; exit: number | null; executed: boolean; output?: unknown; error?: string; decidedBy?: string; decidedAt?: string;
|
|
@@ -101,12 +162,52 @@ export interface GraphRunState {
|
|
|
101
162
|
growthPark?: { from: string; outcome: string; reason: string; decisionId: string; decisionRef: string; growth: GraphGrowth; command?: GrowthCommand; approval?: string };
|
|
102
163
|
resume?: { from: string; at: string; previousStatus: GraphRunState['status']; graph?: 'snapshot' | 'current' };
|
|
103
164
|
/** GATE-HOST-EXECUTOR — every explicit input change a resume made (what was set and what it replaced), oldest first. */
|
|
104
|
-
inputOverrides?: GateExecutorOverride
|
|
165
|
+
inputOverrides?: Array<GateExecutorOverride | GatePodPoolOverride>;
|
|
105
166
|
executed: number;
|
|
106
167
|
dryRun: boolean;
|
|
107
168
|
statePath: string;
|
|
108
169
|
}
|
|
109
170
|
|
|
171
|
+
export interface GraphClassifyInput {
|
|
172
|
+
arguments: string;
|
|
173
|
+
classify: ClassifyNode['classify'];
|
|
174
|
+
/** Production consumer that asked for the verdict, so one ledger shape separates callers. */
|
|
175
|
+
caller?: string;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** Run the workflow classifier as a persisted harness graph node. The workflow verdict is unchanged. */
|
|
179
|
+
export async function runGraphClassifyNode(node: ClassifyNode, ctx: NodeExecContext, callLLM: WorkflowDeps['callLLM'],
|
|
180
|
+
meta: { caller?: string } = {}): Promise<NodeOutput> {
|
|
181
|
+
const dir = mkdtempSync(join(tmpdir(), 'elanous-graph-classify-'));
|
|
182
|
+
try {
|
|
183
|
+
const path = join(dir, 'graph.yaml');
|
|
184
|
+
writeFileSync(join(dir, 'recipes.yaml'), '{}\n');
|
|
185
|
+
writeFileSync(path, stringifyYaml({
|
|
186
|
+
graph_id: 'self-implement-classify', version: 1, entry_node: 'classify', terminal_nodes: ['done', 'failed'],
|
|
187
|
+
nodes: [
|
|
188
|
+
{ node_id: 'classify', kind: 'classify', recipe: 'none', max_visits: 1 },
|
|
189
|
+
{ node_id: 'done', kind: 'gate', recipe: 'none', max_visits: 1 },
|
|
190
|
+
{ node_id: 'failed', kind: 'gate', recipe: 'none', max_visits: 1 },
|
|
191
|
+
],
|
|
192
|
+
edges: [{ from: 'classify', on: 'outcome', map: { ok: 'done', fail: 'failed' } }],
|
|
193
|
+
}));
|
|
194
|
+
const run = await runGraph(path, { input: { arguments: ctx.arguments, classify: node.classify,
|
|
195
|
+
...(meta.caller === undefined ? {} : { caller: meta.caller }) } satisfies GraphClassifyInput,
|
|
196
|
+
quiet: true,
|
|
197
|
+
deps: { callLLM: async (prompt) => callLLM({ prompt, ...(ctx.resolvedModel === undefined ? {} : { model: ctx.resolvedModel }),
|
|
198
|
+
...(ctx.resolvedProvider === undefined ? {} : { provider: ctx.resolvedProvider }),
|
|
199
|
+
...(ctx.signal === undefined ? {} : { signal: ctx.signal }) }) } });
|
|
200
|
+
const recorded = lastJsonObject(run.nodes[0]?.output);
|
|
201
|
+
if (!recorded || typeof recorded.durationMs !== 'number' || typeof recorded.ok !== 'boolean' || !('output' in recorded)) {
|
|
202
|
+
throw new Error(`classify graph did not record a result: ${run.statePath}`);
|
|
203
|
+
}
|
|
204
|
+
return { ok: recorded.ok, output: recorded.output, durationMs: recorded.durationMs,
|
|
205
|
+
...(typeof recorded.error === 'string' ? { error: recorded.error } : {}) };
|
|
206
|
+
} finally {
|
|
207
|
+
rmSync(dir, { recursive: true, force: true });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
110
211
|
export interface GraphRunOptions {
|
|
111
212
|
input?: unknown;
|
|
112
213
|
/** Bytes already checked by the tick gate, used for a current-graph start or legacy resume. */
|
|
@@ -117,12 +218,16 @@ export interface GraphRunOptions {
|
|
|
117
218
|
resumeRunId?: string;
|
|
118
219
|
resumeGraphId?: string;
|
|
119
220
|
fromNodeId?: string;
|
|
221
|
+
/** Embedded runs (a classify verdict inside self-implement) keep the per-node `[graph]` stderr lines off the caller's terminal; debug.log still records every node. */
|
|
222
|
+
quiet?: boolean;
|
|
120
223
|
/** Release-only: accept the recorded failed node without executing it, and expose its regression to known-issues. */
|
|
121
224
|
releaseWaiver?: { nodeId: string; reason: string; requestedRegressions: AcceptedRegression[]; acceptedRegressions: AcceptedRegression[]; unmeasured?: string };
|
|
122
225
|
/** Release-only: add accepted issues independently of a waiver at a restart boundary. */
|
|
123
226
|
releaseAcceptedRegressions?: { requested: AcceptedRegression[]; acceptedRegressions: AcceptedRegression[] };
|
|
124
227
|
/** Release-only (GATE-HOST-EXECUTOR): run the restarted gate on this executor — recorded in `inputOverrides`, never a waiver. */
|
|
125
228
|
releaseGateExecutor?: { executor: string; host?: string };
|
|
229
|
+
/** Release-only (RESUME-GATE-POOL-OVERRIDE): replace the saved gate pool for this resumed gate. */
|
|
230
|
+
releaseGatePodPool?: string;
|
|
126
231
|
useCurrentGraph?: boolean;
|
|
127
232
|
/** Internal unit invocation context, propagated only by runGraph. */
|
|
128
233
|
unitContext?: { parentRunId: string; ancestors: readonly string[]; remainingSteps: number; entryNodeId?: string };
|
|
@@ -132,9 +237,35 @@ export interface GraphRunOptions {
|
|
|
132
237
|
* its own universe and lands in the tree-derived test universe while the run ledger is prod.
|
|
133
238
|
*/
|
|
134
239
|
pinChildUniverse?: boolean;
|
|
240
|
+
/** Release resume: command checkout and cut tip, checked before every Bash dispatch. */
|
|
241
|
+
releaseCommandSource?: { root: string; cutTip: string; git?: (args: string[]) => string };
|
|
135
242
|
deps?: { root?: string; runBash?: BashRun; callLLM?: (prompt: string) => Promise<string>; log?: (event: string, data: Record<string, unknown>) => void; beforeNode?: () => void; processStartMs?: (pid: number) => number | null; growthProposer?: GrowthProposer; growthLLM?: (prompt: string) => Promise<string>; classifyGrowthRecipe?: (node: GraphNodeSpec, resolved: { command?: string; approval?: string }) => GrowthRecipeEffect; growthDecision?: GrowthDecisionDeps & { list?: (filters: { status: 'all' }) => DecisionEntry[] } };
|
|
136
243
|
}
|
|
137
244
|
|
|
245
|
+
/** The command directory must itself be the checkout at the cut tip. */
|
|
246
|
+
export function verifyReleaseCommandRoot(root: string, cutTip: string, git?: (args: string[]) => string): string {
|
|
247
|
+
let commandRoot: string;
|
|
248
|
+
try { commandRoot = realpathSync(root); }
|
|
249
|
+
catch { throw new Error(`release command root missing: ${root} — use --command-root <컷 tip checkout>`); }
|
|
250
|
+
const run = git ?? ((args: string[]): string => {
|
|
251
|
+
// git-spawn-allow: read-only checkout identity before release command dispatch.
|
|
252
|
+
// `git ls-files -v -z` exceeds Node's 1 MiB default in the 25k-path main checkout.
|
|
253
|
+
const result = spawnSync('git', args, { cwd: commandRoot, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
|
|
254
|
+
if (result.status !== 0 || result.error) throw new Error(`release command root is not a git checkout: ${commandRoot} — use --command-root <컷 tip checkout>`);
|
|
255
|
+
return result.stdout.trim();
|
|
256
|
+
});
|
|
257
|
+
const head = run(['rev-parse', 'HEAD']);
|
|
258
|
+
// `status` can hide modified tracked code when assume-unchanged or skip-worktree is set.
|
|
259
|
+
// A release command checkout must not carry either index promise.
|
|
260
|
+
const hiddenTracked = run(['ls-files', '-v', '-z']).split('\0').find((entry) => entry && entry[0] !== 'H');
|
|
261
|
+
if (!/^[0-9a-f]{40}$/i.test(cutTip) || head.toLowerCase() !== cutTip.toLowerCase() ||
|
|
262
|
+
(!git && realpathSync(run(['rev-parse', '--show-toplevel'])) !== commandRoot) ||
|
|
263
|
+
hiddenTracked || run(['-c', 'status.showUntrackedFiles=all', 'status', '--porcelain', '--untracked-files=all'])) {
|
|
264
|
+
throw new Error(`release command root ${commandRoot}@${head.slice(0, 12)} differs from cut tip ${cutTip.slice(0, 12)} — use --command-root <컷 tip checkout>`);
|
|
265
|
+
}
|
|
266
|
+
return commandRoot;
|
|
267
|
+
}
|
|
268
|
+
|
|
138
269
|
function safeSegment(value: string): string {
|
|
139
270
|
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value) || value === '.' || value === '..') {
|
|
140
271
|
throw new Error(`invalid graph run identifier: ${value}`);
|
|
@@ -443,46 +574,22 @@ function nextNode(edges: readonly GraphEdgeSpec[], nodeId: string, exitOutcome:
|
|
|
443
574
|
return edge.map?.[exitOutcome] ?? edge.fallback?.[0]?.node;
|
|
444
575
|
}
|
|
445
576
|
|
|
446
|
-
type ResolvedUnit =
|
|
447
|
-
|
|
448
|
-
export class UnitNotFoundError extends Error {
|
|
449
|
-
constructor(call: string) {
|
|
450
|
-
super(`unit not found: ${call}`);
|
|
451
|
-
this.name = 'UnitNotFoundError';
|
|
452
|
-
}
|
|
453
|
-
}
|
|
577
|
+
type ResolvedUnit = ResolvedGraphUnit;
|
|
578
|
+
export const resolveUnit = resolveGraphUnit;
|
|
454
579
|
|
|
455
|
-
export function
|
|
456
|
-
|
|
457
|
-
const repo = join(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
458
|
-
const directories = [join(dirname(callerPath), 'units'), dirname(callerPath), join(repo, 'graphs', 'units'), join(getElanousConfigDir(), 'graphs', 'units')];
|
|
459
|
-
for (const dir of directories) {
|
|
460
|
-
if (!existsSync(dir)) continue;
|
|
461
|
-
const matches = readdirSync(dir).filter(file => /\.ya?ml$/.test(file) && file !== 'recipes.yaml' && file !== 'recipes.yml').flatMap(file => {
|
|
462
|
-
const path = join(dir, file);
|
|
463
|
-
const source = readFileSync(path, 'utf8');
|
|
464
|
-
const header: unknown = parseYaml(source);
|
|
465
|
-
if (!header || typeof header !== 'object' || Array.isArray(header) || (header as Record<string, unknown>).graph_id !== id) return [];
|
|
466
|
-
const parsed = parseGraphTemplateYaml(source, path);
|
|
467
|
-
if (parsed.errors.length) throw new Error(parsed.errors.map(e => `${e.path}: ${e.message}`).join('\n'));
|
|
468
|
-
const template = parsed.template!;
|
|
469
|
-
return template.unit && (requested === String(template.version) || requested === `^${template.version}`)
|
|
470
|
-
? [{ path, template, hash: createHash('sha256').update(source).digest('hex') }] : [];
|
|
471
|
-
});
|
|
472
|
-
if (matches.length > 1) throw new Error(`ambiguous unit: ${call}`);
|
|
473
|
-
if (matches.length) return matches[0]!;
|
|
474
|
-
}
|
|
475
|
-
throw new UnitNotFoundError(call);
|
|
580
|
+
export function validateUnitCalls(graph: GraphTemplateSpec, path: string, ancestors: readonly string[] = [], onMissing?: (call: string) => void): Map<string, ResolvedUnit> {
|
|
581
|
+
return validateUnitCallsWithResolver(graph, path, ancestors, onMissing, createGraphUnitResolver());
|
|
476
582
|
}
|
|
477
583
|
|
|
478
|
-
|
|
584
|
+
function validateUnitCallsWithResolver(graph: GraphTemplateSpec, path: string, ancestors: readonly string[], onMissing: ((call: string) => void) | undefined,
|
|
585
|
+
resolve: typeof resolveGraphUnit): Map<string, ResolvedUnit> {
|
|
479
586
|
if (ancestors.includes(graph.graphId)) throw new Error(`unit cycle: ${[...ancestors, graph.graphId].join(' -> ')}`);
|
|
480
587
|
if (ancestors.length > 3) throw new Error('unit nesting exceeds depth 3');
|
|
481
588
|
const result = new Map<string, ResolvedUnit>();
|
|
482
589
|
for (const node of graph.nodes) {
|
|
483
590
|
if (node.kind !== 'subgraph' || node.call === undefined) continue;
|
|
484
591
|
let unit: ResolvedUnit;
|
|
485
|
-
try { unit =
|
|
592
|
+
try { unit = resolve(node.call!, path); } catch (error) {
|
|
486
593
|
if (error instanceof UnitNotFoundError && onMissing) { onMissing(node.call!); continue; }
|
|
487
594
|
throw error;
|
|
488
595
|
}
|
|
@@ -501,7 +608,7 @@ export function validateUnitCalls(graph: GraphTemplateSpec, path: string, ancest
|
|
|
501
608
|
debug.log('graph.unit', 'contract-mismatch', { graphId: graph.graphId, nodeId: node.nodeId, call: node.call });
|
|
502
609
|
throw new Error(`unit contract mismatch: ${node.nodeId} -> ${node.call}`);
|
|
503
610
|
}
|
|
504
|
-
|
|
611
|
+
validateUnitCallsWithResolver(unit.template, unit.path, [...ancestors, graph.graphId], onMissing, resolve);
|
|
505
612
|
result.set(node.nodeId, unit);
|
|
506
613
|
}
|
|
507
614
|
return result;
|
|
@@ -515,6 +622,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
515
622
|
if (options.releaseWaiver && (!options.resumeRunId || options.fromNodeId !== options.releaseWaiver.nodeId)) throw new Error('release waiver requires --resume --from <waived node>');
|
|
516
623
|
if (options.releaseAcceptedRegressions && (!options.resumeRunId || !options.fromNodeId || options.releaseWaiver)) throw new Error('accepted regressions require a release resume boundary');
|
|
517
624
|
if (options.releaseGateExecutor && (!options.resumeRunId || !options.fromNodeId)) throw new Error('gate executor override requires a release resume boundary');
|
|
625
|
+
if (options.releaseGatePodPool !== undefined && (!options.resumeRunId || !options.fromNodeId)) throw new Error('gate pod pool override requires a release resume boundary');
|
|
518
626
|
const root = options.deps?.root ?? effectiveInstanceRoot();
|
|
519
627
|
const matchingRuns = options.resumeRunId && !options.resumeGraphId
|
|
520
628
|
? listGraphRuns(root).runs.filter((run) => run.runId === options.resumeRunId && run.graphPath === resolve(path)) : [];
|
|
@@ -547,7 +655,13 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
547
655
|
const variant = options.variant ? createGraphVariant({ template: graph, ...options.variant }) : undefined;
|
|
548
656
|
if (variant && !variant.ok) throw new Error(`graph variant rejected: ${JSON.stringify(variant.rejections)}`);
|
|
549
657
|
if (variant?.ok) graph = variant.template;
|
|
550
|
-
const
|
|
658
|
+
const unitResolver = createGraphUnitResolver();
|
|
659
|
+
const units = validateUnitCallsWithResolver(graph, path, options.unitContext?.ancestors ?? [], undefined, unitResolver);
|
|
660
|
+
if (units.size > 0) {
|
|
661
|
+
const staticView = flattenGraphUnits(graph, path, unitResolver);
|
|
662
|
+
debug.log('graph.unit', 'static-view', { graphId: graph.graphId, hash: graphVersionHash(staticView),
|
|
663
|
+
nodeIds: staticView.nodes.map((node) => node.nodeId), edges: staticView.edges });
|
|
664
|
+
}
|
|
551
665
|
const unitEntryNode = options.unitContext?.entryNodeId ?? saved?.entryNodeId ?? graph.entryNode;
|
|
552
666
|
if (saved?.entryNodeId !== undefined && options.unitContext?.entryNodeId !== undefined && saved.entryNodeId !== options.unitContext.entryNodeId) {
|
|
553
667
|
throw new Error('unit entry changed on resume');
|
|
@@ -579,11 +693,21 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
579
693
|
.flatMap(name => credentialStatus(name, pluginRoot).fields.map(field => field.env));
|
|
580
694
|
const credentialFields = owner ? credentialStatus(owner.name, pluginRoot).fields.filter(field => field.set).map(field => field.name) : [];
|
|
581
695
|
for (const terminal of graph.terminalNodes) {
|
|
582
|
-
|
|
583
|
-
|
|
696
|
+
// Units use their declared exits. The four loop graphs also declare named
|
|
697
|
+
// top-level exits; all other graphs retain the done/failed contract.
|
|
698
|
+
if (!(graph.unit ? graph.unit.exits.includes(terminal) : topLevelTerminalStatus(graph.graphId, terminal) !== undefined)) {
|
|
699
|
+
throw new Error(`unsupported terminal node: ${terminal} (expected ${graph.unit ? graph.unit.exits.join(' or ') : 'done or failed'})`);
|
|
584
700
|
}
|
|
585
701
|
}
|
|
586
|
-
const
|
|
702
|
+
const recipePath = graphMode === 'snapshot' ? join(snapshotDir!, 'recipes.yaml') : join(dirname(path), 'recipes.yaml');
|
|
703
|
+
// A harness loop template without a command sidecar is planned, never executed, by this runner.
|
|
704
|
+
const harnessLoopTemplate = !graph.unit && HARNESS_LOOP_GRAPH_IDS.has(graph.graphId) && graphMode === 'current' && !existsSync(recipePath);
|
|
705
|
+
if (harnessLoopTemplate && (options.dryRun !== true || options.resumeRunId)) {
|
|
706
|
+
debug.log('graph.run', 'harness-loop-refused', { graphId: graph.graphId, path: resolve(path), why: 'real-run' });
|
|
707
|
+
throw new Error(`harness loop template ${graph.graphId} runs through the self-implement harness — graph run only plans it with --dry-run`);
|
|
708
|
+
}
|
|
709
|
+
const harnessLoopRoute = harnessLoopTemplate ? planHarnessLoopRoute(graph, (nodeId) => units.get(nodeId)?.template.unit?.exits[0]) : undefined;
|
|
710
|
+
const recipeSource = harnessLoopTemplate ? '{}\n' : readFileSync(recipePath, 'utf8');
|
|
587
711
|
if (graphMode === 'snapshot' && saved?.graphSnapshot &&
|
|
588
712
|
(createHash('sha256').update(source).digest('hex') !== saved.graphSnapshot.graphSha ||
|
|
589
713
|
createHash('sha256').update(recipeSource).digest('hex') !== saved.graphSnapshot.recipesSha)) {
|
|
@@ -595,10 +719,20 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
595
719
|
const approvalSourceHash = createHash('sha256').update(variantSource).update('\0').update(recipeSource).digest('hex');
|
|
596
720
|
// Resolve all commands before executing any node; an unknown recipe must never produce a partial publication.
|
|
597
721
|
for (const node of graph.nodes) {
|
|
722
|
+
if (node.kind === 'classify' && node.recipe !== 'none') throw new Error(`classify node cannot execute a recipe: ${node.nodeId}`);
|
|
598
723
|
if (node.recipe === 'none') continue;
|
|
599
724
|
const resolved = resolveNodeRecipe(node, recipes, catalogRoles);
|
|
725
|
+
// Harness loop recipes are labels the self-implement harness dispatches by node id (most are outside the
|
|
726
|
+
// node catalog — graph-catalog.test.ts); a planned loop never executes them, and a real run is refused above.
|
|
727
|
+
if (harnessLoopRoute) continue;
|
|
600
728
|
if (!resolved.command && !resolved.prompt && !resolved.approval) throw new Error(`unknown command recipe for ${node.nodeId}: ${node.recipe}`);
|
|
601
729
|
}
|
|
730
|
+
if (harnessLoopRoute) {
|
|
731
|
+
if (!harnessLoopRoute.has(graph.entryNode)) throw new Error(`harness loop ${graph.graphId} has no declared route from ${graph.entryNode} to a success terminal`);
|
|
732
|
+
const planned: string[] = [graph.entryNode];
|
|
733
|
+
for (let at = harnessLoopRoute.get(graph.entryNode); at; at = harnessLoopRoute.get(at.to)) planned.push(at.to);
|
|
734
|
+
debug.log('graph.run', 'harness-loop-plan', { graphId: graph.graphId, path: resolve(path), route: planned });
|
|
735
|
+
}
|
|
602
736
|
const graphId = safeSegment(graph.graphId);
|
|
603
737
|
const isReleaseLoop = graphId === 'release-loop';
|
|
604
738
|
// A copied or saved release graph is still a release graph. Its path cannot grant or revoke
|
|
@@ -636,6 +770,29 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
636
770
|
...(options.input === undefined ? {} : { input: options.input }),
|
|
637
771
|
...(options.unitContext?.entryNodeId === undefined ? {} : { entryNodeId: options.unitContext.entryNodeId }),
|
|
638
772
|
executed: 0, dryRun: options.dryRun === true, statePath };
|
|
773
|
+
const verifyReleaseSource = (): string | undefined => {
|
|
774
|
+
const source = options.releaseCommandSource;
|
|
775
|
+
if (!source) return undefined;
|
|
776
|
+
const savedCutTip = lastJsonObject(state.nodes.find((node) => node.nodeId === 'version-release')?.output)?.commit;
|
|
777
|
+
if (graphId !== 'release-loop' || !options.resumeRunId || typeof savedCutTip !== 'string' || source.cutTip !== savedCutTip) {
|
|
778
|
+
throw new Error('release command source differs from the saved cut tip');
|
|
779
|
+
}
|
|
780
|
+
const commandRoot = verifyReleaseCommandRoot(source.root, savedCutTip, source.git);
|
|
781
|
+
// The ledger snapshot must be the recipe that the cut checkout actually carries.
|
|
782
|
+
// HEAD alone does not bind a saved graph to that checkout.
|
|
783
|
+
if (!state.graphSnapshot) throw new Error('release recipe snapshot missing — cannot pin command source');
|
|
784
|
+
const cutGraph = join(commandRoot, 'graphs', 'release', 'release-loop.yaml');
|
|
785
|
+
const cutRecipes = join(commandRoot, 'graphs', 'release', 'recipes.yaml');
|
|
786
|
+
const hashFile = (file: string): string => {
|
|
787
|
+
try { return createHash('sha256').update(readFileSync(file)).digest('hex'); }
|
|
788
|
+
catch { throw new Error(`release recipe source missing in cut checkout: ${file}`); }
|
|
789
|
+
};
|
|
790
|
+
if (hashFile(cutGraph) !== state.graphSnapshot.graphSha || hashFile(cutRecipes) !== state.graphSnapshot.recipesSha) {
|
|
791
|
+
throw new Error('release recipe source differs from the saved graph snapshot at cut tip');
|
|
792
|
+
}
|
|
793
|
+
return commandRoot;
|
|
794
|
+
};
|
|
795
|
+
verifyReleaseSource();
|
|
639
796
|
if (options.resumeRunId && graphMode === 'snapshot' && state.sourceHash && state.sourceHash !== approvalSourceHash) {
|
|
640
797
|
throw new Error('graph snapshot changed since run started');
|
|
641
798
|
}
|
|
@@ -728,6 +885,13 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
728
885
|
state.inputOverrides = [...(state.inputOverrides ?? []), override];
|
|
729
886
|
debug.log('graph.runs', 'input-override', { graphId, runId, ...override });
|
|
730
887
|
}
|
|
888
|
+
if (options.releaseGatePodPool !== undefined) {
|
|
889
|
+
if (graphId !== 'release-loop') throw new Error('gate pod pool override requires the release-loop graph');
|
|
890
|
+
const override = releaseResumeGatePodPool(state, { from: options.fromNodeId, pool: options.releaseGatePodPool });
|
|
891
|
+
state.input = { ...(state.input as Record<string, unknown>), ...override.set };
|
|
892
|
+
state.inputOverrides = [...(state.inputOverrides ?? []), override];
|
|
893
|
+
debug.log('graph.runs', 'input-override', { graphId, runId, ...override });
|
|
894
|
+
}
|
|
731
895
|
if (state.unitCalls) {
|
|
732
896
|
const calls = state.unitCalls;
|
|
733
897
|
state.unitCalls = calls.filter(call => {
|
|
@@ -890,7 +1054,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
890
1054
|
const startedAt = performance.now();
|
|
891
1055
|
const nodeStartedAt = new Date().toISOString();
|
|
892
1056
|
if (!resumingCompleted) state.currentNode = { nodeId: current, startedAt: nodeStartedAt };
|
|
893
|
-
console.error(`[graph] ${current} start (0.00s)`);
|
|
1057
|
+
if (!options.quiet) console.error(`[graph] ${current} start (0.00s)`);
|
|
894
1058
|
debug.log('graph.run', 'node', { graphId, runId, nodeId: current, phase: 'start', dryRun: state.dryRun });
|
|
895
1059
|
publishInsideEvent({ kind: 'node', graphId, runId, nodeId: current, phase: 'start' });
|
|
896
1060
|
log('node-start', { graphId, runId, nodeId: current, visit: visits.get(current), dryRun: state.dryRun });
|
|
@@ -911,6 +1075,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
911
1075
|
const redactCredentials = (text: string) => Object.values(credentials).filter(value => value.length > 0)
|
|
912
1076
|
.reduce((safe, value) => safe.replaceAll(value, '[REDACTED]'), text);
|
|
913
1077
|
const runBash: BashRun = async (body, opts) => {
|
|
1078
|
+
const commandRoot = verifyReleaseSource();
|
|
914
1079
|
// Hash the actual /bin/bash argv after interpolation. Keep the command text (which may contain
|
|
915
1080
|
// credentials) out of logs, but leave enough to distinguish a replayed publish from npm/docs.
|
|
916
1081
|
const argvSha256 = createHash('sha256').update(JSON.stringify(['/bin/bash', '-c', body])).digest('hex');
|
|
@@ -929,7 +1094,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
929
1094
|
return true;
|
|
930
1095
|
});
|
|
931
1096
|
try {
|
|
932
|
-
const result = await execute(body, opts);
|
|
1097
|
+
const result = await execute(body, commandRoot ? { ...opts, cwd: commandRoot } : opts);
|
|
933
1098
|
code = result.exitCode;
|
|
934
1099
|
return { ...result, stdout: redactCredentials(result.stdout), stderr: redactCredentials(result.stderr) };
|
|
935
1100
|
} finally {
|
|
@@ -968,7 +1133,12 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
968
1133
|
state.executed++;
|
|
969
1134
|
}
|
|
970
1135
|
let unitExecuted = false;
|
|
971
|
-
|
|
1136
|
+
const plannedStep: PlannedStep | undefined = harnessLoopRoute?.get(current);
|
|
1137
|
+
if (harnessLoopRoute && !graph.terminalNodes.includes(current)) {
|
|
1138
|
+
if (!plannedStep) throw new Error(`harness loop ${graphId} has no declared success route from ${current}`);
|
|
1139
|
+
// The planned outcome stands in for the harness node (or unit) that a real loop run would execute.
|
|
1140
|
+
output = JSON.stringify({ outcome: plannedStep.outcome ?? 'ok', dryRun: true, plannedNext: plannedStep.to });
|
|
1141
|
+
} else if (units.has(current) && !waiving && state.dryRun && !resumingCompleted) {
|
|
972
1142
|
// Dry run plans the walk only: no child run, no unit event, no unitCalls entry; the first declared exit stands in.
|
|
973
1143
|
output = JSON.stringify({ outcome: units.get(current)!.template.unit!.exits[0], dryRun: true });
|
|
974
1144
|
} else if (units.has(current) && !waiving && !resumingCompleted) {
|
|
@@ -978,9 +1148,13 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
978
1148
|
for (const record of state.nodes) previous[record.nodeId] = lastJsonObject(record.output) ?? record.output;
|
|
979
1149
|
const supplied = state.input && typeof state.input === 'object' && !Array.isArray(state.input)
|
|
980
1150
|
? state.input as Record<string, unknown> : {};
|
|
1151
|
+
const lastPrior = state.nodes.at(-1);
|
|
1152
|
+
const lastPriorOutput = lastPrior ? previous[lastPrior.nodeId] : undefined;
|
|
1153
|
+
const priorResult = lastPriorOutput && typeof lastPriorOutput === 'object' && !Array.isArray(lastPriorOutput)
|
|
1154
|
+
? (lastPriorOutput as Record<string, unknown>).result : undefined;
|
|
981
1155
|
const inputs: Record<string, unknown> = Object.create(null);
|
|
982
1156
|
for (const key of contract.inputs) {
|
|
983
|
-
const value = Object.hasOwn(supplied, key) ? supplied[key] : previous[key];
|
|
1157
|
+
const value = Object.hasOwn(supplied, key) ? supplied[key] : key === 'prior' ? priorResult : previous[key];
|
|
984
1158
|
if (value !== undefined) inputs[key] = value;
|
|
985
1159
|
}
|
|
986
1160
|
const alreadySpent = state.path.length + (state.unitCalls ?? []).reduce((sum, call) => sum + call.steps, 0);
|
|
@@ -1066,6 +1240,39 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1066
1240
|
}
|
|
1067
1241
|
state.executed++;
|
|
1068
1242
|
}
|
|
1243
|
+
if (node.kind === 'classify' && !waiving && !state.dryRun && !resumingCompleted) {
|
|
1244
|
+
const input = state.input as GraphClassifyInput | undefined;
|
|
1245
|
+
const classify = input?.classify;
|
|
1246
|
+
if (!input || typeof input.arguments !== 'string' || !classify || typeof classify.input !== 'string' ||
|
|
1247
|
+
!Array.isArray(classify.classes) || !classify.classes.length || !classify.classes.every(c => typeof c === 'string' && c.length > 0) ||
|
|
1248
|
+
(classify.retries !== undefined && (!Number.isSafeInteger(classify.retries) || classify.retries < 0)) ||
|
|
1249
|
+
(classify.retryDelayMs !== undefined && (!Number.isSafeInteger(classify.retryDelayMs) || classify.retryDelayMs < 0))) {
|
|
1250
|
+
throw new Error('classify node requires input.arguments and a valid input.classify');
|
|
1251
|
+
}
|
|
1252
|
+
try {
|
|
1253
|
+
const result = await executeClassifyNode({ id: current, classify }, {
|
|
1254
|
+
arguments: input.arguments, artifactsDir: dirname(statePath), outputs: {},
|
|
1255
|
+
resolvedProvider: undefined, resolvedModel: undefined, toolPolicy: {},
|
|
1256
|
+
}, { callLLM: async ({ prompt }) => {
|
|
1257
|
+
if (!options.deps?.callLLM) throw new Error('classify node requires an injected LLM (deps.callLLM)');
|
|
1258
|
+
return options.deps.callLLM(prompt);
|
|
1259
|
+
}, runBash: async () => ({ stdout: '', stderr: '', exitCode: 0 }) });
|
|
1260
|
+
output = JSON.stringify({ input: input.arguments, ok: result.ok, verdict: result.output, output: result.output,
|
|
1261
|
+
durationMs: result.durationMs, ...(result.error ? { error: result.error } : {}) });
|
|
1262
|
+
ok = result.ok;
|
|
1263
|
+
error = result.error;
|
|
1264
|
+
} catch (cause) {
|
|
1265
|
+
ok = false;
|
|
1266
|
+
error = cause instanceof Error ? cause.message : String(cause);
|
|
1267
|
+
output = JSON.stringify({ input: input.arguments, ok, verdict: 'unknown', output: 'unknown', durationMs: 0, error });
|
|
1268
|
+
}
|
|
1269
|
+
const recorded = lastJsonObject(output);
|
|
1270
|
+
debug.log('graph.classify', 'node-result', { graphId, runId, nodeId: current, caller: input.caller ?? null,
|
|
1271
|
+
input: input.arguments, inputChars: input.arguments.length, classes: classify.classes,
|
|
1272
|
+
verdict: recorded?.verdict ?? 'unknown', output: recorded?.output ?? 'unknown', ok,
|
|
1273
|
+
...(error ? { error } : {}) });
|
|
1274
|
+
state.executed++;
|
|
1275
|
+
}
|
|
1069
1276
|
const seconds = Number(((performance.now() - startedAt) / 1000).toFixed(2));
|
|
1070
1277
|
// A wall clock stepped back mid-node must not record an end before the start.
|
|
1071
1278
|
const nodeEndedAt = new Date(Math.max(Date.now(), Date.parse(nodeStartedAt))).toISOString();
|
|
@@ -1083,9 +1290,10 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1083
1290
|
} else {
|
|
1084
1291
|
// 승인 노드도 결과를 «값»으로 남긴다 — 뒤 노드가 문맥(outputs)에서 승인 여부를 확인할 수 있게(발행 노드가 승인 없이 돌지 않도록).
|
|
1085
1292
|
if (approval && !state.dryRun && !command) {
|
|
1086
|
-
output = JSON.stringify({ outcome: ok ? 'approved' : 'rejected',
|
|
1293
|
+
output = JSON.stringify({ outcome: ok ? 'approved' : 'rejected', graphId, runId, nodeId: current,
|
|
1294
|
+
...(state.pending?.decidedBy === undefined ? {} : { decidedBy: state.pending.decidedBy }), decidedAt: state.pending?.decidedAt ?? null });
|
|
1087
1295
|
}
|
|
1088
|
-
state.nodes.push({ nodeId: current, ok, exit, executed: !waiving && ((!!command && (!state.dryRun || !!command.dry_run_command)) || (!!prompt && !state.dryRun) || unitExecuted), ...((waiving || units.has(current) || ((command || prompt || approval) && (!state.dryRun || !!command?.dry_run_command))) && output !== undefined ? { output } : {}), ...(error ? { error } : {}),
|
|
1296
|
+
state.nodes.push({ nodeId: current, ok, exit, executed: !waiving && ((!!command && (!state.dryRun || !!command.dry_run_command)) || (!!prompt && !state.dryRun) || (node.kind === 'classify' && !state.dryRun) || unitExecuted), ...((waiving || harnessLoopRoute || units.has(current) || ((command || prompt || approval || node.kind === 'classify') && (!state.dryRun || !!command?.dry_run_command))) && output !== undefined ? { output } : {}), ...(error ? { error } : {}),
|
|
1089
1297
|
...(waiving ? { waiver: { reason: options.releaseWaiver!.reason, at: nodeEndedAt, ...(options.releaseWaiver!.unmeasured === undefined ? {} : { unmeasured: options.releaseWaiver!.unmeasured }), original: { exit: waivedRecord!.exit, ...(waivedRecord!.output === undefined ? {} : { output: waivedRecord!.output }), ...(waivedRecord!.error === undefined ? {} : { error: waivedRecord!.error }) } } } : {}),
|
|
1090
1298
|
...(approval && state.pending ? { ...(state.pending.decidedBy === undefined ? {} : { decidedBy: state.pending.decidedBy }), decidedAt: state.pending.decidedAt } : {}),
|
|
1091
1299
|
startedAt: nodeStartedAt, endedAt: nodeEndedAt, seconds });
|
|
@@ -1098,9 +1306,9 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1098
1306
|
delete state.pending;
|
|
1099
1307
|
delete state.approvalSourceHash;
|
|
1100
1308
|
}
|
|
1101
|
-
const reported = waiving || units.has(current) || (prompt && !state.dryRun) || (command && (!state.dryRun || command.dry_run_command)) ? lastJsonObject(resumingCompleted ? completed?.output : output)?.outcome : undefined;
|
|
1102
|
-
const namedOutcome = typeof reported === 'string' ? reported : undefined;
|
|
1103
|
-
console.error(`[graph] ${current} ${ok ? 'ok' : 'fail'} (${seconds.toFixed(2)}s)`);
|
|
1309
|
+
const reported: unknown = waiving || harnessLoopRoute || units.has(current) || (prompt && !state.dryRun) || (command && (!state.dryRun || command.dry_run_command)) ? lastJsonObject(resumingCompleted ? completed?.output : output)?.outcome : undefined;
|
|
1310
|
+
const namedOutcome: string | undefined = typeof reported === 'string' ? reported : undefined;
|
|
1311
|
+
if (!options.quiet) console.error(`[graph] ${current} ${ok ? 'ok' : 'fail'} (${seconds.toFixed(2)}s)`);
|
|
1104
1312
|
debug.log('graph.run', 'node', { graphId, runId, nodeId: current, phase: ok ? 'ok' : 'fail', seconds, exit });
|
|
1105
1313
|
publishInsideEvent({ kind: 'node', graphId, runId, nodeId: current, phase: ok ? 'ok' : 'fail', seconds });
|
|
1106
1314
|
publishInsideEvent({ kind: 'verdict', graphId, runId, nodeId: current, verdict: ok ? 'ok' : 'fail', ...(namedOutcome === undefined ? {} : { outcome: namedOutcome }) });
|
|
@@ -1111,7 +1319,10 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1111
1319
|
}
|
|
1112
1320
|
persist();
|
|
1113
1321
|
if (graph.terminalNodes.includes(current)) {
|
|
1114
|
-
state.status =
|
|
1322
|
+
state.status = !ok ? 'failed' : graph.unit ? (current === 'failed' ? 'failed' : 'done')
|
|
1323
|
+
: topLevelTerminalStatus(graph.graphId, current)!;
|
|
1324
|
+
if (!graph.unit && current !== 'done' && current !== 'failed') state.reason = current;
|
|
1325
|
+
else delete state.reason;
|
|
1115
1326
|
persist();
|
|
1116
1327
|
if (state.status === 'failed' && !state.dryRun && graphId === 'release-loop') {
|
|
1117
1328
|
recordReleaseRunFailure(state, root, `Graph ${graphId}/${runId} failed at ${current}`);
|
|
@@ -1155,7 +1366,9 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1155
1366
|
}
|
|
1156
1367
|
persist();
|
|
1157
1368
|
}
|
|
1158
|
-
|
|
1369
|
+
// A planned harness loop follows its route directly: `changed-files` edges have no runner condition.
|
|
1370
|
+
current = plannedStep ? plannedStep.to
|
|
1371
|
+
: nextNode(graph.edges, current, state.dryRun && !command?.dry_run_command ? 'ok' : ok ? 'ok' : 'fail', namedOutcome);
|
|
1159
1372
|
resumedGrowth = false;
|
|
1160
1373
|
if (current !== undefined) publishInsideEvent({ kind: 'edge', graphId, runId, from: fromNodeId, to: current });
|
|
1161
1374
|
if (current === undefined) {
|
package/src/grok/credential.ts
CHANGED
|
@@ -87,6 +87,8 @@ export interface GrokCredential {
|
|
|
87
87
|
baseUrl: string;
|
|
88
88
|
/** Bearer 값. ⛔ 로그·관측에 실지 마라. */
|
|
89
89
|
token: string;
|
|
90
|
+
/** Expiry for the selected subscription scope; absent for API-key credentials. */
|
|
91
|
+
expiresAt?: string | null;
|
|
90
92
|
/** 이 자격에 «반드시» 붙어야 하는 헤더(Authorization 제외). */
|
|
91
93
|
headers: Record<string, string>;
|
|
92
94
|
/** 관측용 — 값이 아니라 «출처»만. */
|
|
@@ -120,8 +122,10 @@ function readSubscriptionToken(
|
|
|
120
122
|
}
|
|
121
123
|
if (!parsed || typeof parsed !== 'object') return null;
|
|
122
124
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
+
type SubscriptionToken = { token: string; expiresAt: string | null; userId: string | null; ms: number };
|
|
126
|
+
let best: SubscriptionToken | null = null;
|
|
127
|
+
let hqMirror: SubscriptionToken | null = null;
|
|
128
|
+
for (const [scopeName, scope] of Object.entries(parsed as Record<string, unknown>)) {
|
|
125
129
|
if (!scope || typeof scope !== 'object') continue;
|
|
126
130
|
const s = scope as GrokAuthScope;
|
|
127
131
|
if (typeof s.key !== 'string' || s.key.length === 0) continue;
|
|
@@ -133,9 +137,11 @@ function readSubscriptionToken(
|
|
|
133
137
|
userId: typeof s.user_id === 'string' ? s.user_id : null,
|
|
134
138
|
ms: Number.isNaN(ms) ? Number.NEGATIVE_INFINITY : ms,
|
|
135
139
|
};
|
|
140
|
+
if (scopeName === 'https://auth.x.ai::hq-mirror') hqMirror = cand;
|
|
136
141
|
if (best === null || cand.ms > best.ms) best = cand;
|
|
137
142
|
}
|
|
138
|
-
|
|
143
|
+
const selected = hqMirror ?? best;
|
|
144
|
+
return selected ? { token: selected.token, expiresAt: selected.expiresAt, userId: selected.userId } : null;
|
|
139
145
|
}
|
|
140
146
|
|
|
141
147
|
/** 호스트 발급 문이 응답에 실을 access. user id 는 반환하지 않는다. */
|
|
@@ -147,6 +153,11 @@ export function readGrokSubscriptionAccess(
|
|
|
147
153
|
return { key: sub.token, expiresAt: sub.expiresAt };
|
|
148
154
|
}
|
|
149
155
|
|
|
156
|
+
/** Read only the selected subscription expiry for status/alert surfaces; never return token or account id. */
|
|
157
|
+
export function readGrokSubscriptionExpiry(home?: string): string | null {
|
|
158
|
+
return readSubscriptionToken(grokAuthFilePath(home))?.expiresAt ?? null;
|
|
159
|
+
}
|
|
160
|
+
|
|
150
161
|
/** 프록시 필수 헤더. ⛔ `x-grok-client-version` 을 빼면 426 이다(실측). */
|
|
151
162
|
export function grokSubscriptionHeaders(opts: {
|
|
152
163
|
model?: string;
|
|
@@ -297,6 +308,7 @@ function readGrokCredential(opts: {
|
|
|
297
308
|
kind: 'subscription',
|
|
298
309
|
baseUrl: GROK_SUBSCRIPTION_BASE_URL,
|
|
299
310
|
token: sub.token,
|
|
311
|
+
expiresAt: sub.expiresAt,
|
|
300
312
|
headers: grokSubscriptionHeaders({
|
|
301
313
|
...(opts.model ? { model: opts.model } : {}),
|
|
302
314
|
userId: sub.userId,
|