elanous 0.2.40 → 0.2.42
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/README.md +7 -7
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4769.9fd582071301f382.js → 1063.2fb8a9dc55c731f2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
- package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{470.51a72a2348306455.js → 1262.e804feb8fd1acb8c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7219-15bdd9a80661af8e.js → 1455-530ca16c7e71baff.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1281.d81877e35b9068f4.js → 1487.2f67b79444062da6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
- package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
- package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
- package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{1350.59f40e39e02d91b1.js → 2456.b6de0e1c05f28843.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
- package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +115 -0
- package/apps/pwa/out/_next/static/chunks/{5436.fdf6fa8ae3e9588d.js → 2974.595d1e29d040cb6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5383.bdfa5d886e39a826.js → 3207.a756c95e9ec8c3c8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +93 -0
- package/apps/pwa/out/_next/static/chunks/{2177.df8547f9d7215c4e.js → 3347.f846266b5e5f3ede.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
- package/apps/pwa/out/_next/static/chunks/{9184.45afbf44fec87574.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
- package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{8099.1cccf31c1baa7e1c.js → 3741.9cf76acaa2ee5298.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4864a2ca.1c1c280a7772c5e5.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
- package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3330.7443183b7e6fdbdf.js → 4276.336d76d858fcdf1b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{3b355b3d.6f73c98bf6f9c749.js → 50061469.0326382241ef3b2d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +149 -0
- package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
- package/apps/pwa/out/_next/static/chunks/{8d173e38.18a2f7b4e1848bdb.js → 53c73f84.373b6160adfa89a4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1537-6bb97b5214928ea9.js → 5431-72a1dbde59400691.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
- package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{261.0d471e8aded799f3.js → 6131.348b7d6bdcd267ce.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{9175.2de5209a5ce6f68a.js → 6377.bc7df239edbff244.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2226.2cf61ec781827219.js → 6632.0eac1c554f8f2ef3.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
- package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
- package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b84cad00.594027ebe0531fe2.js → 73d2eb0e.4966ad55293c801a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{6257.c0037b8949239f5e.js → 7411.9b4b8b747dc7b802.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
- package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9189505a.980427ac048c8c60.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2566.beaffc3a5e1fcd2e.js → 8262.ddc03e06b733f184.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
- package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
- package/apps/pwa/out/_next/static/chunks/{8272-025653884f9645d2.js → 8546-6f03f8ea34dd61d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6051-0ae955eedb10adb9.js → 8673-bab689a55f7e13b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4351.0f37a6db2b34d50b.js → 9249.976f1e69a9d80754.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6749.0744ce6eb08d40e9.js → 9427.96aa912ddb5801e0.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7611.85f045bf232053ac.js → 9633.ce5bddc56784da72.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3746-f80a78f220bf37b5.js → 9656-374232558fd528d0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/{page-83d27757e2b8060a.js → page-0e3d7b9421b79dac.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-139d722de1dcd6c1.js → page-bf067887b3307423.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{409c787b.e48c5bec8ec10456.js → b450776b.3db34d8d965f82d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{ca3702f8.2913182e73889fa2.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
- package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
- 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 +23 -24
- 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 +22 -22
- 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 +23 -24
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -24
- 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 +6 -1
- package/catalog/models/openai/gpt-6.1-sol.yaml +16 -0
- package/catalog/models/openai/gpt-6.1-terra.yaml +16 -0
- package/docs/goal-context/04-mock-scenarios.md +13 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
- package/graphs/demo/persona-teacher/recipes.yaml +17 -0
- package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
- package/graphs/heal/heal-loop.yaml +1 -0
- package/graphs/overlays/stop-heal-ladder.yaml +136 -2
- package/graphs/release/release-loop.yaml +3 -1
- package/graphs/units/gate/gate.yaml +20 -0
- package/graphs/units/git/git.yaml +26 -0
- package/graphs/units/implement/implement.yaml +19 -0
- package/graphs/units/landing/landing.yaml +18 -0
- package/graphs/units/review/review.yaml +20 -0
- package/graphs/units/verbs/recipes.yaml +13 -10
- package/graphs/units/verbs/research.yaml +20 -0
- package/graphs/work/research-report.yaml +21 -3
- package/package.json +1 -1
- package/scripts/disk-steward.ts +46 -0
- package/scripts/fleet/node-setup.sh +50 -0
- package/scripts/graph-units/verbs/research.ts +55 -0
- package/scripts/heal/run-role.ts +99 -5
- package/scripts/land-global-checks.ts +6 -1
- package/scripts/lib/decompose-ab.ts +1 -0
- package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
- package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
- package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
- package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
- package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
- package/scripts/lib/tui-regress-checks.ts +33 -13
- package/scripts/llm-cost-ledger.ts +179 -8
- package/scripts/measure-nl-routing-corpus.ts +10 -2
- package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
- package/scripts/public-copy-lint.ts +163 -19
- package/scripts/ratchets/train-side-invariants.sh +0 -1
- package/scripts/release-loop/gate-autoheal.ts +117 -0
- package/scripts/release-loop/gate-baseline-receipt.ts +55 -10
- package/scripts/release-loop/gate-diff.ts +22 -3
- package/scripts/release-loop/gate-image-pin.ts +81 -0
- package/scripts/release-loop/gate-node-sim.ts +207 -0
- package/scripts/release-loop/gate-node.ts +489 -62
- package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
- package/scripts/release-loop/gate-radius-live.ts +97 -13
- package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
- package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
- package/scripts/release-loop/gate-train-receipts.ts +122 -0
- package/scripts/release-loop/gate-triage-node.ts +70 -10
- package/scripts/release-loop/resume-release.ts +330 -23
- package/scripts/release-loop/traffic-node.ts +6 -3
- package/scripts/release-loop/unattended-release.ts +4 -2
- package/scripts/shadow-authoring-probe.ts +20 -0
- package/scripts/ux-sim.ts +37 -3
- package/scripts/warm-pool-provider-config.ts +263 -0
- package/skills/omni-crawl/SKILL.md +5 -2
- package/skills/omni-crawl/scripts/main.ts +84 -23
- package/src/acp/core-turn-bridge.ts +99 -4
- package/src/agent/registry.ts +2 -0
- package/src/agent/task-notification.ts +25 -5
- package/src/agent/types.ts +6 -0
- package/src/agent-mission/mission-cli.ts +24 -0
- package/src/agent-mission/mission-out.ts +595 -0
- package/src/agent-mission/tool-install.ts +88 -2
- package/src/agent-substrate/context-strategy.ts +4 -4
- package/src/agent-substrate/self-review-cli.ts +267 -40
- package/src/auto-research/research-turn.ts +133 -51
- package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
- package/src/autopilot/pr-manager.ts +38 -7
- package/src/autopilot/pty-control-loop.ts +2 -0
- package/src/boot/daemon-tools/self-implement.ts +46 -9
- package/src/budget/shadow-arms.ts +52 -0
- package/src/capture/tui-self-report.ts +22 -6
- package/src/chat/index.ts +1 -1
- package/src/chat/pickers/state.ts +7 -1
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
- package/src/cli/log-event-names.ts +5 -0
- package/src/cli/mcp-login.ts +8 -18
- package/src/cli/msg-cli.ts +57 -1
- package/src/cli/pr-land-heavy-remote.ts +47 -9
- package/src/cli/pr-land-overlap-evidence.ts +100 -1
- package/src/cli/pr-land-pod-shadow-job.ts +60 -0
- package/src/cli/release-checklist-read-cli.ts +20 -10
- package/src/cli/release-cli.ts +27 -1
- package/src/cli/research-cli.ts +4 -5
- package/src/cli/sim-cli.ts +7 -1
- package/src/cli/tasks-cli.ts +12 -4
- package/src/codex/models.ts +30 -15
- package/src/compact/auto.ts +8 -1
- package/src/control-plane/ledger.ts +52 -2
- package/src/control-plane/server.ts +16 -2
- package/src/core-turn/run-core-turn.ts +313 -89
- package/src/core-turn/run-goal-loop.ts +106 -2
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/acp-boot.ts +72 -3
- package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
- package/src/dashboard/classic-sidetab-mission.ts +185 -0
- package/src/dashboard/index.ts +155 -15
- package/src/dashboard/input/agent-wake.ts +23 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
- package/src/dashboard/mission-cli-consumer.ts +153 -0
- package/src/dashboard/seat-boot-preamble.ts +171 -1
- package/src/dashboard/side-basic-runtime.ts +54 -1
- package/src/dashboard/sidetab-runtime.ts +90 -1
- package/src/dashboard/skill-catalog-preamble.ts +101 -0
- package/src/dashboard/skill-detection-runtime.ts +55 -15
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
- package/src/dashboard/turn-preamble.ts +65 -16
- package/src/dashboard/turn-prompt-runtime.ts +4 -2
- package/src/disk-steward/judge.ts +73 -0
- package/src/disk-steward/ledger.ts +122 -0
- package/src/disk-steward/steward.ts +373 -0
- package/src/domains/guardian-tick.ts +191 -2
- package/src/graph-runner/graph-cli.ts +44 -7
- package/src/graph-runner/graph-tick.ts +10 -2
- package/src/graph-runner/in-process-registry.ts +37 -0
- package/src/graph-runner/runner.ts +34 -4
- package/src/grok/agent-search.ts +14 -4
- package/src/grok/credential.ts +28 -11
- package/src/grounding/ref-index.ts +19 -0
- package/src/grounding/sources-cli.ts +9 -1
- package/src/harness/harness-cli-command.ts +267 -14
- package/src/harness/harness-incidents.ts +312 -7
- package/src/harness/harness-pod-dispatch.ts +81 -15
- package/src/harness/harness-space.ts +15 -1
- package/src/harness/harness-stop.ts +155 -11
- package/src/harness/progress-worker-entry.ts +59 -0
- package/src/harness/progress-worker-runtime.ts +11 -0
- package/src/index.ts +52 -7
- package/src/instance/dev-project.ts +25 -0
- package/src/instance/spawn-elanous.ts +6 -4
- package/src/intelligence-map/model-alias.ts +6 -5
- package/src/intelligence-map/model-catalog.ts +59 -2
- package/src/llm/model-defaults.ts +4 -4
- package/src/llm.ts +208 -19
- package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
- package/src/loops/orchestrator/tick.ts +61 -0
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/mcp/mcp-oauth.ts +3 -1
- package/src/model-tier/llm-tier-map.ts +9 -9
- package/src/model-tier/turn-tier.ts +1 -1
- package/src/msg/msg-mirror-github.ts +80 -0
- package/src/msg/msg-mirror-policy.ts +61 -0
- package/src/msg/msg-mirror-runner.ts +219 -0
- package/src/msg/msg-mirror-state.ts +33 -0
- package/src/msg/msg-store.ts +11 -0
- package/src/native-tool-catalog.ts +2 -2
- package/src/nexus/api/harness-traversal.ts +11 -0
- package/src/output-truncation.ts +41 -12
- package/src/pr-tool/census.ts +3 -2
- package/src/project/project-store.ts +48 -1
- package/src/pty-shell/tui-run-state.ts +188 -2
- package/src/release-loop/checklist-target-path-hint.ts +13 -0
- package/src/release-loop/checklist.ts +9 -1
- package/src/release-loop/gate-host-reservation.ts +144 -0
- package/src/release-loop/release-schedule.ts +90 -1
- package/src/repl/index.ts +43 -2
- package/src/research/axis-fanout.ts +121 -16
- package/src/research/bloom-exemplars.ts +137 -0
- package/src/research/gap-followup.ts +13 -1
- package/src/research/plugin-discovery.ts +36 -14
- package/src/research-bridge/invoke.ts +22 -5
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +39 -25
- package/src/self-dev/decompose.ts +119 -5
- package/src/self-dev/dev-cli.ts +17 -17
- package/src/self-dev/graph-front-nodes.ts +23 -0
- package/src/self-dev/launch-preflight-text.ts +5 -6
- package/src/self-dev/launch-preflight.ts +9 -4
- package/src/self-dev/orchestrate.ts +27 -2
- package/src/self-dev/review-provider-fallback.ts +9 -2
- package/src/self-dev/run-supervisor.ts +226 -6
- package/src/self-dev/run-types.ts +7 -0
- package/src/self-implement/doctor-visit.ts +88 -0
- package/src/self-implement/gate-artifacts.ts +13 -0
- package/src/self-implement/gate-cli.ts +54 -24
- package/src/self-implement/gate-remote.ts +23 -5
- package/src/self-implement/goal-author-clarification.ts +31 -12
- package/src/self-implement/goal-author.ts +403 -8
- package/src/self-implement/graph-overlay-yaml.ts +7 -0
- package/src/self-implement/graph-stage-units.ts +172 -0
- package/src/self-implement/graph-templates.ts +162 -1
- package/src/self-implement/graph-variant.ts +37 -4
- package/src/self-implement/headless-elanous-driver.ts +31 -2
- package/src/self-implement/heal-intake.ts +112 -4
- package/src/self-implement/heal-triage.ts +20 -0
- package/src/self-implement/host-regate.ts +31 -8
- package/src/self-implement/knowhow-pack.ts +38 -0
- package/src/self-implement/merge-train.ts +5 -0
- package/src/self-implement/orchestrator.ts +359 -30
- package/src/self-implement/regate-detail.ts +38 -1
- package/src/self-implement/rework-child-provider.ts +25 -0
- package/src/self-implement/run-chart.ts +119 -0
- package/src/self-implement/run-ledger.ts +176 -17
- package/src/self-implement/run-stop.ts +208 -5
- package/src/self-implement/running-runs.ts +35 -12
- package/src/self-implement/self-implement-cli.ts +36 -4
- package/src/self-implement/stop-autoheal-operational.ts +43 -0
- package/src/self-implement/stop-autoheal.ts +28 -6
- package/src/session/chat.ts +69 -58
- package/src/session/request-size-guard.ts +123 -0
- package/src/session-runtime/index.ts +98 -4
- package/src/session-runtime/tier-flip.ts +3 -3
- package/src/sidetab-core/model.ts +150 -0
- package/src/sidetab-core/visible-agent-mission.ts +186 -0
- package/src/skills/name-match.ts +20 -0
- package/src/skills/tools/agent.ts +30 -2
- package/src/skills/tools/omni-search.ts +67 -5
- package/src/task-agent/parent-host.ts +14 -1
- package/src/task-agent/pod-distributor-entry.ts +3 -0
- package/src/task-agent/task-hand.ts +31 -1
- package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +43 -0
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
- package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +163 -13
- package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +280 -60
- package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
- package/src/tokens.ts +35 -2
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
- package/src/tool-runtime/skill-exec-runtime.ts +33 -13
- package/src/tool-runtime/types.ts +1 -0
- package/src/tui/entry.ts +24 -7
- package/src/tui/sidetab/attach.ts +47 -0
- package/src/tui/sidetab/list.ts +45 -0
- package/src/tui/sidetab/nl-tool.ts +2 -136
- package/src/tui/sidetab/peek.ts +52 -0
- package/src/tui-client/dashboard-session.ts +3 -0
- package/src/tui-client/local-chat-turn.ts +26 -13
- package/src/tui.ts +22 -0
- package/src/user-config.ts +11 -5
- package/src/ux-sim/fake-kubectl.ts +37 -3
- package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
- package/src/ux-sim/fault-pod-child-result.ts +42 -0
- package/src/ux-sim/fault-pool-cap.ts +11 -6
- package/src/ux-sim/mock-scenario-catalog.json +41 -0
- package/src/ux-sim/mock-scenario-catalog.ts +156 -0
- package/src/ux-sim/release-sim-rig.ts +262 -0
- package/src/ux-sim/scenario.ts +116 -23
- package/src/ux-sim/seminar-rehearsal.ts +109 -0
- package/src/ux-sim/subagent-tools-device.ts +2 -2
- package/src/version/packed-revision.json +1 -1
- package/src/voice/voice-tts-singleton.ts +18 -3
- package/src/web-search/grok.ts +5 -9
- package/apps/pwa/out/_next/static/chunks/1060.014f1f01a17aec26.js +0 -115
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +0 -286
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +0 -90
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +0 -2
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066.a77257c8c350770a.js +0 -23
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2522.f2766b76d22c8bdf.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +0 -1
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +0 -24
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +0 -77
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +0 -36
- package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +0 -287
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +0 -1
- package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +0 -94
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +0 -148
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +0 -93
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8357.1aaa713b052a78b1.js +0 -309
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +0 -79
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +0 -1
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/d8de0de2-dd0f4ac8e5ab1832.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +0 -1
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
- package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
- /package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
import type { SelfReportFrame } from './self-report-frame.js';
|
|
32
32
|
import { resolveInstanceName } from '../instance-identity.js';
|
|
33
33
|
import { getHarnessRunId } from '../harness/harness-space.js';
|
|
34
|
-
import { injectKey, setFrameObserver, splitKeys, termSize as tuiTermSize, type Key } from '../tui.js';
|
|
34
|
+
import { injectKey, routeExternalTuiKey, setFrameObserver, splitKeys, termSize as tuiTermSize, type Key } from '../tui.js';
|
|
35
35
|
import { canTransitionAccessMode, type PtyAccessMode, type PtyTransitionPolicy } from '../pty-shell/pty-ref.js';
|
|
36
36
|
import { resolveWriteDecision, type PtyWriteActor } from '../pty-shell/pty-write-arbiter.js';
|
|
37
37
|
import { registerPtyControlTarget, startPtyControlPoller, type PtyControlTarget } from '../pty-shell/registry.js';
|
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
updatePtyManifestBuild,
|
|
44
44
|
} from '../pty-shell/pty-manifest.js';
|
|
45
45
|
import { writeHarnessScreen } from '../harness/harness-screen.js';
|
|
46
|
-
import { runningBuild, startTuiRunStateRecorder } from '../pty-shell/tui-run-state.js';
|
|
46
|
+
import { runningBuild, seatCompareDepsFromEnv, startTuiRunStateRecorder } from '../pty-shell/tui-run-state.js';
|
|
47
47
|
import type { TuiSelfRestartDeps } from '../pty-shell/tui-run-state.js';
|
|
48
48
|
import { lastHumanKeyAt } from '../tui.js';
|
|
49
49
|
import { debug } from '../debug/log.js';
|
|
@@ -176,9 +176,19 @@ export function createTuiControlTarget(surfaceId: string, deps: TuiControlTarget
|
|
|
176
176
|
stopTurn: (force: true) => force && stopTurn(),
|
|
177
177
|
canWrite: (actor: PtyWriteActor = 'human') => resolveWriteDecision(accessMode, actor).allow,
|
|
178
178
|
write(chars: string): void {
|
|
179
|
+
const keys = parse(chars);
|
|
180
|
+
const remaining: Key[] = [];
|
|
181
|
+
let routedToModal = false;
|
|
182
|
+
for (const key of keys) {
|
|
183
|
+
if (routeExternalTuiKey(key)) routedToModal = true;
|
|
184
|
+
else remaining.push(key);
|
|
185
|
+
}
|
|
186
|
+
if (routedToModal) {
|
|
187
|
+
if (remaining.length > 0 && !remaining.every(inject)) throw new Error('tui-input-undelivered');
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
179
190
|
// ⭐ 이 write 는 «바깥»(제어 IPC)에서만 온다 — 키보드와 섞이기 전에 라우터가 먼저 가른다.
|
|
180
191
|
if (routeExternal(chars) !== 'passthrough') return;
|
|
181
|
-
const keys = parse(chars);
|
|
182
192
|
if (!keys.length || !keys.every(inject)) throw new Error('tui-input-undelivered');
|
|
183
193
|
},
|
|
184
194
|
resize: () => { throw new Error('tui-resize-unsupported'); },
|
|
@@ -444,9 +454,15 @@ export function startTuiSelfReport(deps: TuiSelfReportDeps = {}): () => void {
|
|
|
444
454
|
const startRunState = deps.startRunState
|
|
445
455
|
?? (deps.registerRow
|
|
446
456
|
? () => () => {}
|
|
447
|
-
: (id: string) =>
|
|
448
|
-
|
|
449
|
-
|
|
457
|
+
: (id: string) => {
|
|
458
|
+
// TUI-SEAT-PILOT-2H-COMPARE — 판정 신호 한 줄은 env(ELANOUS_SEAT_COMPARE_RUN_ID)가 있을 때만 켜진다.
|
|
459
|
+
// env 가 없으면 빈 spread → 종전 기록 경로 그대로(보존 계약).
|
|
460
|
+
const seatCompare = seatCompareDepsFromEnv();
|
|
461
|
+
return startTuiRunStateRecorder(id, {
|
|
462
|
+
selfRestart: deps.selfRestart === null ? undefined : (deps.selfRestart ?? productionTuiSelfRestart(readActiveSessionId)),
|
|
463
|
+
...(seatCompare ? { seatCompare } : {}),
|
|
464
|
+
});
|
|
465
|
+
});
|
|
450
466
|
try { stopRunState = startRunState(surfaceId); } catch { /* fail-soft — recorder logs its own write failures */ }
|
|
451
467
|
// 미룬 우편 깨움(TUI-H4) — 이 TUI 가 턴 중·5분 창이라 못 받은 깨움을 idle 로 «기록»된 뒤 한 번 다시 두드린다.
|
|
452
468
|
// 실 행 등록과 짝일 때만(시험이 행 등록을 갈아 끼우면 0) · 무거운 모듈은 늦게 불러온다.
|
package/src/chat/index.ts
CHANGED
|
@@ -523,7 +523,7 @@ export const SLASH_COMMANDS: SlashCommand[] = ([
|
|
|
523
523
|
{ name: 'tablet', aliases: [], description: 'Tablet mode — collapse layout to log + input', subcommands: ['on', 'off', 'toggle', 'auto', 'status', 'browser-preview', 'bp'] },
|
|
524
524
|
{ name: 'surface', aliases: [], description: 'Surface control — open a pane/catalog launcher (/surface catalog · browser · preview · log · scratch · obsidian · skill) OR set a preferred LLM surface (/surface coding-agent · research-agent · control-agent · ops-agent · … · clear · status)', subcommands: ['catalog', 'browser', 'preview', 'browser-preview', 'log', 'scratch', 'obsidian', 'skill', 'skill-file', 'agents', 'coding-agent', 'coding-chat', 'research-agent', 'research-chat', 'control-agent', 'ops-ui-agent', 'ops-fleet-agent', 'ops-agent', 'clear', 'status'] },
|
|
525
525
|
{ name: 'term', aliases: ['terminal'], description: 'Interactive terminal modal — new / list / attach / detach / switch / kill / snapshot / resume', subcommands: ['new', 'list', 'attach', 'detach', 'switch', 'kill', 'snapshot', 'resume'] },
|
|
526
|
-
{ name: 'side', aliases: [], description: '사이드탭
|
|
526
|
+
{ name: 'side', aliases: [], description: '사이드탭 — 목록 · 셸/Codex/Claude 탭 · attach · 미션 결과 파일', subcommands: ['list', 'new', 'attach', 'open', 'mission'] },
|
|
527
527
|
{ name: 'claude', aliases: [], description: 'Spawn claude-code CLI in a terminal modal' },
|
|
528
528
|
{ name: 'codex', aliases: [], description: 'Spawn codex CLI in a terminal modal' },
|
|
529
529
|
{ name: 'gemini', aliases: [], description: 'Spawn gemini CLI in a terminal modal' },
|
|
@@ -237,7 +237,13 @@ export function createPickerState(deps: PickerDeps): PickerState {
|
|
|
237
237
|
|
|
238
238
|
const filteredSlash = (buf: PickerBufferView): SlashCommand[] => {
|
|
239
239
|
const { role, showBeta } = readTuiSlashAudience();
|
|
240
|
-
|
|
240
|
+
// /directive is intentionally outside the compact first-use menu, but an owner must be able
|
|
241
|
+
// to discover its ops-only command in the live palette. Keep that role-specific exception local
|
|
242
|
+
// to the palette so the shared first-use menu and help catalog remain at their 15-command policy.
|
|
243
|
+
const paletteCommands = role === 'owner'
|
|
244
|
+
? deps.commands.map((command) => command.name === 'directive' ? { ...command, hidden: false } : command)
|
|
245
|
+
: deps.commands;
|
|
246
|
+
return filterSlashCommands((buf.lines[0] ?? '').slice(1), paletteCommands)
|
|
241
247
|
.filter((cmd) => (role === 'owner' && slashMaturity(cmd.name) === undefined) || slashVisibleFor(cmd.name, role, { showBeta }));
|
|
242
248
|
};
|
|
243
249
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr": 32646, "headCommit": "1694ccc7a1704d451508008068265aeee45cde24", "reviewed": true, "verdict": "pass", "mustFix": [], "shouldFix": [], "reviewer": "OP-waiver", "model": "none (OP adjudication)", "waiver": {"by": "OP", "approvedBy": "OP 2026-10-29 10:5x «무한 리뷰 중단·웨이버» · r9 초과", "adjudicates": "pr-32646-2dcdb05e4306.json (gpt-6.1-terra r9 fail · mustFix 1: evidencePathPattern 이 @·공백·한글 경로를 잘라 출력)", "headTestRun": {"host": "node-b", "sha": "1694ccc7a1704d451508008068265aeee45cde24", "command": "bun test src/dashboard/seat-boot-preamble.test.ts", "pass": 20, "fail": 0, "expects": 97, "exit": 0, "rawOutput": "~/elanous-hq/seat-state/OPC/evidence/32646-1694ccc7a170-node-b.txt"}, "diffChecked": "2dcdb05e→1694ccc7: seat-boot-preamble.ts +7/-5 · test +16/-8 — 경로 끝 경계 판정 · 공백 경로는 확장자 꼬리 확인 · 시험이 proof@2.md·검증@2.md 전체 보존 ⊕ 공백·# 경로는 잘린 포인터 미출력 확인 — OP 직접 대조", "dispositions": [{"finding": 1, "disposition": "fixed-in-this-head", "evidence": "seat-boot-preamble.test.ts 추가 단언(asciiSpecialPath·unicodeSpecialPath 포함 · spaced/delimiter 잘린 출력 없음) · node-b 20/0"}]}, "summary": "OP waiver — r9 지적 수리 확인."}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr": 32853, "headCommit": "bd8f73595c83e3bee478faa3b765d4082c4c5aa6", "reviewed": true, "verdict": "pass", "mustFix": [], "shouldFix": [], "reviewer": "OP-waiver", "model": "none (OP adjudication)", "waiver": {"by": "OP", "approvedBy": "OP 2026-10-29 10:5x «b OP 판정 예외 승인 · 무한 리뷰 중단·웨이버»", "adjudicates": "pr-32853-1c0f33c905e0.json (gpt-6.1-terra r11 fail mustFix 5) — 이후 수정 1c0f33c9→f3d60e98→bd8f7359 은 driver.test.ts 만(import 1 · 동적 경로 · 구독 fake · fail-closed 회귀 추가) · OP 가 diff 직접 대조", "headTestRun": {"host": "node-b", "sha": "bd8f73595c83e3bee478faa3b765d4082c4c5aa6", "command": "bun test src/agent-mission/driver.test.ts", "pass": 140, "fail": 0, "expects": 586, "exit": 0, "reportedBy": "OPC #51223"}, "dispositions": [{"finding": 1, "disposition": "already-fixed", "evidence": "driver.test.ts «$name accepts only its observed final-input suggestion after marker, answer, and stable idle»"}, {"finding": 2, "disposition": "already-fixed", "evidence": "driver.test.ts «completion record preserves a final answer longer than 100 lines…» · «long final answer is preserved while output logging remains bounded» · driver.ts slice(-3500) 은 LLM 입력·reviewSummary 뿐"}, {"finding": 3, "disposition": "out-of-scope-followup", "evidence": "실 CLI 자동 시험 → AGENT-MISSION-BENCH-READY-FU · 실측 run-ab227633 양팔 통과"}, {"finding": 4, "disposition": "already-fixed", "evidence": "driver.test.ts «empty input prompt never completes even after a stable interval»"}, {"finding": 5, "disposition": "fixed-in-this-head", "evidence": "readdirSync import 추가(f3d60e98) · fail-closed 쓰기 실패 회귀 추가(bd8f7359)"}]}, "summary": "OP waiver(재작성) — 정확 head 실측 140/0 근거."}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr": 33097, "headCommit": "1cc85900413cfcb2fdc427d4ca85c51fc0eb8358", "reviewed": true, "verdict": "pass", "mustFix": [], "shouldFix": [], "reviewer": "OP-waiver", "model": "none (OP adjudication)", "waiver": {"by": "OP", "approvedBy": "OP 2026-10-29 10:5x «무한 리뷰 중단·웨이버» 일반 승인 · r7 상한 도달", "adjudicates": "pr-33097-1cc85900413c.json (gpt-6.1-terra r7 fail mustFix 2 — 리뷰 입력이 PR 본문·실행 로그를 못 봐 재개)", "headTestRun": {"host": "node-b", "sha": "1cc85900413cfcb2fdc427d4ca85c51fc0eb8358", "command": "bun test src/cli/pr-land-heavy-remote.test.ts src/task-orchestrator/surfaces/pod-warm-switch.test.ts src/task-orchestrator/surfaces/warm-reuse-evidence.test.ts src/cli/pr-land-pod-shadow-job.test.ts src/task-orchestrator/surfaces/pod-warm-worker-provider.test.ts", "pass": 130, "fail": 0, "expects": 536, "exit": 0, "rawOutput": "~/elanous-hq/seat-state/TC/evidence/33097-1cc85900-node-b.txt"}, "dispositions": [{"finding": 1, "disposition": "evidence-provided", "evidence": "원문 파일에 명령·EXIT_CODE=0·130 pass · (pass) «heavy land gate decides warm reuse once per landing — no evidence=off · 3 matching=live · 1 mismatch=recent-mismatch» · «persisted writer rows flow through the shared reader…» — OP 가 원문·head 시험 존재 대조"}, {"finding": 2, "disposition": "already-fixed", "evidence": "warm-reuse-evidence.test.ts:56 «expired or corrupt rows cannot revive older warm matches» · :69 «corruption after recent passing rows invalidates the entire evidence window» · :83 «a corrupt recent mismatch row cannot restore the preceding three green samples» — 원문에서 corrupt (pass) 3"}]}, "summary": "OP waiver — r7 stale reopen · 정확 head node-b 원문 130/0 근거."}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr":33106,"headCommit":"972f31e4a3cab0dc62873f915f0c71a2882b6044","reviewed":true,"verdict":"pass","mustFix":[],"shouldFix":[],"reviewer":"OP-waiver","model":"none (OP adjudication)","waiver":{"by":"OP","approvedBy":"OP 2026-10-29 12:2x «0.2.41 재개 최적 경로» · 10:5x 웨이버 승인","adjudicates":"gpt-6.1-terra r6 on cc59ca7b (fail · mustFix 2 · shouldFix 1)","headTestRun":{"host":"node-b","sha":"972f31e4a3cab0dc62873f915f0c71a2882b6044","scope":"resume-release.test.ts 전체(apps/pwa/node_modules 부재 전·후 모두 · afterAll rmdirSync 경로 실제 통과)","pass":40,"fail":0,"reportedBy":"MK #51574"},"parentTestRun":{"host":"node-b","sha":"cc59ca7b1e264f4f23504d5523a32efbecf300b9","scope":"resume-release·release-branch·gate-autoheal·gate-shard-receipts 4 suite","pass":287,"fail":0,"expects":1677,"reportedBy":"MK #51494"},"diffChecked":"cc59ca7b→32646bb4: resume-release.ts +13/-5 · resume-release.test.ts +45/-? — 저장된 cutoff baseline 과 receipt base40 대조 · 부재/불일치 시 full(fail-closed) · OP 직접 대조 · 32646bb4→30001d64→972f31e4: 시험 파일만 — Pod checkout 의 apps/pwa/node_modules 부재(기존 28·새 3 실패 공통 원인 · 급행 게이트 123723) 를 빈 디렉터리 fixture 로 · 정리는 rmdirSync","mergeGate":"급행 열차 gate 가 착지 전 전체 반경 재측정","dispositions":[{"finding":1,"disposition":"fixed-in-this-head","evidence":"expectedBase40 = cutoff 노드 baseline.sha · 불일치/부재 → fail(full gate)"},{"finding":2,"disposition":"out-of-scope-followup","evidence":"Goodhart(합성 gate 출력 대신 실 graph 상태) → 0.2.42 GATE-MOCK-EVENT-SCENARIOS"},{"finding":3,"disposition":"fixed-in-this-head","evidence":"SIGTERM 시험이 완료 receipt 확인 뒤 중단"}],"expressGateFinding":"batch-minim5-express-123723 introduced 3 = 환경 원인(verifyResumePreflight 기본 commandRoot 의 apps/pwa/node_modules 부재) — 같은 파일 preexisting 28 과 동일 원인"},"summary":"OP waiver — 0.2.41 필수 GATE-RESUME-STALLED-ONLY."}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr": 33113, "headCommit": "3ab51f05968f926047a670d11c2afcca698df028", "reviewed": true, "verdict": "pass", "mustFix": [], "shouldFix": [], "reviewer": "OP-waiver", "model": "none (OP adjudication)", "waiver": {"by": "OP", "approvedBy": "OP 2026-10-29 10:5x «무한 리뷰 중단·웨이버» · identity 지적 r1·r2 반복", "adjudicates": "ux-coord-entrance-fold-terra-r2-33113-f5db480b56d5.json (fail · mustFix 2)", "headTestRun": {"host": "node-b", "sha": "3ab51f05968f926047a670d11c2afcca698df028", "tests": {"task-hand": "1/0", "coordinator-shadow": "9/0", "tick": "5/0"}, "exit": 0, "rawOutput": "~/elanous-hq/seat-state/UX/evidence/33113-3ab51f05968f-node-b.txt", "fileHashesMatchHead": 7}, "dispositions": [{"finding": 1, "disposition": "reviewer-misread-contract", "evidence": "칸 COORD-ENTRANCE-FOLD «조율자 그림자가 ④ builder 로 같은 칸·같은 지시서 3일 연속» — ④ builder 는 지시서를 «만드는» caller 단계(OP #51545·#51569 정의 · PR 본문 기록). recipient(--seat)는 받는 자리로 증거 행에만 남긴다. 리뷰어는 builder 4 를 «받는 쪽»으로 읽었다."}, {"finding": 2, "disposition": "fixed-in-this-head", "evidence": "coordinator-shadow.ts:120 그룹 키 = agent·cell·directive(recipient 제외) · :116-124 recipient 는 그룹 속성으로만 · recipient 없는 옛 행도 같은 그룹 — OP 가 head 코드 직접 대조"}]}, "summary": "OP waiver — 계약 오독 1 · 수리 확인 1."}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr":"33097","model":"gpt-6.1-terra","verdict":"fail","mustFix":["통합 head의 필수 수용 증거가 미완료다: 골 문서가 요구한 `bun test src/cli/pr-land-heavy-remote.test.ts src/task-orchestrator/surfaces/pod-warm-switch.test.ts`와 생산 호출 경로를 지나는 mock 무대의 명령·종료 코드·출력 원문이 없다. 장애 환경을 피한 판단은 타당하지만, node-b에서 실행해 일치 3건의 live, mismatch의 recent-mismatch, 착지당 판정 1줄과 기존 시험 통과를 확인해야 한다.","`readWarmReuseEvidence()`는 손상되거나 유효하지 않은 행을 조용히 제거한다. 최근 mismatch 행이 손상되면 그 앞의 성공 행들이 연속 표본으로 복원될 수 있어 fail-closed가 아니다. 손상된 창은 미측정으로 처리하고 회귀 시험을 추가하라."],"shouldFix":[],"requirements":["DELTA-FINDING 1: OPEN — 이번 delta에 필수 실행 결과와 출력 증거가 없다.","DELTA-FINDING 2: OPEN — 회귀 시험은 추가됐지만 구현 변경이나 시험 통과 증거는 없다.","관찰: 추가된 시험은 임시 디렉터리의 파일만 쓰고 정리한다. 실제 fail-closed 동작은 시험 실행 결과로 확인해야 한다."],"reviewed":true,"diffBudget":{"truncated":false,"shownChars":1645,"totalChars":1645,"omittedFiles":0},"referencedFilesOpened":false,"referencedFilesRead":0,"reviewInputChars":2488,"reviewDurationMs":6440,"basedOn":"10cd6c80fe8d036f7530fd373fcfffc1aa9be044","basedOnReview":"warm-land-evidence-terra-0241-r5-33097-10cd6c80fe8d.json","deltaFindings":[{"finding":"통합 head의 필수 수용 증거가 미완료다: 골 문서가 요구한 `bun test src/cli/pr-land-heavy-remote.test.ts src/task-orchestrator/surfaces/pod-warm-switch.test.ts`와 생산 호출 경로를 지나는 mock 무대의 명령·종료 코드·출력 원문이 없다. 장애 환경을 피한 판단은 타당하지만, node-b에서 실행해 일치 3건의 live, mismatch의 recent-mismatch, 착지당 판정 1줄과 기존 시험 통과를 확인해야 한다.","status":"open"},{"finding":"`readWarmReuseEvidence()`는 손상되거나 유효하지 않은 행을 조용히 제거한다. 최근 mismatch 행이 손상되면 그 앞의 성공 행들이 연속 표본으로 복원될 수 있어 fail-closed가 아니다. 손상된 창은 미측정으로 처리하고 회귀 시험을 추가하라.","status":"open"}],"excludedNewFindings":2,"deltaInputChars":2488,"deltaDurationMs":6440,"deltaEfficiency":{"inputRatio":0.8632893823733518,"timeRatio":0.9649385675756668,"maxRatio":0.3333333333333333,"withinTarget":false},"deltaOutcome":"reviewed","reviewRoute":"api","fallbackAttempted":false,"requestedModel":"gpt-6.1-terra","fallbackNotAttemptedReason":"primary-review-succeeded","skippedAcpFallbackBackends":[{"backend":"gemini","reason":"Confirmed live 2026-08-19 (first observed 2026-08-12): gemini-cli is rejected with IneligibleTierError (free-tier UNSUPPORTED_CLIENT). Antigravity CLI (agy) replaces it but does NOT speak ACP, so this ACP entry has no successor yet — use the PTY backend (--backend gemini) instead."}],"respondedProvider":"openai-codex","respondedModel":"gpt-6.1-terra","reviewerSource":"cli","headCommit":"1cc85900413cfcb2fdc427d4ca85c51fc0eb8358","currentHeadCommit":"1cc85900413cfcb2fdc427d4ca85c51fc0eb8358","stale":false,"refetched":false,"diffSource":"sha-pinned","diffBaseCommit":"10cd6c80fe8d036f7530fd373fcfffc1aa9be044","localHeadComparison":"unavailable","localHead":"59018b9bd0d74574b50bdf4880373756335758a8","prHead":"1cc85900413cfcb2fdc427d4ca85c51fc0eb8358","localHeadComparisonReason":"detached-head","reviewerContextLoaded":0,"reviewerContextFailed":0,"reviewerContextFailures":[],"reviewerContextSource":"pr-diff-files","reviewerContextSourcePaths":[],"decompositionContextStatus":"absent","findingPathHeadChecks":[],"pathWarnings":[],"evidence":"saved-review-delta","prDiffFiles":1}
|
|
@@ -201,6 +201,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
201
201
|
"chain-step-failed",
|
|
202
202
|
"change",
|
|
203
203
|
"chat-error",
|
|
204
|
+
"chat-history-compacted",
|
|
204
205
|
"chat-input-consumed",
|
|
205
206
|
"chat-main",
|
|
206
207
|
"chat-main.await",
|
|
@@ -1075,6 +1076,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1075
1076
|
"read-error",
|
|
1076
1077
|
"read.path-resolved",
|
|
1077
1078
|
"readiness-threw",
|
|
1079
|
+
"readonly-tool-repeat-suppressed",
|
|
1078
1080
|
"ready",
|
|
1079
1081
|
"ready.timeout",
|
|
1080
1082
|
"rebuild",
|
|
@@ -1140,6 +1142,9 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1140
1142
|
"reply.tts.ok",
|
|
1141
1143
|
"request",
|
|
1142
1144
|
"request-received",
|
|
1145
|
+
"request-size",
|
|
1146
|
+
"request-size-compact",
|
|
1147
|
+
"request-size-compact-error",
|
|
1143
1148
|
"request-watch-fail",
|
|
1144
1149
|
"request.error",
|
|
1145
1150
|
"request.out",
|
package/src/cli/mcp-login.ts
CHANGED
|
@@ -11,6 +11,8 @@ import {
|
|
|
11
11
|
prepareMcpOAuthAuthorization,
|
|
12
12
|
authorizeMcpDevice,
|
|
13
13
|
type McpOAuthFetch,
|
|
14
|
+
type AuthorizationServerMetadata,
|
|
15
|
+
type ProtectedResourceMetadata,
|
|
14
16
|
} from '../mcp/mcp-oauth.js';
|
|
15
17
|
import { parseWwwAuthenticate } from '../mcp/client.js';
|
|
16
18
|
import { debug } from '../debug/log.js';
|
|
@@ -129,6 +131,7 @@ export async function runMcpLogin(opts: McpLoginOpts): Promise<McpLoginResult> {
|
|
|
129
131
|
early: callbackListener,
|
|
130
132
|
serverId: opts.serverId,
|
|
131
133
|
resourceMetadataUrl: challenge.resourceMetadata,
|
|
134
|
+
discovered,
|
|
132
135
|
...(challenge.scope ? { scope: challenge.scope } : {}),
|
|
133
136
|
resourceUrl: spec.url,
|
|
134
137
|
...oauthOpts,
|
|
@@ -245,6 +248,7 @@ function loginFailureStage(error: unknown): 'authorization' | 'token' | 'login'
|
|
|
245
248
|
async function openLoginListener(opts: {
|
|
246
249
|
serverId: string;
|
|
247
250
|
resourceMetadataUrl: string;
|
|
251
|
+
discovered: { resource: ProtectedResourceMetadata; metadata: AuthorizationServerMetadata };
|
|
248
252
|
scope?: string;
|
|
249
253
|
resourceUrl: string;
|
|
250
254
|
fetch?: McpOAuthFetch;
|
|
@@ -253,13 +257,14 @@ async function openLoginListener(opts: {
|
|
|
253
257
|
onListener?: (server: Server) => void;
|
|
254
258
|
early: Awaited<ReturnType<typeof listenForCallback>>;
|
|
255
259
|
}): Promise<{ listener: Awaited<ReturnType<typeof listenForCallback>>; authorization: Awaited<ReturnType<typeof prepareMcpOAuthAuthorization>> }> {
|
|
256
|
-
const prior =
|
|
260
|
+
const prior = loadStoredRegistration(opts.discovered.metadata.issuer, opts);
|
|
257
261
|
const preferred = loopbackRedirectPort(prior?.redirectUri);
|
|
258
262
|
if (preferred === null && (prior === null || prior.redirectUri)) {
|
|
259
263
|
const listener = opts.early;
|
|
260
264
|
debug.log('mcp.login', 'callback-port', { serverId: opts.serverId, source: 'fresh' });
|
|
261
265
|
const authorization = await prepareMcpOAuthAuthorization({
|
|
262
266
|
resourceMetadataUrl: opts.resourceMetadataUrl,
|
|
267
|
+
discovered: opts.discovered,
|
|
263
268
|
scope: opts.scope,
|
|
264
269
|
redirectUri: listener.redirectUri,
|
|
265
270
|
resourceUrl: opts.resourceUrl,
|
|
@@ -276,6 +281,7 @@ async function openLoginListener(opts: {
|
|
|
276
281
|
debug.log('mcp.login', 'callback-port', { serverId: opts.serverId, source: 'registered' });
|
|
277
282
|
const authorization = await prepareMcpOAuthAuthorization({
|
|
278
283
|
resourceMetadataUrl: opts.resourceMetadataUrl,
|
|
284
|
+
discovered: opts.discovered,
|
|
279
285
|
scope: opts.scope,
|
|
280
286
|
redirectUri: listener.redirectUri,
|
|
281
287
|
resourceUrl: opts.resourceUrl,
|
|
@@ -296,6 +302,7 @@ async function openLoginListener(opts: {
|
|
|
296
302
|
});
|
|
297
303
|
const authorization = await prepareMcpOAuthAuthorization({
|
|
298
304
|
resourceMetadataUrl: opts.resourceMetadataUrl,
|
|
305
|
+
discovered: opts.discovered,
|
|
299
306
|
scope: opts.scope,
|
|
300
307
|
redirectUri: listener.redirectUri,
|
|
301
308
|
resourceUrl: opts.resourceUrl,
|
|
@@ -306,23 +313,6 @@ async function openLoginListener(opts: {
|
|
|
306
313
|
return { listener, authorization };
|
|
307
314
|
}
|
|
308
315
|
|
|
309
|
-
async function priorRegistration(opts: {
|
|
310
|
-
resourceMetadataUrl: string;
|
|
311
|
-
resourceUrl: string;
|
|
312
|
-
fetch?: McpOAuthFetch;
|
|
313
|
-
storePath?: string;
|
|
314
|
-
}): Promise<ReturnType<typeof loadStoredRegistration>> {
|
|
315
|
-
try {
|
|
316
|
-
const discovered = await discoverMcpOAuth(opts.resourceMetadataUrl, {
|
|
317
|
-
resourceUrl: opts.resourceUrl,
|
|
318
|
-
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
319
|
-
});
|
|
320
|
-
return loadStoredRegistration(discovered.metadata.issuer, opts);
|
|
321
|
-
} catch {
|
|
322
|
-
return null;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
316
|
function isAddressInUse(error: unknown): boolean {
|
|
327
317
|
return Boolean(error && typeof error === 'object' && 'code' in error && (error as { code: unknown }).code === 'EADDRINUSE');
|
|
328
318
|
}
|
package/src/cli/msg-cli.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
+
import { mkdirSync } from 'node:fs';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
2
4
|
import { ensureAuthToken } from '../auth/acp-token.js';
|
|
3
5
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
4
6
|
import { canonicalSeatId, openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
|
|
5
7
|
import { clearPostOffice, ensurePostOffice, writePostOffice } from '../msg/msg-post-office.js';
|
|
8
|
+
import { acquireLockSync } from '../storage/file-lock.js';
|
|
9
|
+
import { GitHubMsgMirrorTransport } from '../msg/msg-mirror-github.js';
|
|
10
|
+
import { configuredMirrorTarget, runMsgMirrorTick, type MirrorTarget, type MsgMirrorStateStore, type MsgMirrorTransport } from '../msg/msg-mirror-runner.js';
|
|
11
|
+
import { JsonMsgMirrorStateStore } from '../msg/msg-mirror-state.js';
|
|
6
12
|
import { startMsgSseServer } from '../msg/msg-sse-server.js';
|
|
13
|
+
import { debug } from '../debug/log.js';
|
|
7
14
|
import type { AgentReplyAddress, AgentReplyInput, AgentReplyResult } from '../loops/agent-reply.js';
|
|
8
15
|
import { messageRouteFor, noReplyBodyNotice, unsupportedLoopAddressNotice } from '../loops/msg-address.js';
|
|
9
16
|
import { resolveWake, wakeRecipient, type WakeDeps, type WakeOutcome } from '../loops/msg-wake.js';
|
|
10
|
-
import type
|
|
17
|
+
import { getUserConfig, type RoleLlmSpec } from '../user-config.js';
|
|
11
18
|
|
|
12
19
|
/** The loop rows whose reply body is an LLM agent: `--agent-reply` picks one of these. */
|
|
13
20
|
const AGENT_REPLY_ROLES = { COORDINATOR: 'coordinator', GUARDIAN: 'guardian' } as const;
|
|
@@ -22,6 +29,9 @@ export interface MsgCliDeps {
|
|
|
22
29
|
signal?: AbortSignal;
|
|
23
30
|
fetch?: typeof fetch;
|
|
24
31
|
authToken?: () => string;
|
|
32
|
+
mirrorTarget?: MirrorTarget | null;
|
|
33
|
+
mirrorState?: MsgMirrorStateStore;
|
|
34
|
+
mirrorTransport?: MsgMirrorTransport;
|
|
25
35
|
/** Wake-path resolution for `msg route` (tests inject; default reads pty manifest ⊕ seat folders). */
|
|
26
36
|
wakeDeps?: WakeDeps;
|
|
27
37
|
/** Attach the logs.db sink so `msg.wake` reaches `elanous logs` (a short CLI otherwise writes only the file trail). */
|
|
@@ -198,6 +208,52 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
198
208
|
if (address !== to) throw new Error(`--agent-reply ${address} requires --to ${address}`);
|
|
199
209
|
};
|
|
200
210
|
|
|
211
|
+
msg.command('mirror').description('Mirror selected seat messages to the configured GitHub issue')
|
|
212
|
+
.option('--dry-run', 'read the configured channel and ledger without writing')
|
|
213
|
+
.option('--watch', 'repeat until interrupted')
|
|
214
|
+
.option('--interval <seconds>', 'poll interval in watch mode (default 60)', '60')
|
|
215
|
+
.option('--json')
|
|
216
|
+
.action((opts: CommonOptions & { dryRun?: boolean; watch?: boolean; interval?: string }) => run(async () => {
|
|
217
|
+
const intervalSeconds = integer(opts.interval, '--interval', 60, 1, 3600);
|
|
218
|
+
const state = deps.mirrorState ?? new JsonMsgMirrorStateStore();
|
|
219
|
+
const configTarget = deps.mirrorTarget === undefined
|
|
220
|
+
? configuredMirrorTarget(getUserConfig().raw.msgMirror) : deps.mirrorTarget ?? undefined;
|
|
221
|
+
const existingState = state.read();
|
|
222
|
+
if (!configTarget && !existingState) {
|
|
223
|
+
const result = { status: 'disabled', reason: 'msgMirror.target is not configured', target: null };
|
|
224
|
+
debug.log('msg.mirror', 'disabled', result);
|
|
225
|
+
out.log(opts.json ? JSON.stringify(result) : 'msg mirror 비활성: msgMirror.target 미설정');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const store = openRead();
|
|
229
|
+
const transport = deps.mirrorTransport ?? new GitHubMsgMirrorTransport();
|
|
230
|
+
const signal = deps.signal;
|
|
231
|
+
try {
|
|
232
|
+
do {
|
|
233
|
+
let release = () => {};
|
|
234
|
+
if (state instanceof JsonMsgMirrorStateStore) {
|
|
235
|
+
mkdirSync(dirname(state.path), { recursive: true, mode: 0o700 });
|
|
236
|
+
release = acquireLockSync(`${state.path}.lock`, { breakDeadHolder: true });
|
|
237
|
+
}
|
|
238
|
+
let result: Awaited<ReturnType<typeof runMsgMirrorTick>>;
|
|
239
|
+
try {
|
|
240
|
+
result = await runMsgMirrorTick({
|
|
241
|
+
...(configTarget ? { configuredTarget: configTarget } : {}),
|
|
242
|
+
...(opts.dryRun ? { dryRun: true } : {}),
|
|
243
|
+
source: { listAfter: (after, limit) => store.listAfter(after, limit),
|
|
244
|
+
listWindow: (start, end) => store.listCreatedBetween(start, end), latestId: () => store.latestId() },
|
|
245
|
+
state, transport,
|
|
246
|
+
});
|
|
247
|
+
} finally { release(); }
|
|
248
|
+
debug.log('msg.mirror', 'tick', result);
|
|
249
|
+
out.log(opts.json ? JSON.stringify(result)
|
|
250
|
+
: `msg mirror ${result.status} · scanned ${result.scanned} · posted ${result.posted} · rotated ${result.rotated} · summaries ${result.summaries}`);
|
|
251
|
+
if (!opts.watch || signal?.aborted) break;
|
|
252
|
+
await sleep(intervalSeconds * 1000);
|
|
253
|
+
} while (!signal?.aborted);
|
|
254
|
+
} finally { store.close(); }
|
|
255
|
+
})());
|
|
256
|
+
|
|
201
257
|
/**
|
|
202
258
|
* Human-free live conversation: the selected address's LLM body answers the message that was just saved.
|
|
203
259
|
* The durable ledger stays authoritative — `replyWithAgent` owns the one-reply-per-request transaction and
|
|
@@ -6,12 +6,12 @@ import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
|
6
6
|
import { getUserConfig } from '../user-config.js';
|
|
7
7
|
import { debug, redactSecretText } from '../debug/log.js';
|
|
8
8
|
import { gateRemoteHostCap, realGateRemoteRunner, resolveGateRemoteSettings, runOnRemote, type GateRemoteRunner, type RemoteRunOutcome } from '../self-implement/gate-remote.js';
|
|
9
|
+
import { decideWarmReuse, type WarmReuseEvidenceByConsumer, type WarmReuseSwitchConfig } from '../task-orchestrator/surfaces/pod-warm-switch.js';
|
|
10
|
+
import { buildLandWarmEvidence, type LandShadowSampleWindow } from './pr-land-pod-shadow-job.js';
|
|
9
11
|
|
|
10
12
|
const SHA = /^[0-9a-f]{40}$/i;
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// allowlisted as the third slot while node-b/node-c keep discovery order — the recorded host order stays part of the
|
|
14
|
-
// evidence contract.
|
|
13
|
+
// This is the stable fallback order when settings.host is unavailable; an explicitly configured allowlisted host
|
|
14
|
+
// always leads, and the remaining allowlisted hosts retain their relative order.
|
|
15
15
|
export const PR_LAND_HEAVY_HOSTS = ['node-b', 'node-c', 'host-e-wsl'] as const;
|
|
16
16
|
export const PR_LAND_HEAVY_HOST = PR_LAND_HEAVY_HOSTS[0];
|
|
17
17
|
export type PrLandHeavyHost = typeof PR_LAND_HEAVY_HOSTS[number];
|
|
@@ -68,20 +68,33 @@ export interface HeavyRemoteDeps {
|
|
|
68
68
|
/** Test seam — same cadence as self gate (`dispatchHeavyCheck`): sleep at most 15s while a host stays busy. */
|
|
69
69
|
sleep?: (ms: number) => void;
|
|
70
70
|
observe?: (event: string, data: Record<string, unknown>) => void;
|
|
71
|
+
/** WARM-REUSE-LAND-CONSUMER-WIRE — land warm 재사용 config seam(기본은 `getUserConfig().pod?.warmReuse`). */
|
|
72
|
+
warmReuseConfig?: () => WarmReuseSwitchConfig | undefined;
|
|
73
|
+
/** WARM-REUSE-LAND-CONSUMER-WIRE — land shadow Job 결과 창 seam(기본 없음 = 증거 없음 = off). */
|
|
74
|
+
landShadowSamples?: () => LandShadowSampleWindow | undefined;
|
|
71
75
|
}
|
|
72
76
|
|
|
73
77
|
function evidencePath(input: HeavyRemoteInput): string {
|
|
74
78
|
return join(input.evidenceDir ?? join(effectiveInstanceRoot(), 'pr-land-heavy-results'), `${input.pr}.json`);
|
|
75
79
|
}
|
|
76
80
|
|
|
81
|
+
function validRootPlan(value: unknown): value is RootPlanSummary | null {
|
|
82
|
+
if (value === null) return true;
|
|
83
|
+
if (!value || typeof value !== 'object') return false;
|
|
84
|
+
const plan = value as Partial<RootPlanSummary>;
|
|
85
|
+
return (plan.mode === 'affected' || plan.mode === 'full')
|
|
86
|
+
&& (plan.roots === null || (Number.isSafeInteger(plan.roots) && plan.roots >= 0))
|
|
87
|
+
&& typeof plan.promoted === 'boolean'
|
|
88
|
+
&& (plan.reason === null || typeof plan.reason === 'string');
|
|
89
|
+
}
|
|
90
|
+
|
|
77
91
|
function matchingEvidence(path: string, input: HeavyRemoteInput): HeavyRemoteEvidence | null {
|
|
78
92
|
if (!existsSync(path)) return null;
|
|
79
93
|
try {
|
|
80
94
|
const data: HeavyRemoteEvidence = JSON.parse(readFileSync(path, 'utf8'));
|
|
81
95
|
return data.schema === 2 && data.pr === input.pr && data.head === input.head
|
|
82
96
|
&& data.main === input.main && allowedHost(data.host) && Number.isFinite(data.elapsedMs)
|
|
83
|
-
&& typeof data.interferenceMeasured === 'boolean'
|
|
84
|
-
&& (data.rootPlan === null || (data.rootPlan?.mode === 'affected' || data.rootPlan?.mode === 'full')) ? data : null;
|
|
97
|
+
&& typeof data.interferenceMeasured === 'boolean' && validRootPlan(data.rootPlan) ? data : null;
|
|
85
98
|
} catch { return null; }
|
|
86
99
|
}
|
|
87
100
|
|
|
@@ -202,6 +215,32 @@ export function ensurePrLandHeavyRemote(input: HeavyRemoteInput, deps: HeavyRemo
|
|
|
202
215
|
if (!Number.isSafeInteger(input.pr) || input.pr <= 0 || !SHA.test(input.head) || !SHA.test(input.main)) {
|
|
203
216
|
return { ok: false, source: 'unmeasured', reason: 'invalid-pr-head-or-main', elapsedMs: 0, evidencePath: path };
|
|
204
217
|
}
|
|
218
|
+
// WARM-REUSE-LAND-CONSUMER-WIRE — 무거운 착지 판정마다 land 소비자 판정을 1줄 남긴다(pod.warm/switch-decision).
|
|
219
|
+
// 판정은 그림자 전용이다: live 여부와 무관하게 원격 게이트는 기존(fresh) 경로를 그대로 간다.
|
|
220
|
+
// 증거는 land shadow Job 결과 창(주입 seam · 기본 없음=증거 없음=off)에서 만들고, 판정 실패는 착지를 깨지 않는다.
|
|
221
|
+
let warmConfig: WarmReuseSwitchConfig | undefined;
|
|
222
|
+
let warmEvidence: WarmReuseEvidenceByConsumer | undefined;
|
|
223
|
+
let warmStage: 'config' | 'evidence' = 'config';
|
|
224
|
+
try {
|
|
225
|
+
warmConfig = deps.warmReuseConfig?.() ?? getUserConfig().pod?.warmReuse;
|
|
226
|
+
} catch (error) {
|
|
227
|
+
debug.log('pod.warm', 'land-shadow-unavailable', {
|
|
228
|
+
pr: input.pr, stage: warmStage,
|
|
229
|
+
reason: `warm-${warmStage}-read-failed`,
|
|
230
|
+
detail: error instanceof Error ? error.message : String(error), execution: 'fresh-gate',
|
|
231
|
+
}, { level: 'warn' });
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
warmStage = 'evidence';
|
|
235
|
+
warmEvidence = buildLandWarmEvidence(deps.landShadowSamples?.(), { head: input.head, main: input.main });
|
|
236
|
+
} catch (error) {
|
|
237
|
+
debug.log('pod.warm', 'land-shadow-unavailable', {
|
|
238
|
+
pr: input.pr, stage: warmStage, reason: 'warm-evidence-read-failed',
|
|
239
|
+
detail: error instanceof Error ? error.message : String(error), execution: 'fresh-gate',
|
|
240
|
+
}, { level: 'warn' });
|
|
241
|
+
}
|
|
242
|
+
// Read failures leave config/evidence absent, but every valid landing still emits one fail-closed decision.
|
|
243
|
+
decideWarmReuse('land', warmConfig, warmEvidence);
|
|
205
244
|
// A cached success is still a landing claim; accept only a measured host in the landing allowlist.
|
|
206
245
|
const settings = deps.settings ?? resolveGateRemoteSettings(getUserConfig().gateRemote);
|
|
207
246
|
if (!allowedHost(settings.host)) {
|
|
@@ -214,9 +253,8 @@ export function ensurePrLandHeavyRemote(input: HeavyRemoteInput, deps: HeavyRemo
|
|
|
214
253
|
const started = now();
|
|
215
254
|
const deadline = started + settings.slotWaitSeconds * 1000;
|
|
216
255
|
let outcome: RemoteRunOutcome = { kind: 'busy' };
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
const hosts = [primaryHost, ...PR_LAND_HEAVY_HOSTS.filter((candidate) => candidate !== primaryHost)];
|
|
256
|
+
let selectedHost: PrLandHeavyHost = PR_LAND_HEAVY_HOSTS[0];
|
|
257
|
+
const hosts: readonly PrLandHeavyHost[] = [settings.host, ...PR_LAND_HEAVY_HOSTS.filter((host) => host !== settings.host)];
|
|
220
258
|
wait: for (;;) {
|
|
221
259
|
for (const host of hosts) {
|
|
222
260
|
selectedHost = host;
|
|
@@ -119,6 +119,17 @@ function checkSelectedReviewAttempts(input: VerifyOverlapEvidenceInput, e: Parti
|
|
|
119
119
|
let selectedRecord: Record<string, unknown> | undefined;
|
|
120
120
|
try { selectedRecord = lastReviewRecord(input.readFile(selected)); } catch { return { ok: false, reason: 'review-unreadable' }; }
|
|
121
121
|
const hasResolvedPrior = hasResolvedPriorDeclaration(selectedRecord);
|
|
122
|
+
if (selectedRecord?.reviewer === 'OP-waiver') {
|
|
123
|
+
const waiver = validOpWaiver(selectedRecord, input.pr, selectedHead);
|
|
124
|
+
if (!waiver.ok) return { ok: false, reason: waiver.reason };
|
|
125
|
+
const linkedSameHeadFailure = candidates.some((path) => {
|
|
126
|
+
if (path === selected || !adjudicatesReviewFile(waiver.adjudicates, path)) return false;
|
|
127
|
+
const failed = checkReview(input, { reviewResult: path }, selectedHead);
|
|
128
|
+
return !failed.ok && /^review-(?:verdict-fail|must-fix-[1-9][0-9]*)$/.test(failed.reason)
|
|
129
|
+
&& reviewAttemptHasExactSameHeadFail(input, path, selectedHead);
|
|
130
|
+
});
|
|
131
|
+
if (!linkedSameHeadFailure) return { ok: false, reason: 'review-op-waiver-same-head-failure-missing' };
|
|
132
|
+
}
|
|
122
133
|
if (entries?.length || hasResolvedPrior) {
|
|
123
134
|
try { selectedTime = input.reviewMtime(selected); } catch { return { ok: false, reason: 'review-attempt-time-unmeasured' }; }
|
|
124
135
|
if (!Number.isFinite(selectedTime)) return { ok: false, reason: 'review-attempt-time-unmeasured' };
|
|
@@ -196,8 +207,77 @@ function lastReviewRecord(text: string): Record<string, unknown> | undefined {
|
|
|
196
207
|
return undefined;
|
|
197
208
|
}
|
|
198
209
|
|
|
210
|
+
const OP_WAIVER_DISPOSITIONS = new Set(['already-fixed', 'out-of-scope-followup', 'reviewer-error']);
|
|
211
|
+
|
|
212
|
+
function canonicalWaiverDisposition(value: unknown): string | undefined {
|
|
213
|
+
if (typeof value !== 'string') return undefined;
|
|
214
|
+
if (OP_WAIVER_DISPOSITIONS.has(value)) return value;
|
|
215
|
+
// These labels occur in OP's saved, approved adjudications; accept only their
|
|
216
|
+
// narrow semantic aliases while new decisions use the canonical vocabulary.
|
|
217
|
+
if (value === 'fixed-in-this-head') return 'already-fixed';
|
|
218
|
+
if (value === 'evidence-provided' || value === 'reviewer-misread-contract') return 'reviewer-error';
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function opWaiverTestResult(value: unknown, head: string): boolean {
|
|
223
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
|
|
224
|
+
const run = value as Record<string, unknown>;
|
|
225
|
+
if (typeof run.sha !== 'string' || run.sha.toLowerCase() !== head || (run.exit !== undefined && run.exit !== 0)) return false;
|
|
226
|
+
const hasRunDescription = ['command', 'scope', 'rawOutput'].some((key) => typeof run[key] === 'string' && (run[key] as string).trim());
|
|
227
|
+
if (!hasRunDescription) return false;
|
|
228
|
+
let pass = typeof run.pass === 'number' && Number.isSafeInteger(run.pass) ? run.pass : undefined;
|
|
229
|
+
let fail = typeof run.fail === 'number' && Number.isSafeInteger(run.fail) ? run.fail : undefined;
|
|
230
|
+
if ((pass === undefined || fail === undefined) && run.tests && typeof run.tests === 'object' && !Array.isArray(run.tests)) {
|
|
231
|
+
const rows = Object.values(run.tests as Record<string, unknown>);
|
|
232
|
+
const parsed = rows.map((row) => typeof row === 'string' ? /^(\d+)\/(\d+)$/.exec(row) : null);
|
|
233
|
+
if (rows.length > 0 && parsed.every(Boolean)) {
|
|
234
|
+
pass = parsed.reduce((sum, row) => sum + Number(row![1]), 0);
|
|
235
|
+
fail = parsed.reduce((sum, row) => sum + Number(row![2]), 0);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return pass !== undefined && pass > 0 && fail === 0;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function validOpWaiver(record: Record<string, unknown> | undefined, pr: number, head: string):
|
|
242
|
+
| { ok: true; adjudicates: string; findingCount: number }
|
|
243
|
+
| { ok: false; reason: string } {
|
|
244
|
+
if (!record || record.reviewer !== 'OP-waiver') return { ok: false, reason: 'review-op-waiver-reviewer' };
|
|
245
|
+
const waiver = record.waiver;
|
|
246
|
+
if (!waiver || typeof waiver !== 'object' || Array.isArray(waiver)) return { ok: false, reason: 'review-op-waiver-missing' };
|
|
247
|
+
const value = waiver as Record<string, unknown>;
|
|
248
|
+
if (value.by !== 'OP' || typeof value.approvedBy !== 'string' || !value.approvedBy.trim()) {
|
|
249
|
+
return { ok: false, reason: 'review-op-waiver-approval-missing' };
|
|
250
|
+
}
|
|
251
|
+
if (typeof value.adjudicates !== 'string' || !value.adjudicates.trim()) return { ok: false, reason: 'review-op-waiver-adjudication-missing' };
|
|
252
|
+
if (!opWaiverTestResult(value.headTestRun, head)) return { ok: false, reason: 'review-op-waiver-head-test-missing' };
|
|
253
|
+
if (!Array.isArray(value.dispositions) || value.dispositions.length === 0) return { ok: false, reason: 'review-op-waiver-dispositions-missing' };
|
|
254
|
+
const findings = new Set<number>();
|
|
255
|
+
for (const raw of value.dispositions) {
|
|
256
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return { ok: false, reason: 'review-op-waiver-disposition-invalid' };
|
|
257
|
+
const item = raw as Record<string, unknown>;
|
|
258
|
+
if (!Number.isSafeInteger(item.finding) || (item.finding as number) < 1 || findings.has(item.finding as number)
|
|
259
|
+
|| !canonicalWaiverDisposition(item.disposition)
|
|
260
|
+
|| typeof item.evidence !== 'string' || !item.evidence.trim()) return { ok: false, reason: 'review-op-waiver-disposition-invalid' };
|
|
261
|
+
if (canonicalWaiverDisposition(item.disposition) === 'out-of-scope-followup'
|
|
262
|
+
&& !/(?:#[1-9]\d*|\b[A-Z][A-Z0-9]+(?:-[A-Z0-9]+)+\b)/.test(item.evidence)) {
|
|
263
|
+
return { ok: false, reason: 'review-op-waiver-followup-missing' };
|
|
264
|
+
}
|
|
265
|
+
findings.add(item.finding as number);
|
|
266
|
+
}
|
|
267
|
+
const ordered = [...findings].sort((a, b) => a - b);
|
|
268
|
+
if (ordered.some((finding, index) => finding !== index + 1)) return { ok: false, reason: 'review-op-waiver-findings-incomplete' };
|
|
269
|
+
const recordPr = typeof record.pr === 'number' ? record.pr : Number(record.pr);
|
|
270
|
+
if (!Number.isSafeInteger(recordPr) || recordPr !== pr) return { ok: false, reason: 'review-op-waiver-pr-mismatch' };
|
|
271
|
+
return { ok: true, adjudicates: value.adjudicates, findingCount: findings.size };
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function adjudicatesReviewFile(adjudicates: string, path: string): boolean {
|
|
275
|
+
return adjudicates.split(/[\s,;()]+/).includes(basename(path));
|
|
276
|
+
}
|
|
277
|
+
|
|
199
278
|
function hasResolvedPriorDeclaration(review: Record<string, unknown> | undefined): boolean {
|
|
200
279
|
if (!review) return false;
|
|
280
|
+
if (review.reviewer === 'OP-waiver' && review.waiver && typeof review.waiver === 'object' && !Array.isArray(review.waiver)) return true;
|
|
201
281
|
const value = review.resolvedPrior;
|
|
202
282
|
if (value === true) return true;
|
|
203
283
|
if (Array.isArray(value) && value.length > 0) return true;
|
|
@@ -250,12 +330,18 @@ function reviewAttemptExplicitlyResolved(input: VerifyOverlapEvidenceInput, sele
|
|
|
250
330
|
let failed: Record<string, unknown> | undefined;
|
|
251
331
|
try { failed = lastReviewRecord(input.readFile(failedPath)); } catch { return false; }
|
|
252
332
|
if (!failed || failed.pr === undefined || String(failed.pr) !== String(input.pr)
|
|
253
|
-
||
|
|
333
|
+
|| typeof failed.headCommit !== 'string' || failed.headCommit.toLowerCase() !== head
|
|
254
334
|
|| (typeof failed.currentHeadCommit === 'string' && failed.currentHeadCommit.toLowerCase() !== head)) return false;
|
|
255
335
|
const rawFindings = findingList(failed.mustFix).map((finding) => finding.trim());
|
|
256
336
|
const findings = rawFindings.map(normalizedFinding);
|
|
257
337
|
if (findings.length === 0) return false;
|
|
258
338
|
|
|
339
|
+
const waiver = validOpWaiver(selected, input.pr, head);
|
|
340
|
+
if (waiver.ok) {
|
|
341
|
+
if (failed.reviewed !== true || failed.verdict !== 'fail' || rawFindings.length === 0) return false;
|
|
342
|
+
return adjudicatesReviewFile(waiver.adjudicates, failedPath) && waiver.findingCount === rawFindings.length;
|
|
343
|
+
}
|
|
344
|
+
|
|
259
345
|
const declared = selected.resolvedPrior;
|
|
260
346
|
if (declared !== undefined && declared !== false && containsUnresolvedDeclaration(declared)) return false;
|
|
261
347
|
const intentBlocks = [selected.intent, selected.intentBlock, selected.reviewIntent, selected.reviewIntentBlock]
|
|
@@ -327,6 +413,15 @@ function reviewAttemptExplicitlyResolved(input: VerifyOverlapEvidenceInput, sele
|
|
|
327
413
|
return findings.every((finding) => resolvedSet.has(finding));
|
|
328
414
|
}
|
|
329
415
|
|
|
416
|
+
function reviewAttemptHasExactSameHeadFail(input: VerifyOverlapEvidenceInput, failedPath: string, head: string): boolean {
|
|
417
|
+
let failed: Record<string, unknown> | undefined;
|
|
418
|
+
try { failed = lastReviewRecord(input.readFile(failedPath)); } catch { return false; }
|
|
419
|
+
return Boolean(failed && failed.pr !== undefined && String(failed.pr) === String(input.pr)
|
|
420
|
+
&& failed.reviewed === true && failed.verdict === 'fail'
|
|
421
|
+
&& typeof failed.headCommit === 'string' && failed.headCommit.toLowerCase() === head
|
|
422
|
+
&& findingList(failed.mustFix).length > 0);
|
|
423
|
+
}
|
|
424
|
+
|
|
330
425
|
type Checked = { ok: false; reason: string; baseTip?: string; gateBase?: string; windowCommits?: number }
|
|
331
426
|
| (OverlapEvidenceVerdict & { ok: true; baseTip?: string });
|
|
332
427
|
|
|
@@ -359,6 +454,10 @@ function checkReview(input: Pick<VerifyOverlapEvidenceInput, 'pr' | 'readFile'>
|
|
|
359
454
|
// The capture parser projects away model provenance; inspect the same last result-shaped line here.
|
|
360
455
|
const raw = lastReviewRecord(text);
|
|
361
456
|
if (raw) {
|
|
457
|
+
if (raw.reviewer === 'OP-waiver') {
|
|
458
|
+
const waiver = validOpWaiver(raw, input.pr, head);
|
|
459
|
+
if (!waiver.ok) return { ok: false, reason: waiver.reason, baseTip };
|
|
460
|
+
}
|
|
362
461
|
const actualBackend = typeof raw.actualBackend === 'string' ? raw.actualBackend.trim().toLowerCase() : '';
|
|
363
462
|
const model = typeof raw.model === 'string' ? raw.model.trim().toLowerCase() : '';
|
|
364
463
|
const route = typeof raw.reviewRoute === 'string' ? raw.reviewRoute.trim().toLowerCase() : '';
|