elanous 0.2.37 → 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/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.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/{7424.c0fe2a595d4232b5.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/{4937-28d437999b77c9dd.js → 1923-5c1695332240246a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
- package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +1 -0
- 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/{3199.6a1a9b0e6cd01dc6.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/{1262.a89bb27a5b2f844e.js → 3086.fb14b60ce98b53d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3124-561f7f037943cde2.js +1 -0
- 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/{2283.edd9627b7bdfb546.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/{6877-84d47b7e85d0c41e.js → 3341-f09b9efbd7a82f70.js} +1 -1
- 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/{6680.6a693c28aae4cd19.js → 3528.e4b8ab70d339f965.js} +1 -1
- 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/4199-f7c6eb40cd0322f8.js +1 -0
- 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/{4036.d54e55e1ebf5acdc.js → 4804.6012b5cd33c22792.js} +2 -2
- 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/{6819.be5c9c4d67f22922.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/{757-4fbaf50942b8c424.js → 5255-1b60d50eabe9f057.js} +1 -1
- 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/{7867.e8725745ddd1d940.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/{5046.7fd5cbd859299448.js → 5638.107314dc479e2f37.js} +1 -1
- 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/6493.27ad77de7aac7966.js +1 -0
- 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/{1224.2ceca6c180d5130b.js → 7000.28157393caaf5343.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 7161-8f22db3ec5ed005e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{2479-fe7e188bd9402d14.js → 7311-60a7ea80d23c7521.js} +1 -1
- 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/{5952.294fc574a8625184.js → 7488.966b116789f3d41a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +1 -0
- 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/{6252.240578f10952e091.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/{1746.3563617ea64023a3.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/{4931.95cc6dbd230774ca.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/{2375.bf364c85dbb6f085.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/{4383.18e5c54db3a22c88.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/{9151.a2c51e93f9156dae.js → 8911.bf5e712acb25fb6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 8994d93e.33ba491f95345fc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +41 -0
- 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/9581.da63ddf41acfad46.js +1 -0
- 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/{de8446d3.31b73eb239fecd7b.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-5c112c6d7c33656e.js → page-c348a3959c5b5fc6.js} +1 -1
- 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-88a1edbff62eaf1d.js → page-d1d1210f99f620ae.js} +1 -1
- 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-291ab19fe2acb173.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/{page-b9af2ac1c4737ce8.js → page-7f569e533ddeecba.js} +1 -1
- 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-fb9e639c107f5f72.js → page-a9d9a3e66459c1e0.js} +1 -1
- 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-6b140f77593576eb.js +1 -0
- 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/{709a918c.4fd3b4e2a32cb4e3.js → b7459770.6539b11860eb8a9c.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b7478fef.5917716286213fcc.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → bb6987f9.3647e1a23b0e3217.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/de8b930d.d94c0f42acf807fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.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/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/package.json +1 -1
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +39 -0
- package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
- 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/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/resume-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +297 -8
- 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 +29 -4
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/core-turn-bridge.ts +6 -1
- package/src/agent/run-context.ts +1 -1
- package/src/agent/task-notification.ts +3 -1
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +195 -27
- 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/bots/screen-probe.ts +1 -1
- package/src/capture/tui-self-report.ts +10 -2
- package/src/chat/index.ts +1 -0
- package/src/chat/tool-render/dispatch.ts +8 -1
- 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/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 +5 -2
- package/src/cli/release-cli.ts +47 -9
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +1 -1
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +62 -23
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/context-bus/context-now.ts +86 -2
- package/src/core-turn/run-core-turn.ts +9 -2
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/index.ts +18 -17
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -0
- package/src/dashboard/term-slash-runtime.ts +2 -0
- package/src/dashboard/turn-preamble.ts +28 -4
- package/src/domains/guardian-tick.ts +9 -0
- package/src/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/runner.ts +17 -2
- package/src/grok/credential.ts +107 -36
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +44 -14
- 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-tool-schema.ts +20 -0
- package/src/llm.ts +81 -11
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +6 -3
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/patents/ledger.ts +18 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +5 -0
- package/src/pty-shell/pty-manifest.ts +16 -2
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/repl/index.ts +10 -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/self-dev/decompose.ts +45 -9
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +29 -16
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/run-supervisor.ts +22 -7
- package/src/self-dev/shard-run.ts +260 -3
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/doctor-visit.ts +25 -0
- package/src/self-implement/gate-artifacts.ts +2 -2
- package/src/self-implement/gate-baseline.ts +44 -9
- package/src/self-implement/gate-cli.ts +151 -86
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-remote.ts +2 -0
- package/src/self-implement/goal-author.ts +74 -3
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +38 -4
- package/src/self-implement/knowhow-pack.ts +120 -7
- 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 +55 -12
- 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/run-ledger.ts +258 -0
- package/src/self-implement/seams.ts +33 -10
- package/src/self-implement/self-implement-cli.ts +26 -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 +3 -0
- package/src/session/index.ts +2 -0
- package/src/session-runtime/index.ts +9 -22
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/schedule-wakeup.ts +1 -6
- package/src/status/bar.ts +3 -3
- package/src/storage/file-lock.ts +17 -4
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/parent-host.ts +59 -12
- package/src/task-agent/repair-cycle.ts +67 -8
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/task-hand.ts +98 -10
- package/src/task-agent/tier-split.ts +37 -3
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
- package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +126 -48
- package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -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/entry.ts +469 -31
- 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 +3 -23
- package/src/tui/slash/term-next.ts +2 -1
- package/src/tui-client/local-chat-turn.ts +29 -8
- package/src/user-config.ts +11 -2
- package/src/ux-sim/fake-llm.ts +11 -5
- package/src/ux-sim/next-tui-seat-scenarios.ts +53 -1
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3578.4e9f9948a9a6f2f4.js +0 -2
- package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
- package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4313.76f232c304a15bde.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4725-34bed25720cc326b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
- package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
- package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
- package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
- package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
- package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
- package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
- package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
- package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
- package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
- package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
- package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
- package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-3337c6a1328c2674.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.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/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
package/src/cli/tasks-cli.ts
CHANGED
|
@@ -90,6 +90,8 @@ export interface TasksCliDeps {
|
|
|
90
90
|
adoptRunTerminal?: typeof import('../task-agent/adopt-pr.js').adoptedRunTerminal;
|
|
91
91
|
/** `tasks show`·`advance` 의 런 근거 읽기(시험 주입) — 기본 = 런 원장(이 우주 ⊕ 연합) ⊕ 호스트 logs 의 Pod job-finished. */
|
|
92
92
|
cardRunEvidence?: CardRunEvidenceDeps;
|
|
93
|
+
/** `tasks show --json` 의 저작 골 파일 조회(시험 주입). null 은 골 연결을 확인하지 못한 상태다. */
|
|
94
|
+
cardGoalDocument?: (goalId: string) => { goalFile: string; goalBody: string } | null;
|
|
93
95
|
/** `tasks live-verified` 가 적는 런 원장 디렉터리(시험 주입). 기본 = `runLedgerDir()`. */
|
|
94
96
|
liveVerifiedLedgerDir?: string;
|
|
95
97
|
/** HARNESS-PARENT-ON-MSB1 — 원격 부모 카드의 원장 거울(시험 주입). 기본 = ssh 로 `<prodRoot>/remote-parents/<host>/run-ledger`. */
|
|
@@ -189,8 +191,6 @@ export interface DefaultTaskLauncherDeps {
|
|
|
189
191
|
localVersion?: string;
|
|
190
192
|
/** HQ-owned, refresh-less Codex access mirror to install before a remote parent launch. */
|
|
191
193
|
codexAccessMirror?: () => Promise<{ elanousAuth: string; codexAuth: string; account?: string; usedPercent?: number; thresholdPercent?: number; mirrors?: Array<{ elanousAuth: string; codexAuth: string; account: string; usedPercent?: number; thresholdPercent: number; expiresAt: number }> } | null>;
|
|
192
|
-
/** HQ-owned Grok subscription access mirror; resolved before the first remote SSH call. */
|
|
193
|
-
grokAccessMirror?: () => import('../task-agent/parent-host.js').OwnerGrokAccessMirror;
|
|
194
194
|
/** Clock used to recheck mirror freshness immediately before installation. */
|
|
195
195
|
now?: () => number;
|
|
196
196
|
/** Isolated integration seam; production still reads the HQ rotation snapshot and config directly. */
|
|
@@ -205,6 +205,18 @@ export interface DefaultTaskLauncherDeps {
|
|
|
205
205
|
|
|
206
206
|
class NoEligibleOwnerCodexAccountError extends Error {}
|
|
207
207
|
|
|
208
|
+
/** Only declared Pod launch switches cross from HQ to the remote parent. */
|
|
209
|
+
export function podParentLaunchSelectors(contextEnv: Record<string, string>, inheritedEnv: NodeJS.ProcessEnv): Record<string, string> {
|
|
210
|
+
const selectors: Record<string, string> = {};
|
|
211
|
+
for (const key of ['ELANOUS_POD_MEMORY_TIER', 'ELANOUS_POD_MEMORY', 'ELANOUS_POD_MEMORY_HIGH', 'ELANOUS_POD_MEMORY_LITE', 'ELANOUS_POD_GOAL_TYPE'] as const) {
|
|
212
|
+
const value = contextEnv[key] ?? inheritedEnv[key];
|
|
213
|
+
if (value !== undefined) selectors[key] = value;
|
|
214
|
+
}
|
|
215
|
+
const inplace = contextEnv.ELANOUS_POD_INPLACE_WORKTREE ?? inheritedEnv.ELANOUS_POD_INPLACE_WORKTREE;
|
|
216
|
+
if (inplace !== undefined) selectors.ELANOUS_POD_INPLACE_WORKTREE = inplace === '1' ? '1' : '0';
|
|
217
|
+
return selectors;
|
|
218
|
+
}
|
|
219
|
+
|
|
208
220
|
/**
|
|
209
221
|
* HARNESS-PARENT-ON-MSB1 — 켜져 있고 발사 전 점검이 통과하면 원격(ssh)에서 부모를 띄운다(PR 까지만 · 병합은 HQ).
|
|
210
222
|
* 막히면 null — 호출부가 종전 로컬 발사로 간다(관측: task-agent parent-host-fallback).
|
|
@@ -223,9 +235,21 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
223
235
|
?? (args.includes('--child-llm-provider') ? args[args.indexOf('--child-llm-provider') + 1] : undefined);
|
|
224
236
|
const effectiveChildProvider = context.effectiveChildProvider ?? providerFromArgs;
|
|
225
237
|
const notice = deps.notice ?? ((line: string) => { try { process.stderr.write(`${line}\n`); } catch { /* ignore */ } });
|
|
238
|
+
const provisionRequests = new Set<string>();
|
|
239
|
+
const provision = (host: string, reason: string): void => {
|
|
240
|
+
const key = `${host}:${reason}`;
|
|
241
|
+
if (provisionRequests.has(key)) return;
|
|
242
|
+
provisionRequests.add(key);
|
|
243
|
+
try { debug.log('task-agent.parent-host', 'provision-requested', { host, runId: context.runId, provider: effectiveChildProvider ?? 'openai-codex', reason }); } catch { /* fail-soft */ }
|
|
244
|
+
notice(`[parent-host] ${host} provision 요청 — ${reason}; 준비 완료 전 배정 대기`);
|
|
245
|
+
};
|
|
226
246
|
const failed = (target: typeof targets[number], gaps: string[], facts: Record<string, string> = {}): void => {
|
|
227
247
|
try { debug.log('task-agent', 'parent-host-fallback', { host: target.host, runId: context.runId, gaps, facts }); } catch { /* fail-soft */ }
|
|
228
|
-
|
|
248
|
+
// grok-credential-* 은 호스트가 스스로 보고한 자체 자격 상태다 — 무효면 OP 재로그인 요청이 나간다.
|
|
249
|
+
const provisionGaps = ['grok-cli-missing', 'codex-cli-missing', 'grok-credential-missing', 'grok-credential-expiring', 'grok-credential-expired', 'codex-access-mirror-unavailable'];
|
|
250
|
+
const missing = gaps.every((gap) => provisionGaps.includes(gap)) ? gaps : [];
|
|
251
|
+
notice(`[parent-host] ${target.host} 로 못 띄움 — ${missing.length ? '공급자 준비 뒤 재시도' : multi ? '다음 호스트 또는 로컬 발사로 간다' : '로컬 발사로 간다'}: ${gaps.join(' · ')}`);
|
|
252
|
+
for (const gap of missing) provision(target.host, gap);
|
|
229
253
|
};
|
|
230
254
|
type OwnerMirror = { elanousAuth: string; codexAuth: string; account?: string; usedPercent?: number; thresholdPercent?: number; mirrors?: Array<{ elanousAuth: string; codexAuth: string; account: string; usedPercent?: number; thresholdPercent: number; expiresAt: number }> };
|
|
231
255
|
let accessMirror: OwnerMirror | null | undefined;
|
|
@@ -313,11 +337,9 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
313
337
|
// 그 앞의 readParentHostCapacity 도 ssh). 가드를 아래로 내리면 hold 경로에서 시험이 실 ssh 를 쏜다(R7 사고 모양).
|
|
314
338
|
// hold 경로를 재는 시험은 deps.ssh 가짜 또는 parentHost:null 을 주입한다(real-launch-guard.test 가 이 순서를 문다).
|
|
315
339
|
if (!deps.ssh) (await import('../task-agent/real-launch-guard.js')).refuseRealLaunchUnderTest('remote-parent-ssh', targets.map((target) => target.host).join(','));
|
|
316
|
-
//
|
|
317
|
-
//
|
|
318
|
-
|
|
319
|
-
? (deps.grokAccessMirror?.() ?? parentHostModule.resolveOwnerGrokAccessMirror())
|
|
320
|
-
: undefined;
|
|
340
|
+
// GROK-MIRROR-REAL-SCOPE: HQ does not select or copy its own Grok access for a remote parent. Each host keeps
|
|
341
|
+
// its own device-auth session, and the preflight below blocks the Grok child when the host reports it invalid
|
|
342
|
+
// (grok-credential-*) — that gap drives the OP re-login request instead of a silent local fallback.
|
|
321
343
|
let launchHoldActive = false;
|
|
322
344
|
try {
|
|
323
345
|
if (deps.launchHoldActive) launchHoldActive = deps.launchHoldActive();
|
|
@@ -328,7 +350,7 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
328
350
|
}
|
|
329
351
|
} catch { launchHoldActive = true; /* 못 읽으면 막힌 것으로(fail-closed) */ }
|
|
330
352
|
const podGoal = context.substrate === 'pod' ? context.podGoal : undefined;
|
|
331
|
-
//
|
|
353
|
+
// Pod 선택자만 원격 부모에 넘긴다. 로컬의 나머지 환경·자격은 SSH 로 복사하지 않는다.
|
|
332
354
|
const remoteEnv = { ...context.env };
|
|
333
355
|
// These labels describe an HQ-selected Codex access mirror; never forward an inherited label by itself.
|
|
334
356
|
delete remoteEnv.ELANOUS_REMOTE_CODEX_ACCOUNT;
|
|
@@ -336,10 +358,7 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
336
358
|
delete remoteEnv.ELANOUS_REMOTE_CODEX_THRESHOLD_PERCENT;
|
|
337
359
|
delete remoteEnv.ELANOUS_REMOTE_CODEX_ACCOUNTS;
|
|
338
360
|
delete remoteEnv.ELANOUS_REMOTE_CODEX_ACCESS_ONLY;
|
|
339
|
-
if (podGoal)
|
|
340
|
-
const value = context.env[key] ?? process.env[key];
|
|
341
|
-
if (value !== undefined) remoteEnv[key] = value;
|
|
342
|
-
}
|
|
361
|
+
if (podGoal) Object.assign(remoteEnv, podParentLaunchSelectors(context.env, process.env));
|
|
343
362
|
const memoryLimit = podGoal ? (await import('../task-orchestrator/surfaces/self-implement-pod.js')).podMemoryLimitFor(podGoal, remoteEnv).limit : undefined;
|
|
344
363
|
const fits = Object.fromEntries(targets.map((target) => {
|
|
345
364
|
const fit = memoryLimit
|
|
@@ -354,7 +373,9 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
354
373
|
const details = targets.map((target) => `${target.host}: Pod ${fits[target.host]!.memoryLimit} (${fits[target.host]!.requiredBytes} bytes) > node allocatable ${fits[target.host]!.allocatableBytes} bytes`).join(' · ');
|
|
355
374
|
throw new Error(`parent-host memory-never-fits — ${details}; local fallback refused`);
|
|
356
375
|
}
|
|
357
|
-
const capacities
|
|
376
|
+
const capacities: Record<string, import('../task-agent/parent-host.js').ParentHostCapacity | null> = Object.fromEntries(
|
|
377
|
+
multi ? eligible.map((target) => [target.host, parentHostModule.readParentHostCapacity(target, deps.ssh)]) : [],
|
|
378
|
+
);
|
|
358
379
|
const measured = eligible.filter((target) => fits[target.host]?.state === 'fits');
|
|
359
380
|
const unknown = eligible.filter((target) => fits[target.host]?.state !== 'fits');
|
|
360
381
|
const ranked = multi
|
|
@@ -372,11 +393,14 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
372
393
|
};
|
|
373
394
|
for (const target of ordered) {
|
|
374
395
|
if (multi && (!capacities[target.host] || capacities[target.host]!.approvalHeadroom <= 0)) {
|
|
375
|
-
|
|
396
|
+
const capacity = capacities[target.host];
|
|
397
|
+
failed(target, [`capacity-unavailable · ${capacity
|
|
398
|
+
? `host active=${capacity.active} waiting=${capacity.waiting} limit=${capacity.limit} headroom=${capacity.headroom}`
|
|
399
|
+
: 'measurement=unknown'}`]);
|
|
376
400
|
continue;
|
|
377
401
|
}
|
|
378
402
|
let preflight: ReturnType<typeof parentHostModule.preflightParentHost>;
|
|
379
|
-
try { preflight = parentHostModule.preflightParentHost({ target, localVersion: deps.localVersion ?? parentHostModule.localElanousVersion(), launchHoldActive, ...(deps.ssh ? { ssh: deps.ssh } : {}) }); }
|
|
403
|
+
try { preflight = parentHostModule.preflightParentHost({ target, localVersion: deps.localVersion ?? parentHostModule.localElanousVersion(), launchHoldActive, childProvider: effectiveChildProvider ?? 'openai-codex', ...(deps.ssh ? { ssh: deps.ssh } : {}) }); }
|
|
380
404
|
catch (error) { failed(target, [`preflight-error: ${error instanceof Error ? error.message : String(error)}`]); continue; }
|
|
381
405
|
if (!preflight.ok) { failed(target, preflight.gaps, preflight.facts); continue; }
|
|
382
406
|
if (preflight.warnings.length) notice(`⚠ ${target.host} 자격: ${preflight.warnings.join(' · ')}`);
|
|
@@ -422,8 +446,7 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
422
446
|
else {
|
|
423
447
|
try { debug.log('task-agent.parent-host', 'codex-access-mirror-unavailable', { host: target.host, runId: context.runId, reason: mirrorReason }); } catch { /* fail-soft */ }
|
|
424
448
|
failed(target, ['codex-access-mirror-unavailable']);
|
|
425
|
-
|
|
426
|
-
return null;
|
|
449
|
+
continue;
|
|
427
450
|
}
|
|
428
451
|
if (selected?.account) {
|
|
429
452
|
remoteEnv.ELANOUS_REMOTE_CODEX_ACCOUNT = selected.account;
|
|
@@ -433,8 +456,7 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
433
456
|
if (mirrors) remoteEnv.ELANOUS_REMOTE_CODEX_ACCOUNTS = JSON.stringify(mirrors.map(({ account, usedPercent, thresholdPercent, expiresAt }) => ({ account, usedPercent: usedPercent ?? null, thresholdPercent, expiresAt })));
|
|
434
457
|
remoteEnv.ELANOUS_REMOTE_CODEX_ACCESS_ONLY = '1';
|
|
435
458
|
}
|
|
436
|
-
const launched = parentHostModule.launchRemoteParent(target, args, remoteEnv, deps.ssh,
|
|
437
|
-
grokAccessMirror ? () => grokAccessMirror : undefined, effectiveChildProvider, deps.now);
|
|
459
|
+
const launched = parentHostModule.launchRemoteParent(target, args, remoteEnv, deps.ssh, effectiveChildProvider);
|
|
438
460
|
recordHostRanking(target.host);
|
|
439
461
|
try { debug.log('task-agent', 'parent-host-launched', { host: target.host, runId: context.runId, pid: launched.pid, log: launched.log }); } catch { /* fail-soft */ }
|
|
440
462
|
return { runId: context.runId, parentHost: { host: target.host, ...(target.configDir ? { configDir: target.configDir } : {}), pid: launched.pid, log: launched.log } };
|
|
@@ -447,6 +469,7 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
447
469
|
}
|
|
448
470
|
}
|
|
449
471
|
recordHostRanking(null);
|
|
472
|
+
if (provisionRequests.size > 0) throw new Error(`parent-host-provision-pending: ${[...provisionRequests].join(', ')}; no child provider host launched`);
|
|
450
473
|
return null;
|
|
451
474
|
}
|
|
452
475
|
|
|
@@ -2486,14 +2509,17 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
2486
2509
|
.option('--card <id>', '기존 launched 카드(미바인딩 또는 같은 PR이 등록부에서 바인딩됨)')
|
|
2487
2510
|
.option('--checklist <id>', '새 카드에 붙일 체크리스트 칸')
|
|
2488
2511
|
.option('--version <version>', '체크리스트 판(기존 카드에도 고정 가능)')
|
|
2512
|
+
.option('--rebind', '옛 판 또는 failed 카드의 기존 PR 결속을 풀고 지정 판의 새 카드로 원자 이동')
|
|
2489
2513
|
.option('--unlinked-terminal', '기존 카드의 모든 구현 자식이 종결되고 PR 사건이 전혀 없을 때만 별도로 열린 PR을 명시적으로 입양')
|
|
2490
2514
|
.option('--json', 'JSON 출력')
|
|
2491
|
-
.action(async (value: string, opts: { card?: string; checklist?: string; version?: string; unlinkedTerminal?: boolean; json?: boolean }) => {
|
|
2515
|
+
.action(async (value: string, opts: { card?: string; checklist?: string; version?: string; rebind?: boolean; unlinkedTerminal?: boolean; json?: boolean }) => {
|
|
2492
2516
|
await registerTaskAgentSink(deps.registerSink);
|
|
2493
2517
|
try {
|
|
2494
2518
|
if (!/^[1-9]\d*$/.test(value) || !Number.isSafeInteger(Number(value))) throw new Error(`PR 번호가 아니다: ${value}`);
|
|
2495
2519
|
if ((opts.card === undefined) === (opts.checklist === undefined))
|
|
2496
2520
|
throw new Error('--card 또는 --checklist [--version] 중 하나만 준다');
|
|
2521
|
+
if (opts.rebind && (opts.card || !opts.checklist || !opts.version || opts.unlinkedTerminal))
|
|
2522
|
+
throw new Error('--rebind는 --checklist와 --version을 지정하고 --card/--unlinked-terminal은 생략한다');
|
|
2497
2523
|
if (opts.unlinkedTerminal && !opts.card) throw new Error('--unlinked-terminal은 --card와 함께 준다');
|
|
2498
2524
|
if (opts.version) validateVersion(opts.version);
|
|
2499
2525
|
let cardVersion = opts.version;
|
|
@@ -2534,15 +2560,28 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
2534
2560
|
const linkedEvidence = targetCard ? checkRun(targetCard, view) : undefined;
|
|
2535
2561
|
const terminalRunEvidence = linkedEvidence || (opts.unlinkedTerminal && targetCard ? checkRun(targetCard, view, undefined, true) : false);
|
|
2536
2562
|
const unlinkedTerminalUsed = opts.unlinkedTerminal === true && linkedEvidence !== true;
|
|
2563
|
+
let rebindSource: { card: TaskCard; terminalRunEvidence: boolean } | undefined;
|
|
2564
|
+
if (opts.rebind) {
|
|
2565
|
+
const statePath = deps.taskStatePath ?? taskStatePathDefault();
|
|
2566
|
+
const bound = Object.values(readTaskAgentState<{ tasks?: Record<string, TaskCard> }>(statePath).tasks ?? {})
|
|
2567
|
+
.filter((card) => cardPrNumber(card) === number);
|
|
2568
|
+
if (bound.length !== 1) throw new Error(bound.length
|
|
2569
|
+
? `PR #${number}가 여러 카드에 묶였다 — 임의로 rebind하지 않는다`
|
|
2570
|
+
: `PR #${number}가 기존 카드에 묶이지 않았다 — --rebind 대상 없음`);
|
|
2571
|
+
const source = bound[0]!;
|
|
2572
|
+
rebindSource = { card: source, terminalRunEvidence: source.status === 'launched' ? checkRun(source, view) : false };
|
|
2573
|
+
}
|
|
2537
2574
|
const chosen = observedChecklist ?? checklist;
|
|
2538
2575
|
const result = adoptExistingPr({ pr: view, repo, statePath: deps.taskStatePath ?? taskStatePathDefault(),
|
|
2539
2576
|
...(opts.card ? { cardId: opts.card, version: cardVersion, terminalRunEvidence, unlinkedTerminal: unlinkedTerminalUsed, observedChecklist,
|
|
2540
2577
|
observedRun: { runId: targetCard?.runId, runChildId: targetCard?.runChildId, parentHost: targetCard?.parentHost?.host, launchId: targetCard?.launchId } } : {}),
|
|
2578
|
+
...(rebindSource ? { rebindSource } : {}),
|
|
2579
|
+
...(opts.rebind && opts.version ? { version: opts.version } : {}),
|
|
2541
2580
|
...(chosen ? { checklistAtWrite: () => (deps.adoptChecklist ?? listChecklist)(chosen.version).items.find((item) => item.id === chosen.id) } : {}),
|
|
2542
2581
|
...(checklist ? { checklist } : {}) });
|
|
2543
2582
|
try { debug.log('task-agent', 'pr-adopted', { card: result.card.id, pr: number, head: view.headRefOid, created: result.created, changed: result.changed, launched: false }); } catch { /* fail-soft */ }
|
|
2544
|
-
if (opts.json) out(JSON.stringify({ card: result.card.id, pr: number, head: view.headRefOid, created: result.created, changed: result.changed, next: `tasks rejudge ${result.card.id}` }));
|
|
2545
|
-
else out(`${result.card.id}\tPR #${number}\t${result.changed ? 'adopted' : 'already-adopted'}\t구현 발사 0 · 다음: tasks rejudge ${result.card.id}`);
|
|
2583
|
+
if (opts.json) out(JSON.stringify({ card: result.card.id, ...(result.previousCardId ? { previousCard: result.previousCardId } : {}), pr: number, head: view.headRefOid, created: result.created, changed: result.changed, next: `tasks rejudge ${result.card.id}` }));
|
|
2584
|
+
else out(`${result.card.id}\tPR #${number}\t${result.changed ? 'adopted' : 'already-adopted'}${result.previousCardId ? ` · 이전 카드 ${result.previousCardId} 결속 해제` : ''}\t구현 발사 0 · 다음: tasks rejudge ${result.card.id}`);
|
|
2546
2585
|
} catch (error) {
|
|
2547
2586
|
out(error instanceof Error ? error.message : String(error));
|
|
2548
2587
|
process.exitCode = 1;
|
|
@@ -6,6 +6,7 @@ import { readNexusRuntime } from '../nexus/runtime.js';
|
|
|
6
6
|
import { TASK_CARD_PREFIX } from '../task-agent/task-card-prefix.js';
|
|
7
7
|
import type { Task } from '../task-orchestrator/types.js';
|
|
8
8
|
import type { TasksCliDeps } from './tasks-cli.js';
|
|
9
|
+
import { writeStdoutFully } from './stdout-flush.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* CLI-ENTRY-LAZY — `tasks list`·`tasks show` 의 등록과 넥서스 조회 보조.
|
|
@@ -100,6 +101,7 @@ export function handleError(error: unknown, out: (line: string) => void): void {
|
|
|
100
101
|
export interface TasksCliContext {
|
|
101
102
|
deps: TasksCliDeps;
|
|
102
103
|
out: (line: string) => void;
|
|
104
|
+
outFully: (line: string) => Promise<void>;
|
|
103
105
|
authenticate: () => { baseUrl: string; token?: string };
|
|
104
106
|
clearToken: () => void;
|
|
105
107
|
}
|
|
@@ -107,9 +109,15 @@ export interface TasksCliContext {
|
|
|
107
109
|
export function createTasksCliContext(deps: TasksCliDeps): TasksCliContext {
|
|
108
110
|
let activeToken: string | undefined;
|
|
109
111
|
const output = deps.output ?? console.log;
|
|
112
|
+
const maskToken = (line: string) => activeToken ? line.replaceAll(activeToken, '[redacted]') : line;
|
|
110
113
|
return {
|
|
111
114
|
deps,
|
|
112
|
-
out: (line: string) => output(
|
|
115
|
+
out: (line: string) => output(maskToken(line)),
|
|
116
|
+
outFully: async (line: string) => {
|
|
117
|
+
const safeLine = maskToken(line);
|
|
118
|
+
if (deps.output) output(safeLine);
|
|
119
|
+
else await writeStdoutFully(safeLine);
|
|
120
|
+
},
|
|
113
121
|
authenticate: () => {
|
|
114
122
|
const auth = credentials(deps);
|
|
115
123
|
activeToken = auth?.token;
|
|
@@ -126,7 +134,7 @@ export function registerTasksRoot(program: Command): Command {
|
|
|
126
134
|
}
|
|
127
135
|
|
|
128
136
|
export function registerTaskListCommand(tasks: Command, ctx: TasksCliContext): void {
|
|
129
|
-
const { deps, out, authenticate } = ctx;
|
|
137
|
+
const { deps, out, outFully, authenticate } = ctx;
|
|
130
138
|
tasks.command('list')
|
|
131
139
|
.description('우선순위와 생성 시각 순으로 태스크 보기')
|
|
132
140
|
.option('--status <s>', '상태로 필터')
|
|
@@ -152,7 +160,7 @@ export function registerTaskListCommand(tasks: Command, ctx: TasksCliContext): v
|
|
|
152
160
|
if (!opts.provider || (data.task.generatedBy?.kind === 'external' && data.task.generatedBy.provider === opts.provider)) rows.push(data.task);
|
|
153
161
|
}
|
|
154
162
|
rows.sort(taskOrder);
|
|
155
|
-
if (opts.json)
|
|
163
|
+
if (opts.json) await outFully(JSON.stringify(rows));
|
|
156
164
|
else {
|
|
157
165
|
out('id\t우선순위\t상태\t승인\t출처\t제목');
|
|
158
166
|
for (const row of rows) out(taskLine(row));
|
|
@@ -162,7 +170,7 @@ export function registerTaskListCommand(tasks: Command, ctx: TasksCliContext): v
|
|
|
162
170
|
}
|
|
163
171
|
|
|
164
172
|
export function registerTaskShowCommand(tasks: Command, ctx: TasksCliContext): void {
|
|
165
|
-
const { deps, out, authenticate } = ctx;
|
|
173
|
+
const { deps, out, outFully, authenticate } = ctx;
|
|
166
174
|
tasks.command('show <id>')
|
|
167
175
|
.description(`태스크 상세 보기 (id 가 \`${TASK_CARD_PREFIX}\` 로 시작하면 TASK-AGENT 과제 카드 ⊕ 다음 수)`)
|
|
168
176
|
.option('--json', 'JSON 출력')
|
|
@@ -179,7 +187,7 @@ export function registerTaskShowCommand(tasks: Command, ctx: TasksCliContext): v
|
|
|
179
187
|
if (!response.ok) throw httpError(response);
|
|
180
188
|
const data = await responseJson(response) as { task?: TaskRow };
|
|
181
189
|
if (!data?.task) throw new Error('넥서스 태스크 상세 형식이 유효하지 않다');
|
|
182
|
-
if (opts.json)
|
|
190
|
+
if (opts.json) await outFully(JSON.stringify(data));
|
|
183
191
|
else {
|
|
184
192
|
out(taskLine(data.task));
|
|
185
193
|
out(JSON.stringify(data, null, 2));
|
|
@@ -16,7 +16,7 @@ import { filterPublicDemoContext } from './context-now-public.js';
|
|
|
16
16
|
|
|
17
17
|
export type ContextFact =
|
|
18
18
|
| { kind: 'version'; version: string; source: string }
|
|
19
|
-
| { kind: 'cell'; version: string; id: string; title: string; status: string; owner: string | null; source: string }
|
|
19
|
+
| { kind: 'cell'; version: string; id: string; title: string; status: string; owner: string | null; source: string; priority?: string | null }
|
|
20
20
|
| { kind: 'decision'; id: string; title: string; status: string; dueAt: string | null; source: string }
|
|
21
21
|
| { kind: 'seat'; seat: string; at: string; status: string; id: string | null; title: string | null; source: string }
|
|
22
22
|
| { kind: 'run'; goal: string; phase: string; elapsed: string; source: string; unreadable?: string }
|
|
@@ -157,7 +157,8 @@ export function contextNow(options: { topic?: string; limit?: number; audience?:
|
|
|
157
157
|
for (const item of checklist.items) {
|
|
158
158
|
if (item.status === 'done') continue;
|
|
159
159
|
facts.push({ kind: 'cell', version: v, id: item.id, title: redactSecretText(item.title.split(/\r?\n/, 1)[0] ?? '').slice(0, 120),
|
|
160
|
-
status: item.status, owner: item.owner ?? null,
|
|
160
|
+
status: item.status, owner: item.owner ?? null, priority: item.priority ?? null,
|
|
161
|
+
source: `elanous://release/${v}/checklist#${encodeURIComponent(item.id)}` });
|
|
161
162
|
}
|
|
162
163
|
}
|
|
163
164
|
for (const item of (deps.decisions ?? (() => new DecisionLedger().list({ status: 'open' })))()) {
|
|
@@ -218,6 +219,89 @@ export function contextNow(options: { topic?: string; limit?: number; audience?:
|
|
|
218
219
|
return options.audience === 'public-demo' ? filterPublicDemoContext(answer, deps.brandCheck) : answer;
|
|
219
220
|
}
|
|
220
221
|
|
|
222
|
+
export type AskOpContextTopic = 'release' | 'required' | 'train' | 'incident' | 'decision' | 'general';
|
|
223
|
+
export type AskOpContextBundle = {
|
|
224
|
+
queriedAt: string;
|
|
225
|
+
topic: AskOpContextTopic;
|
|
226
|
+
facts: Array<{ kind: string; summary: string; source: string; observedAt: string }>;
|
|
227
|
+
gaps: Array<{ kind: string; reason: string }>;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
function askOpTopic(question: string): AskOpContextTopic {
|
|
231
|
+
const text = question.toLocaleLowerCase();
|
|
232
|
+
if (/열차|착지|병합|merge|train|pull request|\bpr\b/.test(text)) return 'train';
|
|
233
|
+
if (/사고|장애|incident|failure|실패|에러|오류/.test(text)) return 'incident';
|
|
234
|
+
if (/결정|승인|decision|approval/.test(text)) return 'decision';
|
|
235
|
+
if (/필수|p0|must|required|우선순위/.test(text)) return 'required';
|
|
236
|
+
if (/발행|출시|릴리스|release|컷|cut|게이트|gate|이번 판|다음 판|판 진도|\b\d+\.\d+\.\d+\b/.test(text)) return 'release';
|
|
237
|
+
return 'general';
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** A small evidence packet for an OP answer. A missing source stays a gap, never an inferred fact. */
|
|
241
|
+
export function buildAskOpContextBundle(
|
|
242
|
+
question: string,
|
|
243
|
+
snapshot: ContextNowAnswer,
|
|
244
|
+
options: { audience?: 'operator' | 'public-demo'; limit?: number } = {},
|
|
245
|
+
): AskOpContextBundle {
|
|
246
|
+
const answer = options.audience === 'public-demo' ? filterPublicDemoContext(snapshot) : snapshot;
|
|
247
|
+
const topic = askOpTopic(question);
|
|
248
|
+
const limit = typeof options.limit === 'number' && Number.isFinite(options.limit)
|
|
249
|
+
? Math.max(1, Math.min(20, Math.floor(options.limit))) : 8;
|
|
250
|
+
const facts: AskOpContextBundle['facts'] = [];
|
|
251
|
+
const gaps: AskOpContextBundle['gaps'] = [];
|
|
252
|
+
const pushFact = (kind: string, summary: string, source: string, observedAt: string) => {
|
|
253
|
+
if (facts.length < limit) facts.push({ kind, summary: oneLine(summary), source, observedAt });
|
|
254
|
+
};
|
|
255
|
+
const relevant = (kind: ContextFact['kind']) => topic === 'general'
|
|
256
|
+
|| (topic === 'release' && (kind === 'release' || kind === 'version'))
|
|
257
|
+
|| (topic === 'required' && kind === 'cell')
|
|
258
|
+
|| (topic === 'decision' && kind === 'decision')
|
|
259
|
+
|| (topic === 'incident' && kind === 'run');
|
|
260
|
+
for (const fact of answer.facts) {
|
|
261
|
+
if (!relevant(fact.kind)) continue;
|
|
262
|
+
if ('unreadable' in fact && fact.unreadable) {
|
|
263
|
+
gaps.push({ kind: fact.kind, reason: fact.unreadable });
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
if (topic === 'required' && fact.kind === 'cell' && fact.priority !== 'P0') continue;
|
|
267
|
+
if (topic === 'incident' && fact.kind === 'run' && !/fail|error|timeout|실패|오류|정지|중단/i.test(`${fact.phase} ${fact.goal}`)) continue;
|
|
268
|
+
if (topic === 'train') continue;
|
|
269
|
+
const summary = fact.kind === 'version' ? `판 ${fact.version}`
|
|
270
|
+
: fact.kind === 'cell' ? `${fact.id} ${fact.status} ${fact.title}`
|
|
271
|
+
: fact.kind === 'decision' ? `${fact.id} ${fact.status} ${fact.title}`
|
|
272
|
+
: fact.kind === 'seat' ? `${fact.seat} ${fact.status} ${fact.id ?? ''}`
|
|
273
|
+
: fact.kind === 'run' ? `${fact.goal} ${fact.phase} ${fact.elapsed}`
|
|
274
|
+
: fact.kind === 'release' ? `${fact.version} ${fact.node} ${fact.status}`
|
|
275
|
+
: `${fact.count ?? '미관측'}건 ${fact.names.join(', ')}`;
|
|
276
|
+
pushFact(fact.kind, summary, fact.source, fact.kind === 'seat' ? fact.at : answer.at);
|
|
277
|
+
}
|
|
278
|
+
const eventMatches = (kind: string, summary: string) => topic === 'general'
|
|
279
|
+
|| (topic === 'train' && /train|열차|착지|병합|merge|\bpr\b/i.test(`${kind} ${summary}`))
|
|
280
|
+
|| (topic === 'incident' && /incident|사고|장애|failure|실패|에러|오류|timeout/i.test(`${kind} ${summary}`));
|
|
281
|
+
for (const event of answer.events) {
|
|
282
|
+
if (eventMatches(event.kind, event.summary)) pushFact(event.kind, event.summary, event.source, event.at);
|
|
283
|
+
}
|
|
284
|
+
if (topic === 'required' && !facts.length) {
|
|
285
|
+
const cells = answer.facts.filter(fact => fact.kind === 'cell');
|
|
286
|
+
if (cells.some(fact => fact.priority == null)) gaps.push({ kind: 'cell', reason: '우선순위 미관측' });
|
|
287
|
+
else if (cells.length) gaps.push({ kind: 'cell', reason: '조회 범위에서 일치하는 P0 없음' });
|
|
288
|
+
}
|
|
289
|
+
if (!facts.length && !gaps.length) gaps.push({ kind: topic, reason: '미관측' });
|
|
290
|
+
if (topic === 'release' && !answer.facts.some(fact => fact.kind === 'release' && !('unreadable' in fact && fact.unreadable))
|
|
291
|
+
&& !gaps.some(gap => gap.kind === 'release')) gaps.push({ kind: 'release', reason: '미관측' });
|
|
292
|
+
return { queriedAt: answer.at, topic, facts, gaps: gaps.slice(0, 3) };
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/** Worker scan keeps ledger IO away from the OP inbox turn; the packet itself is bounded. */
|
|
296
|
+
export async function askOpContextBundle(
|
|
297
|
+
question: string,
|
|
298
|
+
options: { audience?: 'operator' | 'public-demo'; limit?: number } = {},
|
|
299
|
+
readSnapshot: () => Promise<ContextNowAnswer> = () => contextNowInWorker({ audience: 'operator', limit: 100 }),
|
|
300
|
+
): Promise<AskOpContextBundle> {
|
|
301
|
+
try { return buildAskOpContextBundle(question, await readSnapshot(), { ...options, audience: options.audience ?? 'public-demo' }); }
|
|
302
|
+
catch { return { queriedAt: new Date().toISOString(), topic: askOpTopic(question), facts: [], gaps: [{ kind: 'context', reason: '조회 실패' }] }; }
|
|
303
|
+
}
|
|
304
|
+
|
|
221
305
|
const workerAnswers = new Map<string, { promise: Promise<ContextNowAnswer>; expiresAt: number }>();
|
|
222
306
|
const WORKER_ANSWER_TTL_MS = 5_000;
|
|
223
307
|
const WORKER_SCAN_TIMEOUT_MS = 60_000;
|
|
@@ -25,7 +25,7 @@ import { drainPendingUserInput } from '../session/pending-input.js';
|
|
|
25
25
|
import type { StreamWithToolsHandlers } from '../llm.js';
|
|
26
26
|
import { debug, redactSecretText, withAmbientSessionScope } from '../debug/log.js';
|
|
27
27
|
import { applyDeferredTools } from '../session-runtime/tier-flip.js';
|
|
28
|
-
import { resolveSessionSurfaceProfile } from '../session-runtime/index.js';
|
|
28
|
+
import { buildResearchDateSystemMessage, resolveSessionSurfaceProfile } from '../session-runtime/index.js';
|
|
29
29
|
import type {
|
|
30
30
|
CoreTurnContext,
|
|
31
31
|
CoreTurnResult,
|
|
@@ -239,12 +239,18 @@ export async function runCoreTurn(
|
|
|
239
239
|
// 있으면 그 스코프의 deferred 툴을 active 로 선주입(ToolSearch 왕복 0).
|
|
240
240
|
const recentUserText = extractRecentUserText(ctx.messages);
|
|
241
241
|
const surfaceUserText = selectSurfaceUserText(ctx);
|
|
242
|
-
const surface = resolveSessionSurfaceProfile({ userText: surfaceUserText });
|
|
242
|
+
const surface = ctx.surfaceProfile ?? resolveSessionSurfaceProfile({ userText: surfaceUserText });
|
|
243
243
|
const { messages, tools, stats } = applyDeferredTools(
|
|
244
244
|
ctx.messages,
|
|
245
245
|
ctx.tools,
|
|
246
246
|
{ enabled: deferredEnabled, ...(recentUserText ? { userText: recentUserText } : {}) },
|
|
247
247
|
);
|
|
248
|
+
if (surface.id === 'research/agent' && !messages.some((message) =>
|
|
249
|
+
message.role === 'system' && typeof message.content === 'string'
|
|
250
|
+
&& message.content.startsWith('Current local date:'))
|
|
251
|
+
) {
|
|
252
|
+
messages.unshift(buildResearchDateSystemMessage());
|
|
253
|
+
}
|
|
248
254
|
if (debug.enabled) {
|
|
249
255
|
debug.log('llm.request', 'tools-tier', {
|
|
250
256
|
sessionId: ctx.sessionId,
|
|
@@ -282,6 +288,7 @@ export async function runCoreTurn(
|
|
|
282
288
|
handlers,
|
|
283
289
|
{
|
|
284
290
|
tools,
|
|
291
|
+
researchTurn: surface.id === 'research/agent',
|
|
285
292
|
signal: ctx.signal,
|
|
286
293
|
...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}),
|
|
287
294
|
...(ctx.maxToolTurns !== undefined ? { maxTurns: ctx.maxToolTurns } : {}),
|
package/src/core-turn/types.ts
CHANGED
|
@@ -137,6 +137,9 @@ export interface CoreTurnContext {
|
|
|
137
137
|
originSessionId?: string;
|
|
138
138
|
/** Original human prompt for this turn, forwarded to tool dispatch. */
|
|
139
139
|
userText?: string;
|
|
140
|
+
/** Caller-selected surface. ACP passes its one per-turn verdict through;
|
|
141
|
+
* direct callers can omit it and let core-turn resolve from userText. */
|
|
142
|
+
surfaceProfile?: import('../session-runtime/index.js').SessionSurfaceProfile;
|
|
140
143
|
/** Full prompt (system + history + current user blocks). */
|
|
141
144
|
messages: LLMMessage[];
|
|
142
145
|
/** Tool catalog the model may call this turn. Empty array means
|
package/src/dashboard/index.ts
CHANGED
|
@@ -5078,8 +5078,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
5078
5078
|
};
|
|
5079
5079
|
|
|
5080
5080
|
// P5 — register the mode-enter actions + default chord bindings so
|
|
5081
|
-
// `Ctrl+
|
|
5082
|
-
// 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`
|
|
5083
5083
|
// flag is critical because this closure may re-run on hot-reload
|
|
5084
5084
|
// scenarios (tests, plugin reinit) — the registry should be idempotent.
|
|
5085
5085
|
// A2 — forward-declared toast hook. mouseWiring is initialized
|
|
@@ -5100,7 +5100,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
5100
5100
|
handler: () => {
|
|
5101
5101
|
enterSessionControlMode(chatModeState);
|
|
5102
5102
|
void inputCoreSetMode(resolveSessionInputModeFromChatMode({ chatModeState }));
|
|
5103
|
-
chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^
|
|
5103
|
+
chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^X c chord)'));
|
|
5104
5104
|
chatScrollOffset = -1;
|
|
5105
5105
|
draw();
|
|
5106
5106
|
pushModeToast('→ control mode', 'success');
|
|
@@ -7481,7 +7481,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7481
7481
|
// Scratch visibility (Phase S5). When closed, the workingDir
|
|
7482
7482
|
// layouts drop the scratch cell so the remaining panes expand
|
|
7483
7483
|
// to fill the reclaimed columns — useful on narrow terminals.
|
|
7484
|
-
// Reopen via the ^
|
|
7484
|
+
// Reopen via the ^X ^S chord.
|
|
7485
7485
|
let scratchClosed = false;
|
|
7486
7486
|
const dashboardViewRegistryOptions = () => ({
|
|
7487
7487
|
extraPanes: pluginHost.activeDashboardPanes().map(p => p.paneId),
|
|
@@ -7676,10 +7676,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7676
7676
|
);
|
|
7677
7677
|
};
|
|
7678
7678
|
|
|
7679
|
-
// Prefix chord (Phase O6).
|
|
7680
|
-
//
|
|
7681
|
-
//
|
|
7682
|
-
// `[^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.
|
|
7683
7682
|
const chord: ChordState = createChord();
|
|
7684
7683
|
const disarmChordHud = (): void => {
|
|
7685
7684
|
disarmChord(chord);
|
|
@@ -7752,7 +7751,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7752
7751
|
let previewTerminalDims: { cols: number; rows: number } | null = null;
|
|
7753
7752
|
// Phase T7 — when true, the preview widget swells to the full
|
|
7754
7753
|
// top-row width, hiding browser / scratch / obsidian / skill
|
|
7755
|
-
// siblings. Toggled by `^
|
|
7754
|
+
// siblings. Toggled by `^X e` / `^X ㄷ` (pane chord) and by `e`
|
|
7756
7755
|
// on the focused preview pane (muscle memory). Auto-clears when
|
|
7757
7756
|
// the terminal session exits.
|
|
7758
7757
|
let terminalExpanded = false;
|
|
@@ -7909,7 +7908,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7909
7908
|
};
|
|
7910
7909
|
|
|
7911
7910
|
/** Shared helper for both the pane-level `t` key AND the global
|
|
7912
|
-
* `Ctrl+
|
|
7911
|
+
* `Ctrl+X t` chord. Idempotent — calling while a session is
|
|
7913
7912
|
* already alive just re-focuses the preview pane. Handles:
|
|
7914
7913
|
* - view 4 (chat-only) → bounce to view 1 so wd-preview is visible
|
|
7915
7914
|
* - wiring onUpdate / onExit callbacks with cleanup
|
|
@@ -8672,7 +8671,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
8672
8671
|
widgetHost.register(planBoardWidget, 'builtin', 'src/widgets/plan-board.ts');
|
|
8673
8672
|
}
|
|
8674
8673
|
// NT4 — notification bell modal widget. Registered + spawned here
|
|
8675
|
-
// so Ctrl+
|
|
8674
|
+
// so Ctrl+X b (NT5) can toggle without spawn latency. The bellOpen
|
|
8676
8675
|
// flag + helpers live further down (after notificationStore is
|
|
8677
8676
|
// created) because refreshBellInto reads from the store.
|
|
8678
8677
|
widgetHost.register(bellModalWidget, 'builtin', 'src/notification-bell-modal.ts');
|
|
@@ -12492,8 +12491,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
12492
12491
|
}
|
|
12493
12492
|
|
|
12494
12493
|
/** N2 — open the shell-runner rollup popup centered on the viewport.
|
|
12495
|
-
*
|
|
12496
|
-
*
|
|
12494
|
+
* Entry point for `/shell rollup` so keyboard users can access the
|
|
12495
|
+
* same UI mouse users get by clicking
|
|
12497
12496
|
* the 🐚 status-bar pill. Anchored-to-pill placement stays in
|
|
12498
12497
|
* dashboard-mouse-wiring; this path is explicitly center-placed so
|
|
12499
12498
|
* it works with status row unknown. */
|
|
@@ -13470,8 +13469,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13470
13469
|
try {
|
|
13471
13470
|
if (req.kind === 'shell') {
|
|
13472
13471
|
const shellSeat = resolveTuiShellSeat(req.cwd, process.env.COORD_ID);
|
|
13472
|
+
const terminalSessionId = crypto.randomUUID();
|
|
13473
13473
|
session = sessionRegistry.spawn(
|
|
13474
13474
|
{
|
|
13475
|
+
id: terminalSessionId,
|
|
13475
13476
|
title: 'terminal',
|
|
13476
13477
|
cwd: req.cwd,
|
|
13477
13478
|
command: req.command,
|
|
@@ -13481,7 +13482,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13481
13482
|
registryKind: 'shell',
|
|
13482
13483
|
registryNickname: `tui-shell:${req.cwd}`,
|
|
13483
13484
|
registryOrigin: { originRoot: 'elanous-internal', controller: 'tui-shell' },
|
|
13484
|
-
registryPurpose: `tui-shell:${shellSeat}`,
|
|
13485
|
+
registryPurpose: `tui-shell:${shellSeat}:session:${currentChatPersonaSessionId()}:terminal:${terminalSessionId}`,
|
|
13485
13486
|
registrySeat: shellSeat,
|
|
13486
13487
|
onExit: handleExit,
|
|
13487
13488
|
onTitleAction: handleTitleAction,
|
|
@@ -14938,7 +14939,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14938
14939
|
chatScrollOffset = -1;
|
|
14939
14940
|
break;
|
|
14940
14941
|
// Phase T: spawn an embedded terminal in this pane. Same
|
|
14941
|
-
// code path as the `Ctrl+
|
|
14942
|
+
// code path as the `Ctrl+X t` pane chord.
|
|
14942
14943
|
case 't': case 'ㅅ':
|
|
14943
14944
|
openPreviewTerminal();
|
|
14944
14945
|
break;
|
|
@@ -14954,7 +14955,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14954
14955
|
}
|
|
14955
14956
|
|
|
14956
14957
|
// Ctrl+W (no chord armed — chord would have consumed the
|
|
14957
|
-
// key earlier) closes the scratch pane. Reopen via the ^
|
|
14958
|
+
// key earlier) closes the scratch pane. Reopen via the ^X ^S chord.
|
|
14958
14959
|
if (key.ctrl && (key.name === 'w' || key.name === 'ㅈ')) {
|
|
14959
14960
|
scratchClosed = true;
|
|
14960
14961
|
userClosedPanes.add('scratch');
|
|
@@ -16233,7 +16234,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16233
16234
|
terminalExpanded = !terminalExpanded;
|
|
16234
16235
|
previewTerminalDims = null;
|
|
16235
16236
|
chatLines.push(C.muted(terminalExpanded
|
|
16236
|
-
? 'Terminal expanded. Ctrl+Shift+E
|
|
16237
|
+
? 'Terminal expanded. Ctrl+Shift+E to restore.'
|
|
16237
16238
|
: 'Terminal collapsed to preview slot.'));
|
|
16238
16239
|
chatScrollOffset = -1;
|
|
16239
16240
|
},
|