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
package/src/dashboard/index.ts
CHANGED
|
@@ -255,6 +255,62 @@ import {
|
|
|
255
255
|
getDashboardContextMenuRegistry,
|
|
256
256
|
} from './context-menu/registry.js';
|
|
257
257
|
import { createTransientOverlayHost } from '../display/transient-overlay-host.js';
|
|
258
|
+
import { beginSynchronizedFrameOutput } from './synchronized-frame-output.js';
|
|
259
|
+
import type { SynchronizedFrameOutputDeps } from './synchronized-frame-output.js';
|
|
260
|
+
export {
|
|
261
|
+
beginSynchronizedFrameOutput,
|
|
262
|
+
SYNCHRONIZED_OUTPUT_BEGIN,
|
|
263
|
+
SYNCHRONIZED_OUTPUT_END,
|
|
264
|
+
} from './synchronized-frame-output.js';
|
|
265
|
+
export type {
|
|
266
|
+
SynchronizedFrameOutput,
|
|
267
|
+
SynchronizedFrameOutputDeps,
|
|
268
|
+
} from './synchronized-frame-output.js';
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* TUI-FLICKER-DRAW-INTEGRATION — the single synchronized-output owner that every
|
|
272
|
+
* dashboard draw entry goes through: BSU → draw body (frame + coordinator modal
|
|
273
|
+
* overlay + prompt repaint) → ESU. The finally keeps the region closed when the
|
|
274
|
+
* body throws, so a failed compose cannot leave a dangling BSU that swallows the
|
|
275
|
+
* next frame.
|
|
276
|
+
*/
|
|
277
|
+
export function runSynchronizedFrameDraw<T>(
|
|
278
|
+
drawBody: () => T,
|
|
279
|
+
deps: SynchronizedFrameOutputDeps,
|
|
280
|
+
): T {
|
|
281
|
+
const frame = beginSynchronizedFrameOutput(deps);
|
|
282
|
+
try {
|
|
283
|
+
return drawBody();
|
|
284
|
+
} finally {
|
|
285
|
+
frame.close();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export interface SynchronizedFrameDrawSink {
|
|
290
|
+
write: (chunk: string) => void;
|
|
291
|
+
/** Production passes `process.stdout.isTTY`: only a tty receives DEC 2026. */
|
|
292
|
+
isTTY?: boolean;
|
|
293
|
+
/** Environment for the `ELANOUS_SYNC_OUTPUT` escape hatch. Defaults to `process.env`. */
|
|
294
|
+
env?: Record<string, string | undefined>;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* TUI-FLICKER-DRAW-INTEGRATION — production entry for a synchronized dashboard
|
|
299
|
+
* frame. `drawNow` (the single draw function both the force path and the queued
|
|
300
|
+
* microtask path call) hands its compose body to this function, so the tty gate
|
|
301
|
+
* and the BSU/ESU ownership live in exactly one place.
|
|
302
|
+
*/
|
|
303
|
+
export function drawDashboardFrameSynchronized<T>(
|
|
304
|
+
drawBody: () => T,
|
|
305
|
+
sink: SynchronizedFrameDrawSink = process.stdout,
|
|
306
|
+
): T {
|
|
307
|
+
return runSynchronizedFrameDraw(drawBody, {
|
|
308
|
+
write: (chunk) => { sink.write(chunk); },
|
|
309
|
+
supported: sink.isTTY === true,
|
|
310
|
+
env: sink.env,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
258
314
|
import { configureThemeIconsGetter } from '../theme/icons.js';
|
|
259
315
|
import { configureModalAdapterTheme } from '../ui/modal-adapter.js';
|
|
260
316
|
import {
|
|
@@ -947,7 +1003,7 @@ import { runPtySnapshot, type PtyTakeoverCommandDeps } from '../cli/pty-takeover
|
|
|
947
1003
|
import { requestRemotePtyControl } from '../pty-shell/pty-control-ipc.js';
|
|
948
1004
|
import { getHarnessRunId } from '../harness/harness-space.js';
|
|
949
1005
|
import { formatPtyCallLine, formatPtyResultLine } from '../pty-activity-log.js';
|
|
950
|
-
import { getSessionMetrics } from '../status/metrics.js';
|
|
1006
|
+
import { getSessionMetrics, noteRestoredContext } from '../status/metrics.js';
|
|
951
1007
|
import {
|
|
952
1008
|
createContextRegistry, tokenizeInput, pruneUnreferenced,
|
|
953
1009
|
addAttachmentEx as ctxAddEx,
|
|
@@ -1024,7 +1080,7 @@ import {
|
|
|
1024
1080
|
deriveDaemonHttpBase,
|
|
1025
1081
|
fetchDaemonSessionHistory,
|
|
1026
1082
|
} from './acp-boot.js';
|
|
1027
|
-
import {
|
|
1083
|
+
import { renderRestoredTranscriptLines } from './replay-preview.js';
|
|
1028
1084
|
import {
|
|
1029
1085
|
buildDashboardTurnPreamble,
|
|
1030
1086
|
} from './turn-preamble.js';
|
|
@@ -1062,6 +1118,7 @@ import { spawnCodingAgent, CodingAgentBinaryMissing } from '../terminal/coding-a
|
|
|
1062
1118
|
import type { TerminalSession } from '../terminal/session-registry.js';
|
|
1063
1119
|
import { createSessionPickerModal } from '../session/picker-modal.js';
|
|
1064
1120
|
import { listSessions as listChatSessionsForResume, adoptSession as adoptChatSession, setActiveSessionId as markActiveChatSession } from '../session/index.js';
|
|
1121
|
+
import { idPrefixCell, sessionIdPrefixes, sessionListTime } from '../session/id-prefix.js';
|
|
1065
1122
|
// TUI 부활 S-b — 타임트래블 포크 엔진 (codex ForkSnapshot 동형 · 2026-07-09
|
|
1066
1123
|
// 이식 후 호출처 0 이던 방치 자산 회수). 순수 히스토리 절단 로직만 소비;
|
|
1067
1124
|
// 영속은 세션 스토어(forkSessionFromHistory)가 담당한다.
|
|
@@ -1213,7 +1270,7 @@ import { type ExecutionSurfaceHandle } from '../display/index.js';
|
|
|
1213
1270
|
import { AgentSurfaceStore, renderAgentDetail, renderAgentRoster, type AgentSurfaceState } from '../display/agent-surface.js';
|
|
1214
1271
|
import { globalAgentFlash } from '../display/agent-flash.js';
|
|
1215
1272
|
import { globalTaskNotificationQueue, type TaskNotificationQueue, type PendingTaskNotification } from '../agent/task-notification.js';
|
|
1216
|
-
import { createDashboardAgentWakeNotify,
|
|
1273
|
+
import { createDashboardAgentWakeNotify, installSeatedAgentWake, wrapAgentWakePort } from './input/agent-wake.js';
|
|
1217
1274
|
import { renderDebugEventDetail, renderDebugEventRows, renderDebugStack, renderPromptInjectionDebug } from '../display/debug-surface.js';
|
|
1218
1275
|
import { buildDebugCallStack } from '../debug/call-stack.js';
|
|
1219
1276
|
import { buildAstGrepHostTool } from '../skills/tools/ast-grep.js';
|
|
@@ -2752,16 +2809,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2752
2809
|
// Pickers share the composer bottom slot.
|
|
2753
2810
|
const placement = resolveDecisionPickerPlacement({ height: 16 });
|
|
2754
2811
|
const modalWidth = placement.width;
|
|
2812
|
+
// Unique prefixes, not a fixed 8 — two sessions sharing 8 characters used to look identical (TUI-RESUME-PICKER).
|
|
2813
|
+
const idPrefixes = sessionIdPrefixes(rows.map((m) => m.id));
|
|
2755
2814
|
const fmtRow = (m: (typeof rows)[number]): string => {
|
|
2756
2815
|
const marker = m.id === attachedSessionId ? '▸ ' : ' ';
|
|
2757
|
-
const ts = m.updatedAt
|
|
2816
|
+
const ts = sessionListTime(m.updatedAt);
|
|
2758
2817
|
const binds: string[] = [];
|
|
2759
2818
|
if (m.bindings?.cli) binds.push('cli');
|
|
2760
2819
|
if (m.bindings?.telegram) binds.push('tg');
|
|
2761
2820
|
if (m.bindings?.discord) binds.push('dc');
|
|
2762
2821
|
const bindStr = binds.length > 0 ? `[${binds.join(',')}]` : '';
|
|
2763
2822
|
const title = (m.title || '(no title)').slice(0, 42);
|
|
2764
|
-
return `${marker}${m.id
|
|
2823
|
+
return `${marker}${idPrefixCell(idPrefixes, m.id)} ${ts} ${String(m.messageCount).padStart(3)}t ${bindStr.padEnd(9)} ${title}`;
|
|
2765
2824
|
};
|
|
2766
2825
|
const handle = createSearchModal({
|
|
2767
2826
|
id: `session-resume:${Date.now().toString(36)}`,
|
|
@@ -2788,7 +2847,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2788
2847
|
promptCtl.submit(`/session load ${id}`);
|
|
2789
2848
|
} else {
|
|
2790
2849
|
// 입력 루프 비활성 등으로 합성 submit 불가 — 수동 안내 폴백.
|
|
2791
|
-
chatLines.push(C.muted(` /session load ${
|
|
2850
|
+
chatLines.push(C.muted(` /session load ${idPrefixes.get(id) ?? id} 를 입력해 재개하세요`));
|
|
2792
2851
|
chatScrollOffset = -1;
|
|
2793
2852
|
draw();
|
|
2794
2853
|
}
|
|
@@ -5019,8 +5078,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
5019
5078
|
};
|
|
5020
5079
|
|
|
5021
5080
|
// P5 — register the mode-enter actions + default chord bindings so
|
|
5022
|
-
// `Ctrl+
|
|
5023
|
-
// control, `Ctrl+
|
|
5081
|
+
// `Ctrl+X s` from input focus enters sync, `Ctrl+X c` enters
|
|
5082
|
+
// control, `Ctrl+X g` returns to general. The `allowOverwrite`
|
|
5024
5083
|
// flag is critical because this closure may re-run on hot-reload
|
|
5025
5084
|
// scenarios (tests, plugin reinit) — the registry should be idempotent.
|
|
5026
5085
|
// A2 — forward-declared toast hook. mouseWiring is initialized
|
|
@@ -5041,7 +5100,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
5041
5100
|
handler: () => {
|
|
5042
5101
|
enterSessionControlMode(chatModeState);
|
|
5043
5102
|
void inputCoreSetMode(resolveSessionInputModeFromChatMode({ chatModeState }));
|
|
5044
|
-
chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^
|
|
5103
|
+
chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^X c chord)'));
|
|
5045
5104
|
chatScrollOffset = -1;
|
|
5046
5105
|
draw();
|
|
5047
5106
|
pushModeToast('→ control mode', 'success');
|
|
@@ -7422,7 +7481,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7422
7481
|
// Scratch visibility (Phase S5). When closed, the workingDir
|
|
7423
7482
|
// layouts drop the scratch cell so the remaining panes expand
|
|
7424
7483
|
// to fill the reclaimed columns — useful on narrow terminals.
|
|
7425
|
-
// Reopen via the ^
|
|
7484
|
+
// Reopen via the ^X ^S chord.
|
|
7426
7485
|
let scratchClosed = false;
|
|
7427
7486
|
const dashboardViewRegistryOptions = () => ({
|
|
7428
7487
|
extraPanes: pluginHost.activeDashboardPanes().map(p => p.paneId),
|
|
@@ -7617,10 +7676,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7617
7676
|
);
|
|
7618
7677
|
};
|
|
7619
7678
|
|
|
7620
|
-
// Prefix chord (Phase O6).
|
|
7621
|
-
//
|
|
7622
|
-
//
|
|
7623
|
-
// `[^B]` while armed so the user knows the terminal is waiting.
|
|
7679
|
+
// Prefix chord (Phase O6). Ctrl+X arms the chord; the next key
|
|
7680
|
+
// within the timeout window triggers a bound action. HUD segment
|
|
7681
|
+
// `chord` shows `[^X]` while armed.
|
|
7624
7682
|
const chord: ChordState = createChord();
|
|
7625
7683
|
const disarmChordHud = (): void => {
|
|
7626
7684
|
disarmChord(chord);
|
|
@@ -7693,7 +7751,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7693
7751
|
let previewTerminalDims: { cols: number; rows: number } | null = null;
|
|
7694
7752
|
// Phase T7 — when true, the preview widget swells to the full
|
|
7695
7753
|
// top-row width, hiding browser / scratch / obsidian / skill
|
|
7696
|
-
// siblings. Toggled by `^
|
|
7754
|
+
// siblings. Toggled by `^X e` / `^X ㄷ` (pane chord) and by `e`
|
|
7697
7755
|
// on the focused preview pane (muscle memory). Auto-clears when
|
|
7698
7756
|
// the terminal session exits.
|
|
7699
7757
|
let terminalExpanded = false;
|
|
@@ -7850,7 +7908,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7850
7908
|
};
|
|
7851
7909
|
|
|
7852
7910
|
/** Shared helper for both the pane-level `t` key AND the global
|
|
7853
|
-
* `Ctrl+
|
|
7911
|
+
* `Ctrl+X t` chord. Idempotent — calling while a session is
|
|
7854
7912
|
* already alive just re-focuses the preview pane. Handles:
|
|
7855
7913
|
* - view 4 (chat-only) → bounce to view 1 so wd-preview is visible
|
|
7856
7914
|
* - wiring onUpdate / onExit callbacks with cleanup
|
|
@@ -8613,7 +8671,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
8613
8671
|
widgetHost.register(planBoardWidget, 'builtin', 'src/widgets/plan-board.ts');
|
|
8614
8672
|
}
|
|
8615
8673
|
// NT4 — notification bell modal widget. Registered + spawned here
|
|
8616
|
-
// so Ctrl+
|
|
8674
|
+
// so Ctrl+X b (NT5) can toggle without spawn latency. The bellOpen
|
|
8617
8675
|
// flag + helpers live further down (after notificationStore is
|
|
8618
8676
|
// created) because refreshBellInto reads from the store.
|
|
8619
8677
|
widgetHost.register(bellModalWidget, 'builtin', 'src/notification-bell-modal.ts');
|
|
@@ -11337,7 +11395,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
11337
11395
|
try { mouseWiring.toasts().push({ text, kind, ttlMs: 1200 }); } catch { /* ignore */ }
|
|
11338
11396
|
};
|
|
11339
11397
|
|
|
11340
|
-
|
|
11398
|
+
const drawFrameNow = ({ force: forceFromCoordinator = false } = {}) => {
|
|
11341
11399
|
const { rows: termRows, cols } = termSize();
|
|
11342
11400
|
const totalW = cols - 1;
|
|
11343
11401
|
|
|
@@ -11781,6 +11839,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
11781
11839
|
if (overlay.length > 0) process.stdout.write(overlay);
|
|
11782
11840
|
} catch { /* overlay must not crash main draw */ }
|
|
11783
11841
|
};
|
|
11842
|
+
// TUI-FLICKER-DRAW-INTEGRATION — one synchronized-output owner for the whole
|
|
11843
|
+
// frame compose: BSU → frame (+ coordinator modal overlay) → prompt repaint →
|
|
11844
|
+
// ESU. Both draw entry paths (force and queued microtask) call this same
|
|
11845
|
+
// seam, and the finally keeps the region closed when a compose throws so the
|
|
11846
|
+
// next frame is not swallowed by a dangling BSU. `supported` is the tty gate:
|
|
11847
|
+
// piped/captured output keeps the bytes it had before this seam existed.
|
|
11848
|
+
drawNow = (opts = {}) => {
|
|
11849
|
+
drawDashboardFrameSynchronized(() => { drawFrameNow(opts); }, process.stdout);
|
|
11850
|
+
};
|
|
11784
11851
|
draw = (opts = {}) => {
|
|
11785
11852
|
if (debug.enabled) {
|
|
11786
11853
|
const now = Date.now();
|
|
@@ -12424,8 +12491,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
12424
12491
|
}
|
|
12425
12492
|
|
|
12426
12493
|
/** N2 — open the shell-runner rollup popup centered on the viewport.
|
|
12427
|
-
*
|
|
12428
|
-
*
|
|
12494
|
+
* Entry point for `/shell rollup` so keyboard users can access the
|
|
12495
|
+
* same UI mouse users get by clicking
|
|
12429
12496
|
* the 🐚 status-bar pill. Anchored-to-pill placement stays in
|
|
12430
12497
|
* dashboard-mouse-wiring; this path is explicitly center-placed so
|
|
12431
12498
|
* it works with status row unknown. */
|
|
@@ -12645,7 +12712,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
12645
12712
|
const disposeResizeListener = installResizeListener({
|
|
12646
12713
|
draw: (opts) => draw(opts),
|
|
12647
12714
|
promptCtl,
|
|
12648
|
-
requestOverlayFrame: () => display.
|
|
12715
|
+
requestOverlayFrame: () => display.requestRenderNow({ force: true }),
|
|
12716
|
+
withSynchronizedOutput: (paint) => display.withSynchronizedOutput(paint),
|
|
12649
12717
|
});
|
|
12650
12718
|
process.on('exit', disposeResizeListener);
|
|
12651
12719
|
// 외부 주입(`pty text`)을 사용자 타이핑과 섞지 않고 별도 대기열로 — 결함 #6(10-14).
|
|
@@ -13267,14 +13335,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13267
13335
|
// ⭐ TUI-AGENT-IDLE-WAKE — 배경 자식(⊕ RunShell bg) 완료 큐의 «유일한» 구독(onEnqueue 구독 0 → 1).
|
|
13268
13336
|
// 채팅 한 줄 «✓ 위임 끝: <이름> — 다음 턴에 결과» · 결과는 다음 턴 preamble 이 싣는다.
|
|
13269
13337
|
// ⛔ 입력칸·injectKey·pty 주입 0(대표 비침투). dedupe·수명은 모듈, 여기선 배선만.
|
|
13270
|
-
const agentWake =
|
|
13338
|
+
const agentWake = installSeatedAgentWake({
|
|
13271
13339
|
subscribe: (listener) => subscribeDashboardAgentResults(
|
|
13272
13340
|
globalTaskNotificationQueue, listener, (line) => { pushChatLine(C.muted(line)); draw(); },
|
|
13273
13341
|
),
|
|
13274
13342
|
// 그리기 실패는 삼키지 않는다 — 모듈이 잡아 notified{shown:false} 로 남긴다.
|
|
13275
13343
|
notify: createDashboardAgentWakeNotify((line) => { chatLines.push(C.muted(line)); }, () => draw()),
|
|
13276
13344
|
// 조각 2 — 자리 TUI ∧ 유휴면 H2 문으로 다음 턴(origin child-complete) · 판정은 모듈.
|
|
13277
|
-
|
|
13345
|
+
startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts),
|
|
13346
|
+
getCwd: () => workingDir.cwd,
|
|
13347
|
+
isPending: (taskId) => globalTaskNotificationQueue.has(taskId),
|
|
13278
13348
|
});
|
|
13279
13349
|
disposeDashboardAgentWake = () => agentWake.dispose();
|
|
13280
13350
|
|
|
@@ -13399,8 +13469,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13399
13469
|
try {
|
|
13400
13470
|
if (req.kind === 'shell') {
|
|
13401
13471
|
const shellSeat = resolveTuiShellSeat(req.cwd, process.env.COORD_ID);
|
|
13472
|
+
const terminalSessionId = crypto.randomUUID();
|
|
13402
13473
|
session = sessionRegistry.spawn(
|
|
13403
13474
|
{
|
|
13475
|
+
id: terminalSessionId,
|
|
13404
13476
|
title: 'terminal',
|
|
13405
13477
|
cwd: req.cwd,
|
|
13406
13478
|
command: req.command,
|
|
@@ -13410,7 +13482,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13410
13482
|
registryKind: 'shell',
|
|
13411
13483
|
registryNickname: `tui-shell:${req.cwd}`,
|
|
13412
13484
|
registryOrigin: { originRoot: 'elanous-internal', controller: 'tui-shell' },
|
|
13413
|
-
registryPurpose: `tui-shell:${shellSeat}`,
|
|
13485
|
+
registryPurpose: `tui-shell:${shellSeat}:session:${currentChatPersonaSessionId()}:terminal:${terminalSessionId}`,
|
|
13414
13486
|
registrySeat: shellSeat,
|
|
13415
13487
|
onExit: handleExit,
|
|
13416
13488
|
onTitleAction: handleTitleAction,
|
|
@@ -14867,7 +14939,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14867
14939
|
chatScrollOffset = -1;
|
|
14868
14940
|
break;
|
|
14869
14941
|
// Phase T: spawn an embedded terminal in this pane. Same
|
|
14870
|
-
// code path as the `Ctrl+
|
|
14942
|
+
// code path as the `Ctrl+X t` pane chord.
|
|
14871
14943
|
case 't': case 'ㅅ':
|
|
14872
14944
|
openPreviewTerminal();
|
|
14873
14945
|
break;
|
|
@@ -14883,7 +14955,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14883
14955
|
}
|
|
14884
14956
|
|
|
14885
14957
|
// Ctrl+W (no chord armed — chord would have consumed the
|
|
14886
|
-
// key earlier) closes the scratch pane. Reopen via the ^
|
|
14958
|
+
// key earlier) closes the scratch pane. Reopen via the ^X ^S chord.
|
|
14887
14959
|
if (key.ctrl && (key.name === 'w' || key.name === 'ㅈ')) {
|
|
14888
14960
|
scratchClosed = true;
|
|
14889
14961
|
userClosedPanes.add('scratch');
|
|
@@ -15236,14 +15308,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15236
15308
|
chat.history.push(m as ChatMessage);
|
|
15237
15309
|
}
|
|
15238
15310
|
const turns = past.length;
|
|
15239
|
-
chatLines.push(C.muted(` ${turns} turn${turns === 1 ? '' : 's'} restored
|
|
15311
|
+
chatLines.push(C.muted(` ${turns} turn${turns === 1 ? '' : 's'} restored:`));
|
|
15312
|
+
noteRestoredContext(chat.history);
|
|
15240
15313
|
// BACKLOG #1 — markdown-aware preview rendering. Replaces
|
|
15241
15314
|
// the previous one-line `slice(0, 100)` snippet so tables
|
|
15242
15315
|
// / bold / lists in replayed turns look the same as when
|
|
15243
15316
|
// they were originally streamed (`formatResponse` path).
|
|
15244
15317
|
const previewWidth = Math.max(40, termSize().cols - 8);
|
|
15245
15318
|
const previewWrap = getUserConfig().chat.rendering.wrap;
|
|
15246
|
-
const previewLines =
|
|
15319
|
+
const previewLines = renderRestoredTranscriptLines(past, {
|
|
15247
15320
|
maxWidth: previewWidth,
|
|
15248
15321
|
wrapOpts: previewWrap,
|
|
15249
15322
|
});
|
|
@@ -15285,7 +15358,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15285
15358
|
if (resume.repaired) {
|
|
15286
15359
|
chatLines.push(C.muted(` 깨진 도구 호출·결과 짝을 잘라 이어받았다(호출 ${resume.repaired.removedCalls} · 결과 ${resume.repaired.removedResults})`));
|
|
15287
15360
|
}
|
|
15288
|
-
|
|
15361
|
+
// TUI-RESUME-PICKER ②③④ — `--resume` used to leave the chat log blank and ctx at 0, so the user could
|
|
15362
|
+
// not see that 379 messages had come back. Show the restored conversation and its size now.
|
|
15363
|
+
chatLines.push(C.muted(` ${resume.turns} turns restored:`));
|
|
15364
|
+
for (const line of renderRestoredTranscriptLines(chat.history, {
|
|
15365
|
+
maxWidth: Math.max(40, termSize().cols - 8),
|
|
15366
|
+
wrapOpts: getUserConfig().chat.rendering.wrap,
|
|
15367
|
+
})) chatLines.push(line);
|
|
15368
|
+
const restoredTokens = noteRestoredContext(chat.history);
|
|
15369
|
+
debug.log('chat.session.resume', 'restored', { sessionId: resume.sessionId, turns: resume.turns, estimatedContextTokens: restoredTokens });
|
|
15370
|
+
chatLines.push(C.muted(' Next turn continues this conversation.'));
|
|
15289
15371
|
}
|
|
15290
15372
|
}
|
|
15291
15373
|
observeSessionStart({
|
|
@@ -16152,7 +16234,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16152
16234
|
terminalExpanded = !terminalExpanded;
|
|
16153
16235
|
previewTerminalDims = null;
|
|
16154
16236
|
chatLines.push(C.muted(terminalExpanded
|
|
16155
|
-
? 'Terminal expanded. Ctrl+Shift+E
|
|
16237
|
+
? 'Terminal expanded. Ctrl+Shift+E to restore.'
|
|
16156
16238
|
: 'Terminal collapsed to preview slot.'));
|
|
16157
16239
|
chatScrollOffset = -1;
|
|
16158
16240
|
},
|
|
@@ -17866,6 +17948,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17866
17948
|
},
|
|
17867
17949
|
};
|
|
17868
17950
|
const slashOutcome = await dashboardSlashRegistry.dispatch(cmdLower, args, slashCtx);
|
|
17951
|
+
if (cmdLower === 'mission') {
|
|
17952
|
+
debug.log('tui.legacy-slash-use', 'mission', { surface: 'classic', tuiSession: null });
|
|
17953
|
+
}
|
|
17869
17954
|
if (debug.enabled) {
|
|
17870
17955
|
debug.log('dashboard.slash.dispatch', cmdLower, {
|
|
17871
17956
|
argsCount: args.length,
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
// 턴 중(NotIdle)·입력 중(HumanTyping)에 온 완료는 «대기»: 입력칸이 다시 뜰 때(`wrapAgentWakePort`) 그 결과가
|
|
14
14
|
// 아직 큐에 남아 있으면(=어느 턴도 안 실었으면) 한 번만 다시 청한다. 이미 실렸으면(drain) 아무것도 안 한다.
|
|
15
15
|
// ⛔ 같은 알림(taskId)은 한 번만 — 큐 `seen` 이 `clear()` 로 비워져도, 대시보드가 재진입해도 막는다.
|
|
16
|
+
// ⭐ 생산 조립은 `installSeatedAgentWake` «하나» — `src/dashboard/index.ts` 의 `showDashboard` 가 그 함수만
|
|
17
|
+
// 부르고, 이 파일의 무대 시험이 «같은 함수»를 지난다(문자열 배선 확인이 아니라 생산 호출 경로 증거).
|
|
16
18
|
//
|
|
17
19
|
// 세 얼굴:
|
|
18
20
|
// 관측 = debug.log('tui.agent-wake', 'notified' | 'opened' | 'rejected' | 'deferred', { taskId, agent, state, seat, shown, reason })
|
|
@@ -240,6 +242,47 @@ export function installAgentWake(deps: Omit<AgentWakeDeps, 'handled'>): AgentWak
|
|
|
240
242
|
return own;
|
|
241
243
|
}
|
|
242
244
|
|
|
245
|
+
/** 대시보드가 넘기는 «생산 포트» — showDashboard 가 실제로 채우는 모양 그대로. */
|
|
246
|
+
export interface DashboardAgentWakePorts {
|
|
247
|
+
/** 큐 구독 — `subscribeDashboardAgentResults(globalTaskNotificationQueue, …)` 가 여기로 들어온다. */
|
|
248
|
+
subscribe: AgentWakeDeps['subscribe'];
|
|
249
|
+
/** 채팅 한 줄 — `createDashboardAgentWakeNotify(pushLine, draw)`. */
|
|
250
|
+
notify: AgentWakeDeps['notify'];
|
|
251
|
+
/** H2 문 — `internalTurnGate.startTurnIfIdle`. 자리 TUI ∧ 유휴일 때만 실제로 열린다. */
|
|
252
|
+
startTurnIfIdle: AgentWakeOpenTurnDeps['startTurnIfIdle'];
|
|
253
|
+
/** 지금 화면의 cwd(자리 판정 입력) — `() => workingDir.cwd`. */
|
|
254
|
+
getCwd: () => string;
|
|
255
|
+
/** 그 완료가 아직 어느 턴에도 안 실렸나 — `globalTaskNotificationQueue.has`. «대기» 재시도의 근거. */
|
|
256
|
+
isPending: (taskId: string) => boolean;
|
|
257
|
+
/** 시험·주입 자리(생산은 안 넘긴다 — 기본 `homedir()`·`detectSeatTui`·`setTimeout 0`). */
|
|
258
|
+
home?: string;
|
|
259
|
+
detectSeat?: AgentWakeOpenTurnDeps['detectSeat'];
|
|
260
|
+
defer?: AgentWakeOpenTurnDeps['defer'];
|
|
261
|
+
log?: AgentWakeDeps['log'];
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* 대시보드 생산 조립 — `showDashboard` 는 이 함수 «하나»만 부른다.
|
|
266
|
+
* 알림(조각 1)과 «자리 TUI ∧ 유휴 → H2 한 턴(origin child-complete)»(조각 2)을 같은 큐 구독에서 낸다.
|
|
267
|
+
* 중복 거부(같은 taskId 한 번)·DEFERRABLE 대기→입력칸 재시도·수명은 `createAgentWake` 몫이다.
|
|
268
|
+
*/
|
|
269
|
+
export function installSeatedAgentWake(ports: DashboardAgentWakePorts): AgentWakeController {
|
|
270
|
+
const openTurn: AgentWakeOpenTurnDeps = {
|
|
271
|
+
startTurnIfIdle: ports.startTurnIfIdle,
|
|
272
|
+
getCwd: ports.getCwd,
|
|
273
|
+
isPending: ports.isPending,
|
|
274
|
+
...(ports.home !== undefined ? { home: ports.home } : {}),
|
|
275
|
+
...(ports.detectSeat !== undefined ? { detectSeat: ports.detectSeat } : {}),
|
|
276
|
+
...(ports.defer !== undefined ? { defer: ports.defer } : {}),
|
|
277
|
+
};
|
|
278
|
+
return installAgentWake({
|
|
279
|
+
subscribe: ports.subscribe,
|
|
280
|
+
notify: ports.notify,
|
|
281
|
+
openTurn,
|
|
282
|
+
...(ports.log !== undefined ? { log: ports.log } : {}),
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
243
286
|
/** 시험 격리용 — 설치·공유 dedupe 를 비운다. */
|
|
244
287
|
export function resetAgentWakeForTest(): void {
|
|
245
288
|
installed?.dispose();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { NormalizedAttachment } from '../../acp/content-blocks.js';
|
|
2
2
|
import { debug } from '../../debug/log.js';
|
|
3
3
|
import type { ControlSignalBus } from '../../input/control-signal.js';
|
|
4
|
+
import { classifyInterimReply, formatInterimFoldLine } from '../../tui/chat/goal-interim.js';
|
|
4
5
|
import {
|
|
5
6
|
createTurnOutputBundle,
|
|
6
7
|
runTurnOutputBundleSettle,
|
|
@@ -76,6 +77,8 @@ export function dispatchDashboardChatMainAcpSend(
|
|
|
76
77
|
let firstChunk = true;
|
|
77
78
|
let assistantTextActive = false;
|
|
78
79
|
let assistantBodyStart = -1;
|
|
80
|
+
let assistantBodyEnd = -1;
|
|
81
|
+
const interimBodyRanges: Array<{ start: number; end: number }> = [];
|
|
79
82
|
let assistantBodyText = '';
|
|
80
83
|
let assistantRunUsesPrefix = false;
|
|
81
84
|
|
|
@@ -91,6 +94,7 @@ export function dispatchDashboardChatMainAcpSend(
|
|
|
91
94
|
if (firstChunk) firstChunk = false;
|
|
92
95
|
assistantBodyText = '';
|
|
93
96
|
assistantBodyStart = -1;
|
|
97
|
+
assistantBodyEnd = -1;
|
|
94
98
|
assistantTextActive = true;
|
|
95
99
|
}
|
|
96
100
|
assistantBodyText += delta;
|
|
@@ -110,7 +114,7 @@ export function dispatchDashboardChatMainAcpSend(
|
|
|
110
114
|
deps.autoTtsHooks?.pushChunk(delta);
|
|
111
115
|
const rendered = deps.formatAssistantLines(assistantBodyText);
|
|
112
116
|
if (assistantBodyStart < 0) assistantBodyStart = deps.chatLines.length;
|
|
113
|
-
deps.chatLines.
|
|
117
|
+
deps.chatLines.splice(assistantBodyStart, Math.max(0, assistantBodyEnd - assistantBodyStart));
|
|
114
118
|
rendered.forEach((line, index) => {
|
|
115
119
|
if (index === 0 && assistantRunUsesPrefix) {
|
|
116
120
|
deps.chatLines.push(`${deps.formatAssistantPrefix(display)} ${line}`);
|
|
@@ -118,8 +122,24 @@ export function dispatchDashboardChatMainAcpSend(
|
|
|
118
122
|
deps.chatLines.push(` ${line}`);
|
|
119
123
|
}
|
|
120
124
|
});
|
|
125
|
+
assistantBodyEnd = assistantBodyStart + rendered.length;
|
|
126
|
+
if (interimBodyRanges.at(-1)?.start === assistantBodyStart) interimBodyRanges[interimBodyRanges.length - 1]!.end = assistantBodyEnd;
|
|
127
|
+
else interimBodyRanges.push({ start: assistantBodyStart, end: assistantBodyEnd });
|
|
121
128
|
deps.setChatScrollToTail();
|
|
122
129
|
},
|
|
130
|
+
foldGoalInterim: (text) => {
|
|
131
|
+
const verdict = classifyInterimReply(text.split('\n'));
|
|
132
|
+
if (verdict.interim && interimBodyRanges.length > 0) {
|
|
133
|
+
const first = interimBodyRanges[0]!.start;
|
|
134
|
+
for (const { start, end } of [...interimBodyRanges].reverse()) deps.chatLines.splice(start, end - start);
|
|
135
|
+
deps.chatLines.splice(first, 0, ` ${formatInterimFoldLine(verdict.summary)}`);
|
|
136
|
+
deps.setChatScrollToTail();
|
|
137
|
+
}
|
|
138
|
+
interimBodyRanges.length = 0;
|
|
139
|
+
assistantTextActive = false;
|
|
140
|
+
assistantBodyStart = -1;
|
|
141
|
+
assistantBodyEnd = -1;
|
|
142
|
+
},
|
|
123
143
|
pushToolCall: (tool) => {
|
|
124
144
|
deps.chatLines.push(deps.formatToolLine(tool));
|
|
125
145
|
deps.setChatScrollToTail();
|
|
@@ -1,159 +1,8 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// interpret them
|
|
10
|
-
//
|
|
11
|
-
// Kept as a standalone module so the policy is unit-testable
|
|
12
|
-
// without standing up the full dashboard. dashboard.ts imports and
|
|
13
|
-
// wires it into the top of its stdin handler in a follow-up commit.
|
|
14
|
-
//
|
|
15
|
-
// P10 will extend this with Ctrl-B prefix handling (d=detach,
|
|
16
|
-
// s=switch, etc.) once a session registry exists to act on.
|
|
17
|
-
|
|
18
|
-
import type { InteractiveTerminalModalHandle } from '../../interactive-terminal-modal.js';
|
|
19
|
-
import type { KeyEvent } from '../../display/types.js';
|
|
20
|
-
import { debug } from '../../debug/log.js';
|
|
21
|
-
|
|
22
|
-
export type KeyRouteResult = 'consumed' | 'passthrough' | 'closed';
|
|
23
|
-
|
|
24
|
-
export interface TerminalModalRouter {
|
|
25
|
-
current(): InteractiveTerminalModalHandle | null;
|
|
26
|
-
/** Install a modal handle. Optional closePolicy controls what
|
|
27
|
-
* ESC/Ctrl-G does: 'kill' disposes the modal + PTY (default);
|
|
28
|
-
* 'detach' calls handle.dispose({keepPreview:true}) so the PTY
|
|
29
|
-
* survives for re-attach (session registry flow). An explicit
|
|
30
|
-
* onClose hook wins over closePolicy — that's how dashboard
|
|
31
|
-
* wires sessionRegistry.detach(session.id) on Esc. */
|
|
32
|
-
set(
|
|
33
|
-
handle: InteractiveTerminalModalHandle | null,
|
|
34
|
-
opts?: { closePolicy?: 'kill' | 'detach'; onClose?: () => void },
|
|
35
|
-
): void;
|
|
36
|
-
close(): void;
|
|
37
|
-
handleKey(ev: KeyEvent): KeyRouteResult;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// `exit` typed cleanly + Enter closes the popup. claude / codex don't
|
|
41
|
-
// recognize plain `exit` (their command is /exit or /quit), so a user
|
|
42
|
-
// typing `exit\n` would otherwise be stuck — the popup stays open
|
|
43
|
-
// because the child never exits, and the typed text just becomes chat
|
|
44
|
-
// input. elanous intercepts the exact sequence at the router so:
|
|
45
|
-
// • plain shell: same end result (we close before shell evaluates)
|
|
46
|
-
// • claude / codex: popup closes as the user expected
|
|
47
|
-
// Sequence is reset on any non-letter key (other than backspace, which
|
|
48
|
-
// rewinds), Ctrl/Alt modifiers, or any character outside `e/x/i/t` —
|
|
49
|
-
// so genuine words containing "exit" (e.g. typing "exit this loop"
|
|
50
|
-
// into a claude prompt without Enter) DON'T trigger the close. The
|
|
51
|
-
// trigger is specifically `e`, `x`, `i`, `t`, Enter with nothing else.
|
|
52
|
-
const EXIT_CHARS = ['e', 'x', 'i', 't'] as const;
|
|
53
|
-
|
|
54
|
-
export function createTerminalModalRouter(): TerminalModalRouter {
|
|
55
|
-
let handle: InteractiveTerminalModalHandle | null = null;
|
|
56
|
-
let closePolicy: 'kill' | 'detach' = 'kill';
|
|
57
|
-
let onClose: (() => void) | null = null;
|
|
58
|
-
let exitProgress = 0; // how many of EXIT_CHARS have been typed in order
|
|
59
|
-
|
|
60
|
-
const close = (): void => {
|
|
61
|
-
if (!handle) return;
|
|
62
|
-
const h = handle;
|
|
63
|
-
const cb = onClose;
|
|
64
|
-
if (debug.enabled) debug.log('window.terminalModalRouter.close', h.id, { id: h.id, closePolicy, hasOnClose: !!cb });
|
|
65
|
-
handle = null;
|
|
66
|
-
onClose = null;
|
|
67
|
-
exitProgress = 0;
|
|
68
|
-
try {
|
|
69
|
-
if (cb) cb();
|
|
70
|
-
else if (closePolicy === 'detach') h.dispose({ keepPreview: true });
|
|
71
|
-
else h.dispose();
|
|
72
|
-
} catch { /* already disposed */ }
|
|
73
|
-
closePolicy = 'kill';
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
return {
|
|
77
|
-
current: () => handle,
|
|
78
|
-
set: (h, opts) => {
|
|
79
|
-
if (handle && h && handle.id !== h.id) close();
|
|
80
|
-
handle = h;
|
|
81
|
-
closePolicy = opts?.closePolicy ?? 'kill';
|
|
82
|
-
onClose = opts?.onClose ?? null;
|
|
83
|
-
exitProgress = 0;
|
|
84
|
-
if (debug.enabled) {
|
|
85
|
-
debug.log('window.terminalModalRouter.set', h?.id ?? '(null)', {
|
|
86
|
-
id: h?.id ?? null,
|
|
87
|
-
closePolicy,
|
|
88
|
-
hasOnClose: !!onClose,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
|
-
close,
|
|
93
|
-
handleKey: (ev) => {
|
|
94
|
-
if (!handle) return 'passthrough';
|
|
95
|
-
const name = (ev.name ?? '').toLowerCase();
|
|
96
|
-
// ESC must NOT close the modal — claude / codex inside the popup
|
|
97
|
-
// use ESC to cancel an in-progress chat / tool turn. Closing the
|
|
98
|
-
// wrapper window on ESC made the only-way-to-cancel kill the
|
|
99
|
-
// whole popup. iTerm / ghostty don't close their own windows on
|
|
100
|
-
// ESC either; the wrapper should match. Modal close is reserved
|
|
101
|
-
// for: Ctrl+G (close + focus log), Ctrl+Shift+T (toggle off),
|
|
102
|
-
// typed `exit\n`, and the child's own `exit`. ESC just forwards.
|
|
103
|
-
if (ev.ctrl && (name === 'g' || name === 'ㅎ')) {
|
|
104
|
-
if (debug.enabled) debug.log('window.terminalModalRouter.handleKey.close', 'ctrl-g', { id: handle.id });
|
|
105
|
-
close();
|
|
106
|
-
return 'closed';
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Track typed `exit` followed by Enter so the user's natural
|
|
110
|
-
// mental model ("type exit to quit") works inside agent popups
|
|
111
|
-
// (claude / codex) where the child app doesn't recognize a bare
|
|
112
|
-
// `exit` command. See EXIT_CHARS comment above for false-positive
|
|
113
|
-
// avoidance.
|
|
114
|
-
const noMods = !ev.ctrl && !ev.alt;
|
|
115
|
-
if (noMods && name === 'enter' && exitProgress === EXIT_CHARS.length) {
|
|
116
|
-
if (debug.enabled) {
|
|
117
|
-
debug.log('window.terminalModalRouter.handleKey.close', 'typed-exit', {
|
|
118
|
-
id: handle.id,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
close();
|
|
122
|
-
return 'closed';
|
|
123
|
-
}
|
|
124
|
-
if (noMods && name === 'backspace') {
|
|
125
|
-
if (exitProgress > 0) exitProgress--;
|
|
126
|
-
} else if (noMods && name.length === 1 && exitProgress < EXIT_CHARS.length && name === EXIT_CHARS[exitProgress]) {
|
|
127
|
-
exitProgress++;
|
|
128
|
-
} else if (noMods && name === 'enter') {
|
|
129
|
-
// Enter without a complete `exit` prefix — reset and forward.
|
|
130
|
-
exitProgress = 0;
|
|
131
|
-
} else if (name.length === 1 || name === 'space' || ev.ctrl || ev.alt) {
|
|
132
|
-
// Any other printable key OR a modifier keystroke breaks the
|
|
133
|
-
// streak. Multi-char named keys (arrow / fn / etc.) leave the
|
|
134
|
-
// streak alone — the child may consume them without affecting
|
|
135
|
-
// the user's typed prompt buffer.
|
|
136
|
-
exitProgress = 0;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (debug.enabled) {
|
|
140
|
-
debug.log('window.terminalModalRouter.handleKey.forward', name || '(empty)', {
|
|
141
|
-
id: handle.id,
|
|
142
|
-
name,
|
|
143
|
-
ctrl: ev.ctrl ?? false,
|
|
144
|
-
shift: ev.shift ?? false,
|
|
145
|
-
alt: ev.alt ?? false,
|
|
146
|
-
exitProgress,
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
try {
|
|
150
|
-
handle.surface.onKey?.(ev);
|
|
151
|
-
} catch { /* surface disposed mid-event; treat as no-op */ }
|
|
152
|
-
return 'consumed';
|
|
153
|
-
},
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/** Singleton instance used by dashboard.ts. Exported as a separate
|
|
158
|
-
* factory + singleton so tests can inject a fresh router per case. */
|
|
159
|
-
export const terminalModalRouter = createTerminalModalRouter();
|
|
1
|
+
// Compatibility entry for dashboard-owned consumers. The routing policy is
|
|
2
|
+
// shared with the standalone Next TUI from src/terminal.
|
|
3
|
+
export {
|
|
4
|
+
createTerminalModalRouter,
|
|
5
|
+
terminalModalRouter,
|
|
6
|
+
type KeyRouteResult,
|
|
7
|
+
type TerminalModalRouter,
|
|
8
|
+
} from '../../terminal/terminal-modal-router.js';
|
|
@@ -105,3 +105,28 @@ export function renderReplayPreviewLines(
|
|
|
105
105
|
}
|
|
106
106
|
return lines;
|
|
107
107
|
}
|
|
108
|
+
|
|
109
|
+
/** Restored transcripts longer than this show their tail plus one «earlier N messages» line. */
|
|
110
|
+
export const RESTORED_TRANSCRIPT_MAX_MESSAGES = 200;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* The restored conversation in full (TUI-RESUME-PICKER ③): every user/assistant message, every line —
|
|
114
|
+
* not the 5-message, 2-line preview. Resuming used to leave the chat log blank but for that preview,
|
|
115
|
+
* so the user could not see what they were continuing. Very long sessions keep the last
|
|
116
|
+
* `maxMessages` and say how many were left out.
|
|
117
|
+
*/
|
|
118
|
+
export function renderRestoredTranscriptLines(
|
|
119
|
+
messages: readonly ReplayPreviewMessage[],
|
|
120
|
+
opts: Omit<ReplayPreviewOpts, 'tail' | 'perMessageLines'> & { maxMessages?: number },
|
|
121
|
+
): string[] {
|
|
122
|
+
const visible = messages.filter((m) => m.role !== 'system' && extractReplayText(m.content).length > 0);
|
|
123
|
+
const max = opts.maxMessages ?? RESTORED_TRANSCRIPT_MAX_MESSAGES;
|
|
124
|
+
const hidden = Math.max(0, visible.length - max);
|
|
125
|
+
const lines = hidden > 0 ? [C.muted(` … 앞 ${hidden}개 메시지 생략 (최근 ${max}개 표시)`)] : [];
|
|
126
|
+
return lines.concat(renderReplayPreviewLines(visible.slice(-max), {
|
|
127
|
+
maxWidth: opts.maxWidth,
|
|
128
|
+
...(opts.wrapOpts ? { wrapOpts: opts.wrapOpts } : {}),
|
|
129
|
+
tail: max,
|
|
130
|
+
perMessageLines: Number.MAX_SAFE_INTEGER,
|
|
131
|
+
}));
|
|
132
|
+
}
|