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
|
@@ -23,7 +23,6 @@ import { createArtifactStore } from '../artifact/index.js';
|
|
|
23
23
|
import { tmpdir } from 'node:os';
|
|
24
24
|
import { isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
25
25
|
import { promisify } from 'node:util';
|
|
26
|
-
import { forkSessionById, HARNESS_SESSION_ORIGIN, isHarnessSessionOrigin } from '../session/index.js';
|
|
27
26
|
import { configuredWorktreeRoot, getUserConfig, resolveActiveProvider, resolveRoleLlm } from '../user-config.js';
|
|
28
27
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
29
28
|
import { addHarnessQueue } from '../harness/harness-queue.js';
|
|
@@ -1305,7 +1304,9 @@ type SameCellRebindDecision =
|
|
|
1305
1304
|
type SameCellRebindExtra = { boundPr?: number; detail?: string };
|
|
1306
1305
|
|
|
1307
1306
|
/** 같은 칸 새 draft 뒤 카드 재결속 — 사유를 다섯 갈래로 나눠 남기고, 카드 저장소가 없는 실행은 던지지 않고
|
|
1308
|
-
* deferred 로 돌려준다(Pod 자식은 본부 카드 저장소가 없다 · 부모 pr-terminal 결속은 #29948 이 맡는다).
|
|
1307
|
+
* deferred 로 돌려준다(Pod 자식은 본부 카드 저장소가 없다 · 부모 pr-terminal 결속은 #29948 이 맡는다).
|
|
1308
|
+
* 카드 저장소가 있는 호스트에서 card-missing·card-id-absent 는 조용한 성공이 아니라
|
|
1309
|
+
* debug.log('self-implement.same-cell','rebind-missing-on-host',{reason}) 경고로 분리한다(#30021 r4 shouldFix). */
|
|
1309
1310
|
function rebindSameCellCardToPr(input: {
|
|
1310
1311
|
taskCardId: string | undefined;
|
|
1311
1312
|
storePath: string;
|
|
@@ -1329,8 +1330,14 @@ function rebindSameCellCardToPr(input: {
|
|
|
1329
1330
|
debug.log('self-implement.pr', 'same-cell-card-rebind-failed', { ...base, ...extra, reason }, { level: 'warn' });
|
|
1330
1331
|
throw new Error(`same-cell 새 draft ${input.url} 개설됨; 카드 재결속 실패(${reasonText}) — 새 PR 수확 필요`);
|
|
1331
1332
|
};
|
|
1332
|
-
|
|
1333
|
-
|
|
1333
|
+
const hostStore = existsSync(input.storePath);
|
|
1334
|
+
/** 호스트(카드 저장소 있음)인데 결속 대상이 없으면 deferred 로 조용히 지나가지 않고 경고 이벤트로 분리한다. */
|
|
1335
|
+
const missingOnHost = (reason: SameCellCardRebindReason): SameCellCardRebindObservation => {
|
|
1336
|
+
debug.log('self-implement.same-cell', 'rebind-missing-on-host', { ...base, reason }, { level: 'warn' });
|
|
1337
|
+
return deferred(reason);
|
|
1338
|
+
};
|
|
1339
|
+
if (!input.taskCardId) return hostStore ? missingOnHost('card-id-absent') : deferred('card-id-absent');
|
|
1340
|
+
if (!hostStore) return deferred('card-store-absent');
|
|
1334
1341
|
let decision: SameCellRebindDecision | undefined;
|
|
1335
1342
|
let updated: ReturnType<typeof updateTaskCard>;
|
|
1336
1343
|
try {
|
|
@@ -1372,7 +1379,7 @@ function rebindSameCellCardToPr(input: {
|
|
|
1372
1379
|
case 'manual-ref':
|
|
1373
1380
|
return failed('manual-ref');
|
|
1374
1381
|
case 'card-missing':
|
|
1375
|
-
return
|
|
1382
|
+
return missingOnHost('card-missing');
|
|
1376
1383
|
case 'already-rebound':
|
|
1377
1384
|
observe('already-rebound');
|
|
1378
1385
|
return { outcome: 'already-rebound', reason: 'already-rebound', cardId, oldPr: input.oldPr, newPr: input.newPr };
|
|
@@ -1674,6 +1681,7 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1674
1681
|
},
|
|
1675
1682
|
|
|
1676
1683
|
forkSession: async (parentSessionId) => {
|
|
1684
|
+
const { forkSessionById, HARNESS_SESSION_ORIGIN, isHarnessSessionOrigin } = await import('../session/index.js');
|
|
1677
1685
|
const forked = forkSessionById(parentSessionId, { origin: HARNESS_SESSION_ORIGIN });
|
|
1678
1686
|
if (!forked) throw new Error(`self-implement fork: source session not found — ${parentSessionId}`);
|
|
1679
1687
|
if (!isHarnessSessionOrigin(forked.meta.origin)) {
|
|
@@ -1738,7 +1746,11 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1738
1746
|
}
|
|
1739
1747
|
// P1 — 대상 repo: 명시 repoRoot(외부 개발) 우선, 없으면 데몬 cwd 의 repo(=elanous 자신·현행).
|
|
1740
1748
|
const repoRoot = o.repoRoot ?? resolveMainRepoRoot(process.cwd()) ?? process.cwd();
|
|
1741
|
-
|
|
1749
|
+
// Keep the optional Pod-only implementation out of the TUI's static module graph.
|
|
1750
|
+
const inPlaceCandidate = process.env.ELANOUS_POD_INPLACE_WORKTREE === '1'
|
|
1751
|
+
? (await import('./pod-inplace-worktree.js')).tryCreatePodInplaceWorktree({ repoRoot, cwd: process.cwd(), branch, ...(base ? { base } : {}), runId, ...(goalFile ? { goalFile } : {}), env: process.env })
|
|
1752
|
+
: null;
|
|
1753
|
+
const r = inPlaceCandidate ?? createWorktree({
|
|
1742
1754
|
repoRoot,
|
|
1743
1755
|
branch,
|
|
1744
1756
|
worktreeRoot: configuredWorktreeRoot(),
|
|
@@ -1748,6 +1760,7 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1748
1760
|
...(base ? { base } : {}),
|
|
1749
1761
|
...(runId ? { currentOwner: `dev:${runId}` } : {}),
|
|
1750
1762
|
});
|
|
1763
|
+
const inPlace = 'inPlace' in r && r.inPlace === true;
|
|
1751
1764
|
if (r.resolvedBase) baselineRefs.set(r.path, r.resolvedBase);
|
|
1752
1765
|
const benchId = benchIdFromBase(base);
|
|
1753
1766
|
if (benchId) benchWorktrees.set(r.path, benchId);
|
|
@@ -1775,6 +1788,7 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1775
1788
|
baseIsIntegration: baseIsIntegration(r.path, r.resolvedBase),
|
|
1776
1789
|
baseFreshness: r.baseFreshness,
|
|
1777
1790
|
...(r.reused ? { reused: true } : {}),
|
|
1791
|
+
...(inPlace ? { inPlace: true } : {}),
|
|
1778
1792
|
...provenance,
|
|
1779
1793
|
};
|
|
1780
1794
|
const goalMetadata: HarnessWorktreeGoalMetadata = {
|
|
@@ -1795,6 +1809,8 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1795
1809
|
const provenanceError = error instanceof Error ? error.message : String(error);
|
|
1796
1810
|
// Manual creation rolls back on a metadata failure; self-implement retains its workspace and continues.
|
|
1797
1811
|
debug.log('self-implement', 'worktree-provenance-failed', { path: r.path, ...(provenance ?? {}), reason: provenanceError }, { level: 'warn' });
|
|
1812
|
+
// This source tree is also the Pod's recovery anchor. Never continue in-place without an owner marker.
|
|
1813
|
+
if (inPlace) throw new Error(`pod in-place provenance unavailable: ${provenanceError}`);
|
|
1798
1814
|
return {
|
|
1799
1815
|
path: r.path,
|
|
1800
1816
|
branch: r.branch,
|
|
@@ -1804,6 +1820,7 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1804
1820
|
baseIsIntegration: baseIsIntegration(r.path, r.resolvedBase),
|
|
1805
1821
|
baseFreshness: r.baseFreshness,
|
|
1806
1822
|
...(r.reused ? { reused: true } : {}),
|
|
1823
|
+
...(inPlace ? { inPlace: true } : {}),
|
|
1807
1824
|
provenanceError,
|
|
1808
1825
|
};
|
|
1809
1826
|
}
|
|
@@ -2598,19 +2615,24 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2598
2615
|
// ⛔ writer 가 넘긴 command 를 믿지 않는다 — **로그에서 직접** 뽑아 문서와 대조한다(리뷰 must-fix).
|
|
2599
2616
|
"const cm = testLine.match(/^\\[test\\]\\s+PASS\\s+(.+?)\\s*(?:—|$)/); if (!cm) process.exit(1);",
|
|
2600
2617
|
"const cmdFromLog = cm[1].trim();",
|
|
2601
|
-
"if (
|
|
2618
|
+
"if (body('## 불변식').indexOf(cmdFromLog) < 0) process.exit(1);",
|
|
2602
2619
|
// 문서가 baseline 문면도 담고 있어야 한다 — 근거가 문서 안에서 재검증 가능해야 한다.
|
|
2603
2620
|
// ⛔ 부분 문자열이 아니라 **로그의 baseline 줄 전체**와 대조한다 — `preexisting=9` 같은
|
|
2604
2621
|
// 불일치가 통과하면 근거가 근거가 아니다(리뷰 must-fix).
|
|
2605
2622
|
"const bl = log.split('\\n').find((l) => l.indexOf('[gate-baseline]') === 0);",
|
|
2606
2623
|
"if (bl) { if (!/^\\[gate-baseline\\] introduced=0, preexisting=0, unknown=0, precondition-unmet=0(?:,|$)/.test(bl)) process.exit(1); if (e.baselineLine !== bl.trim()) process.exit(1); if (sections.some((p) => p.indexOf(bl.trim()) < 0)) process.exit(1); }",
|
|
2607
2624
|
"else { if (e.baselineLine !== undefined) process.exit(1); if (sections.some((p) => p.indexOf('baseline not run (test PASS)') < 0)) process.exit(1); }",
|
|
2608
|
-
// ② 조건 줄의 명령을 **그 필드에서**
|
|
2625
|
+
// ② 조건 줄의 저작 명령을 **그 필드에서** 파싱하고, 해당 명령의 별도 실행 결과가
|
|
2626
|
+
// 정확히 일치하며 0으로 끝났는지 확인한다. 게이트 측정 명령은 독립된 증거다.
|
|
2609
2627
|
"const condLine = body('## 불변식').split('\\n').find((l) => l.indexOf('조건 —') >= 0); if (!condLine) process.exit(1);",
|
|
2628
|
+
// 불변식에는 writer가 측정한 명령 전문을 기록하므로, 원문 gate 명령이 해당 필드에도 있어야 한다.
|
|
2610
2629
|
"if (condLine.indexOf(cmdFromLog) < 0) process.exit(1);",
|
|
2630
|
+
"const signalLine = body('## 판정 신호').split('\\n').find((l) => l.indexOf('- Condition:') >= 0);",
|
|
2631
|
+
"const authoredCommand = signalLine?.match(/- Condition:\\s*(.+?)\\s*$/)?.[1]?.trim().replace(/^`([^`]+)`(?=\\s|를|$)/, '$1').replace(/\\s*를\\s*실행한다[.。]?$/, '').replace(/[.。]$/, '').trim();",
|
|
2632
|
+
"if (authoredCommand) { const s = e.authoredSignal; if (!s || s.command !== authoredCommand || s.exitCode !== 0) process.exit(1); const rendered = body('## 판정 신호'); if (!rendered.includes('exit 0') || !rendered.includes(s.command)) process.exit(1); const raw = (s.stdout + '\\n' + s.stderr).trim().slice(-1200) || '(출력 없음)'; if (!rendered.includes(raw.replace(/\\r?\\n/g, ' ⏎ '))) process.exit(1); }",
|
|
2611
2633
|
// ⭐ 핵심 — 문서의 관측값이 로그의 값과 다르면 거부한다.
|
|
2612
2634
|
"if (String(e.observedFail) !== String(failFromLog)) process.exit(1);",
|
|
2613
|
-
"if (body('## 판정 신호').indexOf('fail ' + failFromLog) < 0) process.exit(1);",
|
|
2635
|
+
"if (!e.authoredSignal && body('## 판정 신호').indexOf('fail ' + failFromLog) < 0) process.exit(1);",
|
|
2614
2636
|
// ⛔ 불변식 쪽 관측값도 대조한다 — 한쪽만 보면 다른 쪽에 거짓 수치가 들어간다(리뷰 must-fix).
|
|
2615
2637
|
"if (body('## 불변식').indexOf('관측됨 — fail ' + failFromLog) < 0) process.exit(1);",
|
|
2616
2638
|
// 문서 어디에도 로그와 **다른** fail 수치가 있으면 안 된다(정규식은 런타임에 만든다).
|
|
@@ -2623,8 +2645,9 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2623
2645
|
// 그 안에 게이트 로그가 통째로 들어 있어 `$(...)`·백틱이 **셸에서 실행**될 수 있었다(리뷰 must-fix).
|
|
2624
2646
|
// ⇒ 파일로 넘기고 검사기가 읽는다. 명령 문자열에는 **고정 리터럴만** 남는다.
|
|
2625
2647
|
writeFileSync(join(root, 'evidence.json'), JSON.stringify(evidence));
|
|
2648
|
+
writeFileSync(join(root, 'checker.cjs'), checker);
|
|
2626
2649
|
const rule = withIndependentChecker({ kind: 'and', rules: [] }, {
|
|
2627
|
-
command:
|
|
2650
|
+
command: 'bun checker.cjs',
|
|
2628
2651
|
timeoutMs: 5_000,
|
|
2629
2652
|
});
|
|
2630
2653
|
const outcome = await evaluateTermination(rule, { vault: {} as never, budget: {} as never, goalRoot: root });
|
|
@@ -19,6 +19,7 @@ import type { DocumentReferenceStatus } from './self-implement-runtime.js';
|
|
|
19
19
|
import { resolveObserveOnlyDecision } from './observe-only.js';
|
|
20
20
|
import { getUserConfig } from '../user-config.js';
|
|
21
21
|
import { resolveAutoReview } from './context-capsule.js';
|
|
22
|
+
import { readDecomposeProposals } from '../self-dev/decompose-proposal.js';
|
|
22
23
|
|
|
23
24
|
/** self implement CLI 옵션(commander) — `--no-draft` 는 draft:false 로, `--max-wait` 는 문자열로 도착. */
|
|
24
25
|
export interface SelfImplementCliOpts {
|
|
@@ -71,6 +72,28 @@ export interface SelfImplementCliDeps {
|
|
|
71
72
|
}>;
|
|
72
73
|
/** runDevPipeline 내부 배선 주입(runSelfImplement/seams 등·테스트). */
|
|
73
74
|
pipelineDeps?: DevPipelineDeps;
|
|
75
|
+
/** Parent-side run-ledger observation, injected to verify terminal JSON evidence. */
|
|
76
|
+
readGoalPlanRevision?: typeof readDecomposeProposals;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function attachGoalPlanRevisionObservation(
|
|
80
|
+
result: SelfImplementResult,
|
|
81
|
+
deps: SelfImplementCliDeps,
|
|
82
|
+
): SelfImplementResult {
|
|
83
|
+
if (result.goalPlanRevision !== undefined || typeof result.runId !== 'string' || !result.runId.trim()) return result;
|
|
84
|
+
try {
|
|
85
|
+
// The ledger reader joins by shardId when present and otherwise by runId; a single-run
|
|
86
|
+
// child uses its runId as either key depending on the writer, so query both explicitly.
|
|
87
|
+
const scan = (deps.readGoalPlanRevision ?? readDecomposeProposals)({
|
|
88
|
+
shardIds: [result.runId],
|
|
89
|
+
runIds: [result.runId],
|
|
90
|
+
});
|
|
91
|
+
const observation = scan.goalPlanRevisions.get(result.runId) ?? scan.readFailure;
|
|
92
|
+
return observation ? { ...result, goalPlanRevision: observation } : result;
|
|
93
|
+
} catch {
|
|
94
|
+
// An unavailable observation stays absent; the supervisor treats that as a hold.
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
74
97
|
}
|
|
75
98
|
|
|
76
99
|
/**
|
|
@@ -210,6 +233,7 @@ export async function runSelfImplementCliCommand(
|
|
|
210
233
|
: deps.pipelineDeps;
|
|
211
234
|
const exec = deps.executeReroute ?? executeSelfImplementReroute;
|
|
212
235
|
let { result, exitCode } = await exec(spec, pipelineDeps ? { pipelineDeps } : undefined);
|
|
236
|
+
result = attachGoalPlanRevisionObservation(result, deps);
|
|
213
237
|
|
|
214
238
|
// ⭐⭐⭐ 단일 실행도 «루프»를 지난다 (E2) — 판정자는 연합과 «같은 자»다.
|
|
215
239
|
// ⛔ 종전엔 단일이 실패하면 그냥 끝났다. 아무도 「다시 걸까」를 묻지 않았다.
|
|
@@ -257,9 +281,9 @@ export async function runSelfImplementCliCommand(
|
|
|
257
281
|
rerun: async (_, invocation) => {
|
|
258
282
|
const repairGoal = invocation.repairGoals?.[initialJob.taskId];
|
|
259
283
|
const next = await exec(repairGoal ? { ...spec, input: { ...spec.input, text: repairGoal } } : spec, pipelineDeps ? { pipelineDeps } : undefined);
|
|
260
|
-
result = next.result;
|
|
284
|
+
result = attachGoalPlanRevisionObservation(next.result, deps);
|
|
261
285
|
exitCode = next.exitCode;
|
|
262
|
-
return [{ ...singleRunAsJobResult(feature,
|
|
286
|
+
return [{ ...singleRunAsJobResult(feature, result), taskId: initialJob.taskId }];
|
|
263
287
|
},
|
|
264
288
|
});
|
|
265
289
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface AskOpQuestionEnvelope {
|
|
2
|
+
surface: 'telegram';
|
|
3
|
+
botId: string;
|
|
4
|
+
chatId: number | string;
|
|
5
|
+
threadId?: number | string;
|
|
6
|
+
messageId: number | string;
|
|
7
|
+
updateId: number | string;
|
|
8
|
+
question: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const ASK_OP_COMMAND = 'askop';
|
|
12
|
+
|
|
13
|
+
export function formatAskOpQuestionEnvelope(input: AskOpQuestionEnvelope): string {
|
|
14
|
+
return [
|
|
15
|
+
`Telegram /${ASK_OP_COMMAND}`,
|
|
16
|
+
`botId=${input.botId}`,
|
|
17
|
+
`chatId=${input.chatId}`,
|
|
18
|
+
`threadId=${input.threadId ?? 'none'}`,
|
|
19
|
+
`messageId=${input.messageId}`,
|
|
20
|
+
`updateId=${input.updateId}`,
|
|
21
|
+
`question: ${input.question.trim()}`,
|
|
22
|
+
].join('\n');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function parseAskOpQuestionEnvelope(body: string): AskOpQuestionEnvelope | null {
|
|
26
|
+
const telegram = /^Telegram \/(?:askop|ask-op)\nbotId=([A-Za-z0-9_-]+)\nchatId=(-?\d+)\nthreadId=(none|\d+)\nmessageId=(\d+)\nupdateId=(\d+)\nquestion: ([\s\S]+)$/.exec(body);
|
|
27
|
+
if (telegram) {
|
|
28
|
+
const [, botId, chatId, threadId, messageId, updateId, question] = telegram;
|
|
29
|
+
return {
|
|
30
|
+
surface: 'telegram', botId: botId!, chatId: chatId!,
|
|
31
|
+
...(threadId === 'none' ? {} : { threadId: threadId! }),
|
|
32
|
+
messageId: messageId!, updateId: updateId!, question: question!,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
|
|
2
|
+
import { subscribeMsgStream, type MsgStreamHandle } from '../msg/msg-sse-client.js';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
5
|
+
import { debug } from '../debug/log.js';
|
|
6
|
+
import { isOwnInstanceEndpoint, parseTelegramEndpoint, telegramEndpointKey } from './session-endpoint-key.js';
|
|
7
|
+
import type { TelegramBot } from '../telegram.js';
|
|
8
|
+
import { parseAskOpQuestionEnvelope } from './channel-ask-op-envelope.js';
|
|
9
|
+
|
|
10
|
+
export type ChannelOpEndpoint = { surface: 'telegram'; key: string } & NonNullable<ReturnType<typeof parseTelegramEndpoint>>;
|
|
11
|
+
|
|
12
|
+
export interface ChannelOpReplyTransport {
|
|
13
|
+
/** Must reject endpoint keys whose instance or bot is not served by this transport. */
|
|
14
|
+
canSend(endpoint: ChannelOpEndpoint): boolean;
|
|
15
|
+
/** The stable idempotency key lets a transport suppress retries if it supports them. */
|
|
16
|
+
send(endpoint: ChannelOpEndpoint, body: string, idempotencyKey: string): Promise<{ receiptId: string }>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function createTelegramChannelOpReplyTransport(input: {
|
|
20
|
+
bot: Pick<TelegramBot, 'sendMessage'>;
|
|
21
|
+
botId: string;
|
|
22
|
+
instance: string;
|
|
23
|
+
}): ChannelOpReplyTransport {
|
|
24
|
+
return {
|
|
25
|
+
canSend(endpoint) {
|
|
26
|
+
return endpoint.surface === 'telegram'
|
|
27
|
+
&& isOwnInstanceEndpoint(endpoint.instance, input.instance)
|
|
28
|
+
&& endpoint.botId === input.botId;
|
|
29
|
+
},
|
|
30
|
+
async send(endpoint, body, idempotencyKey) {
|
|
31
|
+
if (endpoint.surface !== 'telegram') throw new Error('Telegram transport cannot send to Discord');
|
|
32
|
+
const sent = await input.bot.sendMessage(Number(endpoint.chatId), body, {
|
|
33
|
+
...(endpoint.threadId !== '0' ? { threadId: Number(endpoint.threadId) } : {}),
|
|
34
|
+
});
|
|
35
|
+
return { receiptId: sent && 'messageId' in sent ? `telegram:${sent.messageId}` : `telegram:${idempotencyKey}` };
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type ChannelOpReplyResult =
|
|
41
|
+
| { status: 'delivered'; receiptId: string }
|
|
42
|
+
| { status: 'already-delivered'; receiptId: string }
|
|
43
|
+
| { status: 'held' }
|
|
44
|
+
| { status: 'unknown' }
|
|
45
|
+
| { status: 'failed-permanent'; errorCode: number }
|
|
46
|
+
| { status: 'rejected'; reason: 'not-op-reply' | 'missing-question' | 'invalid-question' | 'invalid-endpoint' | 'unknown-endpoint' | 'already-answered' };
|
|
47
|
+
|
|
48
|
+
const CREATE_RECEIPTS = `CREATE TABLE IF NOT EXISTS channel_op_reply_receipts (
|
|
49
|
+
question_id INTEGER PRIMARY KEY REFERENCES msg_messages(id),
|
|
50
|
+
answer_id INTEGER NOT NULL UNIQUE REFERENCES msg_messages(id),
|
|
51
|
+
endpoint_key TEXT NOT NULL,
|
|
52
|
+
status TEXT NOT NULL CHECK(status IN ('sending', 'delivered', 'unknown', 'retry', 'failed-permanent')),
|
|
53
|
+
transport_receipt TEXT,
|
|
54
|
+
transport_error_code INTEGER,
|
|
55
|
+
updated_at TEXT NOT NULL
|
|
56
|
+
)`;
|
|
57
|
+
|
|
58
|
+
function telegramEndpoint(questionBody: string, instance: string): ChannelOpEndpoint | null {
|
|
59
|
+
const source = parseAskOpQuestionEnvelope(questionBody);
|
|
60
|
+
if (!source) return null;
|
|
61
|
+
const threadId = source.threadId ?? '0';
|
|
62
|
+
if (!Number.isSafeInteger(Number(source.chatId)) || !Number.isSafeInteger(Number(threadId))) return null;
|
|
63
|
+
const key = telegramEndpointKey({ instance, botId: source.botId, chatId: source.chatId, threadId });
|
|
64
|
+
const parsed = parseTelegramEndpoint(key);
|
|
65
|
+
return parsed ? { surface: 'telegram', key, ...parsed } : null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function parseQuestionEndpoint(questionBody: string, instance: string): ChannelOpEndpoint | null {
|
|
69
|
+
return telegramEndpoint(questionBody, instance);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Resolve an OP reply through its durable replyTo link, claim one channel receipt,
|
|
74
|
+
* and send only to the endpoint captured in that question's stored envelope.
|
|
75
|
+
* An interrupted/ambiguous attempt is held rather than resent. Telegram 4xx
|
|
76
|
+
* responses other than rate limiting are terminal because the request cannot succeed unchanged.
|
|
77
|
+
*/
|
|
78
|
+
export async function deliverChannelOpReply(
|
|
79
|
+
store: MsgStore,
|
|
80
|
+
answerId: number,
|
|
81
|
+
transport: ChannelOpReplyTransport,
|
|
82
|
+
options: { instance: string },
|
|
83
|
+
): Promise<ChannelOpReplyResult> {
|
|
84
|
+
store.db.exec(CREATE_RECEIPTS);
|
|
85
|
+
const answer = store.getMessage(answerId);
|
|
86
|
+
if (!answer || answer.from !== 'OP' || answer.replyTo === undefined) return { status: 'rejected', reason: 'not-op-reply' };
|
|
87
|
+
const question = store.getMessage(answer.replyTo);
|
|
88
|
+
if (!question) return { status: 'rejected', reason: 'missing-question' };
|
|
89
|
+
if (question.to !== 'COORDINATOR' || question.kind !== 'question' || question.from !== 'TELEGRAM') {
|
|
90
|
+
return { status: 'rejected', reason: 'invalid-question' };
|
|
91
|
+
}
|
|
92
|
+
const source = parseAskOpQuestionEnvelope(question.body);
|
|
93
|
+
if (!source) return { status: 'rejected', reason: 'invalid-endpoint' };
|
|
94
|
+
const provenanceKey = `coord:tg-${source.botId}-${source.updateId}:COORDINATOR`;
|
|
95
|
+
const provenance = store.db.query(`SELECT 1 FROM msg_provenance WHERE provenance_key = ? AND message_id = ?`)
|
|
96
|
+
.get(provenanceKey, question.id);
|
|
97
|
+
if (!provenance) return { status: 'rejected', reason: 'invalid-question' };
|
|
98
|
+
const endpoint = parseQuestionEndpoint(question.body, options.instance);
|
|
99
|
+
if (!endpoint) return { status: 'rejected', reason: 'invalid-endpoint' };
|
|
100
|
+
if (!transport.canSend(endpoint)) return { status: 'rejected', reason: 'unknown-endpoint' };
|
|
101
|
+
|
|
102
|
+
const claim = store.db.transaction(() => {
|
|
103
|
+
const existing = store.db.query(`SELECT answer_id, endpoint_key, status, transport_receipt, transport_error_code
|
|
104
|
+
FROM channel_op_reply_receipts WHERE question_id = ?`).get(question.id) as {
|
|
105
|
+
answer_id: number; endpoint_key: string; status: 'sending' | 'delivered' | 'unknown' | 'retry' | 'failed-permanent'; transport_receipt: string | null; transport_error_code: number | null;
|
|
106
|
+
} | null;
|
|
107
|
+
if (existing) {
|
|
108
|
+
if (existing.answer_id !== answer.id || existing.endpoint_key !== endpoint.key) return { kind: 'already-answered' as const };
|
|
109
|
+
if (existing.status === 'delivered') return { kind: 'delivered' as const, receiptId: existing.transport_receipt ?? '' };
|
|
110
|
+
if (existing.status === 'failed-permanent') return { kind: 'failed-permanent' as const, errorCode: existing.transport_error_code ?? 400 };
|
|
111
|
+
if (existing.status !== 'retry') return { kind: 'held' as const };
|
|
112
|
+
store.db.query(`UPDATE channel_op_reply_receipts SET status = 'sending', updated_at = ?
|
|
113
|
+
WHERE question_id = ? AND answer_id = ? AND status = 'retry'`)
|
|
114
|
+
.run(new Date().toISOString(), question.id, answer.id);
|
|
115
|
+
return { kind: 'claimed' as const };
|
|
116
|
+
}
|
|
117
|
+
store.db.query(`INSERT INTO channel_op_reply_receipts(question_id, answer_id, endpoint_key, status, updated_at)
|
|
118
|
+
VALUES (?, ?, ?, 'sending', ?)`).run(question.id, answer.id, endpoint.key, new Date().toISOString());
|
|
119
|
+
return { kind: 'claimed' as const };
|
|
120
|
+
}).immediate();
|
|
121
|
+
if (claim.kind === 'already-answered') return { status: 'rejected', reason: 'already-answered' };
|
|
122
|
+
if (claim.kind === 'delivered') return { status: 'already-delivered', receiptId: claim.receiptId };
|
|
123
|
+
if (claim.kind === 'failed-permanent') return { status: 'failed-permanent', errorCode: claim.errorCode };
|
|
124
|
+
if (claim.kind === 'held') return { status: 'held' };
|
|
125
|
+
|
|
126
|
+
try {
|
|
127
|
+
const receipt = await transport.send(endpoint, answer.body, `ask-op-reply:${question.id}`);
|
|
128
|
+
store.db.transaction(() => {
|
|
129
|
+
store.db.query(`UPDATE channel_op_reply_receipts SET status = 'delivered', transport_receipt = ?, updated_at = ?
|
|
130
|
+
WHERE question_id = ? AND answer_id = ? AND status = 'sending'`)
|
|
131
|
+
.run(receipt.receiptId, new Date().toISOString(), question.id, answer.id);
|
|
132
|
+
}).immediate();
|
|
133
|
+
return { status: 'delivered', receiptId: receipt.receiptId };
|
|
134
|
+
} catch (error) {
|
|
135
|
+
const errorCode = error && typeof error === 'object' && 'errorCode' in error
|
|
136
|
+
? (error as { errorCode?: unknown }).errorCode
|
|
137
|
+
: undefined;
|
|
138
|
+
const permanent4xx = typeof errorCode === 'number' && Number.isInteger(errorCode)
|
|
139
|
+
&& errorCode >= 400 && errorCode < 500 && errorCode !== 429;
|
|
140
|
+
const permanentErrorCode = permanent4xx ? errorCode as number : null;
|
|
141
|
+
store.db.transaction(() => {
|
|
142
|
+
store.db.query(`UPDATE channel_op_reply_receipts SET status = ?, transport_error_code = ?, updated_at = ?
|
|
143
|
+
WHERE question_id = ? AND answer_id = ? AND status = 'sending'`)
|
|
144
|
+
.run(permanent4xx ? 'failed-permanent' : 'unknown', permanentErrorCode, new Date().toISOString(), question.id, answer.id);
|
|
145
|
+
}).immediate();
|
|
146
|
+
if (permanentErrorCode !== null) return { status: 'failed-permanent', errorCode: permanentErrorCode };
|
|
147
|
+
return { status: 'unknown' };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Explicit operator reconciliation for an ambiguous Telegram send. */
|
|
152
|
+
export function reconcileChannelOpReply(
|
|
153
|
+
store: MsgStore,
|
|
154
|
+
questionId: number,
|
|
155
|
+
decision: { status: 'delivered'; receiptId: string } | { status: 'not-delivered' },
|
|
156
|
+
): boolean {
|
|
157
|
+
store.db.exec(CREATE_RECEIPTS);
|
|
158
|
+
if (decision.status === 'delivered' && !decision.receiptId.trim()) throw new Error('receiptId is required for delivered reconciliation');
|
|
159
|
+
const status = decision.status === 'delivered' ? 'delivered' : 'retry';
|
|
160
|
+
const receiptId = decision.status === 'delivered' ? decision.receiptId : null;
|
|
161
|
+
return store.db.transaction(() => store.db.query(`UPDATE channel_op_reply_receipts
|
|
162
|
+
SET status = ?, transport_receipt = ?, updated_at = ? WHERE question_id = ? AND status IN ('sending', 'unknown')`)
|
|
163
|
+
.run(status, receiptId, new Date().toISOString(), questionId).changes === 1).immediate();
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export interface StartChannelOpReplyRouteOptions {
|
|
167
|
+
transport: ChannelOpReplyTransport;
|
|
168
|
+
instance: string;
|
|
169
|
+
botId: string;
|
|
170
|
+
cursorPath?: string;
|
|
171
|
+
openReadStore?: () => MsgStore;
|
|
172
|
+
openWriteStore?: () => MsgStore;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Listen to the Telegram seat mailbox and route only linked OP replies. */
|
|
176
|
+
export function startChannelOpReplyRoute(options: StartChannelOpReplyRouteOptions): MsgStreamHandle {
|
|
177
|
+
const cursorPath = options.cursorPath ?? join(
|
|
178
|
+
elanousStateRoot(), 'msg', 'sse-cursor', `TELEGRAM-channel-op-replies-${options.botId}.json`,
|
|
179
|
+
);
|
|
180
|
+
return subscribeMsgStream({
|
|
181
|
+
address: 'TELEGRAM',
|
|
182
|
+
cursorPath,
|
|
183
|
+
pollMs: 500,
|
|
184
|
+
openStore: options.openReadStore ?? (() => openMsgStoreReadOnly()),
|
|
185
|
+
onMessage: async (message: Message) => {
|
|
186
|
+
if (message.to !== 'TELEGRAM' || message.from !== 'OP' || message.replyTo === undefined) return;
|
|
187
|
+
const store = (options.openWriteStore ?? (() => openMsgStore()))();
|
|
188
|
+
try {
|
|
189
|
+
const result = await deliverChannelOpReply(store, message.id, options.transport, { instance: options.instance });
|
|
190
|
+
if (result.status === 'unknown' || result.status === 'rejected' || result.status === 'held' || result.status === 'failed-permanent') {
|
|
191
|
+
debug.log('channel-op-reply-route', result.status, {
|
|
192
|
+
answerId: message.id,
|
|
193
|
+
reason: result.status === 'rejected' ? result.reason : undefined,
|
|
194
|
+
errorCode: result.status === 'failed-permanent' ? result.errorCode : undefined,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
} finally { store.close(); }
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
package/src/session/chat.ts
CHANGED
|
@@ -58,6 +58,8 @@ export interface RunTurnOpts {
|
|
|
58
58
|
/** Optional callback for each streamed text delta — telegram uses this to
|
|
59
59
|
* accumulate; CLI uses it to render live. */
|
|
60
60
|
onDelta?: (delta: string) => void;
|
|
61
|
+
/** Optional transient stream recovery status for the originating UI. */
|
|
62
|
+
onStatusLine?: (line: string) => void;
|
|
61
63
|
/** Optional provider override — for tests. */
|
|
62
64
|
provider?: LLMProvider;
|
|
63
65
|
/** Originating utterance surface. Omit only when the caller cannot
|
|
@@ -500,6 +502,7 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
500
502
|
onText: (delta /*, full */) => {
|
|
501
503
|
opts.onDelta?.(delta);
|
|
502
504
|
},
|
|
505
|
+
onStatus: (line) => { opts.onStatusLine?.(line); },
|
|
503
506
|
dispatchTool: async (name, args, ctx) => dispatchTool(name, args, ctx),
|
|
504
507
|
onToolCall: (call) => { toolCallArgs.set(call.id, call.args); opts.onToolCall?.(call); },
|
|
505
508
|
onToolResult: (call) => {
|
package/src/session/index.ts
CHANGED
|
@@ -243,6 +243,8 @@ export interface SessionMeta {
|
|
|
243
243
|
* **no runtime effect today** — placeholder for schema stability so
|
|
244
244
|
* future coordinator does not require a migration pass. */
|
|
245
245
|
retiredAt?: string | null;
|
|
246
|
+
/** Per-session Next TUI presentation preferences. */
|
|
247
|
+
uiState?: { sidetabOpen?: boolean };
|
|
246
248
|
}
|
|
247
249
|
|
|
248
250
|
/** Runtime channel attachments. Each key is optional; presence means
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { buildGitSnapshot } from '../git-fs/index.js';
|
|
2
2
|
import { debug } from '../debug/log.js';
|
|
3
|
+
import { isResearchAgentIntent } from '../tool-hints/signals.js';
|
|
3
4
|
import { resolve } from 'node:path';
|
|
4
5
|
import type { ModelFamily } from '../models/prompts.js';
|
|
5
6
|
import type { InputSourceKind, InputSourceRef } from '../input/input-source-kind.js';
|
|
@@ -127,6 +128,13 @@ export interface SessionTurnProfile {
|
|
|
127
128
|
inputSourceKind: InputSourceKind | null;
|
|
128
129
|
}
|
|
129
130
|
|
|
131
|
+
/** A date anchor for research answers. Keep this local to the turn so a
|
|
132
|
+
* long-lived session never presents yesterday as today's date. */
|
|
133
|
+
export function buildResearchDateSystemMessage(now = new Date()): LLMMessage {
|
|
134
|
+
const localDate = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
|
|
135
|
+
return { role: 'system', content: `Current local date: ${localDate}. Verify dates in sources; do not infer freshness from an undated result.` };
|
|
136
|
+
}
|
|
137
|
+
|
|
130
138
|
export interface SessionModeSnapshot {
|
|
131
139
|
rawMode: ChatModeState['mode'];
|
|
132
140
|
activeIntent: string | null;
|
|
@@ -2412,27 +2420,6 @@ const WEB_SEARCH_PROVIDER_TERMS = [
|
|
|
2412
2420
|
'claude',
|
|
2413
2421
|
] as const;
|
|
2414
2422
|
|
|
2415
|
-
const DEEP_RESEARCH_INTENT_TERMS = [
|
|
2416
|
-
'research',
|
|
2417
|
-
'deep research',
|
|
2418
|
-
'triangulate',
|
|
2419
|
-
'compare sources',
|
|
2420
|
-
'multiple sources',
|
|
2421
|
-
'community reaction',
|
|
2422
|
-
'reddit reaction',
|
|
2423
|
-
'x reaction',
|
|
2424
|
-
'trend',
|
|
2425
|
-
'sentiment',
|
|
2426
|
-
'여러 소스',
|
|
2427
|
-
'깊게 조사',
|
|
2428
|
-
'리서치',
|
|
2429
|
-
'반응',
|
|
2430
|
-
'트렌드',
|
|
2431
|
-
'여론',
|
|
2432
|
-
'비교 조사',
|
|
2433
|
-
'교차검증',
|
|
2434
|
-
] as const;
|
|
2435
|
-
|
|
2436
2423
|
const WEB_FETCH_INTENT_TERMS = [
|
|
2437
2424
|
'http://',
|
|
2438
2425
|
'https://',
|
|
@@ -2647,7 +2634,7 @@ function hasWebSearchExposureIntent(text: string): boolean {
|
|
|
2647
2634
|
}
|
|
2648
2635
|
|
|
2649
2636
|
function hasResearchSearchIntent(text: string): boolean {
|
|
2650
|
-
return
|
|
2637
|
+
return isResearchAgentIntent(text);
|
|
2651
2638
|
}
|
|
2652
2639
|
|
|
2653
2640
|
function hasWebFetchIntent(text: string): boolean {
|
package/src/skills/runner.ts
CHANGED
|
@@ -700,6 +700,9 @@ export interface ExecuteSkillOpts {
|
|
|
700
700
|
export interface ExecuteSkillResult {
|
|
701
701
|
provider: string;
|
|
702
702
|
model: string;
|
|
703
|
+
/** Final assistant answer, without the rendered tool-call transcript. */
|
|
704
|
+
finalResponse: string;
|
|
705
|
+
/** Rendered skill transcript used by interactive surfaces. */
|
|
703
706
|
fullResponse: string;
|
|
704
707
|
}
|
|
705
708
|
|
|
@@ -1199,6 +1202,7 @@ async function executeSkillUnrecorded(
|
|
|
1199
1202
|
return {
|
|
1200
1203
|
provider: provider.name,
|
|
1201
1204
|
model: modelHint || provider.defaultModel,
|
|
1205
|
+
finalResponse: '',
|
|
1202
1206
|
fullResponse: display,
|
|
1203
1207
|
};
|
|
1204
1208
|
}
|
|
@@ -2036,9 +2040,9 @@ async function executeSkillUnrecorded(
|
|
|
2036
2040
|
return {
|
|
2037
2041
|
provider: provider.name,
|
|
2038
2042
|
model: modelHint || provider.defaultModel,
|
|
2039
|
-
//
|
|
2040
|
-
//
|
|
2041
|
-
|
|
2043
|
+
// Keep both products: interactive surfaces need the rendered transcript,
|
|
2044
|
+
// while programmatic callers (e.g. skill_exec) need only the final answer.
|
|
2045
|
+
finalResponse: typeof fullResponse === 'string' ? fullResponse : '',
|
|
2042
2046
|
fullResponse: display || fullResponse,
|
|
2043
2047
|
};
|
|
2044
2048
|
}
|
|
@@ -383,7 +383,7 @@ export async function dispatchRunDevHarness(
|
|
|
383
383
|
const { runStagedHarnessOnSurface } = await import('../../harness/harness-membrane.js');
|
|
384
384
|
const { groundMissionInCodebase } = await import('../../autopilot/mission-codebase-gate.js'); // ★ 이식 §3.1 — 하니스 Planner grounding
|
|
385
385
|
const { analyzeGoalAmbiguity } = await import('../../autopilot/mission-intake-clarify.js'); // ⓪ clarify(인터뷰·경량)
|
|
386
|
-
const {
|
|
386
|
+
const { runResearchQuestionLadder, researchTurnForGrounding } = await import('../../auto-research/research-turn.js'); // ★ Bloom 질문을 실제 조사 호출에 연결
|
|
387
387
|
const { buildSkillHint } = await import('../../harness/skill-hint.js'); // ★ H3 skill 힌트(결정론·상황부)
|
|
388
388
|
const { selectHarnessSkill } = await import('../../harness/skill-select.js'); // ★ S1 실행형(luna 주경로·substring fallback)
|
|
389
389
|
const { buildAttractivenessSignal } = await import('../../harness/signal-gate.js'); // ★ R3 신호 게이트(판단층·부작용0)
|
|
@@ -532,7 +532,7 @@ export async function dispatchRunDevHarness(
|
|
|
532
532
|
// ⓪ clarify(인터뷰·경량) — phase='scope'·heavy=false 로 과도한 조사 방지(대표 원칙: 명확하면 0질문·최상위 1개만).
|
|
533
533
|
analyzeGoal: (obj) => analyzeGoalAmbiguity(obj, { phase: 'scope', heavy: false }),
|
|
534
534
|
// ★ H3 외부 research(상황부) — objective 가 외부지식 요할 때만(intent-gate) web 조사 → grounding 에 얹음.
|
|
535
|
-
research: (topic) =>
|
|
535
|
+
research: (topic) => runResearchQuestionLadder(topic).then(researchTurnForGrounding),
|
|
536
536
|
// ★ H3 skill 힌트(상황부) — objective 의 explicit 트리거가 특정 skill 을 강하게 가리키면 grounding 힌트
|
|
537
537
|
// (결정론·실행 안 함·luna 보완축). getSkillIndex 는 프로세스 캐시. fail-soft(index 로드 실패=null).
|
|
538
538
|
skillHint: (objective) => { try { return buildSkillHint(objective, getSkillIndex()); } catch { return null; } },
|
|
@@ -402,7 +402,7 @@ export function buildScheduleWakeupHostTool(scheduler: WakeupScheduler): LLMTool
|
|
|
402
402
|
name: SCHEDULE_WAKEUP_TOOL_NAME,
|
|
403
403
|
description:
|
|
404
404
|
'Wake THIS TUI later with an internal turn: when you would write «다음 점검 HH:MM» and end the turn, call this instead so the check actually happens. '
|
|
405
|
-
+ 'action=schedule (default) needs reason plus one of at ("HH:MM" local, past → tomorrow) / delaySeconds (≥60) / repeatMinutes (≥1; repeats expire after 7 days). Never provide both at and delaySeconds; the
|
|
405
|
+
+ 'action=schedule (default) needs reason plus one of at ("HH:MM" local, past → tomorrow) / delaySeconds (≥60) / repeatMinutes (≥1; repeats expire after 7 days). Never provide both at and delaySeconds; the scheduler validates the timing choice. '
|
|
406
406
|
+ 'ONE-SHOT (wake once): give only delaySeconds or at and OMIT repeatMinutes (0 also means one-shot). Set repeatMinutes only when you really want it to repeat. '
|
|
407
407
|
+ `action=list shows pending wakeups; action=cancel needs id. Limits: ≥60s ahead, ≤7 days, at most 5 pending, at most ${WAKEUP_MAX_CALLS_PER_TURN} schedule/cancel calls per turn. `
|
|
408
408
|
+ 'If the TUI is busy or the human is typing at that time it retries once a minute later, then gives up (repeats move to the next tick). '
|
|
@@ -418,11 +418,6 @@ export function buildScheduleWakeupHostTool(scheduler: WakeupScheduler): LLMTool
|
|
|
418
418
|
id: { type: 'string', description: 'Wakeup id for action=cancel (from schedule/list).' },
|
|
419
419
|
},
|
|
420
420
|
required: [],
|
|
421
|
-
oneOf: [
|
|
422
|
-
{ not: { anyOf: [{ required: ['at'] }, { required: ['delaySeconds'] }] } },
|
|
423
|
-
{ required: ['at'], not: { required: ['delaySeconds'] } },
|
|
424
|
-
{ required: ['delaySeconds'], not: { required: ['at'] } },
|
|
425
|
-
],
|
|
426
421
|
},
|
|
427
422
|
handler: async (args) => {
|
|
428
423
|
const action = typeof args.action === 'string' ? args.action : 'schedule';
|
package/src/status/bar.ts
CHANGED
|
@@ -322,7 +322,7 @@ function truncateAtParamSize(model: string): string {
|
|
|
322
322
|
/** Current active LLM model pill. Pink matches Claude Code's palette.
|
|
323
323
|
*
|
|
324
324
|
* 2026-05-05 — provider name omitted (cloud) / `<node>:<model>` for
|
|
325
|
-
* local. Node name (e.g. `local`, `node-
|
|
325
|
+
* local. Node name (e.g. `local`, `node-a`) doubles as the local-LLM
|
|
326
326
|
* indicator (cloud entries have no `<node>:` prefix). When
|
|
327
327
|
* `opts.compact` is true (caller decides via terminal width), the
|
|
328
328
|
* model id portion truncates at the first parameter-size marker.
|
|
@@ -330,13 +330,13 @@ function truncateAtParamSize(model: string): string {
|
|
|
330
330
|
* Render shape examples:
|
|
331
331
|
* - Cloud: `claude-opus-4-6`, `grok-4.3`
|
|
332
332
|
* - Local (multi-node spec): `local:qwen3.6-35b-a3b-ud-mlx`
|
|
333
|
-
* `node-
|
|
333
|
+
* `node-a:qwen2.5-72b-instruct`
|
|
334
334
|
* - Local (legacy `local:<m>`): `local:llama-3-8b` (unchanged)
|
|
335
335
|
* - Local (bare model): `local:tinyllama-1b`
|
|
336
336
|
* - No model: bare provider name fallback.
|
|
337
337
|
* With `compact: true`:
|
|
338
338
|
* - `local:qwen3.6-35b-a3b-ud-mlx` → `local:qwen3.6-35b`
|
|
339
|
-
* - `node-
|
|
339
|
+
* - `node-a:qwen2.5-72b-instruct` → `node-a:qwen2.5-72b`
|
|
340
340
|
* - `claude-opus-4-6` → unchanged (no `\d+b` marker) */
|
|
341
341
|
export function modelSegment(info: StatusModelInfo, opts: StatusBarRenderOptions = {}): string {
|
|
342
342
|
// 이번 턴 실제 실행이 있으면 그 값이 «지금» 이다 — 설정/런타임 값은 실행 전 기본값일 뿐.
|