elanous 0.2.31 → 0.2.34
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/{LSXfY0u9QtfDbejY0Ukf_ → L04y73dlwKeTW-GetaTF3}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +79 -0
- package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{4174.92ed04922709ac9e.js → 1644.35dd25240ae24e4b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2940-619bfd8ef337c611.js → 1895-60ed0e341c658bd4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5525.86debf231e181813.js → 2124.ed5bf480cea7f85b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +23 -0
- package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +115 -0
- package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +8 -0
- package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6092.a7f99e68b188ca66.js → 2547.dd27303624cb4da8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2213.2ccbada92c33ea0f.js → 2554.3b5e200f5f5cfcd6.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +1 -0
- package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5173-233188df2f42c626.js → 2987-30cf9c2eb7b8bdd5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3541-ce3a5424ed5ad7f1.js → 3001-5a52788c813b6113.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3103.84470c8445962f04.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{6433.fc573af22bbc9ab7.js → 3110.0a7065f25c841818.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3121.779fafe3e44612c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3411-f87314c6c66ebc73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6157.0c9af021de4fb31b.js → 3414.172ad4ca2d9b08e8.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4745.67d6f99c245af3f7.js → 3498.cf2a15a8a9e5b926.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3819.163d4777f0a597f6.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{5543.a438b8ab5a13ea47.js → 3837.722e053fb9f321ad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +104 -0
- package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +149 -0
- package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +148 -0
- package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +64 -0
- package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +74 -0
- package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b313b242.cb1265eea908db61.js → 4fa33ebd.21c1bd5b294496e6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{997ce8a5-2ad501927003b41b.js → 5014f970-22bef0b5210f7d60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2112-e4efc21a6505d5bc.js → 5028-f0722e6114c313e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2898.fd781bc7cf01a7b7.js → 5249.96a848656b582a93.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{9407.e49124dedf0f5e72.js → 5446.edf141cff9ef647d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9002.e5658224e3dc1b6f.js → 5489.ec2dd1b5272a19dc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1335-6731f392c35216eb.js → 5576-82d3703636d5c4b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2985.39ccdecd36848b12.js → 6086.913a69e6fa3e4a8b.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +1 -0
- package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{7862.30a8d6482bb238eb.js → 6740.43de73fc427c9fe2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{2871.0bca6137343b3f76.js → 7005.1623d2aea78eb85f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +287 -0
- package/apps/pwa/out/_next/static/chunks/{7502.ccd5b8065545edd0.js → 7431.3051e9b8a4372d2d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3583.a05e88cc8d594628.js → 7448.478958ffbbba0ac0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7562.948255cbc3e79d33.js +41 -0
- package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +27 -0
- package/apps/pwa/out/_next/static/chunks/{9989.3694300e5f000b14.js → 7952.b192c31b6a0e00cc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +36 -0
- package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +1 -0
- package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5307.60f2209e809bd627.js → 8368.014caa8de2f5af34.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9221.7d22eaf353a2d4e7.js → 8548.036c344973968847.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8817.61bb7ffbba502ecb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9398-6aed28f0a96d0d6f.js → 9131-fce7256c4180c4a5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{3278.2e5d15b53a4091c8.js → 9550.d5f76828f972058c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{2534.e85ae21ad0dac829.js → 9739.8d5f36ac67a3b236.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7a1887c4.f36b88fba31da8fd.js → 9a8cb466.cc9fc9e6e46038aa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{0bb0ff36.b8d418980951e5ba.js → 9b48c871.204d5d13e7809bd0.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{409f1e57.d0649fc47691ebfe.js → abb4b98b.163e0f56e84ae35d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-4fb31eb476dcbad3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-0a07363b130182a1.js → page-398c0faa173203f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-df3445b207ceceab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +122 -0
- package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{ebc7d829.264a0bcb6c750b50.js → ffdc3a04.b9c23c1b28dd4a96.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +1 -0
- package/apps/pwa/out/_next/static/css/b5d88eba78a3d7bf.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +26 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/bin/elanous.mjs +9 -2
- package/docs/goal-context/README.md +1 -0
- package/graphs/default-loop.yaml +20 -3
- package/graphs/document-loop.yaml +21 -2
- package/graphs/implement-loop.yaml +11 -0
- package/graphs/journey/SCENARIOS.md +33 -0
- package/graphs/journey/recipes.yaml +1 -0
- package/graphs/journey/ta-journey.yaml +84 -0
- package/graphs/journey/units/author/author.yaml +20 -0
- package/graphs/journey/units/author/recipes.yaml +2 -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 +21 -2
- 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 +23 -2
- 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 +95 -17
- 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 +25 -0
- package/scripts/measure-si-task-cpu.ts +143 -0
- package/scripts/public-export.ts +43 -1
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +0 -2
- package/scripts/ratchets/train-side-invariants.sh +45 -0
- package/scripts/release-loop/auto-approve-node.ts +30 -16
- 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 +498 -31
- package/scripts/release-loop/gate-partial.ts +3 -3
- 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/preflight.ts +93 -7
- package/scripts/release-loop/prepare-node.ts +102 -4
- package/scripts/release-loop/publish-node.ts +60 -9
- package/scripts/release-loop/resume-cap.ts +56 -0
- package/scripts/release-loop/resume-release.ts +114 -15
- 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 +8 -2
- package/src/acp/core-turn-bridge.ts +36 -9
- package/src/acp/elanous-extensions.ts +3 -0
- package/src/acp/reasoning-thought-buffer.ts +45 -0
- package/src/acp/server.ts +3 -0
- package/src/acp/tool-trace.ts +186 -11
- package/src/agent/self-ambient-cache.ts +156 -0
- package/src/agent/self-ambient.ts +8 -1
- package/src/agent/task-notification.ts +5 -0
- package/src/agent-substrate/acp-reviewer.ts +52 -12
- package/src/agent-substrate/pr-reviewer.ts +3 -1
- package/src/agent-substrate/review-finding-key.ts +53 -0
- package/src/agent-substrate/self-review-cli.ts +126 -5
- package/src/ask-user-question/pending-questions.ts +1 -1
- package/src/ask-user-question/tool.ts +22 -0
- package/src/autopilot/build/llm-conflict-merge.ts +56 -10
- package/src/autopilot/pr-manager.ts +213 -46
- package/src/capture/frame-state-detect.ts +39 -0
- package/src/capture/tui-self-report.ts +134 -6
- package/src/chat/index.ts +61 -15
- package/src/chat/pickers/modal-runtime.ts +6 -0
- package/src/chat/pickers/modals.ts +8 -2
- package/src/chat/tool-render/dispatch.ts +62 -10
- package/src/cli/ask-bare.ts +1 -0
- package/src/cli/control-cli.ts +24 -7
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/import-cli.ts +12 -0
- package/src/cli/light-entry-route.ts +35 -0
- package/src/cli/llm-detect-cli.ts +23 -1
- package/src/cli/log-event-names.ts +10 -0
- package/src/cli/msg-cli.ts +1 -0
- package/src/cli/pod-cli.ts +14 -3
- package/src/cli/pr-cli.ts +140 -41
- package/src/cli/pr-land-base-read.ts +36 -0
- package/src/cli/pr-land-heavy-remote.ts +81 -25
- package/src/cli/pr-land-overlap-evidence.ts +200 -18
- package/src/cli/pr-land-pod-shadow-job.ts +26 -3
- package/src/cli/pr-land-recovery.ts +64 -0
- package/src/cli/pr-land-refusal.ts +20 -5
- package/src/cli/pty-takeover-cli.ts +94 -19
- package/src/cli/release-cli.ts +120 -33
- package/src/cli/release-run-if-ready.ts +29 -28
- package/src/cli/release-single-flight.ts +178 -0
- package/src/cli/seat-cli.ts +37 -0
- package/src/cli/setup-cli.ts +40 -1
- package/src/cli/sim-cli.ts +18 -0
- package/src/cli/tasks-cli.ts +149 -5
- package/src/context-bus/ops-events.ts +6 -2
- 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/run-core-turn.ts +1 -0
- package/src/core-turn/run-goal-loop.ts +21 -0
- package/src/core-turn/short-question.ts +5 -1
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/acp-active-model.ts +42 -1
- package/src/dashboard/background-jobs-status.ts +66 -0
- package/src/dashboard/index.ts +153 -111
- package/src/dashboard/input/agent-wake.ts +242 -0
- package/src/dashboard/input/chat-main-entry-runtime.ts +5 -0
- 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/external-input-host.ts +23 -9
- package/src/dashboard/input/mouse-wiring.ts +108 -11
- package/src/dashboard/input/seat-autowake.ts +56 -3
- package/src/dashboard/log-click-runtime.ts +118 -2
- 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 +163 -41
- package/src/dashboard/turn-session-layers.ts +4 -2
- package/src/dashboard/turn-start-segments.ts +222 -0
- 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/display/prompt-row-owner.ts +146 -0
- package/src/display/resize-listener.ts +33 -2
- package/src/domains/guardian-tick.ts +54 -2
- package/src/domains/outbound-alert.ts +3 -2
- package/src/extractors.ts +3 -1
- package/src/fold-stack.ts +4 -2
- package/src/git-fs/index.ts +263 -36
- package/src/git-fs/retry.ts +4 -0
- package/src/git-fs/runner.ts +2 -0
- package/src/graph-runner/runner.ts +114 -44
- package/src/grok/credential.ts +5 -0
- package/src/harness/gate-reserve.ts +87 -0
- package/src/harness/harness-cli-command.ts +39 -10
- package/src/harness/harness-incidents.ts +17 -0
- package/src/harness/harness-pod-dispatch.ts +38 -1
- package/src/harness/harness-queue.ts +15 -0
- package/src/harness/harness-salvage-cli.ts +14 -2
- package/src/index.ts +198 -12
- package/src/input/external-input-queue.ts +34 -9
- package/src/intake-plane/already-built-hint.ts +89 -0
- package/src/knowhow/pack.ts +199 -0
- package/src/light-cli.ts +95 -0
- package/src/llm/route-decision.ts +36 -0
- package/src/llm/tool-loop-steered-rejection.ts +8 -0
- package/src/llm-request-shape.ts +209 -0
- package/src/llm.ts +221 -276
- package/src/loops/budget.ts +95 -0
- package/src/loops/msg-wake.ts +8 -2
- package/src/loops/orchestrator/tick.ts +24 -2
- package/src/loops/orchestrator/traffic.ts +132 -1
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/mss/logging/log-store.ts +4 -5
- package/src/mss/logging/render-categories.ts +5 -0
- package/src/nexus/api/graphs-api.ts +22 -3
- package/src/nexus/api/http-server.ts +1 -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/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 +36 -1
- package/src/ops/overview.ts +70 -2
- package/src/pr-tool/census.ts +41 -8
- package/src/pr-tool/inflight-registry.ts +296 -0
- 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 +12 -3
- package/src/pty-shell/pty-write-outcome.ts +24 -6
- package/src/pty-shell/tui-run-state.ts +151 -6
- package/src/release-loop/checklist.ts +79 -5
- package/src/release-loop/feature-store.ts +19 -2
- 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/seat-loop/traffic-signal.ts +2 -1
- package/src/self-dev/ask-launch-flow.ts +13 -0
- package/src/self-dev/draft-residue.ts +243 -24
- package/src/self-dev/draft-sweep.ts +52 -3
- package/src/self-dev/graph-journey-nodes.ts +10 -6
- package/src/self-dev/graph-journey-route.ts +60 -6
- package/src/self-dev/orchestrate.ts +79 -3
- package/src/self-dev/run-supervisor.ts +107 -12
- package/src/self-dev/run-types.ts +5 -1
- package/src/self-dev/shard-plan.ts +11 -3
- package/src/self-dev/shard-run.ts +103 -10
- package/src/self-implement/elanous-tui-spawn.ts +14 -0
- package/src/self-implement/follow-up-placement.ts +79 -0
- package/src/self-implement/gate-artifacts.ts +15 -4
- package/src/self-implement/gate-baseline.ts +145 -10
- package/src/self-implement/gate-cli.ts +7 -2
- package/src/self-implement/gate-remote.ts +35 -6
- 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 +4 -120
- package/src/self-implement/graph-overlay-yaml.ts +17 -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/host-regate.ts +36 -4
- package/src/self-implement/knowhow-pack.ts +103 -0
- package/src/self-implement/orchestrator.ts +109 -11
- 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/run-ledger.ts +16 -14
- package/src/self-implement/run-stop.ts +8 -2
- package/src/self-implement/seams.ts +32 -1
- package/src/self-implement/stop-autoheal.ts +25 -1
- package/src/session/chat.ts +27 -0
- package/src/session-runtime/index.ts +22 -267
- package/src/session-runtime/retry-policy.ts +2 -1
- package/src/shell-runner/background-surface.ts +15 -5
- package/src/skills/tools/agent.ts +39 -6
- package/src/skills/tools/list-dir.ts +11 -0
- package/src/skills/tools/schedule-wakeup.ts +457 -0
- package/src/skills/tools/shell.ts +245 -3
- package/src/status/bar.ts +26 -0
- package/src/steward/digest-delivery.ts +118 -0
- package/src/steward/hold-hygiene.ts +120 -0
- package/src/steward/release-day.ts +7 -3
- package/src/steward/triage.ts +47 -4
- package/src/surface/shell-runner-boot.ts +5 -2
- package/src/task-agent/harvest-unit.ts +141 -0
- package/src/task-agent/live-moves.ts +98 -12
- package/src/task-agent/parent-host.ts +93 -3
- 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 +12 -2
- package/src/task-agent/task-hand.ts +76 -5
- package/src/task-agent/work-order-build.ts +22 -0
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +39 -3
- package/src/task-orchestrator/surfaces/pod-command-job.ts +67 -12
- package/src/task-orchestrator/surfaces/pod-lease.ts +98 -0
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +86 -8
- package/src/task-orchestrator/surfaces/pod-pool.ts +76 -18
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +10 -6
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +54 -4
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +548 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +389 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +158 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +230 -43
- package/src/task-orchestrator/surfaces/self-implement.ts +83 -2
- package/src/tool-runtime/truncation-store.ts +4 -0
- package/src/tui/chat/execution-badge.ts +5 -1
- package/src/tui/input-lag-probe.ts +230 -0
- package/src/tui-client/dashboard-session.ts +10 -1
- package/src/tui.ts +4 -0
- package/src/user-config/coercion.ts +36 -0
- package/src/user-config.ts +18 -41
- package/src/ux-sim/scenario.ts +314 -0
- 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-50625904996a8fa8.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/2001.6c7e0fd02190886c.js +0 -1
- 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/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/3040.92ff9ffc9f971cb9.js +0 -115
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3267c0e6.d34854e7b3984a6e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +0 -34
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.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/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/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/60fb96c9.360b01d8d4927b7b.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/6544cb48.a87fe20ddf137be2.js +0 -1
- 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/7371.80c05c653b08e907.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.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/7947-d0759430f8042240.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.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/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/9610.c07cce4bfcc14ed7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.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-bf3634a117322df7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-2ebb8fd59b9461f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.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-805ac2e137b7a121.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.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-521ee23ac8c0abfa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-149dc1caba411bb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.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/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/apps/pwa/out/_next/static/css/3f5fc6f96e2cf7b2.css +0 -1
- package/src/cli/g6a-registration-probe.ts +0 -16
- /package/apps/pwa/out/_next/static/{LSXfY0u9QtfDbejY0Ukf_ → L04y73dlwKeTW-GetaTF3}/_ssgManifest.js +0 -0
|
@@ -203,8 +203,8 @@ function deliverToOrigin(origin: MissionOrigin, text: string, onBot?: (bot: stri
|
|
|
203
203
|
if (origin.channel !== 'telegram' || origin.chatId == null) return false;
|
|
204
204
|
const token = resolveBotToken(origin.botId);
|
|
205
205
|
if (!token) return false;
|
|
206
|
-
onBot?.(botLabel(token));
|
|
207
206
|
assertTestSendFaked('send a real Telegram message to the origin');
|
|
207
|
+
onBot?.(botLabel(token));
|
|
208
208
|
try { return sendTelegramRaw(token, origin.chatId, text, origin.threadId); } catch { return false; }
|
|
209
209
|
}
|
|
210
210
|
|
|
@@ -742,7 +742,7 @@ export function sendTelegramDirect(
|
|
|
742
742
|
} catch { /* unavailable main bot */ }
|
|
743
743
|
const rcToken = cfg?.telegram.reportChannel?.botToken;
|
|
744
744
|
logKindRouteFallback(kind, home ? 'main-home' : 'none', !!mainToken && !!cfg?.telegram.reportChannel && (!rcToken || rcToken === mainToken));
|
|
745
|
-
if (home) { onBot?.(botLabel(home.botToken)); return sendRaw(home.botToken, String(home.chatId), text); }
|
|
745
|
+
if (home) { assertTestSendFaked('send a real Telegram message', !deps.sendRaw); onBot?.(botLabel(home.botToken)); return sendRaw(home.botToken, String(home.chatId), text); }
|
|
746
746
|
console.error('[outbound] 운영 kind 메인 봇/홈 미설정 — 콘솔 출력\n' + text);
|
|
747
747
|
return false;
|
|
748
748
|
}
|
|
@@ -755,6 +755,7 @@ export function sendTelegramDirect(
|
|
|
755
755
|
}
|
|
756
756
|
logKindRouteFallback(kind, tok && chat ? 'conatus-env' : 'none', false);
|
|
757
757
|
if (!tok || !chat) { console.error('[outbound] 토큰/chat 미설정 — 콘솔 출력\n' + text); return false; }
|
|
758
|
+
assertTestSendFaked('send a real Telegram message', !deps.sendRaw);
|
|
758
759
|
onBot?.(botLabel(tok));
|
|
759
760
|
return sendRaw(tok, chat, text);
|
|
760
761
|
}
|
package/src/extractors.ts
CHANGED
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
// not the v1 default-function export. Verified at Phase 0 smoke test.
|
|
9
9
|
|
|
10
10
|
import { readFile } from 'fs/promises';
|
|
11
|
-
import { PDFParse } from 'pdf-parse';
|
|
12
11
|
import mammoth from 'mammoth';
|
|
13
12
|
import * as XLSX from 'xlsx';
|
|
14
13
|
|
|
@@ -69,6 +68,9 @@ export async function readText(path: string): Promise<ExtractResult> {
|
|
|
69
68
|
|
|
70
69
|
export async function extractPdf(path: string): Promise<ExtractResult> {
|
|
71
70
|
const buf = await readFile(path);
|
|
71
|
+
// pdf-parse loads pdfjs-dist and @napi-rs/canvas (system fonts) at import time.
|
|
72
|
+
// A plain text/CLI help request must not pay for the PDF renderer.
|
|
73
|
+
const { PDFParse } = await import('pdf-parse');
|
|
72
74
|
const parser = new PDFParse({ data: new Uint8Array(buf) });
|
|
73
75
|
try {
|
|
74
76
|
const result = await parser.getText();
|
package/src/fold-stack.ts
CHANGED
|
@@ -216,8 +216,9 @@ export class FoldStack {
|
|
|
216
216
|
/** Toggle the latest-pushed static target whose range contains
|
|
217
217
|
* `lineIndex`. Returns true when a target was toggled, false
|
|
218
218
|
* when none contained the line (live targets are never chosen).
|
|
219
|
-
* Reuses the single-target splice/cascade path.
|
|
220
|
-
|
|
219
|
+
* Reuses the single-target splice/cascade path. `logContext` (the
|
|
220
|
+
* click's screen frame) is merged into the expanded/recollapsed line. */
|
|
221
|
+
toggleAtLine(lineIndex: number, logContext: Record<string, unknown> = {}): boolean {
|
|
221
222
|
const t = this.findLatestStaticContaining(lineIndex);
|
|
222
223
|
if (!t) {
|
|
223
224
|
this.logToggleAtLineMiss(lineIndex);
|
|
@@ -236,6 +237,7 @@ export class FoldStack {
|
|
|
236
237
|
lineIndex,
|
|
237
238
|
lineStart,
|
|
238
239
|
lineEnd,
|
|
240
|
+
...logContext,
|
|
239
241
|
});
|
|
240
242
|
}
|
|
241
243
|
return toggled;
|
package/src/git-fs/index.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// on its own cadence (dashboard throttles to ~2s).
|
|
10
10
|
|
|
11
11
|
import { resolve } from 'node:path';
|
|
12
|
-
import { spawnSync } from 'node:child_process';
|
|
12
|
+
import { execFile, spawnSync } from 'node:child_process';
|
|
13
13
|
import { findGitDir, type LocatedGit } from './locate.js';
|
|
14
14
|
import { readGitHead } from './read-head.js';
|
|
15
15
|
import { GitFileWatcher } from './watcher.js';
|
|
@@ -31,13 +31,62 @@ export { probeDirty, probeAheadBehind, parsePorcelain } from './dirty.js';
|
|
|
31
31
|
const SNAPSHOT_TIMEOUT_MS = 5_000;
|
|
32
32
|
const SNAPSHOT_STATUS_MAX_CHARS = 2_000;
|
|
33
33
|
const GIT_SNAPSHOT_TTL_MS = 3_000;
|
|
34
|
+
/** A cached snapshot older than this is rebuilt in the background on the next periodic dirty tick. */
|
|
35
|
+
const GIT_SNAPSHOT_KEEP_WARM_MS = 30_000;
|
|
34
36
|
|
|
35
37
|
interface GitSnapshotCacheEntry {
|
|
36
38
|
at: number;
|
|
39
|
+
/** Monotonic store ordering — `at` can flip within the same millisecond. */
|
|
40
|
+
version: number;
|
|
37
41
|
value: string | null;
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
const gitSnapshotCache = new Map<string, GitSnapshotCacheEntry>();
|
|
45
|
+
/** The entry an invalidation (known write · HEAD move) just evicted. Only the
|
|
46
|
+
* stale-while-revalidate turn path reads it, and only while it is younger than
|
|
47
|
+
* its window: the turn is served the last snapshot (its header states when it
|
|
48
|
+
* was taken) while the background rebuild runs, instead of rebuilding
|
|
49
|
+
* synchronously on the event loop. Any later store supersedes it. */
|
|
50
|
+
const gitSnapshotLastKnown = new Map<string, GitSnapshotCacheEntry>();
|
|
51
|
+
|
|
52
|
+
function storeGitSnapshot(key: string, entry: Omit<GitSnapshotCacheEntry, 'version'>): void {
|
|
53
|
+
gitSnapshotCache.set(key, { ...entry, version: bumpGitSnapshotVersion(key) });
|
|
54
|
+
gitSnapshotLastKnown.delete(key);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function evictGitSnapshot(key: string): boolean {
|
|
58
|
+
const entry = gitSnapshotCache.get(key);
|
|
59
|
+
if (!entry) return false;
|
|
60
|
+
gitSnapshotCache.delete(key);
|
|
61
|
+
gitSnapshotLastKnown.set(key, entry);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
/** One background snapshot rebuild per cwd and invalidation generation. */
|
|
65
|
+
const gitSnapshotInFlight = new Map<string, { generation: string; promise: Promise<string | null> }>();
|
|
66
|
+
|
|
67
|
+
/** Per-key monotonic store version: async rebuilds never overwrite a newer
|
|
68
|
+
* sync value, not even when both land in the same millisecond (`at`
|
|
69
|
+
* comparisons can flip). Generation guards invalidation races instead. */
|
|
70
|
+
const gitSnapshotVersion = new Map<string, number>();
|
|
71
|
+
|
|
72
|
+
function gitSnapshotVersionOf(key: string): number {
|
|
73
|
+
return gitSnapshotVersion.get(key) ?? 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function bumpGitSnapshotVersion(key: string): number {
|
|
77
|
+
const version = gitSnapshotVersionOf(key) + 1;
|
|
78
|
+
gitSnapshotVersion.set(key, version);
|
|
79
|
+
return version;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Test-only hold seam (production null): parks an async rebuild after its
|
|
83
|
+
* reads and before its store, so «a write during a rebuild wins» is provable
|
|
84
|
+
* deterministically instead of by racing timers. */
|
|
85
|
+
let gitSnapshotRebuildHold: (() => void | Promise<void>) | null = null;
|
|
86
|
+
|
|
87
|
+
export function __setGitSnapshotRebuildHoldForTest(hold: (() => void | Promise<void>) | null): void {
|
|
88
|
+
gitSnapshotRebuildHold = hold;
|
|
89
|
+
}
|
|
41
90
|
|
|
42
91
|
interface CacheEntry {
|
|
43
92
|
located: LocatedGit;
|
|
@@ -97,8 +146,15 @@ function ensureEntry(cwd: string): CacheEntry | null {
|
|
|
97
146
|
// Re-read HEAD + retarget watcher whenever a watched file changes.
|
|
98
147
|
// One handler covers all listeners so we don't race each subscriber.
|
|
99
148
|
watcher.subscribe(() => {
|
|
149
|
+
const before = entry.head;
|
|
100
150
|
entry.head = readGitHead(entry.located);
|
|
101
151
|
entry.watcher.retargetForHead(entry.head);
|
|
152
|
+
// A branch/ref move makes every cached snapshot's branch + log lines wrong. Only a real
|
|
153
|
+
// move: macOS fs.watch also replays the ref write that happened just before the watch was
|
|
154
|
+
// installed (measured: refs/heads/main «change» right after the first build), and that
|
|
155
|
+
// spurious event must not evict a fresh snapshot.
|
|
156
|
+
if (headMoved(before, entry.head)) invalidateAllGitSnapshots();
|
|
157
|
+
else debug.log('git-fs.snapshot', 'watch-event-head-unchanged', { root: entry.located.root });
|
|
102
158
|
for (const fn of entry.listeners) {
|
|
103
159
|
try { fn(); } catch { /* noop */ }
|
|
104
160
|
}
|
|
@@ -179,8 +235,8 @@ function viewOf(entry: CacheEntry): GitStatusView {
|
|
|
179
235
|
/** Non-blocking twin of `refreshDirty` for the TUI: the probes run as
|
|
180
236
|
* async subprocesses so a slow `git status` (large worktree, loaded
|
|
181
237
|
* host) never stalls key input. Same throttle; concurrent calls share
|
|
182
|
-
* one probe
|
|
183
|
-
*
|
|
238
|
+
* one probe. `force` also marks cached LLM snapshots stale and rebuilds
|
|
239
|
+
* them in the background — a known write happened. */
|
|
184
240
|
export function refreshDirtyAsync(
|
|
185
241
|
cwd: string,
|
|
186
242
|
opts: { minIntervalMs?: number; force?: boolean } = {},
|
|
@@ -188,26 +244,40 @@ export function refreshDirtyAsync(
|
|
|
188
244
|
let entry: CacheEntry | null;
|
|
189
245
|
try { entry = ensureEntry(cwd); } catch (error) { return Promise.reject(error); }
|
|
190
246
|
if (!entry) return Promise.resolve({ head: null, dirty: null, aheadBehind: null, lastDirtyProbeAt: 0 });
|
|
191
|
-
// An in-flight probe (possibly a forced, post-write one) is newer than the last stored view
|
|
247
|
+
// An in-flight probe (possibly a forced, post-write one) is newer than the last stored view —
|
|
248
|
+
// a throttled call joins it instead of returning the pre-write view (#27493 contract).
|
|
192
249
|
const running = dirtyInFlight.get(entry);
|
|
193
250
|
if (running && !opts.force) return running;
|
|
194
251
|
const min = opts.minIntervalMs ?? 2_000;
|
|
195
252
|
if (!opts.force && entry.lastDirtyProbeAt > 0 && Date.now() - entry.lastDirtyProbeAt < min) {
|
|
196
253
|
return Promise.resolve(viewOf(entry));
|
|
197
254
|
}
|
|
198
|
-
const
|
|
199
|
-
|
|
255
|
+
const probe = probeDirtyAsyncFor(entry, { fresh: !!opts.force });
|
|
256
|
+
// After the post-write probe is queued, so the snapshot rebuild joins it instead of an older one.
|
|
257
|
+
if (opts.force) invalidateGitSnapshots(cwd);
|
|
258
|
+
// Keep-warm: the dashboard's periodic (non-forced) dirty tick also re-warms a snapshot that is in
|
|
259
|
+
// use, so a turn typed after an idle stretch is served within the stale window instead of falling
|
|
260
|
+
// back to the synchronous build. Only snapshots already cached are kept warm.
|
|
261
|
+
else if (gitSnapshotCache.has(resolve(cwd)) || gitSnapshotLastKnown.has(resolve(cwd))) void refreshGitSnapshotAsync(cwd, { ifOlderThanMs: GIT_SNAPSHOT_KEEP_WARM_MS });
|
|
262
|
+
return probe;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/** Share the in-flight probe, unless the caller needs one that started after
|
|
266
|
+
* now (`fresh`: a known write just happened) — then queue a new probe behind it. */
|
|
267
|
+
function probeDirtyAsyncFor(entry: CacheEntry, opts: { fresh: boolean }): Promise<GitStatusView> {
|
|
268
|
+
const running = dirtyInFlight.get(entry);
|
|
269
|
+
if (running && !opts.fresh) return running;
|
|
270
|
+
const root = entry.located.root;
|
|
200
271
|
const start = (): Promise<GitStatusView> => Promise.all([probeDirtyAsync(root), probeAheadBehindAsync(root)])
|
|
201
272
|
.then(([dirty, aheadBehind]) => {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
return viewOf(
|
|
273
|
+
entry.dirty = dirty;
|
|
274
|
+
entry.aheadBehind = aheadBehind;
|
|
275
|
+
entry.lastDirtyProbeAt = Date.now();
|
|
276
|
+
return viewOf(entry);
|
|
206
277
|
});
|
|
207
|
-
// A forced probe queues behind the running one so it reads the post-write tree.
|
|
208
278
|
const probe = (running ? running.then(start, start) : start())
|
|
209
|
-
.finally(() => { if (dirtyInFlight.get(
|
|
210
|
-
dirtyInFlight.set(
|
|
279
|
+
.finally(() => { if (dirtyInFlight.get(entry) === probe) dirtyInFlight.delete(entry); });
|
|
280
|
+
dirtyInFlight.set(entry, probe);
|
|
211
281
|
return probe;
|
|
212
282
|
}
|
|
213
283
|
|
|
@@ -217,7 +287,7 @@ export function refreshDirtyAsync(
|
|
|
217
287
|
* fresh state after mutations. Returns null outside a git repo. */
|
|
218
288
|
export function buildGitSnapshot(
|
|
219
289
|
cwd: string,
|
|
220
|
-
opts: { now?: () => number; ttlMs?: number } = {},
|
|
290
|
+
opts: { now?: () => number; ttlMs?: number; staleWhileRevalidateMs?: number } = {},
|
|
221
291
|
): string | null {
|
|
222
292
|
const now = opts.now ?? Date.now;
|
|
223
293
|
const ttlMs = opts.ttlMs ?? GIT_SNAPSHOT_TTL_MS;
|
|
@@ -228,41 +298,157 @@ export function buildGitSnapshot(
|
|
|
228
298
|
debug.log('git-fs.snapshot', 'cache-hit', { cwd, ageMs: at - cached.at });
|
|
229
299
|
return cached.value;
|
|
230
300
|
}
|
|
301
|
+
// Stale-while-revalidate (TUI turn path): serve the recent snapshot now
|
|
302
|
+
// and rebuild it off the event loop for the next turn.
|
|
303
|
+
if (cached && opts.staleWhileRevalidateMs !== undefined && at - cached.at < opts.staleWhileRevalidateMs) {
|
|
304
|
+
debug.log('git-fs.snapshot', 'stale-hit', { cwd, ageMs: at - cached.at });
|
|
305
|
+
void refreshGitSnapshotAsync(cwd);
|
|
306
|
+
return cached.value;
|
|
307
|
+
}
|
|
308
|
+
// Invalidated (known write · HEAD move) and the background rebuild has not
|
|
309
|
+
// stored yet: serve the evicted snapshot rather than a synchronous rebuild —
|
|
310
|
+
// the TYPING-LAG this path exists to remove. Bounded by the same window.
|
|
311
|
+
const evicted = !cached ? gitSnapshotLastKnown.get(key) : undefined;
|
|
312
|
+
if (evicted && opts.staleWhileRevalidateMs !== undefined && at - evicted.at < opts.staleWhileRevalidateMs) {
|
|
313
|
+
debug.log('git-fs.snapshot', 'stale-after-invalidate', { cwd, ageMs: at - evicted.at, rebuilding: gitSnapshotInFlight.has(key) });
|
|
314
|
+
void refreshGitSnapshotAsync(cwd);
|
|
315
|
+
return evicted.value;
|
|
316
|
+
}
|
|
231
317
|
|
|
232
318
|
const view = refreshDirty(cwd, { force: true });
|
|
233
319
|
let value: string | null = null;
|
|
234
320
|
if (view.head) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
: status;
|
|
243
|
-
|
|
244
|
-
const parts = [
|
|
245
|
-
'This is the git status at the start of this turn. It is a snapshot and will not update during the turn.',
|
|
246
|
-
`Current branch: ${branch}${view.head.isWorktree ? ' (worktree)' : ''}`,
|
|
247
|
-
mainBranch ? `Main branch: ${mainBranch}` : '',
|
|
248
|
-
userName ? `Git user: ${userName}` : '',
|
|
249
|
-
view.aheadBehind
|
|
250
|
-
? `Upstream: ahead ${view.aheadBehind.ahead}, behind ${view.aheadBehind.behind}`
|
|
251
|
-
: '',
|
|
252
|
-
`Status:\n${truncatedStatus || '(clean)'}`,
|
|
253
|
-
`Recent commits:\n${recentLog || '(none)'}`,
|
|
254
|
-
].filter(Boolean);
|
|
255
|
-
value = parts.join('\n\n');
|
|
321
|
+
value = composeGitSnapshot(view, {
|
|
322
|
+
mainBranch: detectDefaultBranch(cwd),
|
|
323
|
+
status: runGit(cwd, ['status', '--short']),
|
|
324
|
+
recentLog: runGit(cwd, ['log', '--oneline', '-n', '5']),
|
|
325
|
+
userName: runGit(cwd, ['config', 'user.name']),
|
|
326
|
+
generatedAt: at,
|
|
327
|
+
});
|
|
256
328
|
}
|
|
257
329
|
|
|
258
|
-
|
|
330
|
+
storeGitSnapshot(key, { at, value });
|
|
259
331
|
debug.log('git-fs.snapshot', 'built', { cwd, ageMs: 0 });
|
|
260
332
|
return value;
|
|
261
333
|
}
|
|
262
334
|
|
|
335
|
+
function composeGitSnapshot(
|
|
336
|
+
view: GitStatusView,
|
|
337
|
+
git: { mainBranch: string | null; status: string; recentLog: string; userName: string; generatedAt: number },
|
|
338
|
+
): string {
|
|
339
|
+
const head = view.head!;
|
|
340
|
+
const branch = head.branch ?? `HEAD@${head.sha?.slice(0, 7) ?? 'unknown'}`;
|
|
341
|
+
const truncatedStatus = git.status.length > SNAPSHOT_STATUS_MAX_CHARS
|
|
342
|
+
? `${git.status.slice(0, SNAPSHOT_STATUS_MAX_CHARS)}\n... (truncated; run git status for more)`
|
|
343
|
+
: git.status;
|
|
344
|
+
const parts = [
|
|
345
|
+
`This is the git status as of ${new Date(git.generatedAt).toISOString()}. It is a snapshot and will not update during the turn.`,
|
|
346
|
+
`Current branch: ${branch}${head.isWorktree ? ' (worktree)' : ''}`,
|
|
347
|
+
git.mainBranch ? `Main branch: ${git.mainBranch}` : '',
|
|
348
|
+
git.userName ? `Git user: ${git.userName}` : '',
|
|
349
|
+
view.aheadBehind
|
|
350
|
+
? `Upstream: ahead ${view.aheadBehind.ahead}, behind ${view.aheadBehind.behind}`
|
|
351
|
+
: '',
|
|
352
|
+
`Status:\n${truncatedStatus || '(clean)'}`,
|
|
353
|
+
`Recent commits:\n${git.recentLog || '(none)'}`,
|
|
354
|
+
].filter(Boolean);
|
|
355
|
+
return parts.join('\n\n');
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/** Rebuild the snapshot for `cwd` with async subprocesses and store it.
|
|
359
|
+
* Concurrent calls share one rebuild. Never throws. `ifOlderThanMs` turns it
|
|
360
|
+
* into a keep-warm tick: a cached snapshot younger than that is left alone. */
|
|
361
|
+
export function refreshGitSnapshotAsync(cwd: string, opts: { ifOlderThanMs?: number } = {}): Promise<string | null> {
|
|
362
|
+
const key = resolve(cwd);
|
|
363
|
+
const cached = gitSnapshotCache.get(key);
|
|
364
|
+
if (cached && opts.ifOlderThanMs !== undefined && Date.now() - cached.at < opts.ifOlderThanMs) {
|
|
365
|
+
return Promise.resolve(cached.value);
|
|
366
|
+
}
|
|
367
|
+
const generation = snapshotGeneration(key);
|
|
368
|
+
const running = gitSnapshotInFlight.get(key);
|
|
369
|
+
if (running && running.generation === generation) return running.promise;
|
|
370
|
+
const startedAt = Date.now();
|
|
371
|
+
const startVersion = gitSnapshotVersionOf(key);
|
|
372
|
+
const rebuild = (async (): Promise<string | null> => {
|
|
373
|
+
const entry = ensureEntry(cwd);
|
|
374
|
+
// Joins the in-flight probe; callers that need a post-write/post-move probe queue a fresh one first.
|
|
375
|
+
const view = entry ? await probeDirtyAsyncFor(entry, { fresh: false }) : getGitStatusView(cwd);
|
|
376
|
+
let value: string | null = null;
|
|
377
|
+
if (view.head) {
|
|
378
|
+
const [mainBranch, status, recentLog, userName] = await Promise.all([
|
|
379
|
+
detectDefaultBranchAsync(cwd),
|
|
380
|
+
runGitAsync(cwd, ['status', '--short']),
|
|
381
|
+
runGitAsync(cwd, ['log', '--oneline', '-n', '5']),
|
|
382
|
+
runGitAsync(cwd, ['config', 'user.name']),
|
|
383
|
+
]);
|
|
384
|
+
// «as of» = when the reads finished, not when the rebuild was queued.
|
|
385
|
+
value = composeGitSnapshot(view, { mainBranch, status, recentLog, userName, generatedAt: Date.now() });
|
|
386
|
+
}
|
|
387
|
+
// Test-only hold seam: reads are done, the store decision is next.
|
|
388
|
+
if (gitSnapshotRebuildHold) await gitSnapshotRebuildHold();
|
|
389
|
+
// An invalidation that landed mid-rebuild wins: keep the entry stale.
|
|
390
|
+
// A newer entry (e.g. a synchronous build that overlapped this rebuild) is
|
|
391
|
+
// kept — ordered by monotonic version, never by `at` (same-ms flips).
|
|
392
|
+
const current = gitSnapshotCache.get(key);
|
|
393
|
+
if (snapshotGeneration(key) === generation && !(current && current.version > startVersion)) {
|
|
394
|
+
storeGitSnapshot(key, { at: startedAt, value });
|
|
395
|
+
}
|
|
396
|
+
debug.log('git-fs.snapshot', 'rebuilt-async', { cwd, ms: Date.now() - startedAt });
|
|
397
|
+
return value;
|
|
398
|
+
})()
|
|
399
|
+
.catch(() => null)
|
|
400
|
+
.finally(() => { if (gitSnapshotInFlight.get(key)?.promise === rebuild) gitSnapshotInFlight.delete(key); });
|
|
401
|
+
gitSnapshotInFlight.set(key, { generation, promise: rebuild });
|
|
402
|
+
return rebuild;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/** Invalidation generations: a rebuild only stores its result when no
|
|
406
|
+
* invalidation (per cwd or global) landed while it was running. */
|
|
407
|
+
const gitSnapshotGeneration = new Map<string, number>();
|
|
408
|
+
let allGitSnapshotsGeneration = 0;
|
|
409
|
+
|
|
410
|
+
function snapshotGeneration(key: string): string {
|
|
411
|
+
return `${allGitSnapshotsGeneration}:${gitSnapshotGeneration.get(key) ?? 0}`;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function invalidateAllGitSnapshots(): void {
|
|
415
|
+
// Snapshots that were in use (cached or being rebuilt) are re-warmed for the next turn.
|
|
416
|
+
const inUse = new Set([...gitSnapshotCache.keys(), ...gitSnapshotInFlight.keys()]);
|
|
417
|
+
for (const key of [...gitSnapshotCache.keys()]) evictGitSnapshot(key);
|
|
418
|
+
allGitSnapshotsGeneration += 1;
|
|
419
|
+
// Probes already running read the old ref's upstream — queue one fresh probe per repo behind
|
|
420
|
+
// them, so the rebuilds below join it instead.
|
|
421
|
+
const entries = new Set<CacheEntry>();
|
|
422
|
+
for (const key of inUse) {
|
|
423
|
+
const entry = ensureEntry(key);
|
|
424
|
+
if (entry) entries.add(entry);
|
|
425
|
+
}
|
|
426
|
+
for (const entry of entries) void probeDirtyAsyncFor(entry, { fresh: true });
|
|
427
|
+
for (const key of inUse) void refreshGitSnapshotAsync(key);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/** A known write happened: the cached snapshot must not be served again.
|
|
431
|
+
* When a snapshot was in use (cached or being rebuilt), rebuild it in the
|
|
432
|
+
* background so the next turn usually still hits. */
|
|
433
|
+
function invalidateGitSnapshots(cwd: string): void {
|
|
434
|
+
const key = resolve(cwd);
|
|
435
|
+
const wasCached = evictGitSnapshot(key);
|
|
436
|
+
const wasRebuilding = gitSnapshotInFlight.has(key);
|
|
437
|
+
gitSnapshotGeneration.set(key, (gitSnapshotGeneration.get(key) ?? 0) + 1);
|
|
438
|
+
// An in-flight rebuild of the old generation will be discarded — schedule its replacement.
|
|
439
|
+
if (wasCached || wasRebuilding) void refreshGitSnapshotAsync(cwd);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
function headMoved(before: GitHeadInfo | null | undefined, after: GitHeadInfo | null | undefined): boolean {
|
|
443
|
+
if (!before || !after) return before !== after;
|
|
444
|
+
return before.branch !== after.branch || before.sha !== after.sha || before.detached !== after.detached;
|
|
445
|
+
}
|
|
446
|
+
|
|
263
447
|
/** Explicitly discard cached git snapshots, including cached non-repositories. */
|
|
264
448
|
export function clearGitSnapshotCache(): void {
|
|
265
449
|
gitSnapshotCache.clear();
|
|
450
|
+
gitSnapshotLastKnown.clear();
|
|
451
|
+
allGitSnapshotsGeneration += 1;
|
|
266
452
|
}
|
|
267
453
|
|
|
268
454
|
function detectDefaultBranch(cwd: string): string | null {
|
|
@@ -281,6 +467,34 @@ function detectDefaultBranch(cwd: string): string | null {
|
|
|
281
467
|
return null;
|
|
282
468
|
}
|
|
283
469
|
|
|
470
|
+
async function detectDefaultBranchAsync(cwd: string): Promise<string | null> {
|
|
471
|
+
const symbolic = await runGitAsync(cwd, ['symbolic-ref', 'refs/remotes/origin/HEAD']);
|
|
472
|
+
if (symbolic.startsWith('refs/remotes/origin/')) {
|
|
473
|
+
return symbolic.slice('refs/remotes/origin/'.length).trim() || null;
|
|
474
|
+
}
|
|
475
|
+
for (const candidate of ['main', 'master', 'develop']) {
|
|
476
|
+
if (await gitSucceeds(cwd, ['show-ref', '--verify', '--quiet', `refs/heads/${candidate}`])) return candidate;
|
|
477
|
+
}
|
|
478
|
+
return null;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
function gitSucceeds(cwd: string, args: string[]): Promise<boolean> {
|
|
482
|
+
return new Promise((resolveOk) => {
|
|
483
|
+
try { execFile('git', args, { cwd, timeout: SNAPSHOT_TIMEOUT_MS }, (error) => resolveOk(!error)); }
|
|
484
|
+
catch { resolveOk(false); }
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
function runGitAsync(cwd: string, args: string[]): Promise<string> {
|
|
489
|
+
return new Promise((resolveOut) => {
|
|
490
|
+
try {
|
|
491
|
+
execFile('git', args, { cwd, encoding: 'utf8', timeout: SNAPSHOT_TIMEOUT_MS, maxBuffer: 2 * 1024 * 1024 }, (error, stdout) => {
|
|
492
|
+
resolveOut(error ? '' : String(stdout ?? '').trim());
|
|
493
|
+
});
|
|
494
|
+
} catch { resolveOut(''); }
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
|
|
284
498
|
function runGit(cwd: string, args: string[]): string {
|
|
285
499
|
const res = spawnSync('git', args, {
|
|
286
500
|
cwd,
|
|
@@ -292,10 +506,23 @@ function runGit(cwd: string, args: string[]): string {
|
|
|
292
506
|
return String(res.stdout ?? '').trim();
|
|
293
507
|
}
|
|
294
508
|
|
|
509
|
+
/** Test helper — the cached snapshot for `cwd` without building one. */
|
|
510
|
+
export function __peekGitSnapshot(cwd: string): string | null | undefined {
|
|
511
|
+
return gitSnapshotCache.get(resolve(cwd))?.value;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/** Test helper — what a HEAD move does to cached snapshots. */
|
|
515
|
+
export function __invalidateAllGitSnapshotsForTest(): void {
|
|
516
|
+
invalidateAllGitSnapshots();
|
|
517
|
+
}
|
|
518
|
+
|
|
295
519
|
/** Test helper — drop the cache + dispose every watcher. */
|
|
296
520
|
export function __resetGitFsCache(): void {
|
|
297
521
|
for (const [, entry] of cache) entry.watcher.dispose();
|
|
298
522
|
cache.clear();
|
|
299
523
|
clearGitSnapshotCache();
|
|
524
|
+
gitSnapshotInFlight.clear();
|
|
300
525
|
dirtyInFlight.clear();
|
|
526
|
+
gitSnapshotGeneration.clear();
|
|
527
|
+
gitSnapshotVersion.clear();
|
|
301
528
|
}
|
package/src/git-fs/retry.ts
CHANGED
|
@@ -4,6 +4,7 @@ const MAX_GIT_RETRY_ATTEMPTS = 6;
|
|
|
4
4
|
export type GitRunResult = {
|
|
5
5
|
status: number | null;
|
|
6
6
|
signal?: NodeJS.Signals | null;
|
|
7
|
+
errorCode?: string;
|
|
7
8
|
stdout: string;
|
|
8
9
|
stderr: string;
|
|
9
10
|
};
|
|
@@ -43,6 +44,9 @@ export function runGitWithRetry(
|
|
|
43
44
|
if (attempt > 1) onRetrySuccess?.(attempt);
|
|
44
45
|
return result;
|
|
45
46
|
}
|
|
47
|
+
// A killed or timed-out process did not report a Git failure. Its partial
|
|
48
|
+
// output may mention a lock, but repeating the checkout hides its cause.
|
|
49
|
+
if (result.status === null) return result;
|
|
46
50
|
const error = result.stderr || result.stdout || '';
|
|
47
51
|
if (!isTransientGitError(error) || attempt === MAX_GIT_RETRY_ATTEMPTS) return result;
|
|
48
52
|
sleepSyncMs(80 * attempt);
|
package/src/git-fs/runner.ts
CHANGED
|
@@ -27,9 +27,11 @@ export function runGitCommand(
|
|
|
27
27
|
const run = runner ?? ((gitArgs: string[]): GitRunResult => {
|
|
28
28
|
if (testRunner) return testRunner(cwd, gitArgs, options);
|
|
29
29
|
const result = spawnSync('git', gitArgs, { ...options, cwd });
|
|
30
|
+
const errorCode = (result.error as NodeJS.ErrnoException | undefined)?.code;
|
|
30
31
|
return {
|
|
31
32
|
status: result.status,
|
|
32
33
|
...(result.signal ? { signal: result.signal } : {}),
|
|
34
|
+
...(errorCode ? { errorCode } : {}),
|
|
33
35
|
stdout: outputText(result.stdout),
|
|
34
36
|
stderr: outputText(result.stderr),
|
|
35
37
|
};
|