elanous 0.2.36 → 0.2.38
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/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 1026-44010f405704050c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 1632.7d87f998e714bede.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
- package/apps/pwa/out/_next/static/chunks/{7784.1f0ac4a16d190cf4.js → 2104.70e086d5174a4736.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6566.926a1d1b7c911442.js → 214.186a430da28338f1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 2415.738b777642a02233.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 3086.fb14b60ce98b53d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3148-98efd4869d660a87.js → 3124-561f7f037943cde2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 3291.f6c1005387d514bd.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 3528.e4b8ab70d339f965.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3031-85328a92fcce4da6.js → 4199-f7c6eb40cd0322f8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +90 -0
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
- package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 5307.d7328020227880c2.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5638.107314dc479e2f37.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6925.562d532110879886.js → 6493.27ad77de7aac7966.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 7161-8f22db3ec5ed005e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 7488.966b116789f3d41a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4116.a84a92a2492c080e.js → 7524.ce973525d30b3d52.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 7628.6b16863ac3972333.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 7954.4f7a8832663ee979.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 8019.21ca554a821dad01.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 8487.291666583bebe640.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 8879.ac06755bcf3e44a1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 8911.bf5e712acb25fb6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 8994d93e.33ba491f95345fc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{599.c39c571b6733f2a2.js → 9223.cbcc88e0e9950426.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8037.e254fd797aa224d1.js → 9581.da63ddf41acfad46.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-e7abc34a48a6f71e.js → page-291ab19fe2acb173.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-c15958835534404b.js → page-6b140f77593576eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → b7459770.6539b11860eb8a9c.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → b7478fef.5917716286213fcc.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{2812ca6a.3b9f4a7a08885744.js → de8b930d.d94c0f42acf807fc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → eaad0cba.771200940c529df7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
- package/apps/pwa/out/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
- 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 +23 -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/graphs/drafts/recipes.yaml +27 -7
- package/graphs/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/graphs/work/draft-close.yaml +54 -0
- package/graphs/work/green-close.yaml +37 -0
- package/graphs/work/recipes.yaml +46 -1
- package/graphs/work/run-research.yaml +35 -0
- package/package.json +1 -1
- package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/boundary-proof-mapping-audit.ts +88 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/codex-fallback-live-probe.ts +17 -15
- package/scripts/fleet/node-setup.sh +32 -2
- package/scripts/fleet/run-light-worker.sh +9 -0
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +546 -0
- package/scripts/goals/authoring-metrics.ts +258 -0
- package/scripts/graph-units/draft-close-node.ts +222 -0
- package/scripts/hook-order-sweep.ts +7 -4
- package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
- package/scripts/land-global-checks.ts +69 -1
- package/scripts/measure-nl-routing-corpus.ts +207 -2
- package/scripts/provision-export-redactions.ts +15 -0
- package/scripts/public-copy-lint.ts +122 -0
- package/scripts/public-export.ts +69 -2
- package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
- package/scripts/ratchets/train-side-invariants.sh +7 -1
- package/scripts/release-loop/cut-branch.ts +61 -12
- package/scripts/release-loop/docs-node.ts +140 -0
- package/scripts/release-loop/gate-closure.ts +48 -0
- package/scripts/release-loop/gate-diff.ts +2 -1
- package/scripts/release-loop/gate-node.ts +161 -25
- package/scripts/release-loop/gate-partial.ts +82 -3
- package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
- package/scripts/release-loop/gate-radius-live.ts +4 -2
- package/scripts/release-loop/known-issues-node.ts +6 -4
- package/scripts/release-loop/notes-repair.ts +216 -0
- package/scripts/release-loop/prepare-node.ts +61 -5
- package/scripts/release-loop/resume-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +406 -7
- package/scripts/release-loop/resume-test-traffic.ts +10 -0
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/traffic-node.ts +12 -4
- package/scripts/release-loop/traffic-transition.ts +53 -13
- package/scripts/release-loop/version-node.ts +109 -15
- package/scripts/train/green-leg.ts +176 -0
- package/scripts/tui-continue-real-evidence.ts +47 -0
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/client.ts +31 -5
- package/src/acp/core-turn-bridge.ts +12 -1
- package/src/acp/stderr-summary.ts +49 -0
- package/src/agent/monad-agent-turn.ts +1 -0
- package/src/agent/run-context.ts +1 -1
- package/src/agent/task-notification.ts +3 -1
- package/src/agent/terminal-surface.ts +217 -0
- package/src/agent-substrate/pr-reviewer.ts +11 -3
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +537 -57
- package/src/auto-research/question-ladder-contract.ts +137 -0
- package/src/auto-research/research-turn.ts +134 -0
- package/src/autopilot/discovery/doc-lint.ts +1 -1
- package/src/autopilot/lineage/sources.ts +1 -1
- package/src/autopilot/pr-manager.ts +64 -13
- package/src/boot/daemon-runtime.ts +35 -3
- package/src/boot/daemon-tools/pty-shell.ts +2 -1
- package/src/bots/screen-probe.ts +1 -1
- package/src/budget/run-usage-rollup.ts +12 -7
- package/src/budget/unified-usage.ts +20 -0
- package/src/capture/tui-self-report.ts +42 -5
- package/src/chat/index.ts +1 -0
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/autopilot-cli.ts +24 -9
- package/src/cli/decisions-cli.ts +7 -4
- package/src/cli/doctor-cli.ts +116 -7
- package/src/cli/guardian-cli.ts +3 -1
- package/src/cli/intake-cli.ts +48 -12
- package/src/cli/lesson-cli.ts +69 -9
- package/src/cli/logs-cli.ts +357 -2
- package/src/cli/memory-cli.ts +30 -1
- package/src/cli/msg-cli.ts +15 -11
- package/src/cli/pr-granularity.ts +5 -3
- package/src/cli/pr-land-overlap-evidence.ts +38 -5
- package/src/cli/pr-land-refusal.ts +1 -1
- package/src/cli/pty-takeover-cli.ts +58 -5
- package/src/cli/release-checklist-read-cli.ts +112 -4
- package/src/cli/release-cli.ts +89 -18
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +24 -6
- package/src/cli/self-utterances-cli.ts +13 -16
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +370 -33
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/cli/usage-cli.ts +12 -10
- package/src/context-bus/claude-memory-import.ts +99 -0
- package/src/context-bus/context-now.ts +86 -2
- package/src/context-bus/long-term-memory.ts +125 -0
- package/src/core-turn/run-core-turn.ts +9 -2
- package/src/core-turn/run-goal-loop.ts +5 -2
- package/src/core-turn/types.ts +5 -0
- package/src/dashboard/chat/acp-chat.ts +9 -0
- package/src/dashboard/index.ts +115 -30
- package/src/dashboard/input/agent-wake.ts +43 -0
- package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/replay-preview.ts +25 -0
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +19 -8
- package/src/dashboard/synchronized-frame-output.ts +74 -0
- package/src/dashboard/term-slash-runtime.ts +2 -0
- package/src/dashboard/turn-preamble.ts +28 -4
- package/src/display/coordinator.ts +45 -12
- package/src/display/resize-listener.ts +41 -20
- package/src/display/synchronized-output-region.ts +60 -0
- package/src/domains/guardian-tick.ts +9 -0
- package/src/domains/surface-events.ts +80 -1
- package/src/exec-requests/planner.ts +37 -2
- package/src/execution-loop/launch-gate.ts +4 -3
- package/src/git-fs/cli-stderr.ts +45 -0
- package/src/git-fs/gh-cli.ts +6 -3
- package/src/git-fs/git-cli.ts +11 -5
- package/src/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-cli.ts +26 -2
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/graph-run-api.ts +3 -2
- package/src/graph-runner/runner.ts +34 -7
- package/src/graph-wizard/generate.ts +29 -6
- package/src/grok/credential.ts +107 -36
- package/src/harness/harness-cli-command.ts +179 -33
- package/src/harness/review-adapter.ts +26 -6
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +151 -18
- package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
- package/src/intake-plane/collect-telegram-saved.ts +54 -5
- package/src/interactive-terminal-modal.ts +3 -0
- package/src/keybindings.ts +17 -22
- package/src/llm/provider-credentials.ts +1 -1
- package/src/llm/route-decision.ts +13 -0
- package/src/llm-tool-name.ts +37 -0
- package/src/llm-tool-schema.ts +55 -0
- package/src/llm.ts +203 -21
- package/src/loops/checker.ts +100 -0
- package/src/loops/consensus.ts +26 -2
- package/src/loops/loop-cli.ts +9 -4
- package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +55 -7
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/model-tier/llm-tier-map.ts +12 -17
- package/src/msg/msg-store.ts +17 -0
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/graph-wizard-api.ts +27 -2
- package/src/nexus/api/grid.ts +24 -4
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/ops-api.ts +14 -6
- package/src/nexus/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/nexus/state/state.ts +7 -1
- package/src/oauth/codex-account-store.ts +34 -1
- package/src/ops/loops-map.ts +46 -0
- package/src/ops/overview-cache.ts +22 -4
- package/src/ops/overview.ts +41 -5
- package/src/patents/ledger.ts +18 -1
- package/src/policy/llm-policy.ts +3 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +9 -4
- package/src/pty-shell/availability.ts +7 -0
- package/src/pty-shell/herdr-agent-report.ts +40 -31
- package/src/pty-shell/herdr-prune-stale.ts +17 -0
- package/src/pty-shell/herdr-sequence-lease.ts +60 -0
- package/src/pty-shell/pty-control-ipc.ts +187 -18
- package/src/pty-shell/pty-manifest.ts +16 -2
- package/src/pty-shell/registry.ts +25 -15
- package/src/pty-shell/tui-run-state.ts +235 -1
- package/src/release-loop/checklist.ts +50 -5
- package/src/release-loop/feature-store.ts +9 -9
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/landed-but-yellow.ts +93 -12
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/repl/index.ts +18 -0
- package/src/research/axis-fanout.ts +133 -0
- package/src/research/edge-decision.ts +88 -0
- package/src/research/output-router.ts +127 -0
- package/src/research-bridge/format.ts +16 -1
- package/src/research-bridge/index.ts +1 -0
- package/src/research-bridge/invoke.ts +41 -5
- package/src/seat-loop/seat-report.ts +1 -0
- package/src/self-dev/ask-launch-flow.ts +86 -10
- package/src/self-dev/decompose-proposal.ts +29 -18
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/dev-pipeline.ts +29 -7
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +254 -16
- package/src/self-dev/draft-triage-rules.ts +19 -5
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/review-provider-fallback.ts +45 -7
- package/src/self-dev/run-supervisor.ts +22 -7
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-run.ts +310 -6
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/doctor-visit.ts +108 -0
- package/src/self-implement/gate-artifacts.ts +6 -2
- package/src/self-implement/gate-baseline.ts +99 -1
- package/src/self-implement/gate-cli.ts +231 -82
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-remote.ts +30 -4
- package/src/self-implement/gate-scope.ts +13 -1
- package/src/self-implement/goal-author.ts +407 -21
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +110 -27
- package/src/self-implement/importer-test-index.ts +215 -2
- package/src/self-implement/knowhow-pack.ts +125 -12
- package/src/self-implement/l8-merge-queue.ts +198 -32
- package/src/self-implement/off-diff-evidence.ts +23 -0
- package/src/self-implement/orchestrator.ts +369 -33
- package/src/self-implement/pod-inplace-worktree.ts +82 -0
- package/src/self-implement/pod-warm-pool-profile.ts +2 -2
- package/src/self-implement/premise-review.ts +7 -5
- package/src/self-implement/review-round-brief.ts +300 -0
- package/src/self-implement/rework-policy.ts +14 -0
- package/src/self-implement/run-ledger.ts +428 -6
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/running-runs.ts +17 -3
- package/src/self-implement/seams.ts +45 -16
- package/src/self-implement/self-implement-cli.ts +26 -2
- package/src/self-implement/stop-autoheal.ts +1 -0
- package/src/self-implement/test-seams.ts +13 -1
- package/src/self-implement/train-reach-grouping.ts +8 -2
- package/src/session/channel-ask-op-envelope.ts +36 -0
- package/src/session/channel-op-reply-route.ts +200 -0
- package/src/session/chat.ts +10 -1
- package/src/session/id-prefix.ts +60 -0
- package/src/session/index.ts +6 -0
- package/src/session-runtime/index.ts +18 -23
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/pty.ts +5 -0
- package/src/skills/tools/schedule-wakeup.ts +1 -6
- package/src/status/bar.ts +3 -3
- package/src/status/metrics.ts +12 -1
- package/src/steward/rejudge-tick.ts +12 -5
- package/src/steward/resync-tick.ts +31 -4
- package/src/storage/file-lock.ts +17 -4
- package/src/task-agent/actions.ts +199 -4
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/boundary-proof-mapping.ts +12 -0
- package/src/task-agent/boundary-proof-producer.ts +147 -0
- package/src/task-agent/completion-evidence.ts +2 -1
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/green-close-recipe.ts +239 -0
- package/src/task-agent/green-sweep.ts +64 -10
- package/src/task-agent/live-moves.ts +48 -3
- package/src/task-agent/map-host-adapter.ts +134 -0
- package/src/task-agent/map-reduce.ts +158 -0
- package/src/task-agent/map-run-ledger.ts +226 -0
- package/src/task-agent/parent-host.ts +74 -17
- package/src/task-agent/rejudge-on-head.ts +72 -5
- package/src/task-agent/repair-cycle.ts +108 -8
- package/src/task-agent/repair-next-move.ts +12 -2
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/review-prior-fix.ts +12 -2
- package/src/task-agent/shadow.ts +188 -5
- package/src/task-agent/task-hand.ts +253 -20
- package/src/task-agent/task-parent-role-llm.ts +9 -0
- package/src/task-agent/tier-split.ts +40 -5
- package/src/task-agent/work-order.ts +53 -2
- package/src/task-orchestrator/dispatcher.ts +46 -1
- package/src/task-orchestrator/generator-prompt.ts +6 -0
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +77 -8
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +338 -79
- package/src/task-orchestrator/surfaces/self-implement.ts +37 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -0
- package/src/testing/linux-env.ts +177 -0
- package/src/tool-hints/gate.ts +6 -4
- package/src/tool-hints/signals.ts +33 -1
- package/src/tui/chat/background-job-status.ts +8 -2
- package/src/tui/chat/goal-interim.ts +5 -1
- package/src/tui/entry.ts +722 -30
- package/src/tui/input/at-picker.ts +55 -0
- package/src/tui/sidetab/attach.ts +304 -0
- package/src/tui/sidetab/list.ts +176 -0
- package/src/tui/sidetab/nl-tool.ts +136 -0
- package/src/tui/slash/resume-command.ts +23 -0
- package/src/tui/slash/resume.ts +38 -35
- package/src/tui/slash/signals.ts +114 -0
- package/src/tui/slash/term-next.ts +72 -0
- package/src/tui-client/local-chat-turn.ts +31 -9
- package/src/user-config.ts +30 -3
- package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
- package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
- package/src/ux-sim/fake-gh.ts +174 -0
- package/src/ux-sim/fake-kubectl.ts +142 -0
- package/src/ux-sim/fake-llm.ts +17 -6
- package/src/ux-sim/next-tui-seat-scenarios.ts +176 -6
- package/src/ux-sim/resume-picker-device.ts +173 -0
- package/src/ux-sim/session-id-seed.ts +60 -0
- package/src/ux-sim/skills-tools-shell-device.ts +156 -0
- package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
- package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +0 -64
- package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
- package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
- package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
- package/apps/pwa/out/_next/static/chunks/2986.45d7652e4f13557e.js +0 -2
- package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
- package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
- package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
- package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
- package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
- package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +0 -1
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
- package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
- package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7481.39f7a4654907bf6e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
- package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
- package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ccae1c4b-0cf414f5eff1b10d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
- package/scripts/migrate-monad-to-elanous.ts +0 -195
- package/scripts/rebrand-elanous.ts +0 -242
- /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Bounded, read-only context from promoted repository knowhow. */
|
|
2
2
|
import { lstatSync, readFileSync, realpathSync, readdirSync, statSync } from 'node:fs';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
3
4
|
import { join, relative, resolve, sep } from 'node:path';
|
|
4
5
|
|
|
5
6
|
export const KNOWHOW_PACK_MAX_BYTES = 4096;
|
|
@@ -10,6 +11,109 @@ export interface KnowhowPack {
|
|
|
10
11
|
text: string;
|
|
11
12
|
ids: string[];
|
|
12
13
|
bytes: number;
|
|
14
|
+
reason: 'selected' | 'marker-present' | 'source-unreadable' | 'no-promoted-section' | 'no-path-overlap' | 'over-budget';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface SelectedAuthoringLessons {
|
|
18
|
+
readonly ids: readonly string[];
|
|
19
|
+
readonly prompt: string;
|
|
20
|
+
readonly status: 'loaded' | 'missing' | 'malformed' | 'unreadable' | 'empty';
|
|
21
|
+
readonly invalidRows: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const AUTHORING_LESSONS_MAX_BYTES = 2_000;
|
|
25
|
+
const AUTHORING_LESSONS_MAX_ITEMS = 2;
|
|
26
|
+
const AUTHORING_LESSON_CLASSES = new Set([
|
|
27
|
+
'a-missing-predecessor', 'b-stale-path', 'c-unbounded-goal', 'd-rigid-acceptance',
|
|
28
|
+
'e-format-trap', 'f-unaware-of-code', 'g-umbrella-scope', 'env-provider',
|
|
29
|
+
'env-capacity', 'env-stale-image',
|
|
30
|
+
]);
|
|
31
|
+
|
|
32
|
+
function authoringLessonClassHints(ask: string, targetPaths: readonly string[]): Set<string> {
|
|
33
|
+
const hints = new Set<string>();
|
|
34
|
+
const rules: readonly [string, RegExp][] = [
|
|
35
|
+
['a-missing-predecessor', /predecessor|prerequisite|depends on|dependency|선행|의존|먼저 완료/iu],
|
|
36
|
+
['b-stale-path', /unsupported path|missing path|path does not exist|not exist|경로.{0,12}(?:없|존재하지)|없는 파일|대상 경로.{0,12}없/iu],
|
|
37
|
+
['c-unbounded-goal', /unbounded|no scope boundary|scope is unclear|범위.{0,12}(?:무한|불명확|제한 없|경계 없)/iu],
|
|
38
|
+
['d-rigid-acceptance', /acceptance criteria|acceptance test|검수 기준|수용 기준|판정 조건/iu],
|
|
39
|
+
['e-format-trap', /format|schema|json|template|형식|스키마|문면/iu],
|
|
40
|
+
['f-unaware-of-code', /already implemented|existing code|cli registration|entry point|이미 구현|기존 코드|등록 파일|진입점/iu],
|
|
41
|
+
['g-umbrella-scope', /umbrella|over.?scope|too broad|too many targets|여러 목표|범위가 넓|너무 넓|한 골에|포괄 골/iu],
|
|
42
|
+
['env-provider', /provider|model|llm|모델|프로바이더/iu],
|
|
43
|
+
['env-capacity', /capacity|resource|oom|용량|부하|자원/iu],
|
|
44
|
+
['env-stale-image', /stale image|image mismatch|오래된 이미지|이미지 불일치/iu],
|
|
45
|
+
];
|
|
46
|
+
for (const [lessonClass, pattern] of rules) if (pattern.test(ask)) hints.add(lessonClass);
|
|
47
|
+
if (targetPaths.length > 5) hints.add('g-umbrella-scope');
|
|
48
|
+
return hints;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function authoringAskPaths(ask: string): string[] {
|
|
52
|
+
const paths = new Set<string>();
|
|
53
|
+
for (const match of ask.matchAll(/(?<![\w./~-])([\w.-]+(?:\/[\w.-]+)+)/gu)) {
|
|
54
|
+
const path = match[1].replace(/[.,;:!?]+$/u, '');
|
|
55
|
+
const parts = path.split('/');
|
|
56
|
+
if (parts.some((part) => !part || part === '.' || part === '..')) continue;
|
|
57
|
+
if (/\.[\w-]+$/u.test(parts.at(-1) ?? '')) paths.add(path);
|
|
58
|
+
}
|
|
59
|
+
return [...paths];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Select up to two relevant lessons, capped by rendered prompt size. Bad optional ledgers only emit observation. */
|
|
63
|
+
export function selectRelevantAuthoringLessons(root: string, ask: string): SelectedAuthoringLessons {
|
|
64
|
+
const path = join(root, 'docs', 'goal-context', '05-authoring-lessons.jsonl');
|
|
65
|
+
let source: string;
|
|
66
|
+
try { source = readFileSync(path, 'utf8'); }
|
|
67
|
+
catch (error) {
|
|
68
|
+
return { ids: [], prompt: '', status: (error as NodeJS.ErrnoException).code === 'ENOENT' ? 'missing' : 'unreadable', invalidRows: 0 };
|
|
69
|
+
}
|
|
70
|
+
const rows: Record<string, unknown>[] = [];
|
|
71
|
+
let invalidRows = 0;
|
|
72
|
+
for (const line of source.split(/\r?\n/u)) {
|
|
73
|
+
if (!line.trim()) continue;
|
|
74
|
+
try {
|
|
75
|
+
const value: unknown = JSON.parse(line);
|
|
76
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('not an object');
|
|
77
|
+
const row = value as Record<string, unknown>;
|
|
78
|
+
if (typeof row.lesson !== 'string' || typeof row.class !== 'string') throw new Error('missing lesson/class');
|
|
79
|
+
// The canonical ledger predates the closed class vocabulary and contains three `other` rows.
|
|
80
|
+
// Ignore those rows individually so valid lessons remain usable; never inject an unknown class.
|
|
81
|
+
if (!AUTHORING_LESSON_CLASSES.has(row.class) && !/^env-[a-z0-9-]+$/u.test(row.class)) { invalidRows += 1; continue; }
|
|
82
|
+
rows.push(row);
|
|
83
|
+
} catch {
|
|
84
|
+
invalidRows += 1;
|
|
85
|
+
return { ids: [], prompt: '', status: 'malformed', invalidRows };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (rows.length === 0) return { ids: [], prompt: '', status: 'empty', invalidRows };
|
|
89
|
+
const targetPaths = authoringAskPaths(ask);
|
|
90
|
+
const classHints = authoringLessonClassHints(ask, targetPaths);
|
|
91
|
+
const ranked = rows.map((row, index) => {
|
|
92
|
+
const lessonPaths = typeof row.paths === 'string' ? row.paths.split(/\s*[·,]\s*/u).filter(Boolean) : [];
|
|
93
|
+
const pathMatches = lessonPaths.some((lessonPath) => targetPaths.some((target) =>
|
|
94
|
+
target === lessonPath || target.startsWith(`${lessonPath}/`) || lessonPath.startsWith(`${target}/`)));
|
|
95
|
+
const classMatch = classHints.has(String(row.class));
|
|
96
|
+
const score = (pathMatches ? 4 : 0) + (classMatch ? 2 : 0);
|
|
97
|
+
const lesson = String(row.lesson).trim().replace(/\s+/gu, ' ');
|
|
98
|
+
const cell = typeof row.cell === 'string' ? row.cell.trim() : '';
|
|
99
|
+
const run = typeof row.run === 'string' && row.run.trim() ? row.run.trim() : '';
|
|
100
|
+
const suppliedId = typeof row.id === 'string' && /^[A-Za-z0-9._:-]{1,80}$/u.test(row.id) ? row.id : undefined;
|
|
101
|
+
const digest = createHash('sha256').update(JSON.stringify([row.ts ?? '', row.cell ?? '', row.class, row.lesson, row.paths ?? ''])).digest('hex').slice(0, 10);
|
|
102
|
+
const id = suppliedId ?? `AL-${digest}`;
|
|
103
|
+
const detail = [cell && `칸=${cell}`, `class=${row.class}`, `lesson=${lesson}`, run && `run=${run}`].filter(Boolean).join(' · ');
|
|
104
|
+
return { id, detail, score, index, timestamp: typeof row.ts === 'string' ? row.ts : '' };
|
|
105
|
+
}).filter((row) => row.score > 0)
|
|
106
|
+
.sort((left, right) => right.score - left.score || right.timestamp.localeCompare(left.timestamp) || left.index - right.index);
|
|
107
|
+
const selected: { id: string; detail: string }[] = [];
|
|
108
|
+
for (const candidate of ranked) {
|
|
109
|
+
if (selected.length >= AUTHORING_LESSONS_MAX_ITEMS) break;
|
|
110
|
+
const line = `- [${candidate.id}] ${candidate.detail}`;
|
|
111
|
+
const next = [...selected.map((entry) => `- [${entry.id}] ${entry.detail}`), line].join('\n');
|
|
112
|
+
if (Buffer.byteLength(next, 'utf8') > AUTHORING_LESSONS_MAX_BYTES) continue;
|
|
113
|
+
selected.push({ id: candidate.id, detail: candidate.detail });
|
|
114
|
+
}
|
|
115
|
+
const prompt = selected.map((entry) => `- [${entry.id}] ${entry.detail}`).join('\n');
|
|
116
|
+
return { ids: selected.map((entry) => entry.id), prompt, status: 'loaded', invalidRows };
|
|
13
117
|
}
|
|
14
118
|
|
|
15
119
|
function inside(root: string, path: string): boolean {
|
|
@@ -42,8 +146,8 @@ function mentionedPaths(text: string): Set<string> {
|
|
|
42
146
|
return paths;
|
|
43
147
|
}
|
|
44
148
|
|
|
45
|
-
function relevance(goal: string, section: string): number {
|
|
46
|
-
const paths = mentionedPaths(goal);
|
|
149
|
+
function relevance(goal: string, section: string, targetPaths?: readonly string[]): number {
|
|
150
|
+
const paths = targetPaths === undefined ? mentionedPaths(goal) : new Set(targetPaths);
|
|
47
151
|
const sourcePaths = mentionedPaths(section);
|
|
48
152
|
let score = 0;
|
|
49
153
|
for (const path of paths) {
|
|
@@ -58,18 +162,21 @@ function relevance(goal: string, section: string): number {
|
|
|
58
162
|
return score;
|
|
59
163
|
}
|
|
60
164
|
|
|
61
|
-
/** Reads only 내부 문서 `KNOWHOW` inside the supplied repository. */
|
|
62
|
-
export function selectKnowhowPack(repo: string, goal: string): KnowhowPack {
|
|
63
|
-
|
|
165
|
+
/** Reads only 내부 문서 `KNOWHOW` inside the supplied repository. Verified target paths narrow relevance when supplied. */
|
|
166
|
+
export function selectKnowhowPack(repo: string, goal: string, targetPaths?: readonly string[]): KnowhowPack {
|
|
167
|
+
const empty = (reason: KnowhowPack['reason']): KnowhowPack => ({ text: '', ids: [], bytes: 0, reason });
|
|
168
|
+
if (goal.includes(MARKER)) return empty('marker-present');
|
|
64
169
|
const rolesDir = resolve(repo, 'docs/roles');
|
|
65
170
|
let realRoles: string;
|
|
66
171
|
try {
|
|
67
172
|
realRoles = realpathSync(rolesDir);
|
|
68
|
-
if (!inside(realpathSync(repo), realRoles)) return
|
|
69
|
-
} catch { return
|
|
173
|
+
if (!inside(realpathSync(repo), realRoles)) return empty('source-unreadable');
|
|
174
|
+
} catch { return empty('source-unreadable'); }
|
|
70
175
|
const candidates: Array<{ id: string; text: string; score: number }> = [];
|
|
71
176
|
let seatDirs: string[];
|
|
72
|
-
try { seatDirs = readdirSync(rolesDir).sort(); } catch { return
|
|
177
|
+
try { seatDirs = readdirSync(rolesDir).sort(); } catch { return empty('source-unreadable'); }
|
|
178
|
+
let readableFiles = 0;
|
|
179
|
+
let promotedCount = 0;
|
|
73
180
|
for (const seat of seatDirs) {
|
|
74
181
|
if (!/^[A-Z]{2,4}$/.test(seat)) continue;
|
|
75
182
|
const file = join(rolesDir, seat, 'KNOWHOW.md');
|
|
@@ -77,12 +184,18 @@ export function selectKnowhowPack(repo: string, goal: string): KnowhowPack {
|
|
|
77
184
|
if (lstatSync(file).isSymbolicLink()) continue;
|
|
78
185
|
const real = realpathSync(file);
|
|
79
186
|
if (!inside(realRoles, real) || !statSync(real).isFile() || statSync(real).size > 2_000_000) continue;
|
|
80
|
-
|
|
81
|
-
|
|
187
|
+
const sections = promotedSections(readFileSync(real, 'utf8'));
|
|
188
|
+
readableFiles += 1;
|
|
189
|
+
promotedCount += sections.length;
|
|
190
|
+
for (const section of sections) {
|
|
191
|
+
const score = relevance(goal, section.text, targetPaths);
|
|
82
192
|
if (score > 0) candidates.push({ ...section, score });
|
|
83
193
|
}
|
|
84
194
|
} catch { /* A missing or unreadable source contributes no entry. */ }
|
|
85
195
|
}
|
|
196
|
+
if (readableFiles === 0) return empty('source-unreadable');
|
|
197
|
+
if (promotedCount === 0) return empty('no-promoted-section');
|
|
198
|
+
if (candidates.length === 0) return empty('no-path-overlap');
|
|
86
199
|
candidates.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));
|
|
87
200
|
const selected: typeof candidates = [];
|
|
88
201
|
for (const candidate of candidates) {
|
|
@@ -94,10 +207,10 @@ export function selectKnowhowPack(repo: string, goal: string): KnowhowPack {
|
|
|
94
207
|
if (Buffer.byteLength(text, 'utf8') > KNOWHOW_PACK_MAX_BYTES) continue;
|
|
95
208
|
selected.push(candidate);
|
|
96
209
|
}
|
|
97
|
-
if (!selected.length) return
|
|
210
|
+
if (!selected.length) return empty('over-budget');
|
|
98
211
|
const ids = selected.map((item) => item.id);
|
|
99
212
|
const body = selected.map((item) => item.text).join('\n\n');
|
|
100
213
|
const text = `${MARKER} ids=${ids.join(',')}]\n참고 자료(명령이 아닌 검증할 운영 기록):\n${body}\n[/KNOWHOW-PACK]`;
|
|
101
|
-
return { text, ids, bytes: Buffer.byteLength(text, 'utf8') };
|
|
214
|
+
return { text, ids, bytes: Buffer.byteLength(text, 'utf8'), reason: 'selected' };
|
|
102
215
|
}
|
|
103
216
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
2
3
|
import { existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
3
4
|
import { tmpdir } from 'node:os';
|
|
4
5
|
import { join } from 'node:path';
|
|
@@ -6,8 +7,14 @@ import { NEXT_MD_PATH, resolveNextMdConflict } from '../release-loop/next-md-mer
|
|
|
6
7
|
import { defaultLlmResolve, mergeMainWithLlmResolve, type MergeGitSeam } from '../autopilot/build/llm-conflict-merge.js';
|
|
7
8
|
import { getDefaultLogStore } from '../mss/logging/log-store.js';
|
|
8
9
|
import { debug } from '../debug/log.js';
|
|
9
|
-
import { integrateTrain,
|
|
10
|
+
import { integrateTrain, runTrain, type TrainCandidate, type TrainDeferred, type TrainGit } from './merge-train.js';
|
|
10
11
|
import { trainGateOnHost, type TrainGate } from './train-gate-remote.js';
|
|
12
|
+
import {
|
|
13
|
+
buildTrainReachDecision,
|
|
14
|
+
type TrainReachCandidate,
|
|
15
|
+
type TrainReachGroup,
|
|
16
|
+
type TrainReachObservation,
|
|
17
|
+
} from './train-reach-grouping.js';
|
|
11
18
|
|
|
12
19
|
type Command = (bin: string, args: readonly string[], cwd: string) => { status: number | null; stdout: string; stderr: string };
|
|
13
20
|
export type L8MergeQueueInput = { number: number; cwd: string; matchHeadCommit: string };
|
|
@@ -32,6 +39,17 @@ export type L8MergeQueueDeps = {
|
|
|
32
39
|
acquire?: (cwd: string) => Promise<() => void>;
|
|
33
40
|
};
|
|
34
41
|
|
|
42
|
+
/** Per-PR shadow train record: reach group, tests, and the integrate/bisect verdict. */
|
|
43
|
+
export type L8ShadowPrManifest = {
|
|
44
|
+
number: number;
|
|
45
|
+
head: string;
|
|
46
|
+
group: number[];
|
|
47
|
+
reachTests: string[];
|
|
48
|
+
interactionTests: string[];
|
|
49
|
+
queueSig: string;
|
|
50
|
+
gatesRun: number;
|
|
51
|
+
verdict: L8ShadowVerdict['verdict'];
|
|
52
|
+
};
|
|
35
53
|
export type L8ShadowVerdict = {
|
|
36
54
|
number: number;
|
|
37
55
|
head: string;
|
|
@@ -41,6 +59,8 @@ export type L8ShadowVerdict = {
|
|
|
41
59
|
detail?: string;
|
|
42
60
|
tests: string[];
|
|
43
61
|
at: string;
|
|
62
|
+
/** Present when this verdict came from a reach-grouped shadow train. */
|
|
63
|
+
manifest?: L8ShadowPrManifest;
|
|
44
64
|
};
|
|
45
65
|
export type L8ShadowQueueItem = {
|
|
46
66
|
number: number;
|
|
@@ -50,7 +70,9 @@ export type L8ShadowQueueItem = {
|
|
|
50
70
|
overlapsWith?: number[];
|
|
51
71
|
overlapsUnknownWith?: number[];
|
|
52
72
|
};
|
|
53
|
-
|
|
73
|
+
/** Reach precheck outcome for a queued PR this run could not pin (stale view, changed head, or worktree failure). */
|
|
74
|
+
export type L8ShadowDeferred = { number: number; head: string; reason: string; at: string };
|
|
75
|
+
export type L8ShadowQueueState = { pending: L8ShadowQueueItem[]; verdicts: L8ShadowVerdict[]; deferred?: L8ShadowDeferred[] };
|
|
54
76
|
export type L8ShadowEnqueueObservation = {
|
|
55
77
|
number: number;
|
|
56
78
|
head: string;
|
|
@@ -68,8 +90,10 @@ export type L8ShadowQueueDeps = L8MergeQueueDeps & {
|
|
|
68
90
|
trainGate?: (repo: string, baseSha: string) => TrainGate;
|
|
69
91
|
/** Shadow merge train integration git seam (default: the queue's own command executor). */
|
|
70
92
|
trainGit?: TrainGit;
|
|
71
|
-
/** Maximum PRs per shadow train batch (default
|
|
93
|
+
/** Maximum PRs per shadow train batch (default 5, the reach-group capacity). */
|
|
72
94
|
trainMaxBatch?: number;
|
|
95
|
+
/** Reach observation seam (default: inspect each fetched PR worktree via buildTrainReachDecision). */
|
|
96
|
+
trainReachInspect?: (candidate: TrainReachCandidate, baseSha: string) => TrainReachObservation;
|
|
73
97
|
};
|
|
74
98
|
|
|
75
99
|
function shadowCommand(execute: Command, bin: string, args: string[], cwd: string): string {
|
|
@@ -89,7 +113,8 @@ function readShadowQueue(path: string): L8ShadowQueueState {
|
|
|
89
113
|
const value: unknown = JSON.parse(readFileSync(path, 'utf8'));
|
|
90
114
|
if (!value || typeof value !== 'object' || !('pending' in value) || !Array.isArray(value.pending)
|
|
91
115
|
|| !value.pending.every((p: { number?: number; head?: string }) => Number.isSafeInteger(p?.number) && p.number! > 0 && typeof p.head === 'string' && /^[0-9a-f]{40}$/i.test(p.head))
|
|
92
|
-
|| !('verdicts' in value) || !Array.isArray(value.verdicts)
|
|
116
|
+
|| !('verdicts' in value) || !Array.isArray(value.verdicts)
|
|
117
|
+
|| !('deferred' in value ? Array.isArray(value.deferred) : true)) throw new Error('invalid shadow queue ledger');
|
|
93
118
|
return value as L8ShadowQueueState;
|
|
94
119
|
}
|
|
95
120
|
|
|
@@ -180,10 +205,94 @@ export async function enqueueL8ShadowQueue(cwd: string, number: number, deps: L8
|
|
|
180
205
|
});
|
|
181
206
|
}
|
|
182
207
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
208
|
+
function shadowQueueSig(base: string, pending: readonly L8ShadowQueueItem[]): string {
|
|
209
|
+
return createHash('sha256').update(`${base}\0${pending.map((item) => `${item.number}:${item.head}`).join('\0')}`).digest('hex');
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function shadowReachWorktree(cwd: string, run: (bin: string, args: string[], where?: string) => string, item: L8ShadowQueueItem, base: string): string {
|
|
213
|
+
const tree = mkdtempSync(join(tmpdir(), `elanous-l8-reach-${item.number}-`));
|
|
214
|
+
try {
|
|
215
|
+
run('git', ['worktree', 'add', '--detach', tree, item.head], cwd);
|
|
216
|
+
if (run('git', ['rev-parse', 'HEAD'], tree) !== item.head) throw new Error(`reach worktree HEAD changed: #${item.number}`);
|
|
217
|
+
run('git', ['cat-file', '-e', `${base}^{commit}`], tree);
|
|
218
|
+
return tree;
|
|
219
|
+
} catch (error) {
|
|
220
|
+
try { run('git', ['worktree', 'remove', '--force', tree], cwd); } catch { /* still delete the directory */ }
|
|
221
|
+
rmSync(tree, { recursive: true, force: true });
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function pinShadowReachCandidates(
|
|
227
|
+
cwd: string,
|
|
228
|
+
run: (bin: string, args: string[], where?: string) => string,
|
|
229
|
+
pending: readonly L8ShadowQueueItem[],
|
|
230
|
+
base: string,
|
|
231
|
+
skip: ReadonlySet<number>,
|
|
232
|
+
): { candidates: TrainReachCandidate[]; trees: string[]; failures: { number: number; head: string; reason: string }[] } {
|
|
233
|
+
const candidates: TrainReachCandidate[] = [];
|
|
234
|
+
const trees: string[] = [];
|
|
235
|
+
const failures: { number: number; head: string; reason: string }[] = [];
|
|
236
|
+
for (const item of pending) {
|
|
237
|
+
if (skip.has(item.number) || item.filesUnmeasured || !item.files?.length) continue;
|
|
238
|
+
try {
|
|
239
|
+
const tree = shadowReachWorktree(cwd, run, item, base);
|
|
240
|
+
trees.push(tree);
|
|
241
|
+
candidates.push({ pr: String(item.number), headSha: item.head, tree, changedFiles: [...item.files] });
|
|
242
|
+
} catch (error) {
|
|
243
|
+
// shadowReachWorktree cleans up its own tree; this PR only leaves the reach candidate set.
|
|
244
|
+
failures.push({ number: item.number, head: item.head, reason: String(error) });
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return { candidates, trees, failures };
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** Keep one deferred record per queued PR (latest reason wins) so the ledger stays bounded. */
|
|
251
|
+
function recordShadowDeferred(state: L8ShadowQueueState, entries: readonly L8ShadowDeferred[]): void {
|
|
252
|
+
const rest = (state.deferred ?? []).filter((entry) => !entries.some((current) => current.number === entry.number));
|
|
253
|
+
state.deferred = [...rest, ...entries];
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function planShadowReachTrain(
|
|
257
|
+
pending: readonly L8ShadowQueueItem[],
|
|
258
|
+
group: TrainReachGroup,
|
|
259
|
+
{ maxBatch }: { maxBatch: number },
|
|
260
|
+
): { batch: TrainCandidate[]; deferred: TrainDeferred[] } {
|
|
261
|
+
const byNumber = new Map(pending.map((item) => [item.number, item]));
|
|
262
|
+
const numbers = group.prs.map((pr) => Number(pr)).filter((number) => byNumber.has(number));
|
|
263
|
+
const batch: TrainCandidate[] = [];
|
|
264
|
+
const deferred: TrainDeferred[] = [];
|
|
265
|
+
for (const number of numbers) {
|
|
266
|
+
const item = byNumber.get(number)!;
|
|
267
|
+
const candidate: TrainCandidate = { number: item.number, head: item.head, files: item.files, filesUnmeasured: item.filesUnmeasured };
|
|
268
|
+
if (batch.length < maxBatch) batch.push(candidate);
|
|
269
|
+
else deferred.push({ number, reason: 'overlap', with: batch.map((entry) => entry.number) });
|
|
270
|
+
}
|
|
271
|
+
return { batch, deferred };
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function shadowPrManifest(
|
|
275
|
+
item: TrainCandidate,
|
|
276
|
+
group: TrainReachGroup,
|
|
277
|
+
queueSig: string,
|
|
278
|
+
gatesRun: number,
|
|
279
|
+
verdict: L8ShadowVerdict['verdict'],
|
|
280
|
+
): L8ShadowPrManifest {
|
|
281
|
+
return {
|
|
282
|
+
number: item.number,
|
|
283
|
+
head: item.head,
|
|
284
|
+
group: group.prs.map((pr) => Number(pr)),
|
|
285
|
+
reachTests: [...group.reachTests],
|
|
286
|
+
interactionTests: [...group.interactionTests],
|
|
287
|
+
queueSig,
|
|
288
|
+
gatesRun,
|
|
289
|
+
verdict,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** LAND-QUEUE — shadow merge train: pinned queue → buildTrainReachDecision → integrateTrain → runTrain.
|
|
294
|
+
* Per-PR verdicts (pass · culprit · unmeasured) land in the queue ledger with a reach-group manifest.
|
|
295
|
+
* Shadow only: no push, no merge API; the single-PR evaluation path stays for every queue this train cannot take. */
|
|
187
296
|
async function runShadowMergeTrain(
|
|
188
297
|
state: L8ShadowQueueState,
|
|
189
298
|
path: string,
|
|
@@ -191,6 +300,9 @@ async function runShadowMergeTrain(
|
|
|
191
300
|
run: (bin: string, args: string[], where?: string) => string,
|
|
192
301
|
execute: Command,
|
|
193
302
|
plan: { batch: TrainCandidate[]; deferred: TrainDeferred[] },
|
|
303
|
+
group: TrainReachGroup,
|
|
304
|
+
queueSig: string,
|
|
305
|
+
base: string,
|
|
194
306
|
deps: L8ShadowQueueDeps,
|
|
195
307
|
): Promise<L8ShadowVerdict | null> {
|
|
196
308
|
for (const item of plan.batch) {
|
|
@@ -200,9 +312,6 @@ async function runShadowMergeTrain(
|
|
|
200
312
|
if (view.headRefOid !== item.head || view.baseRefName !== 'main' || view.state !== 'OPEN'
|
|
201
313
|
|| view.isDraft !== false || view.isCrossRepository !== false) throw new Error(`queued PR #${item.number} changed or is not ready`);
|
|
202
314
|
}
|
|
203
|
-
run('git', ['fetch', 'origin', 'refs/heads/main'], cwd);
|
|
204
|
-
const base = run('git', ['rev-parse', 'FETCH_HEAD'], cwd);
|
|
205
|
-
if (!/^[0-9a-f]{40}$/i.test(base)) throw new Error('main commit unavailable');
|
|
206
315
|
for (const item of plan.batch) {
|
|
207
316
|
run('git', ['fetch', 'origin', `refs/pull/${item.number}/head`], cwd);
|
|
208
317
|
if (run('git', ['rev-parse', 'FETCH_HEAD'], cwd) !== item.head) throw new Error(`fetched PR head changed: #${item.number}`);
|
|
@@ -213,49 +322,106 @@ async function runShadowMergeTrain(
|
|
|
213
322
|
integrate: (batch) => integrateTrain(cwd, base, batch, trainGit),
|
|
214
323
|
gate,
|
|
215
324
|
deferred: plan.deferred,
|
|
216
|
-
// The train's observation channel is debug.log (LAND-QUEUE); the ledger below carries the authoritative state.
|
|
217
325
|
observe: (data) => { debug.log('self-implement.merge-train', 'shadow-verdict', data); },
|
|
218
326
|
});
|
|
219
327
|
const at = new Date().toISOString();
|
|
220
328
|
const batchNumbers = plan.batch.map((item) => item.number);
|
|
221
|
-
const verdicts: L8ShadowVerdict[] = result.verdicts.map((entry) =>
|
|
222
|
-
number
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
329
|
+
const verdicts: L8ShadowVerdict[] = result.verdicts.map((entry) => {
|
|
330
|
+
const item = plan.batch.find((candidate) => candidate.number === entry.number)!;
|
|
331
|
+
const manifest = shadowPrManifest(item, group, queueSig, result.gatesRun, entry.verdict);
|
|
332
|
+
return {
|
|
333
|
+
number: entry.number,
|
|
334
|
+
head: item.head,
|
|
335
|
+
base,
|
|
336
|
+
verdict: entry.verdict,
|
|
337
|
+
detail: `merge train shadow · reach [${group.prs.join(',')}] · batch [${batchNumbers.join(',')}] · gatesRun ${result.gatesRun}`,
|
|
338
|
+
tests: [...group.reachTests],
|
|
339
|
+
at,
|
|
340
|
+
manifest,
|
|
341
|
+
};
|
|
342
|
+
});
|
|
230
343
|
state.pending = state.pending.filter((item) => !batchNumbers.includes(item.number));
|
|
231
344
|
state.verdicts.push(...verdicts);
|
|
232
345
|
writeShadowQueue(path, state);
|
|
233
346
|
return verdicts[0] ?? null;
|
|
234
347
|
}
|
|
235
348
|
|
|
236
|
-
/** Evaluate one pinned queue head against freshly fetched main — or, when
|
|
237
|
-
*
|
|
349
|
+
/** Evaluate one pinned queue head against freshly fetched main — or, when reach grouping finds a measured
|
|
350
|
+
* two-or-more-PR component, one shadow merge train. Never push or call a merge API. */
|
|
238
351
|
export async function runL8ShadowQueue(cwd: string, deps: L8ShadowQueueDeps = {}): Promise<L8ShadowVerdict | null> {
|
|
239
352
|
return withShadowQueue(cwd, deps, async (state, path) => {
|
|
240
353
|
const item = state.pending[0];
|
|
241
354
|
if (!item) return null;
|
|
242
355
|
const execute = deps.command ?? command;
|
|
243
356
|
const run = (bin: string, args: string[], where = cwd) => shadowCommand(execute, bin, args, where);
|
|
244
|
-
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
357
|
+
run('git', ['fetch', 'origin', 'refs/heads/main']);
|
|
358
|
+
const base = run('git', ['rev-parse', 'FETCH_HEAD']);
|
|
359
|
+
if (!/^[0-9a-f]{40}$/i.test(base)) throw new Error('main commit unavailable');
|
|
360
|
+
const queueSig = shadowQueueSig(base, state.pending);
|
|
361
|
+
let trees: string[] = [];
|
|
362
|
+
// Preservation contract: a reach failure on any non-head queued PR defers only that PR; the queue head keeps
|
|
363
|
+
// both its shadow-train chance and the single-PR evaluation path. Only the head's own failure throws.
|
|
364
|
+
const reachDeferred: L8ShadowDeferred[] = [];
|
|
365
|
+
const reachSkip = new Set<number>();
|
|
366
|
+
try {
|
|
367
|
+
for (const pending of state.pending) {
|
|
368
|
+
if (pending.filesUnmeasured || !pending.files?.length) continue;
|
|
369
|
+
const isHead = pending === item;
|
|
370
|
+
try {
|
|
371
|
+
const view = JSON.parse(run('gh', ['pr', 'view', String(pending.number), '--json', 'headRefOid,baseRefName,state,isDraft,isCrossRepository'])) as {
|
|
372
|
+
headRefOid?: string; baseRefName?: string; state?: string; isDraft?: boolean; isCrossRepository?: boolean;
|
|
373
|
+
};
|
|
374
|
+
if (view.headRefOid !== pending.head || view.baseRefName !== 'main' || view.state !== 'OPEN'
|
|
375
|
+
|| view.isDraft !== false || view.isCrossRepository !== false) {
|
|
376
|
+
throw new Error(`queued PR #${pending.number} changed or is not ready`);
|
|
377
|
+
}
|
|
378
|
+
run('git', ['fetch', 'origin', `refs/pull/${pending.number}/head`]);
|
|
379
|
+
if (run('git', ['rev-parse', 'FETCH_HEAD']) !== pending.head) {
|
|
380
|
+
throw new Error(`fetched PR head changed: #${pending.number}`);
|
|
381
|
+
}
|
|
382
|
+
} catch (error) {
|
|
383
|
+
if (isHead) throw error;
|
|
384
|
+
reachDeferred.push({ number: pending.number, head: pending.head, reason: String(error), at: new Date().toISOString() });
|
|
385
|
+
reachSkip.add(pending.number);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
const pinned = pinShadowReachCandidates(cwd, run, state.pending, base, reachSkip);
|
|
389
|
+
trees = pinned.trees;
|
|
390
|
+
for (const failure of pinned.failures) {
|
|
391
|
+
const reason = `reach worktree failed: #${failure.number}: ${failure.reason}`;
|
|
392
|
+
if (failure.number === item.number) throw new Error(reason);
|
|
393
|
+
reachDeferred.push({ number: failure.number, head: failure.head, reason, at: new Date().toISOString() });
|
|
394
|
+
}
|
|
395
|
+
if (reachDeferred.length) {
|
|
396
|
+
recordShadowDeferred(state, reachDeferred);
|
|
397
|
+
writeShadowQueue(path, state);
|
|
398
|
+
}
|
|
399
|
+
if (pinned.candidates.length >= 2) {
|
|
400
|
+
const decision = buildTrainReachDecision(
|
|
401
|
+
{ version: 1, baseSha: base, queueSig, prs: pinned.candidates },
|
|
402
|
+
deps.trainReachInspect,
|
|
403
|
+
);
|
|
404
|
+
const group = decision.groups.find((entry) => entry.status === 'measured' && !entry.capacityBlocked && entry.prs.length >= 2
|
|
405
|
+
&& entry.prs.includes(String(item.number)));
|
|
406
|
+
if (group) {
|
|
407
|
+
const trainPlan = planShadowReachTrain(state.pending, group, { maxBatch: deps.trainMaxBatch ?? 5 });
|
|
408
|
+
if (trainPlan.batch.length >= 2) {
|
|
409
|
+
return await runShadowMergeTrain(state, path, cwd, run, execute, trainPlan, group, queueSig, base, deps);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
} finally {
|
|
414
|
+
for (const tree of trees) {
|
|
415
|
+
try { run('git', ['worktree', 'remove', '--force', tree]); } catch { /* still delete the directory */ }
|
|
416
|
+
rmSync(tree, { recursive: true, force: true });
|
|
417
|
+
}
|
|
418
|
+
}
|
|
250
419
|
const verdict: L8ShadowVerdict = { number: item.number, head: item.head, verdict: 'fail', tests: [], at: new Date().toISOString() };
|
|
251
420
|
const view = JSON.parse(run('gh', ['pr', 'view', String(item.number), '--json', 'headRefOid,baseRefName,state,isDraft,isCrossRepository'])) as {
|
|
252
421
|
headRefOid?: string; baseRefName?: string; state?: string; isDraft?: boolean; isCrossRepository?: boolean;
|
|
253
422
|
};
|
|
254
423
|
if (view.headRefOid !== item.head || view.baseRefName !== 'main' || view.state !== 'OPEN'
|
|
255
424
|
|| view.isDraft !== false || view.isCrossRepository !== false) throw new Error('queued PR changed or is not ready');
|
|
256
|
-
run('git', ['fetch', 'origin', 'refs/heads/main']);
|
|
257
|
-
const base = run('git', ['rev-parse', 'FETCH_HEAD']);
|
|
258
|
-
if (!/^[0-9a-f]{40}$/i.test(base)) throw new Error('main commit unavailable');
|
|
259
425
|
verdict.base = base;
|
|
260
426
|
run('git', ['fetch', 'origin', `refs/pull/${item.number}/head`]);
|
|
261
427
|
if (run('git', ['rev-parse', 'FETCH_HEAD']) !== item.head) throw new Error('fetched PR head changed');
|
|
@@ -5,6 +5,7 @@ import { spawnSync } from 'node:child_process';
|
|
|
5
5
|
import { debug } from '../debug/log.js';
|
|
6
6
|
import { narrowerEvidenceCommand } from './evidence-command-budget.js';
|
|
7
7
|
import { resolveRunIdentity } from '../harness/harness-space.js';
|
|
8
|
+
import { authoredSignalCommandFromGoal } from './goal-doc/section.js';
|
|
8
9
|
//
|
|
9
10
|
// ⛔ **왜 필요한가** — 리뷰어의 증거 채널은 워크트리 diff 하나다(`seams.ts` 의 `reviewDiff`).
|
|
10
11
|
// 그래서 자식이 **diff 로 드러나지 않는 이행**(명령을 돌려 확인한 결과·라이브 관측)을 했을 때
|
|
@@ -334,6 +335,26 @@ interface RequiredEvidenceCheckRun {
|
|
|
334
335
|
readonly substitutedFor?: string;
|
|
335
336
|
}
|
|
336
337
|
|
|
338
|
+
function authoredSignalCommand(goal: string): string | undefined {
|
|
339
|
+
const command = authoredSignalCommandFromGoal(goal);
|
|
340
|
+
if (!command) return undefined;
|
|
341
|
+
// Goal-authored signals run as one explicit command. Reject shell composition and
|
|
342
|
+
// substitutions; keep the accepted executable set aligned with goal-author's contract.
|
|
343
|
+
if (/[\r\n;|&<>`$()]/u.test(command) || /\b(?:sudo|eval|exec)\b/u.test(command)) return undefined;
|
|
344
|
+
const match = command.match(/^([A-Za-z0-9_./~-]+)\s+(.+)$/u);
|
|
345
|
+
if (!match) return undefined;
|
|
346
|
+
const executable = match[1]!.split('/').at(-1);
|
|
347
|
+
if (!new Set(['eln','bun','git','gh','rg','test','npm','pnpm','yarn','node','python','python3','pytest','make','cargo','go','curl','jq','sqlite3','grep','sed','awk','cat','find','docker','kubectl']).has(executable!)) return undefined;
|
|
348
|
+
if (executable === 'test' && !/^(?:-f|-e)\s+[^\s]+$/u.test(match[2]!)) return undefined;
|
|
349
|
+
return command;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export function authoredSignalExecution(goal: string, checks: readonly RequiredEvidenceCheckRun[]): { command: string; exitCode: number | null; stdout: string; stderr: string } | undefined {
|
|
353
|
+
const command = authoredSignalCommand(goal);
|
|
354
|
+
const run = command ? checks.find((check) => check.command === command) : undefined;
|
|
355
|
+
return run ? { command: run.command, exitCode: run.exitCode, stdout: run.stdout, stderr: run.stderr } : undefined;
|
|
356
|
+
}
|
|
357
|
+
|
|
337
358
|
type EvidenceCommandRunner = (command: string, cwd: string) => Pick<ReturnType<typeof spawnSync>, 'status' | 'stdout' | 'stderr' | 'error'>;
|
|
338
359
|
|
|
339
360
|
/**
|
|
@@ -436,6 +457,8 @@ export function runRequiredEvidenceChecks(goal: string, cwd: string, runId?: str
|
|
|
436
457
|
} = {}): RequiredEvidenceCheckRun[] {
|
|
437
458
|
const identity = resolveRunIdentity({ explicit: runId });
|
|
438
459
|
const checks = requiredEvidenceFromGoal(goal).flatMap(({ tag, verifyCommand }) => verifyCommand ? [{ tag, command: verifyCommand }] : []);
|
|
460
|
+
const signalCommand = authoredSignalCommand(goal);
|
|
461
|
+
if (signalCommand && !checks.some(({ command }) => command === signalCommand)) checks.push({ tag: 'authored-signal', command: signalCommand });
|
|
439
462
|
// Direct callers without a measured HEAD have no stable revision identity;
|
|
440
463
|
// the run-owned wrapper supplies a temporary identity when appropriate.
|
|
441
464
|
const timeoutCounts = options.headCommit ? options.timeoutCounts : undefined;
|