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
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
* Cf. PLAN-parallel-self-dev-orchestrator-2026-07-21.
|
|
20
20
|
*/
|
|
21
21
|
import { lstatSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
22
|
-
import type { ReviewRework } from '../../self-dev/run-types.js';
|
|
22
|
+
import type { ReviewRework, SelfDevJobResult } from '../../self-dev/run-types.js';
|
|
23
|
+
import type { SelfImplementGateResult } from '../../self-implement/orchestrator.js';
|
|
23
24
|
import type { WarmWorkerCommand } from './pod-warm-worker-protocol.js';
|
|
24
25
|
import { oldDoorInternalEnv } from '../../self-dev/old-door.js';
|
|
25
26
|
import { selfDevRunsDir } from '../../self-dev/run-store.js';
|
|
@@ -52,11 +53,15 @@ export interface SelfImplementJobDone {
|
|
|
52
53
|
export interface SelfImplementDisposition {
|
|
53
54
|
stage?: string;
|
|
54
55
|
ok?: boolean;
|
|
56
|
+
/** Measured child gate receipt, forwarded only for a failed gate. */
|
|
57
|
+
gate?: SelfImplementGateResult;
|
|
55
58
|
worktreePath?: string;
|
|
56
59
|
branch?: string;
|
|
57
60
|
harvestable?: true;
|
|
58
61
|
prUrl?: string;
|
|
59
62
|
prNumber?: number;
|
|
63
|
+
/** Parent-side observation carried from the child's run ledger when available. */
|
|
64
|
+
goalPlanRevision?: SelfDevJobResult['goalPlanRevision'];
|
|
60
65
|
/** Head SHA checked by the Pod before host regate. */
|
|
61
66
|
checkedHeadCommit?: string;
|
|
62
67
|
/** Review verdict only when the child bound a real pass to a clean, unchanged worktree head. */
|
|
@@ -99,11 +104,30 @@ export interface SelfImplementDisposition {
|
|
|
99
104
|
childEvidence?: PodChildEvidence;
|
|
100
105
|
}
|
|
101
106
|
|
|
107
|
+
function isGoalPlanRevisionObservation(value: unknown): value is NonNullable<SelfDevJobResult['goalPlanRevision']> {
|
|
108
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
|
|
109
|
+
const row = value as Record<string, unknown>;
|
|
110
|
+
if (row.status === 'read') {
|
|
111
|
+
return Number.isSafeInteger(row.attempted) && Number(row.attempted) >= 0
|
|
112
|
+
&& Number.isSafeInteger(row.applied) && Number(row.applied) >= 0
|
|
113
|
+
&& Array.isArray(row.failureReasons) && row.failureReasons.every((reason) => typeof reason === 'string');
|
|
114
|
+
}
|
|
115
|
+
return row.status === 'read-failed'
|
|
116
|
+
&& ['directory-missing', 'unreadable-directory', 'unreadable-files'].includes(String(row.reason))
|
|
117
|
+
&& Number.isSafeInteger(row.scannedFiles) && Number(row.scannedFiles) >= 0
|
|
118
|
+
&& Number.isSafeInteger(row.unreadableFiles) && Number(row.unreadableFiles) >= 0
|
|
119
|
+
&& typeof row.ledgerDirectory === 'string';
|
|
120
|
+
}
|
|
121
|
+
|
|
102
122
|
export interface PodChildEvidence {
|
|
103
123
|
/** Bounded, redacted diagnostics copied only from a failed child terminal result. */
|
|
104
124
|
error?: string;
|
|
105
125
|
detail?: string;
|
|
106
126
|
stderr?: string;
|
|
127
|
+
/** Bounded, redacted complete Pod log tail. Separate from child stderr to avoid replacing stronger child facts. */
|
|
128
|
+
podLogTail?: string[];
|
|
129
|
+
podLogTailLines?: number;
|
|
130
|
+
podLogUnavailable?: string;
|
|
107
131
|
exitCode?: number;
|
|
108
132
|
classification?: string;
|
|
109
133
|
scopeEscape?: true;
|
|
@@ -126,6 +150,10 @@ export interface PodChildEvidence {
|
|
|
126
150
|
candidateCardId?: string;
|
|
127
151
|
blockingCardId?: string;
|
|
128
152
|
};
|
|
153
|
+
/** Harvest pointer and revision observation copied before the parent Pod stop is finalized. */
|
|
154
|
+
harvestable?: true;
|
|
155
|
+
prNumber?: number;
|
|
156
|
+
goalPlanRevision?: SelfDevJobResult['goalPlanRevision'];
|
|
129
157
|
}
|
|
130
158
|
|
|
131
159
|
const SCOPE_STOP_REASON_ORDER: readonly ScopeStopReason[] = SCOPE_STOP_REASONS;
|
|
@@ -204,6 +232,9 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
|
|
|
204
232
|
...(o.goalCauseObserved === true ? { goalCauseObserved: true } : {}),
|
|
205
233
|
...(o.terminationReason !== undefined ? { terminationReason: scrubValue(o.terminationReason) } : {}),
|
|
206
234
|
...(accountAvailability ? { accountAvailability } : {}),
|
|
235
|
+
...(o.harvestable === true && typeof o.branch === 'string' && o.branch.trim() ? { harvestable: true } : {}),
|
|
236
|
+
...(typeof o.prNumber === 'number' && Number.isSafeInteger(o.prNumber) && o.prNumber > 0 ? { prNumber: o.prNumber } : {}),
|
|
237
|
+
...(isGoalPlanRevisionObservation(o.goalPlanRevision) ? { goalPlanRevision: o.goalPlanRevision } : {}),
|
|
207
238
|
};
|
|
208
239
|
if (o.ok === false && typeof o.error === 'string'
|
|
209
240
|
&& /draft PR 생성 실패|PR (?:gh|guard) 실패|same-cell reuse:/u.test(o.error)) {
|
|
@@ -621,11 +652,15 @@ export function parseSelfImplementJson(stdout: string): SelfImplementDisposition
|
|
|
621
652
|
const mapped: SelfImplementDisposition = {
|
|
622
653
|
...(typeof o.stage === 'string' ? { stage: o.stage } : {}),
|
|
623
654
|
...(typeof o.ok === 'boolean' ? { ok: o.ok } : {}),
|
|
655
|
+
...(o.stage === 'gate-failed' && o.ok === false && o.gate && typeof o.gate === 'object'
|
|
656
|
+
&& !Array.isArray(o.gate) && (o.gate as { passed?: unknown }).passed === false
|
|
657
|
+
? { gate: o.gate as SelfImplementGateResult } : {}),
|
|
624
658
|
...(typeof o.worktreePath === 'string' ? { worktreePath: o.worktreePath } : {}),
|
|
625
659
|
...(typeof o.branch === 'string' ? { branch: o.branch } : {}),
|
|
626
660
|
...(o.harvestable === true && typeof o.branch === 'string' && o.branch.trim() ? { harvestable: true } : {}),
|
|
627
661
|
...(typeof o.prUrl === 'string' ? { prUrl: o.prUrl } : {}),
|
|
628
|
-
...(
|
|
662
|
+
...(Number.isSafeInteger(o.prNumber) && Number(o.prNumber) > 0 ? { prNumber: Number(o.prNumber) } : {}),
|
|
663
|
+
...(isGoalPlanRevisionObservation(o.goalPlanRevision) ? { goalPlanRevision: o.goalPlanRevision } : {}),
|
|
629
664
|
...(typeof o.checkedHeadCommit === 'string' ? { checkedHeadCommit: o.checkedHeadCommit } : {}),
|
|
630
665
|
...(o.reviewedHeadCommit && typeof o.reviewedHeadCommit === 'string' && /^[0-9a-f]{40}$/i.test(o.reviewedHeadCommit)
|
|
631
666
|
&& o.review && typeof o.review === 'object' && !Array.isArray(o.review)
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// Shared key routing for interactive terminal modals in dashboard and TUI.
|
|
2
|
+
//
|
|
3
|
+
// Holds singleton state for "which interactive terminal modal is
|
|
4
|
+
// currently foregrounded" + the key-intercept policy:
|
|
5
|
+
//
|
|
6
|
+
// • while a modal is present, ESC / Ctrl-G dispose it
|
|
7
|
+
// • all other keys forward to modal.surface.onKey(ev) so the PTY
|
|
8
|
+
// receives them without the chat readKey loop trying to
|
|
9
|
+
// interpret them
|
|
10
|
+
//
|
|
11
|
+
// Kept separate from either renderer so both can use the same routing policy.
|
|
12
|
+
//
|
|
13
|
+
// P10 will extend this with Ctrl-B prefix handling (d=detach,
|
|
14
|
+
// s=switch, etc.) once a session registry exists to act on.
|
|
15
|
+
|
|
16
|
+
import type { InteractiveTerminalModalHandle } from '../interactive-terminal-modal.js';
|
|
17
|
+
import type { KeyEvent } from '../display/types.js';
|
|
18
|
+
import { debug } from '../debug/log.js';
|
|
19
|
+
|
|
20
|
+
export type KeyRouteResult = 'consumed' | 'passthrough' | 'closed';
|
|
21
|
+
|
|
22
|
+
export interface TerminalModalRouter {
|
|
23
|
+
current(): InteractiveTerminalModalHandle | null;
|
|
24
|
+
/** Install a modal handle. Optional closePolicy controls what
|
|
25
|
+
* ESC/Ctrl-G does: 'kill' disposes the modal + PTY (default);
|
|
26
|
+
* 'detach' calls handle.dispose({keepPreview:true}) so the PTY
|
|
27
|
+
* survives for re-attach (session registry flow). An explicit
|
|
28
|
+
* onClose hook wins over closePolicy — that's how dashboard
|
|
29
|
+
* wires the owning session registry's detach action on Esc. */
|
|
30
|
+
set(
|
|
31
|
+
handle: InteractiveTerminalModalHandle | null,
|
|
32
|
+
opts?: { closePolicy?: 'kill' | 'detach'; onClose?: () => void },
|
|
33
|
+
): void;
|
|
34
|
+
close(): void;
|
|
35
|
+
handleKey(ev: KeyEvent): KeyRouteResult;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// `exit` typed cleanly + Enter closes the popup. claude / codex don't
|
|
39
|
+
// recognize plain `exit` (their command is /exit or /quit), so a user
|
|
40
|
+
// typing `exit\n` would otherwise be stuck — the popup stays open
|
|
41
|
+
// because the child never exits, and the typed text just becomes chat
|
|
42
|
+
// input. elanous intercepts the exact sequence at the router so:
|
|
43
|
+
// • plain shell: same end result (we close before shell evaluates)
|
|
44
|
+
// • claude / codex: popup closes as the user expected
|
|
45
|
+
// Sequence is reset on any non-letter key (other than backspace, which
|
|
46
|
+
// rewinds), Ctrl/Alt modifiers, or any character outside `e/x/i/t` —
|
|
47
|
+
// so genuine words containing "exit" (e.g. typing "exit this loop"
|
|
48
|
+
// into a claude prompt without Enter) DON'T trigger the close. The
|
|
49
|
+
// trigger is specifically `e`, `x`, `i`, `t`, Enter with nothing else.
|
|
50
|
+
const EXIT_CHARS = ['e', 'x', 'i', 't'] as const;
|
|
51
|
+
|
|
52
|
+
export function createTerminalModalRouter(): TerminalModalRouter {
|
|
53
|
+
let handle: InteractiveTerminalModalHandle | null = null;
|
|
54
|
+
let closePolicy: 'kill' | 'detach' = 'kill';
|
|
55
|
+
let onClose: (() => void) | null = null;
|
|
56
|
+
let exitProgress = 0; // how many of EXIT_CHARS have been typed in order
|
|
57
|
+
|
|
58
|
+
const close = (): void => {
|
|
59
|
+
if (!handle) return;
|
|
60
|
+
const h = handle;
|
|
61
|
+
const cb = onClose;
|
|
62
|
+
if (debug.enabled) debug.log('window.terminalModalRouter.close', h.id, { id: h.id, closePolicy, hasOnClose: !!cb });
|
|
63
|
+
handle = null;
|
|
64
|
+
onClose = null;
|
|
65
|
+
exitProgress = 0;
|
|
66
|
+
try {
|
|
67
|
+
if (cb) cb();
|
|
68
|
+
else if (closePolicy === 'detach') h.dispose({ keepPreview: true });
|
|
69
|
+
else h.dispose();
|
|
70
|
+
} catch { /* already disposed */ }
|
|
71
|
+
closePolicy = 'kill';
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
current: () => handle,
|
|
76
|
+
set: (h, opts) => {
|
|
77
|
+
if (handle && h && handle.id !== h.id) close();
|
|
78
|
+
handle = h;
|
|
79
|
+
closePolicy = opts?.closePolicy ?? 'kill';
|
|
80
|
+
onClose = opts?.onClose ?? null;
|
|
81
|
+
exitProgress = 0;
|
|
82
|
+
if (debug.enabled) {
|
|
83
|
+
debug.log('window.terminalModalRouter.set', h?.id ?? '(null)', {
|
|
84
|
+
id: h?.id ?? null,
|
|
85
|
+
closePolicy,
|
|
86
|
+
hasOnClose: !!onClose,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
close,
|
|
91
|
+
handleKey: (ev) => {
|
|
92
|
+
if (!handle) return 'passthrough';
|
|
93
|
+
const name = (ev.name ?? '').toLowerCase();
|
|
94
|
+
// ESC must NOT close the modal — claude / codex inside the popup
|
|
95
|
+
// use ESC to cancel an in-progress chat / tool turn. Closing the
|
|
96
|
+
// wrapper window on ESC made the only-way-to-cancel kill the
|
|
97
|
+
// whole popup. iTerm / ghostty don't close their own windows on
|
|
98
|
+
// ESC either; the wrapper should match. Modal close is reserved
|
|
99
|
+
// for: Ctrl+G (close + focus log), Ctrl+Shift+T (toggle off),
|
|
100
|
+
// typed `exit\n`, and the child's own `exit`. ESC just forwards.
|
|
101
|
+
if (ev.ctrl && (name === 'g' || name === 'ㅎ')) {
|
|
102
|
+
if (debug.enabled) debug.log('window.terminalModalRouter.handleKey.close', 'ctrl-g', { id: handle.id });
|
|
103
|
+
close();
|
|
104
|
+
return 'closed';
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Track typed `exit` followed by Enter so the user's natural
|
|
108
|
+
// mental model ("type exit to quit") works inside agent popups
|
|
109
|
+
// (claude / codex) where the child app doesn't recognize a bare
|
|
110
|
+
// `exit` command. See EXIT_CHARS comment above for false-positive
|
|
111
|
+
// avoidance.
|
|
112
|
+
const noMods = !ev.ctrl && !ev.alt;
|
|
113
|
+
if (noMods && name === 'enter' && exitProgress === EXIT_CHARS.length) {
|
|
114
|
+
if (debug.enabled) {
|
|
115
|
+
debug.log('window.terminalModalRouter.handleKey.close', 'typed-exit', {
|
|
116
|
+
id: handle.id,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
close();
|
|
120
|
+
return 'closed';
|
|
121
|
+
}
|
|
122
|
+
if (noMods && name === 'backspace') {
|
|
123
|
+
if (exitProgress > 0) exitProgress--;
|
|
124
|
+
} else if (noMods && name.length === 1 && exitProgress < EXIT_CHARS.length && name === EXIT_CHARS[exitProgress]) {
|
|
125
|
+
exitProgress++;
|
|
126
|
+
} else if (noMods && name === 'enter') {
|
|
127
|
+
// Enter without a complete `exit` prefix — reset and forward.
|
|
128
|
+
exitProgress = 0;
|
|
129
|
+
} else if (name.length === 1 || name === 'space' || ev.ctrl || ev.alt) {
|
|
130
|
+
// Any other printable key OR a modifier keystroke breaks the
|
|
131
|
+
// streak. Multi-char named keys (arrow / fn / etc.) leave the
|
|
132
|
+
// streak alone — the child may consume them without affecting
|
|
133
|
+
// the user's typed prompt buffer.
|
|
134
|
+
exitProgress = 0;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (debug.enabled) {
|
|
138
|
+
debug.log('window.terminalModalRouter.handleKey.forward', name || '(empty)', {
|
|
139
|
+
id: handle.id,
|
|
140
|
+
name,
|
|
141
|
+
ctrl: ev.ctrl ?? false,
|
|
142
|
+
shift: ev.shift ?? false,
|
|
143
|
+
alt: ev.alt ?? false,
|
|
144
|
+
exitProgress,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
handle.surface.onKey?.(ev);
|
|
149
|
+
} catch { /* surface disposed mid-event; treat as no-op */ }
|
|
150
|
+
return 'consumed';
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Singleton used by renderers; the factory remains available for isolated tests. */
|
|
156
|
+
export const terminalModalRouter = createTerminalModalRouter();
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🐧 LINUX-STAGE — 개발 머신 환경에 기대지 않는 «격리 무대».
|
|
3
|
+
*
|
|
4
|
+
* Situation: 같은 시험이 macOS(개발 머신)에서는 통과하고 Linux 에서는 실패하는 잔여 실패가 있다.
|
|
5
|
+
* 원인은 코드가 아니라 «환경»이다 — 개발 머신 HOME 의 글로벌 git user.* · PATH 에 있는 grok CLI ·
|
|
6
|
+
* LANG/LC_ALL 이 정하는 콜레이션 · 로케일마다 달라지는 이모지 비교.
|
|
7
|
+
* Answer: 그 네 축을 «무대»로 고정한다 — 임시 HOME(글로벌 설정 없음), grok 이 없는 PATH,
|
|
8
|
+
* 저장소 로컬 identity 만 가진 git 작업 트리, C.UTF-8, 코드포인트 비교.
|
|
9
|
+
* ⛔ 이 무대는 «생산 진입점을 그대로 지나게» 하는 시험을 위한 것이다 — 소스 문자열 검사용이 아니다.
|
|
10
|
+
* ⛔ `withLinuxEnv` 는 끝나면 env 와 임시 디렉터리를 원상복구한다(같은 파일의 뒤 시험을 오염시키지 않는다).
|
|
11
|
+
*/
|
|
12
|
+
import { spawnSync, type SpawnSyncReturns } from 'node:child_process';
|
|
13
|
+
import { accessSync, constants, existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
14
|
+
import { tmpdir } from 'node:os';
|
|
15
|
+
import { delimiter, join } from 'node:path';
|
|
16
|
+
|
|
17
|
+
/** 무대 로케일 — Linux CI 의 기본값(LANG 미설정 · POSIX)을 넘긴다. */
|
|
18
|
+
export const STAGE_LOCALE = 'C.UTF-8';
|
|
19
|
+
|
|
20
|
+
/** 무대 git 신원 — 글로벌 설정이 아니라 저장소 로컬에만 박는다. */
|
|
21
|
+
export const STAGE_GIT_IDENTITY = { name: 'Elanous Stage', email: 'stage@elanous.test', branch: 'main' } as const;
|
|
22
|
+
|
|
23
|
+
export interface LinuxEnvStage {
|
|
24
|
+
/** 무대 루트(시험 끝에 통째로 지운다). */
|
|
25
|
+
readonly root: string;
|
|
26
|
+
/** 임시 HOME — `.gitconfig` 가 없다(글로벌 git 신원 없음). */
|
|
27
|
+
readonly home: string;
|
|
28
|
+
/** ELANOUS_STATE_DIR — config-dir 이 이 경로를 따라가므로 둘 다 격리된다. */
|
|
29
|
+
readonly state: string;
|
|
30
|
+
/** 무대 git 작업 트리(저장소 로컬 identity 만). */
|
|
31
|
+
readonly repo: string;
|
|
32
|
+
/** PATH 앞머리 — grok 이 없는 빈 디렉터리. */
|
|
33
|
+
readonly bin: string;
|
|
34
|
+
readonly env: Record<string, string>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const ENV_KEYS = [
|
|
38
|
+
'HOME',
|
|
39
|
+
'ELANOUS_STATE_DIR',
|
|
40
|
+
'ELANOUS_STATE_DIR_SOURCE',
|
|
41
|
+
'ELANOUS_CONFIG_DIR',
|
|
42
|
+
'LANG',
|
|
43
|
+
'LC_ALL',
|
|
44
|
+
'TZ',
|
|
45
|
+
'PATH',
|
|
46
|
+
'GIT_CONFIG_GLOBAL',
|
|
47
|
+
'GIT_CONFIG_SYSTEM',
|
|
48
|
+
'GIT_AUTHOR_NAME',
|
|
49
|
+
'GIT_AUTHOR_EMAIL',
|
|
50
|
+
'GIT_COMMITTER_NAME',
|
|
51
|
+
'GIT_COMMITTER_EMAIL',
|
|
52
|
+
] as const;
|
|
53
|
+
|
|
54
|
+
/** 무대 PATH 의 시스템 꼬리 — grok 이 깔린 디렉터리는 «걸러낸다»(머신마다 설치 위치가 다르다). */
|
|
55
|
+
const SYSTEM_PATH = ['/usr/local/bin', '/usr/bin', '/bin'];
|
|
56
|
+
|
|
57
|
+
/** 무대를 만들기만 한다(env 적용은 `withLinuxEnv`). */
|
|
58
|
+
export function createLinuxEnvStage(): LinuxEnvStage {
|
|
59
|
+
const root = mkdtempSync(join(tmpdir(), 'elanous-linux-env-'));
|
|
60
|
+
const home = join(root, 'home');
|
|
61
|
+
const repo = join(root, 'repo');
|
|
62
|
+
const bin = join(root, 'bin');
|
|
63
|
+
const state = join(repo, '.elanous');
|
|
64
|
+
for (const dir of [home, repo, bin, state]) mkdirSync(dir, { recursive: true });
|
|
65
|
+
const env: Record<string, string> = {
|
|
66
|
+
HOME: home,
|
|
67
|
+
// ELANOUS_CONFIG_DIR 는 state 를 따라가는 것이 정본이므로 따로 두지 않는다(무시 경고 방지).
|
|
68
|
+
ELANOUS_STATE_DIR: state,
|
|
69
|
+
ELANOUS_STATE_DIR_SOURCE: 'explicit',
|
|
70
|
+
LANG: STAGE_LOCALE,
|
|
71
|
+
LC_ALL: STAGE_LOCALE,
|
|
72
|
+
TZ: 'UTC',
|
|
73
|
+
PATH: [bin, ...SYSTEM_PATH.filter((dir) => !existsSync(join(dir, 'grok')))].join(delimiter),
|
|
74
|
+
// 글로벌·시스템 git 설정을 read 자체에서 끊는다 — 개발 머신 설정이 새어 들어올 길을 없앤다.
|
|
75
|
+
GIT_CONFIG_GLOBAL: '/dev/null',
|
|
76
|
+
GIT_CONFIG_SYSTEM: '/dev/null',
|
|
77
|
+
};
|
|
78
|
+
return { root, home, state, repo, bin, env };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 무대 env 로 `fn` 을 돌리고 원상복구한다.
|
|
83
|
+
* `ELANOUS_STATE_DIR` 가 정해지면 config-dir 도 그 아래로 오므로(config 정본 = state) 저장소·HOME 오염이 없다.
|
|
84
|
+
*/
|
|
85
|
+
export async function withLinuxEnv<T>(fn: (stage: LinuxEnvStage) => T | Promise<T>): Promise<T> {
|
|
86
|
+
const stage = createLinuxEnvStage();
|
|
87
|
+
const saved = ENV_KEYS.map((key) => [key, process.env[key]] as const);
|
|
88
|
+
delete process.env.ELANOUS_CONFIG_DIR;
|
|
89
|
+
for (const [key, value] of Object.entries(stage.env)) process.env[key] = value;
|
|
90
|
+
// 개발 머신이 물려준 author/committer env 가 저장소 로컬 identity 증명을 가리지 않게 걷어낸다.
|
|
91
|
+
for (const key of ['GIT_AUTHOR_NAME', 'GIT_AUTHOR_EMAIL', 'GIT_COMMITTER_NAME', 'GIT_COMMITTER_EMAIL']) delete process.env[key];
|
|
92
|
+
try {
|
|
93
|
+
return await fn(stage);
|
|
94
|
+
} finally {
|
|
95
|
+
for (const [key, value] of saved) {
|
|
96
|
+
if (value === undefined) delete process.env[key];
|
|
97
|
+
else process.env[key] = value;
|
|
98
|
+
}
|
|
99
|
+
rmSync(stage.root, { recursive: true, force: true });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 무대 env 를 «명시» 해서 자식 프로세스를 띄운다.
|
|
105
|
+
* ⛔ bun 1.4.2 는 `process.env.PATH` 를 바꾸는 순간 이후 spawn 한 자식의 environ 을 기동 시 스냅샷으로
|
|
106
|
+
* 재구성한다 — HOME 등 다른 키의 JS 측 변이가 자식에 새지 않는다(실측: PATH assign 뒤 `env` 자식의
|
|
107
|
+
* HOME 이 원래 값으로 되돌아감). ambient 상속에 기대지 말고 무대 안의 자식은 반드시 이 함수로 띄운다.
|
|
108
|
+
* in-process(process.env 를 직접 읽는 코드)는 `withLinuxEnv` 의 변이가 그대로 보인다.
|
|
109
|
+
*/
|
|
110
|
+
export function stageSpawnSync(
|
|
111
|
+
stage: LinuxEnvStage,
|
|
112
|
+
file: string,
|
|
113
|
+
args: string[],
|
|
114
|
+
opts: { cwd?: string } = {},
|
|
115
|
+
): SpawnSyncReturns<string> {
|
|
116
|
+
return spawnSync(file, args, {
|
|
117
|
+
cwd: opts.cwd ?? stage.repo,
|
|
118
|
+
env: { ...process.env, ...stage.env },
|
|
119
|
+
encoding: 'utf8',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** 무대 PATH 에서 그 명령이 실행 가능한가 — Linux CI 에 grok 이 없다는 사실을 «재는» 데 쓴다. */
|
|
124
|
+
export function stageHasCommand(stage: LinuxEnvStage, name: string): boolean {
|
|
125
|
+
return (stage.env.PATH ?? '').split(delimiter).some((dir) => {
|
|
126
|
+
if (!dir) return false;
|
|
127
|
+
try {
|
|
128
|
+
accessSync(join(dir, name), constants.X_OK);
|
|
129
|
+
return true;
|
|
130
|
+
} catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** 무대 HOME 에 글로벌 git 신원이 있는가 — 무대에서는 false 여야 한다. */
|
|
137
|
+
export function hasGlobalGitIdentity(stage: LinuxEnvStage): boolean {
|
|
138
|
+
return existsSync(join(stage.home, '.gitconfig')) || existsSync(join(stage.home, '.config', 'git', 'config'));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function gitInStage(stage: LinuxEnvStage, args: string[]): string {
|
|
142
|
+
const result = stageSpawnSync(stage, 'git', args);
|
|
143
|
+
if (result.error) throw result.error;
|
|
144
|
+
if (result.status !== 0) throw new Error(`git ${args.join(' ')} 실패(rc=${result.status}): ${result.stderr.trim()}`);
|
|
145
|
+
return result.stdout.trim();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* 무대 작업 트리를 «저장소 로컬 identity 만» 으로 초기화하고 첫 커밋까지 만든다.
|
|
150
|
+
* 커밋이 성공했다는 것 자체가 user.name/user.email 이 로컬 설정으로 먹었다는 실물 증거다.
|
|
151
|
+
*/
|
|
152
|
+
export function initGitWithExplicitIdentity(stage: LinuxEnvStage): void {
|
|
153
|
+
gitInStage(stage, ['-c', `init.defaultBranch=${STAGE_GIT_IDENTITY.branch}`, 'init', '--quiet']);
|
|
154
|
+
gitInStage(stage, ['config', 'user.name', STAGE_GIT_IDENTITY.name]);
|
|
155
|
+
gitInStage(stage, ['config', 'user.email', STAGE_GIT_IDENTITY.email]);
|
|
156
|
+
gitInStage(stage, ['config', 'init.defaultBranch', STAGE_GIT_IDENTITY.branch]);
|
|
157
|
+
writeFileSync(join(stage.repo, 'README.md'), '# linux stage\n');
|
|
158
|
+
gitInStage(stage, ['add', 'README.md']);
|
|
159
|
+
gitInStage(stage, ['commit', '--quiet', '-m', 'stage: 초기 커밋']);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** 무대 작업 트리의 실제 git 정체 — 로컬 설정과 현재 브랜치를 읽어 온다. */
|
|
163
|
+
export function gitStageIdentity(stage: LinuxEnvStage): { name: string; email: string; branch: string } {
|
|
164
|
+
return {
|
|
165
|
+
name: gitInStage(stage, ['config', '--get', 'user.name']),
|
|
166
|
+
email: gitInStage(stage, ['config', '--get', 'user.email']),
|
|
167
|
+
branch: gitInStage(stage, ['symbolic-ref', '--short', 'HEAD']),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* 문자열을 «코드포인트» 단위로 쪼갠다 — `'🎉party'.length` 는 7(UTF-16)이지만 코드포인트는 6이다.
|
|
173
|
+
* 로케일·인코딩에 따라 이모지 비교가 흔들리는 자리를 코드포인트로 고정한다.
|
|
174
|
+
*/
|
|
175
|
+
export function codePoints(value: string): string[] {
|
|
176
|
+
return [...value];
|
|
177
|
+
}
|
package/src/tool-hints/gate.ts
CHANGED
|
@@ -171,17 +171,19 @@ export function evaluateGate(
|
|
|
171
171
|
|
|
172
172
|
// ─── Step 6: model-tier budget cap ─────────────────────────────
|
|
173
173
|
// Weak/cheap models pay a per-tool token tax. On codex/gpt-5 we
|
|
174
|
-
// cap the prompt
|
|
175
|
-
//
|
|
174
|
+
// cap the prompt after boost sort to keep per-call overhead bounded.
|
|
175
|
+
// Research already has an intent signal; it needs more source tools but
|
|
176
|
+
// still has a finite cap. Claude/Opus/Grok don't need this cap.
|
|
176
177
|
let keep: string[] = [...enabled];
|
|
177
178
|
const capped = signals.modelFamily === 'codex' || signals.modelFamily === 'gpt';
|
|
178
179
|
if (capped) {
|
|
179
180
|
const beforeModelFamilyCap = keep.length;
|
|
180
|
-
|
|
181
|
+
const cap = signals.researchAgent ? 16 : 8;
|
|
182
|
+
if (keep.length > cap) {
|
|
181
183
|
keep = keep
|
|
182
184
|
.map(id => ({ id, score: boost.get(id) ?? 0 }))
|
|
183
185
|
.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id))
|
|
184
|
-
.slice(0,
|
|
186
|
+
.slice(0, cap)
|
|
185
187
|
.map(x => x.id);
|
|
186
188
|
}
|
|
187
189
|
stages.modelFamilyCap = executedStage(beforeModelFamilyCap, keep.length);
|
|
@@ -29,6 +29,8 @@ export interface SignalSnapshot {
|
|
|
29
29
|
|
|
30
30
|
// Recent conversation
|
|
31
31
|
intentResearch: boolean;
|
|
32
|
+
/** Deep multi-source research route; quick fact lookups remain capped. */
|
|
33
|
+
researchAgent?: boolean;
|
|
32
34
|
intentDiagram: boolean;
|
|
33
35
|
recentNetworkError: boolean;
|
|
34
36
|
|
|
@@ -116,6 +118,34 @@ const NETWORK_ERROR_RE = /\b(ETIMEDOUT|ENOTFOUND|ECONNREFUSED|ECONNRESET|EHOSTUN
|
|
|
116
118
|
// positive rate is fine because these signals only nudge a boost.
|
|
117
119
|
const RESEARCH_ASCII_RE = /\b(research|find out|look up|investigate|latest (on|news)|what (are|is|does))\b/i;
|
|
118
120
|
const RESEARCH_KO_RE = /(최신|뉴스|찾아(?:줘|봐)|알아봐|조사|리서치)/;
|
|
121
|
+
const RESEARCH_SKILL_RE = /\b(?:omni[ -]market|omni[ -]crawl|social[ -]pulse)\b/i;
|
|
122
|
+
const RESEARCH_EXPLANATION_RE = /(?:왜|이유|원인|전망|분석|비교|조사|\bwhy\b|\bcause\b|\boutlook\b|\banalysis\b|\bcompare\b)/i;
|
|
123
|
+
const RESEARCH_TOPIC_RE = /(?:금리|채권|시장|경제|물가|환율|주가|기업|산업|정책|선거|역사|기후|질병|의학|과학|\bbond\b|\byield\b|\bmarket\b|\beconomy\b|\binflation\b|\bstock\b|\bpolicy\b|\belection\b|\bhistory\b|\bclimate\b|\bhealth\b|\bscience\b)/i;
|
|
124
|
+
const RESEARCH_CODING_RE = /(?:코드|함수|버그|테스트|빌드|커밋|하니스|설정|오류|구현|수리|고쳐|수정|저장소|\brepo\b|\bcode\b|\bfunction\b|\bbug\b|\btest\b|\bbuild\b|\bcommit\b|\bconfig\b|\bimplement\b|\bfix\b)/i;
|
|
125
|
+
const DEEP_RESEARCH_INTENT_TERMS = [
|
|
126
|
+
'research', 'deep research', 'triangulate', 'compare sources',
|
|
127
|
+
'multiple sources', 'community reaction', 'reddit reaction',
|
|
128
|
+
'x reaction', 'trend', 'sentiment', '여러 소스', '깊게 조사',
|
|
129
|
+
'리서치', '반응', '트렌드', '여론', '비교 조사', '교차검증',
|
|
130
|
+
] as const;
|
|
131
|
+
|
|
132
|
+
function hasResearchTurnIntent(text: string | undefined): boolean {
|
|
133
|
+
if (!text) return false;
|
|
134
|
+
if (matchesIntent(text, RESEARCH_ASCII_RE, RESEARCH_KO_RE)) return true;
|
|
135
|
+
return isResearchAgentIntent(text);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Shared research/agent verdict for surface routing and the tool catalog.
|
|
139
|
+
* Keep the historical deep-research words before the new coding veto so
|
|
140
|
+
* existing explicit surface choices retain their meaning. */
|
|
141
|
+
export function isResearchAgentIntent(text: string | undefined): boolean {
|
|
142
|
+
if (!text) return false;
|
|
143
|
+
const lower = text.toLowerCase();
|
|
144
|
+
if (DEEP_RESEARCH_INTENT_TERMS.some((term) => lower.includes(term))) return true;
|
|
145
|
+
if (RESEARCH_CODING_RE.test(text)) return false;
|
|
146
|
+
return RESEARCH_SKILL_RE.test(text)
|
|
147
|
+
|| (RESEARCH_EXPLANATION_RE.test(text) && RESEARCH_TOPIC_RE.test(text));
|
|
148
|
+
}
|
|
119
149
|
const DIAGRAM_ASCII_RE = /\b(diagrams?|flowcharts?|sequence|mermaid|graphs?|charts?|visuali[sz]e|architecture)\b/i;
|
|
120
150
|
const DIAGRAM_KO_RE = /(시퀀스|플로우|다이어그램|도식|그래프|시각화|아키텍처|구조도)/;
|
|
121
151
|
|
|
@@ -213,7 +243,8 @@ export function collectSignals(ctx: SignalContext = {}): SignalSnapshot {
|
|
|
213
243
|
hasNodeProject: existsSync(joinPath(cwd, 'package.json')),
|
|
214
244
|
hasGitRemote: detectGitRemote(cwd),
|
|
215
245
|
|
|
216
|
-
intentResearch:
|
|
246
|
+
intentResearch: hasResearchTurnIntent(ctx.recentUserText),
|
|
247
|
+
researchAgent: isResearchAgentIntent(ctx.recentUserText),
|
|
217
248
|
intentDiagram: matchesIntent(ctx.recentUserText, DIAGRAM_ASCII_RE, DIAGRAM_KO_RE),
|
|
218
249
|
recentNetworkError: hasRecentNetworkError(ctx.recentToolResults),
|
|
219
250
|
|
|
@@ -284,6 +315,7 @@ function fingerprintOf(s: SignalSnapshot): string {
|
|
|
284
315
|
s.hasNodeProject ? 'node' : '-',
|
|
285
316
|
s.hasGitRemote ? 'git' : '-',
|
|
286
317
|
s.intentResearch ? 'research' : '-',
|
|
318
|
+
s.researchAgent ? 'research-agent' : '-',
|
|
287
319
|
s.intentDiagram ? 'diagram' : '-',
|
|
288
320
|
s.recentNetworkError ? 'neterr' : '-',
|
|
289
321
|
s.modelFamily ?? '-',
|
|
@@ -13,13 +13,15 @@ function nonnegativeCount(value: unknown): value is number {
|
|
|
13
13
|
export class BackgroundJobStatus {
|
|
14
14
|
private sessionId: string | null;
|
|
15
15
|
private current: BackgroundJobSnapshot | null = null;
|
|
16
|
+
private readonly bySession = new Map<string, BackgroundJobSnapshot>();
|
|
16
17
|
|
|
17
18
|
constructor(sessionId: string | null) { this.sessionId = sessionId; }
|
|
18
19
|
|
|
19
20
|
setSessionId(sessionId: string): void {
|
|
20
21
|
if (this.sessionId === sessionId) return;
|
|
22
|
+
if (this.sessionId && this.current) this.bySession.set(this.sessionId, this.current);
|
|
21
23
|
this.sessionId = sessionId;
|
|
22
|
-
this.current = null;
|
|
24
|
+
this.current = this.bySession.get(sessionId) ?? null;
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
accept(json: string): boolean {
|
|
@@ -35,12 +37,16 @@ export class BackgroundJobStatus {
|
|
|
35
37
|
running: frame.running,
|
|
36
38
|
pending: frame.pending,
|
|
37
39
|
}) as BackgroundJobSnapshot;
|
|
40
|
+
this.bySession.set(frame.sessionId as string, this.current);
|
|
38
41
|
return true;
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
snapshot(): BackgroundJobSnapshot | null { return this.current; }
|
|
42
45
|
|
|
43
|
-
clear(): void {
|
|
46
|
+
clear(): void {
|
|
47
|
+
this.current = null;
|
|
48
|
+
if (this.sessionId) this.bySession.delete(this.sessionId);
|
|
49
|
+
}
|
|
44
50
|
|
|
45
51
|
line(): string {
|
|
46
52
|
const state = this.current;
|
|
@@ -92,10 +92,14 @@ export type InterimDisplay =
|
|
|
92
92
|
| { kind: 'folded'; line: string };
|
|
93
93
|
|
|
94
94
|
/** 메시지 인덱스 → 그리기 바꿈. 내부 턴 입력은 출처 한 줄, 그 «바로 앞» 중간 보고 답은 한 줄로 접는다. */
|
|
95
|
-
export function planInterimDisplay(messages: ReadonlyArray<{ role: string; content?: unknown }>): Map<number, InterimDisplay> {
|
|
95
|
+
export function planInterimDisplay(messages: ReadonlyArray<{ role: string; content?: unknown; goalInterim?: boolean }>): Map<number, InterimDisplay> {
|
|
96
96
|
const plan = new Map<number, InterimDisplay>();
|
|
97
97
|
for (let i = 0; i < messages.length; i++) {
|
|
98
98
|
const m = messages[i]!;
|
|
99
|
+
if (m.role === 'assistant' && m.goalInterim === true && typeof m.content === 'string') {
|
|
100
|
+
const verdict = classifyInterimReply(m.content.split('\n'));
|
|
101
|
+
if (verdict.interim) plan.set(i, { kind: 'folded', line: formatInterimFoldLine(verdict.summary) });
|
|
102
|
+
}
|
|
99
103
|
if (m.role !== 'user' || typeof m.content !== 'string') continue;
|
|
100
104
|
const origin = internalTurnOriginOfText(m.content);
|
|
101
105
|
if (!origin) continue;
|