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
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { loadSidetabRows, type SidetabRow } from '../tui/sidetab/list.js';
|
|
2
|
+
import { stripAnsi, termSize } from '../tui.js';
|
|
3
|
+
import { requestRemotePtyControl } from '../pty-shell/pty-control-ipc.js';
|
|
4
|
+
import type { SlashCommandRegistry } from './slash-runtime/registry.js';
|
|
5
|
+
import type { DashboardSlashContext, DashboardSlashReturn } from './slash-runtime/dashboard-handlers.js';
|
|
6
|
+
|
|
7
|
+
/** Classic /side: the Next TUI manifest is the sole source of list ordering. */
|
|
8
|
+
export function registerClassicSideSlash(
|
|
9
|
+
registry: SlashCommandRegistry<DashboardSlashContext, DashboardSlashReturn>,
|
|
10
|
+
loadRows: (sessionId?: string) => SidetabRow[] = (sessionId) => loadSidetabRows(false, sessionId),
|
|
11
|
+
snapshot: typeof requestRemotePtyControl = requestRemotePtyControl,
|
|
12
|
+
): void {
|
|
13
|
+
registry.register(['side'], async (args, ctx) => {
|
|
14
|
+
const sub = (args[0] ?? 'list').toLowerCase();
|
|
15
|
+
if (sub === 'new') {
|
|
16
|
+
if (args.length > 1) ctx.chatLines.push(ctx.warning(' 사용법: /side new'));
|
|
17
|
+
else ctx.termSlash.openNewTerminal();
|
|
18
|
+
ctx.setChatScrollOffset(-1);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (sub !== 'list' && sub !== 'attach') {
|
|
22
|
+
ctx.chatLines.push(ctx.muted(' 사용법: /side [list] | new | attach <번호>'));
|
|
23
|
+
ctx.setChatScrollOffset(-1);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Use the same filtered manifest rows for display and numeric resolution;
|
|
27
|
+
// never let an exited row shift the number shown to the user.
|
|
28
|
+
const rows = loadRows(ctx.chatPersona?.sessionId()).filter(row => row.badge !== 'exited');
|
|
29
|
+
if (sub === 'list') {
|
|
30
|
+
if (rows.length === 0) ctx.chatLines.push(ctx.muted(' 사이드탭 없음'));
|
|
31
|
+
rows.forEach((row, i) => ctx.chatLines.push(ctx.muted(` ${i + 1}. ${row.badge} ${row.label}`)));
|
|
32
|
+
ctx.setChatScrollOffset(-1);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const raw = args[1] ?? '';
|
|
36
|
+
const index = /^\d+$/.test(raw) ? Number(raw) - 1 : -1;
|
|
37
|
+
const row = rows[index];
|
|
38
|
+
if (args.length !== 2 || !row) {
|
|
39
|
+
ctx.chatLines.push(ctx.warning(' 사용법: /side attach <목록 번호>'));
|
|
40
|
+
} else if (row.currentProcess) {
|
|
41
|
+
ctx.chatLines.push(ctx.muted(' 현재 세션입니다'));
|
|
42
|
+
} else if (row.sessionId && ctx.termSlash.sessionRegistry.get(row.sessionId)) {
|
|
43
|
+
const { cols, rows: height } = termSize();
|
|
44
|
+
const session = ctx.termSlash.sessionRegistry.attach(row.sessionId, { termCols: cols, termRows: height });
|
|
45
|
+
if (session?.modal) ctx.termSlash.openSession(session);
|
|
46
|
+
else ctx.chatLines.push(ctx.warning(' PTY attach 실패'));
|
|
47
|
+
} else if (row.ptyId) {
|
|
48
|
+
try {
|
|
49
|
+
// A foreign child belongs to another PTY owner: snapshot only, no takeover.
|
|
50
|
+
const result = await snapshot(row.ptyId, 'snapshot', { ansi: false }, { timeoutMs: 450 });
|
|
51
|
+
if (result.status === 'success' && result.screen?.trim()) {
|
|
52
|
+
ctx.chatLines.push(ctx.muted(` ${row.label} · 읽기 전용 snapshot (입력은 전달되지 않습니다)`));
|
|
53
|
+
ctx.chatLines.push(...stripAnsi(result.screen).split('\n'));
|
|
54
|
+
} else ctx.chatLines.push(ctx.warning(` PTY 화면 읽기 실패 · ${result.status}`));
|
|
55
|
+
} catch (error) {
|
|
56
|
+
ctx.chatLines.push(ctx.warning(` PTY 화면 읽기 오류 · ${error instanceof Error ? error.message : String(error)}`));
|
|
57
|
+
}
|
|
58
|
+
} else ctx.chatLines.push(ctx.warning(' attach할 PTY가 없습니다'));
|
|
59
|
+
ctx.setChatScrollOffset(-1);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
@@ -364,13 +364,15 @@ import {
|
|
|
364
364
|
attachTelegramBinding as sessionAttachTelegram,
|
|
365
365
|
listBoundSessions as sessionListBound,
|
|
366
366
|
} from '../../session/index.js';
|
|
367
|
+
import { idPrefixCell, sessionIdPrefixes, sessionListTime } from '../../session/id-prefix.js';
|
|
367
368
|
import { safeReadLock as telegramSafeReadLock, defaultLockPath as telegramDefaultLockPath } from '../../telegram-lock.js';
|
|
368
369
|
import { userConfigPath as userConfigPathFn } from '../../user-config.js';
|
|
369
370
|
import { dirname as pathDirname, relative, resolve as resolvePath } from 'node:path';
|
|
370
371
|
import { existsSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
371
372
|
import { installPlugin, listInstalledPlugins, type InstalledPlugin } from '../../plugins/install/plugin-install.js';
|
|
372
373
|
import type { SurfaceUx } from '../../agent/surface-ux/types.js';
|
|
373
|
-
import {
|
|
374
|
+
import { renderRestoredTranscriptLines } from '../replay-preview.js';
|
|
375
|
+
import { noteRestoredContext } from '../../status/metrics.js';
|
|
374
376
|
import {
|
|
375
377
|
deriveDaemonHttpBase,
|
|
376
378
|
fetchDaemonSessionList,
|
|
@@ -385,6 +387,7 @@ import { readDashboardAskClarification } from './ask-clarification.js';
|
|
|
385
387
|
export { readDashboardAskClarification };
|
|
386
388
|
import { createLoopScheduler, type LoopScheduler } from '../loop-scheduler.js';
|
|
387
389
|
import { registerShellSlash } from './shell-slash.js';
|
|
390
|
+
import { registerClassicSideSlash } from '../side-basic-runtime.js';
|
|
388
391
|
export { registerShellSlash } from './shell-slash.js';
|
|
389
392
|
import { registerMissionSlash } from '../../tui/slash/mission.js';
|
|
390
393
|
// TUI-SLASH-SPLIT-MISSION(D4b) — /mission 은 src/tui/slash/mission.ts 로 이사. 옛 입구 re-export shim 은 slash-runtime/index.ts 한 곳뿐(RFC A5).
|
|
@@ -2395,6 +2398,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2395
2398
|
}
|
|
2396
2399
|
} else if (result.kind === 'stopped-before-authoring') {
|
|
2397
2400
|
ctx.chatLines.push(ctx.error(' ⛔ 저작 «전» 예비 검사에서 막혔다 — 위 이름을 확인하라'));
|
|
2401
|
+
} else if (result.kind === 'stopped-by-timebox') {
|
|
2402
|
+
ctx.chatLines.push(ctx.error(` ⛔ AUTHOR-TIMEBOX 초과로 접지 없이 끝났다 — 골은 남아 있다: ${result.goalFile}`));
|
|
2398
2403
|
} else {
|
|
2399
2404
|
ctx.chatLines.push(ctx.error(` ⛔ 전제 검사에서 막혔다 — 골은 남아 있다: ${result.goalFile}`));
|
|
2400
2405
|
}
|
|
@@ -2573,6 +2578,7 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2573
2578
|
|
|
2574
2579
|
|
|
2575
2580
|
registerShellSlash(registry);
|
|
2581
|
+
registerClassicSideSlash(registry);
|
|
2576
2582
|
|
|
2577
2583
|
// ── B-3.b ─────────────────────────────────────────────────────────
|
|
2578
2584
|
|
|
@@ -2602,6 +2608,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2602
2608
|
if (seSub === 'list' || seSub === 'ls') {
|
|
2603
2609
|
const limit = args[1] ? Math.max(1, Math.min(50, Number(args[1]) || 10)) : 10;
|
|
2604
2610
|
const rows = sessionListSessions({ limit });
|
|
2611
|
+
// Unique prefixes, not a fixed 8 — `/session load <shown prefix>` must resolve (TUI-RESUME-PICKER).
|
|
2612
|
+
const idPrefixes = sessionIdPrefixes(rows.map((m) => m.id));
|
|
2605
2613
|
// Tier 1 daemon merge — when attached to a remote daemon w/ a
|
|
2606
2614
|
// derivable HTTP base, fetch the daemon's session list too so
|
|
2607
2615
|
// the user sees web/PWA/other-client sessions alongside their
|
|
@@ -2628,9 +2636,9 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2628
2636
|
if (m.bindings?.telegram) binds.push(`tg:${m.bindings.telegram.chatId}`);
|
|
2629
2637
|
if (m.bindings?.discord) binds.push(`dc:${m.bindings.discord.channelId}`);
|
|
2630
2638
|
const bindStr = binds.length > 0 ? ctx.subtext(`[${binds.join(' ')}]`) : '';
|
|
2631
|
-
const ts = m.updatedAt
|
|
2639
|
+
const ts = sessionListTime(m.updatedAt);
|
|
2632
2640
|
const title = (m.title || '(no title)').slice(0, 48);
|
|
2633
|
-
ctx.chatLines.push(` ${marker} ${ctx.text(m.id
|
|
2641
|
+
ctx.chatLines.push(` ${marker} ${ctx.text(idPrefixCell(idPrefixes, m.id))} ${ctx.muted(ts)} ${ctx.muted(`${m.messageCount}t`.padStart(4))} ${bindStr.padEnd(10)} ${title}`);
|
|
2634
2642
|
}
|
|
2635
2643
|
}
|
|
2636
2644
|
if (daemonRows.length > 0) {
|
|
@@ -2734,13 +2742,14 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2734
2742
|
}
|
|
2735
2743
|
ctx.setAttachedSessionId(match.id);
|
|
2736
2744
|
try { sessionSetActiveId(match.id); } catch { /* best-effort */ }
|
|
2745
|
+
noteRestoredContext(chatHistory);
|
|
2737
2746
|
ctx.chatLines.push('');
|
|
2738
2747
|
ctx.chatLines.push(ctx.success(` ✓ swapped to daemon session ${match.id}`));
|
|
2739
2748
|
if (past && past.length > 0) {
|
|
2740
|
-
ctx.chatLines.push(ctx.muted(` ${past.length} turn${past.length === 1 ? '' : 's'} restored
|
|
2749
|
+
ctx.chatLines.push(ctx.muted(` ${past.length} turn${past.length === 1 ? '' : 's'} restored:`));
|
|
2741
2750
|
const swapPreviewWidth = Math.max(40, termSize().cols - 8);
|
|
2742
2751
|
const swapPreviewWrap = getUserConfig().chat.rendering.wrap;
|
|
2743
|
-
const swapPreviewLines =
|
|
2752
|
+
const swapPreviewLines = renderRestoredTranscriptLines(past, {
|
|
2744
2753
|
maxWidth: swapPreviewWidth,
|
|
2745
2754
|
wrapOpts: swapPreviewWrap,
|
|
2746
2755
|
});
|
|
@@ -2792,11 +2801,13 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2792
2801
|
// side /attach (no-arg) picks up the same session automatically.
|
|
2793
2802
|
try { sessionSetActiveId(resolvedId); } catch { /* best-effort */ }
|
|
2794
2803
|
ctx.chatLines.push('');
|
|
2795
|
-
ctx.chatLines.push(ctx.success(` ✓ loaded session ${resolvedId.
|
|
2796
|
-
ctx.chatLines.push(ctx.muted(` ${loaded.history.length} turns restored
|
|
2804
|
+
ctx.chatLines.push(ctx.success(` ✓ loaded session ${sessionIdPrefixes([resolvedId]).get(resolvedId) ?? resolvedId} (${loaded.meta.title || '(no title)'})`));
|
|
2805
|
+
ctx.chatLines.push(ctx.muted(` ${loaded.history.length} turns restored:`));
|
|
2806
|
+
const restoredTokens = noteRestoredContext(chatHistory);
|
|
2807
|
+
debug.log('chat.session.load', 'restored', { sessionId: resolvedId, turns: loaded.history.length, estimatedContextTokens: restoredTokens });
|
|
2797
2808
|
const loadPreviewWidth = Math.max(40, termSize().cols - 8);
|
|
2798
2809
|
const loadPreviewWrap = getUserConfig().chat.rendering.wrap;
|
|
2799
|
-
const loadPreviewLines =
|
|
2810
|
+
const loadPreviewLines = renderRestoredTranscriptLines(loaded.history, {
|
|
2800
2811
|
maxWidth: loadPreviewWidth,
|
|
2801
2812
|
wrapOpts: loadPreviewWrap,
|
|
2802
2813
|
});
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI-FLICKER-DRAW-INTEGRATION — one synchronized-output owner per dashboard frame.
|
|
3
|
+
*
|
|
4
|
+
* A dashboard frame is not a single write: the transient-overlay cleanup, the
|
|
5
|
+
* base frame, the coordinator modal overlay, the prompt repaint and the
|
|
6
|
+
* post-frame overlay stamp are flushed one after another. Under tmux each of
|
|
7
|
+
* those flushes is presented on its own, so a tick that rewrites the frame is
|
|
8
|
+
* visible as a flicker. Wrapping the whole compose in DEC synchronized output
|
|
9
|
+
* (`CSI ? 2026 h` … `CSI ? 2026 l`) lets the terminal present the composite
|
|
10
|
+
* frame atomically.
|
|
11
|
+
*
|
|
12
|
+
* The owner is deliberately tiny and synchronous: callers open it, draw, and
|
|
13
|
+
* close it in a `finally` so a throw inside the draw still emits the ESU and
|
|
14
|
+
* the *next* frame is not swallowed by a dangling synchronized-output region.
|
|
15
|
+
*
|
|
16
|
+
* The wrap nests with the display coordinator, which opens the same region
|
|
17
|
+
* around its own flush and whose `onRender` hook is what calls `drawNow()`.
|
|
18
|
+
* `src/display/synchronized-output-region.ts` keeps that single-owner: an
|
|
19
|
+
* inner open contributes no bytes, so the coordinator's overlay + cursor stamp
|
|
20
|
+
* stays inside the one presentation instead of being pushed out by an early
|
|
21
|
+
* inner ESU.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import {
|
|
25
|
+
SYNCHRONIZED_OUTPUT_BEGIN,
|
|
26
|
+
SYNCHRONIZED_OUTPUT_END,
|
|
27
|
+
openSynchronizedOutputRegion,
|
|
28
|
+
synchronizedOutputDisabledByEnv,
|
|
29
|
+
} from '../display/synchronized-output-region.js';
|
|
30
|
+
|
|
31
|
+
export { SYNCHRONIZED_OUTPUT_BEGIN, SYNCHRONIZED_OUTPUT_END };
|
|
32
|
+
|
|
33
|
+
export interface SynchronizedFrameOutputDeps {
|
|
34
|
+
/** Sink for the control sequences — production passes `process.stdout.write`. */
|
|
35
|
+
write: (chunk: string) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Whether the sink may receive DEC 2026. Defaults to `true`. Production
|
|
38
|
+
* passes `process.stdout.isTTY` so piped/captured output stays
|
|
39
|
+
* byte-identical to what it was before this seam existed.
|
|
40
|
+
*/
|
|
41
|
+
supported?: boolean;
|
|
42
|
+
/** Environment escape hatch (`ELANOUS_SYNC_OUTPUT=off`). Defaults to `process.env`. */
|
|
43
|
+
env?: Record<string, string | undefined>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface SynchronizedFrameOutput {
|
|
47
|
+
/** Closes the region. Idempotent — a second call writes nothing. */
|
|
48
|
+
close: () => void;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function beginSynchronizedFrameOutput(
|
|
52
|
+
deps: SynchronizedFrameOutputDeps,
|
|
53
|
+
): SynchronizedFrameOutput {
|
|
54
|
+
const region = openSynchronizedOutputRegion();
|
|
55
|
+
const enabled =
|
|
56
|
+
region.outermost && deps.supported !== false && !synchronizedOutputDisabledByEnv(deps.env);
|
|
57
|
+
let closed = false;
|
|
58
|
+
if (enabled) {
|
|
59
|
+
try {
|
|
60
|
+
deps.write(SYNCHRONIZED_OUTPUT_BEGIN);
|
|
61
|
+
} catch (err) {
|
|
62
|
+
region.close();
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
close: () => {
|
|
68
|
+
if (closed) return;
|
|
69
|
+
closed = true;
|
|
70
|
+
if (enabled) deps.write(SYNCHRONIZED_OUTPUT_END);
|
|
71
|
+
region.close();
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -127,6 +127,8 @@ export function createDashboardTermSlashRuntime(
|
|
|
127
127
|
deps.muted(' /term list List all alive sessions (fg / bg / exited).'),
|
|
128
128
|
deps.muted(' /term attach <id> Bring a backgrounded session to foreground.'),
|
|
129
129
|
deps.muted(' /term detach Send foreground session to background (PTY survives).'),
|
|
130
|
+
deps.muted(' Ctrl+B (while streaming) Background running child tasks; turn continues.'),
|
|
131
|
+
deps.muted(' Ctrl+X c (chat input) Enter control mode.'),
|
|
130
132
|
deps.muted(' /term switch Open the session picker modal.'),
|
|
131
133
|
deps.muted(' /term kill <id> Stop the PTY and remove the session.'),
|
|
132
134
|
deps.muted(' /term snapshot <id> [tail [bytes]] Capture current grid (snapshot) or last N bytes (tail).'),
|
|
@@ -25,6 +25,7 @@ import { buildConcisenessSystemMessages } from '../prompt-library/chat-concisene
|
|
|
25
25
|
import {
|
|
26
26
|
buildSessionRuntimeSystemMessages,
|
|
27
27
|
buildSessionRuntimeTurnSystemMessages,
|
|
28
|
+
buildResearchDateSystemMessage,
|
|
28
29
|
type SessionTurnProfile,
|
|
29
30
|
} from '../session-runtime/index.js';
|
|
30
31
|
import { buildExecutionAskSystemMessages } from '../ask-user-question/index.js';
|
|
@@ -208,9 +209,13 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
208
209
|
gitSnapshotStaleMs: DASHBOARD_GIT_SNAPSHOT_STALE_MS,
|
|
209
210
|
}));
|
|
210
211
|
const turnProfile = ctx.turnProfile;
|
|
212
|
+
const researchTurn = turnProfile?.surface.id === 'research/agent';
|
|
211
213
|
const surfaceSystemMsgs = turnProfile
|
|
212
214
|
? timed(builderMs, 'surface', () => buildSessionRuntimeTurnSystemMessages(turnProfile, ctx.userText))
|
|
213
215
|
: ([] as LLMMessage[]);
|
|
216
|
+
if (researchTurn) {
|
|
217
|
+
surfaceSystemMsgs.push(buildResearchDateSystemMessage());
|
|
218
|
+
}
|
|
214
219
|
// ⭐⭐ `tools.nativeStructure` 는 «어느 provider 에 켤지»를 목록으로 고를 수 있다(2026-08-18).
|
|
215
220
|
// ⛔ 목록이 없으면 종전대로 «전 provider» — 기존 설정을 쓰는 사람의 값이 안 바뀐다.
|
|
216
221
|
// ⛔ `config.llm.provider` 를 그대로 읽지 않는다. 그것은 `'auto'` 일 수 있고,
|
|
@@ -240,9 +245,9 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
240
245
|
nativeStructureEnabled,
|
|
241
246
|
...(nativeTools !== undefined ? { enabledTools: nativeTools } : {}),
|
|
242
247
|
}) as LLMMessage[]);
|
|
243
|
-
const concisenessSystemMsgs = timed(builderMs, 'conciseness', () =>
|
|
244
|
-
|
|
245
|
-
|
|
248
|
+
const concisenessSystemMsgs = timed(builderMs, 'conciseness', () => researchTurn
|
|
249
|
+
? [] as LLMMessage[]
|
|
250
|
+
: buildConcisenessSystemMessages(ctx.userConfig.chat.conciseness) as LLMMessage[]);
|
|
246
251
|
// ★ elanous 자기접근 규율 + 자기인지 ambient(P3 · 2026-07-13) — 텔레그램/디스코드
|
|
247
252
|
// (makeElanousAgentRunTurn)와 단일 출처(agent/self-ambient.ts). TUI 채팅에서도 미션
|
|
248
253
|
// 진단("P2 왜 실패?")·자율 시스템 관측·회상이 규율+ambient+툴(self-ops family) 3박자로
|
|
@@ -313,10 +318,29 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
313
318
|
let taskNotificationCount = 0;
|
|
314
319
|
try {
|
|
315
320
|
timed(builderMs, 'taskNotifications', () => {
|
|
321
|
+
// ACP may ask for a preamble while the session is idle. Keep queued
|
|
322
|
+
// completion receipts for the next actual user/auto-wake turn.
|
|
323
|
+
if (!ctx.userText.trim()) return;
|
|
324
|
+
const notificationOnlyWake = /(?:^|\n)(?:Question: )?\[자동 재개\] 위임 끝: .+ \((?:done|error|aborted)\) — <task-notification> 의 결과를 읽고 이어서 처리$/u
|
|
325
|
+
.test(ctx.userText);
|
|
326
|
+
if (notificationOnlyWake) {
|
|
327
|
+
preamble.push({ role: 'system', content: '[알림 전용 턴] 이것은 완료 알림을 전달한 비요청 status receipt다. 작업 요청으로 취급하지 말고 Agent 또는 SelfImplement 위임을 시작하지 않는다. 포함된 결과를 바탕으로 한 번의 간결한 상태 요약만 답하고 멈춘다. 결과가 전달되지 않았다면 결과가 아직 제공되지 않았다고 알리고 내용을 추측하지 않는다.' });
|
|
328
|
+
}
|
|
316
329
|
const pendingNotifications = globalTaskNotificationQueue.drain();
|
|
317
330
|
taskNotificationCount = pendingNotifications.length;
|
|
318
|
-
|
|
331
|
+
if (pendingNotifications.length === 0) {
|
|
332
|
+
if (notificationOnlyWake) {
|
|
333
|
+
debug.log('tui.notify', 'notification-only-turn', { notificationCount: 0, resultAvailable: false });
|
|
334
|
+
}
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const taskNotificationsXml = renderTaskNotificationsXml(pendingNotifications, {
|
|
338
|
+
statusReceipt: notificationOnlyWake,
|
|
339
|
+
});
|
|
319
340
|
if (taskNotificationsXml) {
|
|
341
|
+
debug.log('tui.notify', notificationOnlyWake ? 'notification-only-turn' : 'notification-with-user-request', {
|
|
342
|
+
notificationCount: pendingNotifications.length,
|
|
343
|
+
});
|
|
320
344
|
preamble.push({ role: 'user', content: taskNotificationsXml });
|
|
321
345
|
}
|
|
322
346
|
});
|
|
@@ -22,6 +22,10 @@ import { TIER_ORDER, tierRank, tiersCompatible } from './types.js';
|
|
|
22
22
|
import { resolveKeyAlias } from '../input-core/key-alias-table.js';
|
|
23
23
|
import type { DisplayEventBus } from './events.js';
|
|
24
24
|
import { paintCursor, type CursorState } from './cursor-state.js';
|
|
25
|
+
import {
|
|
26
|
+
openSynchronizedOutputRegion,
|
|
27
|
+
synchronizedOutputDisabledByEnv,
|
|
28
|
+
} from './synchronized-output-region.js';
|
|
25
29
|
import { deriveCursor, type CursorDecision } from './cursor-owner.js';
|
|
26
30
|
import {
|
|
27
31
|
createVirtualCursorRegistry,
|
|
@@ -261,7 +265,6 @@ export class DisplayCoordinator {
|
|
|
261
265
|
* even when its bytes are unchanged, because the base rows under it
|
|
262
266
|
* were just repainted. Replaces the old forceNext follow-up. */
|
|
263
267
|
private overlayRowsInvalidated = false;
|
|
264
|
-
|
|
265
268
|
private surfaces = new Map<SurfaceId, DisplaySurface>();
|
|
266
269
|
private focusNodes = new Map<SurfaceId, FocusNode>();
|
|
267
270
|
private keyBindings = new Map<string, DisplayKeyBinding>();
|
|
@@ -288,6 +291,7 @@ export class DisplayCoordinator {
|
|
|
288
291
|
private dirty = new Set<SurfaceId | 'all' | 'status' | 'dock'>();
|
|
289
292
|
private forceNext = false;
|
|
290
293
|
private scheduled: Timer | null = null;
|
|
294
|
+
private scheduleGeneration = 0;
|
|
291
295
|
// P2.2.b — cursor state. Last-writer-wins. cursorVersion bumps on
|
|
292
296
|
// every setCursor; lastEmittedCursorVersion tracks what's been
|
|
293
297
|
// written so flushCursor only emits on change.
|
|
@@ -966,6 +970,36 @@ export class DisplayCoordinator {
|
|
|
966
970
|
}, 'dashboard');
|
|
967
971
|
}
|
|
968
972
|
|
|
973
|
+
/** Mark a render dirty and flush it before returning. Used when a host
|
|
974
|
+
* already owns a synchronized output batch around the render. */
|
|
975
|
+
requestRenderNow(opts?: { region?: SurfaceId | 'all'; force?: boolean }): void {
|
|
976
|
+
this.markDirty(opts?.region ?? 'all');
|
|
977
|
+
if (opts?.force) this.forceNext = true;
|
|
978
|
+
this.scheduleGeneration += 1;
|
|
979
|
+
this.scheduled = null;
|
|
980
|
+
this.flush();
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
/** Run synchronous terminal writes inside DECSET 2026 when enabled.
|
|
984
|
+
* Coordinator flushes, the dashboard draw seam, and host paint batches
|
|
985
|
+
* share the same re-entrant region instead of emitting nested markers. */
|
|
986
|
+
withSynchronizedOutput<T>(paint: () => T): T {
|
|
987
|
+
const syncRegion = openSynchronizedOutputRegion();
|
|
988
|
+
const syncOutput = syncRegion.outermost && this.syncOutputEnabled;
|
|
989
|
+
try {
|
|
990
|
+
if (syncOutput) {
|
|
991
|
+
this.writeOverlay?.('\x1b[?2026h');
|
|
992
|
+
}
|
|
993
|
+
return paint();
|
|
994
|
+
} finally {
|
|
995
|
+
try {
|
|
996
|
+
if (syncOutput) this.writeOverlay?.('\x1b[?2026l');
|
|
997
|
+
} finally {
|
|
998
|
+
syncRegion.close();
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
|
|
969
1003
|
handle(owner: SurfaceOwner): DisplayHandle {
|
|
970
1004
|
return {
|
|
971
1005
|
owner,
|
|
@@ -2629,10 +2663,16 @@ export class DisplayCoordinator {
|
|
|
2629
2663
|
|
|
2630
2664
|
private requestFrame(): void {
|
|
2631
2665
|
if (this.scheduled !== null) return;
|
|
2632
|
-
|
|
2666
|
+
const generation = ++this.scheduleGeneration;
|
|
2667
|
+
const marker = {} as Timer;
|
|
2668
|
+
let scheduled: Timer | undefined;
|
|
2669
|
+
this.scheduled = marker;
|
|
2670
|
+
scheduled = this.scheduleFn(() => {
|
|
2671
|
+
if (generation !== this.scheduleGeneration || (this.scheduled !== marker && this.scheduled !== scheduled)) return;
|
|
2633
2672
|
this.scheduled = null;
|
|
2634
2673
|
this.flush();
|
|
2635
2674
|
}, this.frameMs);
|
|
2675
|
+
if (this.scheduled === marker) this.scheduled = scheduled;
|
|
2636
2676
|
}
|
|
2637
2677
|
|
|
2638
2678
|
private flush(): void {
|
|
@@ -2661,9 +2701,7 @@ export class DisplayCoordinator {
|
|
|
2661
2701
|
// `ELANOUS_SYNC_OUTPUT=off` for buggy terminals (none observed in
|
|
2662
2702
|
// practice, 2026-04-21). Pattern matches Textual (synchronized
|
|
2663
2703
|
// output since v0.47) + Ratatui backend buffer-swap semantics.
|
|
2664
|
-
|
|
2665
|
-
if (syncOutput) this.writeOverlay?.('\x1b[?2026h');
|
|
2666
|
-
try {
|
|
2704
|
+
this.withSynchronizedOutput(() => {
|
|
2667
2705
|
// H1.6 · W2 shadow flush. Fires rc.on('before-flush') +
|
|
2668
2706
|
// rc.on('after-flush') synchronously. Subscriber paints (if any
|
|
2669
2707
|
// are wired in Phase γ) land INSIDE the DECSET 2026 atomic-frame
|
|
@@ -2696,11 +2734,7 @@ export class DisplayCoordinator {
|
|
|
2696
2734
|
// so the prior cursor position may have been overwritten. Always
|
|
2697
2735
|
// re-assert. The bypass-batch path calls flushCursor(false).
|
|
2698
2736
|
this.flushCursor(true);
|
|
2699
|
-
}
|
|
2700
|
-
// Always close the sync block — a throw inside render hooks
|
|
2701
|
-
// must not leave the terminal stuck in "buffering" mode.
|
|
2702
|
-
if (syncOutput) this.writeOverlay?.('\x1b[?2026l');
|
|
2703
|
-
}
|
|
2737
|
+
});
|
|
2704
2738
|
this.eventBus?.emit({ type: 'render:after', request, snapshot });
|
|
2705
2739
|
this.pendingWidgetPatches = [];
|
|
2706
2740
|
this.pendingLogLines = [];
|
|
@@ -2713,8 +2747,7 @@ export class DisplayCoordinator {
|
|
|
2713
2747
|
* not a TTY (unit-test + CI environment) so overlay assertions
|
|
2714
2748
|
* don't have to strip the ?2026h / ?2026l pair. */
|
|
2715
2749
|
private get syncOutputEnabled(): boolean {
|
|
2716
|
-
|
|
2717
|
-
if (v === 'off' || v === '0' || v === 'false') return false;
|
|
2750
|
+
if (synchronizedOutputDisabledByEnv()) return false;
|
|
2718
2751
|
// Non-TTY environments (tests, piped output) gain nothing from
|
|
2719
2752
|
// atomic frame wrapping and the sequences would pollute assertions.
|
|
2720
2753
|
if (typeof process !== 'undefined' && process.stdout && process.stdout.isTTY !== true) {
|
|
@@ -5,10 +5,9 @@
|
|
|
5
5
|
// resize produced a stale paint (old input prompt row + ghost tab
|
|
6
6
|
// bar) until the next keystroke triggered a redraw.
|
|
7
7
|
//
|
|
8
|
-
// Strategy:
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// transient paint error doesn't kill the listener.
|
|
8
|
+
// Strategy: debounce resize bursts for one frame (16ms), then paint the
|
|
9
|
+
// dashboard, prompt, and overlays synchronously inside one atomic output
|
|
10
|
+
// block. Transient paint errors do not kill the listener.
|
|
12
11
|
//
|
|
13
12
|
// (3) TUI-PICKER-RESIZE-SHRINK (#76 · 2026-10-17) — then ask the
|
|
14
13
|
// coordinator for one FORCED frame. Steps (1)+(2) bypass the
|
|
@@ -28,6 +27,8 @@
|
|
|
28
27
|
|
|
29
28
|
import { debug } from '../debug/log.js';
|
|
30
29
|
|
|
30
|
+
const RESIZE_DEBOUNCE_MS = 16;
|
|
31
|
+
|
|
31
32
|
export interface ResizeListenerDeps {
|
|
32
33
|
draw: (opts?: { force?: boolean }) => void;
|
|
33
34
|
promptCtl: { repaint: () => void };
|
|
@@ -35,6 +36,9 @@ export interface ResizeListenerDeps {
|
|
|
35
36
|
* re-emitted on top of the chrome the prompt repaint just wrote.
|
|
36
37
|
* Optional: hosts without a coordinator keep the legacy two-step. */
|
|
37
38
|
requestOverlayFrame?: () => void;
|
|
39
|
+
/** Run the whole resize repaint batch inside the host's atomic output
|
|
40
|
+
* block. Nested coordinator frames must share this outer block. */
|
|
41
|
+
withSynchronizedOutput?: (paint: () => void) => void;
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
/** Registers the resize listener and returns a dispose fn that
|
|
@@ -42,26 +46,43 @@ export interface ResizeListenerDeps {
|
|
|
42
46
|
* fresh listener; the caller is responsible for disposing previous
|
|
43
47
|
* installations. */
|
|
44
48
|
export function installResizeListener(deps: ResizeListenerDeps): () => void {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
50
|
+
let disposed = false;
|
|
51
|
+
const repaint = (): void => {
|
|
52
|
+
timer = undefined;
|
|
53
|
+
if (disposed) return;
|
|
54
|
+
const paint = (): void => {
|
|
55
|
+
try { deps.draw({ force: true }); } catch { /* swallow — paint errors shouldn't break resize */ }
|
|
56
|
+
try { deps.promptCtl.repaint(); } catch { /* swallow */ }
|
|
57
|
+
let overlayFrame: 'requested' | 'absent' | 'failed' = 'absent';
|
|
58
|
+
if (deps.requestOverlayFrame) {
|
|
59
|
+
try {
|
|
60
|
+
deps.requestOverlayFrame();
|
|
61
|
+
overlayFrame = 'requested';
|
|
62
|
+
} catch {
|
|
63
|
+
overlayFrame = 'failed';
|
|
64
|
+
}
|
|
55
65
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
66
|
+
debug.log('display.resize', 'repaint', {
|
|
67
|
+
cols: process.stdout.columns ?? null,
|
|
68
|
+
rows: process.stdout.rows ?? null,
|
|
69
|
+
overlayFrame,
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
try {
|
|
73
|
+
if (deps.withSynchronizedOutput) deps.withSynchronizedOutput(paint);
|
|
74
|
+
else paint();
|
|
75
|
+
} catch { /* resize painting must not detach the listener */ }
|
|
76
|
+
};
|
|
77
|
+
const handler = (): void => {
|
|
78
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
79
|
+
timer = setTimeout(repaint, RESIZE_DEBOUNCE_MS);
|
|
62
80
|
};
|
|
63
81
|
process.stdout.on('resize', handler);
|
|
64
82
|
return (): void => {
|
|
83
|
+
disposed = true;
|
|
84
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
85
|
+
timer = undefined;
|
|
65
86
|
process.stdout.removeListener('resize', handler);
|
|
66
87
|
};
|
|
67
88
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DECSET 2026 (synchronized output) region registry.
|
|
3
|
+
*
|
|
4
|
+
* Two owners wrap their writes in `CSI ? 2026 h` … `CSI ? 2026 l`: the
|
|
5
|
+
* display coordinator (`flush()`) and the dashboard draw seam
|
|
6
|
+
* (`src/dashboard/synchronized-frame-output.ts`). They nest — the
|
|
7
|
+
* coordinator opens a region and its `onRender` hook runs `drawNow()`,
|
|
8
|
+
* which wants the same wrap for the frame + prompt repaint. A second pair
|
|
9
|
+
* emitted inside the outer one is not harmless: the inner ESU flushes the
|
|
10
|
+
* terminal early, so everything the coordinator writes afterwards (modal
|
|
11
|
+
* overlay, cursor) lands in a separate presentation — exactly the flicker
|
|
12
|
+
* the wrap exists to prevent.
|
|
13
|
+
*
|
|
14
|
+
* The registry makes the wrap re-entrant: whoever opens first owns the
|
|
15
|
+
* byte pair; nested openers contribute no bytes and never close the outer
|
|
16
|
+
* region. Every opener must close its handle (idempotent) so the depth
|
|
17
|
+
* stays balanced even when a draw throws.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export const SYNCHRONIZED_OUTPUT_BEGIN = '\x1b[?2026h';
|
|
21
|
+
export const SYNCHRONIZED_OUTPUT_END = '\x1b[?2026l';
|
|
22
|
+
|
|
23
|
+
export interface SynchronizedOutputRegion {
|
|
24
|
+
/** true when this region owns the emitted BSU/ESU pair. */
|
|
25
|
+
readonly outermost: boolean;
|
|
26
|
+
/** Idempotent — closes this region exactly once. */
|
|
27
|
+
close(): void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let openDepth = 0;
|
|
31
|
+
|
|
32
|
+
/** True while any owner holds a synchronized-output region open. */
|
|
33
|
+
export function isSynchronizedOutputRegionOpen(): boolean {
|
|
34
|
+
return openDepth > 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* `ELANOUS_SYNC_OUTPUT=off|0|false` escape hatch for terminals that
|
|
39
|
+
* mishandle DEC 2026. Anything else (including unset) keeps the wrap on.
|
|
40
|
+
*/
|
|
41
|
+
export function synchronizedOutputDisabledByEnv(
|
|
42
|
+
env: Record<string, string | undefined> = process.env,
|
|
43
|
+
): boolean {
|
|
44
|
+
const value = (env.ELANOUS_SYNC_OUTPUT ?? 'on').toLowerCase();
|
|
45
|
+
return value === 'off' || value === '0' || value === 'false';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function openSynchronizedOutputRegion(): SynchronizedOutputRegion {
|
|
49
|
+
const outermost = openDepth === 0;
|
|
50
|
+
openDepth += 1;
|
|
51
|
+
let closed = false;
|
|
52
|
+
return {
|
|
53
|
+
outermost,
|
|
54
|
+
close(): void {
|
|
55
|
+
if (closed) return;
|
|
56
|
+
closed = true;
|
|
57
|
+
if (openDepth > 0) openDepth -= 1;
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -19,6 +19,8 @@ export interface GuardianDeps {
|
|
|
19
19
|
execute?: (command: string) => Promise<SpawnOutcome>;
|
|
20
20
|
/** Injected only for deterministic expiry-alert tests. Production reads the local Grok auth file. */
|
|
21
21
|
grokExpiry?: () => string | null;
|
|
22
|
+
/** Injected in tests; production reevaluates recorded doctor visits without dispatching a prescription. */
|
|
23
|
+
doctorShadow?: () => void | Promise<void>;
|
|
22
24
|
hostName?: string;
|
|
23
25
|
}
|
|
24
26
|
|
|
@@ -100,6 +102,13 @@ export async function guardianTick(now: Date, plan: GuardianPlan, deps: Guardian
|
|
|
100
102
|
errorName: error instanceof Error ? error.name : 'unknown',
|
|
101
103
|
});
|
|
102
104
|
}
|
|
105
|
+
try {
|
|
106
|
+
await deps.doctorShadow?.();
|
|
107
|
+
} catch (error) {
|
|
108
|
+
debug.log('guardian.doctor-shadow', 'reevaluation-failed', {
|
|
109
|
+
errorName: error instanceof Error ? error.name : 'unknown',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
103
112
|
const timeZone = plan.timeZone ?? resolveTimeZone().timeZone;
|
|
104
113
|
const wouldRun: string[] = [];
|
|
105
114
|
let executed = 0;
|