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
|
@@ -37,6 +37,12 @@ import { createTelegramStreamSink } from '../../session/streaming/telegram-strea
|
|
|
37
37
|
import { splitMarkdownForTelegram } from '../../telegram-format.js';
|
|
38
38
|
import { formatTablesAndRules } from '../../discord-markdown.js';
|
|
39
39
|
import { receiveChannelEvent } from '../outbound/router.js';
|
|
40
|
+
import { openMsgStore } from '../../msg/msg-store.js';
|
|
41
|
+
import { createAskOpTelegramSlashCommand } from './channel-ask-op.js';
|
|
42
|
+
import { createTelegramChannelOpReplyTransport, startChannelOpReplyRoute } from '../../session/channel-op-reply-route.js';
|
|
43
|
+
import { resolveInstanceName } from '../../instance-identity.js';
|
|
44
|
+
import { elanousStateRoot } from '../../autopilot/state-paths.js';
|
|
45
|
+
import { join } from 'node:path';
|
|
40
46
|
|
|
41
47
|
export interface NexusTelegramTriggerBotOpts {
|
|
42
48
|
/** Bot token (without `Bot ` prefix). Production reads
|
|
@@ -167,6 +173,14 @@ export function createNexusTelegramTriggerBot(
|
|
|
167
173
|
const onTriggerTap = buildTelegramTriggerTap(opts.dispatch, log);
|
|
168
174
|
|
|
169
175
|
const botWasInjected = opts.bot !== undefined;
|
|
176
|
+
const askOpCommand = createAskOpTelegramSlashCommand({
|
|
177
|
+
allowedUserIds: opts.allowedUsers,
|
|
178
|
+
append: (message, provenanceKey) => {
|
|
179
|
+
const store = openMsgStore();
|
|
180
|
+
try { return store.appendWithProvenance(message, provenanceKey); }
|
|
181
|
+
finally { store.close(); }
|
|
182
|
+
},
|
|
183
|
+
});
|
|
170
184
|
const bot = opts.bot ?? (opts.userConfig
|
|
171
185
|
// Unified inbound: botFromConfig gives the full Q&A handler
|
|
172
186
|
// (onMessage → runTurn, sessions, attachments, slash) and we graft
|
|
@@ -174,6 +188,7 @@ export function createNexusTelegramTriggerBot(
|
|
|
174
188
|
? botFromConfig({
|
|
175
189
|
userConfig: opts.userConfig,
|
|
176
190
|
log,
|
|
191
|
+
extraSlashCommands: [askOpCommand],
|
|
177
192
|
...(opts.runTurnImpl ? { runTurnImpl: opts.runTurnImpl } : {}),
|
|
178
193
|
telegramBotOpts: {
|
|
179
194
|
token: opts.token,
|
|
@@ -286,6 +301,14 @@ export function createNexusTelegramTriggerBot(
|
|
|
286
301
|
});
|
|
287
302
|
}
|
|
288
303
|
|
|
304
|
+
const opReplyInstance = resolveInstanceName();
|
|
305
|
+
const opReplyRoute = !botWasInjected ? startChannelOpReplyRoute({
|
|
306
|
+
transport: createTelegramChannelOpReplyTransport({ bot, botId: thisBotId, instance: opReplyInstance }),
|
|
307
|
+
botId: thisBotId,
|
|
308
|
+
instance: opReplyInstance,
|
|
309
|
+
cursorPath: join(elanousStateRoot(), 'msg', 'sse-cursor', `TELEGRAM-channel-op-replies-${thisBotId}.json`),
|
|
310
|
+
}) : undefined;
|
|
311
|
+
|
|
289
312
|
// One drain promise for every caller. A second stop (SIGINT then
|
|
290
313
|
// SIGTERM, or a duplicate SIGTERM) must wait for the same bound —
|
|
291
314
|
// returning immediately would let the process exit before the turn
|
|
@@ -297,6 +320,7 @@ export function createNexusTelegramTriggerBot(
|
|
|
297
320
|
if (drainPromise) return drainPromise;
|
|
298
321
|
const timeoutMs = stopOpts?.timeoutMs ?? TELEGRAM_TRIGGER_DRAIN_TIMEOUT_MS;
|
|
299
322
|
drainPromise = (async (): Promise<void> => {
|
|
323
|
+
try { await opReplyRoute?.stop(); } catch { /* swallow */ }
|
|
300
324
|
try { offTelegramSink?.(); } catch { /* swallow */ }
|
|
301
325
|
try { offTelegramStream?.(); } catch { /* swallow */ }
|
|
302
326
|
try { bot.stop(); } catch { /* swallow */ }
|
|
@@ -102,6 +102,11 @@ export interface TerminalSummary {
|
|
|
102
102
|
startedAt: number;
|
|
103
103
|
/** Total bytes currently held in the head/tail buffer (after trim). */
|
|
104
104
|
outputBytes: number;
|
|
105
|
+
/** Seat copied from the joined lifecycle row for this PTY id; omitted when unknown. */
|
|
106
|
+
seat?: string;
|
|
107
|
+
/** Cumulative output from the joined lifecycle row; omitted when unknown (NULL/missing/0 legacy row).
|
|
108
|
+
* Only a recorded positive total is a fact — same rule as the lineage endpoint. Distinct from outputBytes (buffer length). */
|
|
109
|
+
outputBytesTotal?: number;
|
|
105
110
|
/** The owner-process access mode, or null when this row is manifest-only. */
|
|
106
111
|
accessMode: 'read' | 'write' | 'auto' | null;
|
|
107
112
|
/** Why accessMode is unavailable; null when an access mode is present. */
|
|
@@ -266,6 +271,18 @@ function terminalOriginFields(row: Pick<PtyManifestRow, 'terminalOriginCategory'
|
|
|
266
271
|
return { terminalOriginCategory: 'unknown', terminalOriginReason: 'legacy-or-malformed-origin-decision' };
|
|
267
272
|
}
|
|
268
273
|
|
|
274
|
+
/** `> 0` 만 사실이다 — legacy 행의 NULL/누락(그리고 매니페스트가 0을 «기록값»으로 구분 못 하는 한 0 전부)은
|
|
275
|
+
* 미상으로 칸을 비운다. 계보 쪽 `lineageRowFromManifest`(`src/cli/pty-takeover-cli.ts`)와 같은 규칙이라
|
|
276
|
+
* 두 엔드포인트가 같은 행을 같게 판정한다. */
|
|
277
|
+
function lifecycleFieldsFromJoinedRow(row: { seat?: string; outputBytesTotal?: number } | undefined): Pick<TerminalSummary, 'seat' | 'outputBytesTotal'> {
|
|
278
|
+
return {
|
|
279
|
+
...(row?.seat ? { seat: row.seat } : {}),
|
|
280
|
+
...(typeof row?.outputBytesTotal === 'number' && Number.isFinite(row.outputBytesTotal) && row.outputBytesTotal > 0
|
|
281
|
+
? { outputBytesTotal: row.outputBytesTotal }
|
|
282
|
+
: {}),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
269
286
|
function summarize(
|
|
270
287
|
handle: PtyHandle,
|
|
271
288
|
manifest: PtyManifestRow | null,
|
|
@@ -300,6 +317,7 @@ function summarize(
|
|
|
300
317
|
exitCode: handle.exitCode,
|
|
301
318
|
startedAt: handle.startedAt,
|
|
302
319
|
outputBytes: snapshot.length,
|
|
320
|
+
...lifecycleFieldsFromJoinedRow(manifest ? { seat: manifest.seat, outputBytesTotal: manifest.outputBytesTotal } : undefined),
|
|
303
321
|
accessMode: handle.accessMode,
|
|
304
322
|
accessModeUnavailableReason: accessModeUnavailableReason('process', handle.accessMode),
|
|
305
323
|
ownerRunUsage: ownerRunUsage(manifest?.ownerPid !== undefined ? isOwnerProcessAlive(manifest.ownerPid) : undefined, manifest?.runId ?? '', resolveRunTerminationForRow),
|
|
@@ -337,6 +355,7 @@ function summarizeManifest(
|
|
|
337
355
|
producer: 'process',
|
|
338
356
|
alive: row.alive, exitCode: row.exitCode, startedAt: row.startedAt,
|
|
339
357
|
outputBytes: Buffer.byteLength(row.snapshot, 'utf8'),
|
|
358
|
+
...lifecycleFieldsFromJoinedRow({ seat: row.seat, outputBytesTotal: row.outputBytesTotal }),
|
|
340
359
|
// Access mode lives in the owner process, so manifest-only rows cannot know it without IPC.
|
|
341
360
|
accessMode: null,
|
|
342
361
|
accessModeUnavailableReason: accessModeUnavailableReason('process', null),
|
|
@@ -1102,12 +1121,15 @@ export function handleTerminalsList(req: Request, opts: MetaApiOpts, deps: Termi
|
|
|
1102
1121
|
try { cleanupStale(Date.now()); } catch { /* fail-soft */ }
|
|
1103
1122
|
const manifestAfterInitialCleanup = readLocalManifest();
|
|
1104
1123
|
const manifestById = new Map(manifestAfterInitialCleanup.map((row) => [row.id, row]));
|
|
1105
|
-
const local = (deps.listPty ?? listPty)().map((handle) =>
|
|
1106
|
-
handle
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1124
|
+
const local = (deps.listPty ?? listPty)().map((handle) => {
|
|
1125
|
+
const manifest = manifestById.get(handle.id) ?? null;
|
|
1126
|
+
return summarize(
|
|
1127
|
+
handle,
|
|
1128
|
+
manifest,
|
|
1129
|
+
resolveRunTerminationForRow,
|
|
1130
|
+
deps.isProcessAlive,
|
|
1131
|
+
);
|
|
1132
|
+
});
|
|
1111
1133
|
const localIds = new Set(local.map((t) => t.id));
|
|
1112
1134
|
try { cleanupOrphans(localIds); } catch { /* fail-soft */ }
|
|
1113
1135
|
const isVisible = (row: PtyManifestRow): boolean => isVisibleManifestRow(row, deps.isProcessAlive);
|
package/src/patents/ledger.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Database } from 'bun:sqlite';
|
|
2
|
-
import { chmodSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { chmodSync, existsSync, mkdirSync } from 'node:fs';
|
|
3
3
|
import { dirname, join } from 'node:path';
|
|
4
4
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
5
5
|
import { debug } from '../debug/log.js';
|
|
@@ -80,6 +80,12 @@ export class PatentLedger {
|
|
|
80
80
|
try { return work(db); } finally { db.close(); }
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
private usingExisting<T>(work: (db: Database) => T): T {
|
|
84
|
+
if (!existsSync(this.path)) throw new Error('patent ledger unavailable');
|
|
85
|
+
const db = new Database(this.path, { readonly: true, create: false, strict: true });
|
|
86
|
+
try { return work(db); } finally { db.close(); }
|
|
87
|
+
}
|
|
88
|
+
|
|
83
89
|
private transaction<T>(db: Database, work: () => T): T {
|
|
84
90
|
db.exec('BEGIN IMMEDIATE');
|
|
85
91
|
try { const result = work(); db.exec('COMMIT'); return result; }
|
|
@@ -125,4 +131,15 @@ export class PatentLedger {
|
|
|
125
131
|
return this.using(db =>
|
|
126
132
|
db.query(`SELECT id, title, track, status, deadline, created_at, updated_at FROM patent_candidates WHERE status = '공개 허용' ORDER BY created_at, id`).all() as PatentCandidate[]);
|
|
127
133
|
}
|
|
134
|
+
|
|
135
|
+
/** Return only line numbers; candidate identifiers and titles remain private. */
|
|
136
|
+
unapprovedCandidateLineNumbers(text: string): number[] {
|
|
137
|
+
return this.usingExisting(db => {
|
|
138
|
+
if (!text.trim()) return [];
|
|
139
|
+
const rows = db.query(`SELECT title FROM patent_candidates WHERE status != '공개 허용'`).all() as Array<{ title: string }>;
|
|
140
|
+
const titles = rows.map(({ title }) => title.toLocaleLowerCase()).filter((title) => title.length >= 3);
|
|
141
|
+
return text.split(/\r?\n/).flatMap((line, index) =>
|
|
142
|
+
titles.some((title) => line.toLocaleLowerCase().includes(title)) ? [index + 1] : []);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
128
145
|
}
|
package/src/preview/terminal.ts
CHANGED
|
@@ -67,6 +67,8 @@ export interface PreviewTerminalOpts {
|
|
|
67
67
|
* splitting honest). */
|
|
68
68
|
shellArgs?: readonly string[];
|
|
69
69
|
env?: Record<string, string>;
|
|
70
|
+
/** Remove captured environment keys after env composition (for subscription-only child auth). */
|
|
71
|
+
unsetEnv?: readonly string[];
|
|
70
72
|
/** Defaults to `xterm-256color` (universal). Override with
|
|
71
73
|
* `xterm-ghostty` to match a ghostty host, or another terminfo
|
|
72
74
|
* name for testing. The chosen name lands in $TERM of the child
|
|
@@ -343,7 +345,7 @@ export class PreviewTerminal {
|
|
|
343
345
|
// PreviewTerminal 자체 에뮬레이터가 렌더 담당이라 무관). 출력 구독/exit 배선은 아래 pump 분기에서.
|
|
344
346
|
this.registryHandle = this.registryDeps.startPty({
|
|
345
347
|
// 합성자 = registry(resolveSpawnShape) — 여기서는 overlay 만 넘긴다.
|
|
346
|
-
cmd: shell, args, workdir: this.opts.cwd, env: childEnv,
|
|
348
|
+
cmd: shell, args, workdir: this.opts.cwd, env: childEnv, unsetEnv: this.opts.unsetEnv,
|
|
347
349
|
cols: this.term.cols, rows: this.term.rows,
|
|
348
350
|
kind: this.opts.registryKind ?? 'preview',
|
|
349
351
|
nickname: this.opts.registryNickname,
|
|
@@ -360,7 +362,7 @@ export class PreviewTerminal {
|
|
|
360
362
|
cols: this.term.cols,
|
|
361
363
|
rows: this.term.rows,
|
|
362
364
|
cwd: this.opts.cwd,
|
|
363
|
-
env: buildPtyEnv(childEnv),
|
|
365
|
+
env: buildPtyEnv(childEnv, process.env, { unset: this.opts.unsetEnv }),
|
|
364
366
|
});
|
|
365
367
|
const masterFd = this.resolveMasterFd(this.pty);
|
|
366
368
|
if (masterFd === null) throw new Error('PreviewTerminal: could not resolve PTY master fd');
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
// caching went GA without a version bump.
|
|
21
21
|
|
|
22
22
|
import type { LLMMessage, LLMToolSpec } from '../llm.js';
|
|
23
|
+
import { assertNoTopLevelToolSchemaCombinators } from '../llm-tool-schema.js';
|
|
23
24
|
import {
|
|
24
25
|
cacheControlFor,
|
|
25
26
|
type CacheControl,
|
|
@@ -98,6 +99,7 @@ export function toAnthropicToolsCached(
|
|
|
98
99
|
opts: CacheOpts,
|
|
99
100
|
): AnthropicToolBlock[] | undefined {
|
|
100
101
|
if (!tools || tools.length === 0) return undefined;
|
|
102
|
+
assertNoTopLevelToolSchemaCombinators(tools);
|
|
101
103
|
// ⭐ Anthropic 은 tool name UNIQUE 를 강제(400 "Tool names must be unique.")한다.
|
|
102
104
|
// OpenAI/codex 는 중복을 조용히 관대 처리 → 하니스가 codex 위주로 개발되며 중복 tool spec
|
|
103
105
|
// (예: goal-loop 이 카탈로그에 이미 있는 spec 을 append)이 claude 에서만 400 으로 터졌다.
|
|
@@ -118,6 +118,8 @@ export interface EnhanceOpts {
|
|
|
118
118
|
* ⭐ 새 LLM 경로를 만들지 않는다 — 이 모듈이 이미 그 자리의 유일한 LLM 단계다.
|
|
119
119
|
*/
|
|
120
120
|
groundedFacts?: readonly string[];
|
|
121
|
+
/** Relevant prior-failure lessons for goal-authoring prompts only; never part of the original ask. */
|
|
122
|
+
authoringLessons?: string;
|
|
121
123
|
/** Clock seam for the first-token observation (ms epoch); defaults to `Date.now`. */
|
|
122
124
|
now?: () => number;
|
|
123
125
|
}
|
|
@@ -434,6 +436,9 @@ export async function enhancePrompt(raw: string, opts: EnhanceOpts = {}): Promis
|
|
|
434
436
|
'위 사실을 «옮겨 적지 말고», 그것이 보여 주는 상태(situation)와 문제(complication)를 써라.',
|
|
435
437
|
]
|
|
436
438
|
: []),
|
|
439
|
+
...(opts.authoringLessons?.trim()
|
|
440
|
+
? ['', '## 지난 실패에서 배운 것', opts.authoringLessons.trim(), '위 교훈은 현재 ask의 대상 경로와 범위에 맞을 때만 적용하고, 맞지 않으면 무시하라.']
|
|
441
|
+
: []),
|
|
437
442
|
].join('\n'),
|
|
438
443
|
},
|
|
439
444
|
];
|
|
@@ -75,7 +75,10 @@ export interface PtyManifestRow {
|
|
|
75
75
|
exitCode: number | null;
|
|
76
76
|
snapshot: string;
|
|
77
77
|
snapshotAt: number;
|
|
78
|
-
|
|
78
|
+
/** Cumulative output bytes recorded for this PTY. `undefined` = the row never recorded a total
|
|
79
|
+
* (legacy schema before `output_bytes_total`, or NULL) — that is *unknown*, not 0. A genuinely
|
|
80
|
+
* recorded zero from a fresh spawn stays 0. */
|
|
81
|
+
outputBytesTotal?: number;
|
|
79
82
|
lastControlAt?: number;
|
|
80
83
|
updatedAt: number;
|
|
81
84
|
frame: string;
|
|
@@ -420,6 +423,17 @@ export function updatePtyManifestNickname(id: string, nickname: string | undefin
|
|
|
420
423
|
} catch { /* fail-soft */ }
|
|
421
424
|
}
|
|
422
425
|
|
|
426
|
+
/** Update the conversation currently shown by a TUI surface without replacing its manifest row. */
|
|
427
|
+
export function updatePtyManifestSession(id: string, sessionId: string, now: number = Date.now()): boolean {
|
|
428
|
+
try {
|
|
429
|
+
const d = db(); if (!d) return false;
|
|
430
|
+
const result = d.run('UPDATE pty_manifest SET session_id=?, updated_at=? WHERE id=? AND kind=\'tui\' AND session_id<>?', [sessionId, now, id, sessionId]);
|
|
431
|
+
return (result.changes ?? 0) > 0;
|
|
432
|
+
} catch {
|
|
433
|
+
return false;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
423
437
|
/** 턴 상태 기록 — 행이 없거나 db 를 못 열면 false(호출자가 관측을 남긴다). */
|
|
424
438
|
export function updatePtyManifestTurn(id: string, turn: PtyTurnState, at: number): boolean {
|
|
425
439
|
try {
|
|
@@ -866,7 +880,7 @@ function mapRow(r: Record<string, unknown>): PtyManifestRow {
|
|
|
866
880
|
exitCode: r.exit_code === null || r.exit_code === undefined ? null : Number(r.exit_code),
|
|
867
881
|
snapshot: String(r.snapshot ?? ''),
|
|
868
882
|
snapshotAt: Number(r.snapshot_at ?? 0),
|
|
869
|
-
outputBytesTotal: Number(r.output_bytes_total
|
|
883
|
+
...(r.output_bytes_total === null || r.output_bytes_total === undefined ? {} : { outputBytesTotal: Number(r.output_bytes_total) }),
|
|
870
884
|
...(r.last_control_at === null || r.last_control_at === undefined ? {} : { lastControlAt: Number(r.last_control_at) }),
|
|
871
885
|
frame: String(r.frame ?? ''),
|
|
872
886
|
frameAt: Number(r.frame_at ?? 0),
|
|
@@ -12,6 +12,12 @@ export type ShardState = typeof SHARD_STATES[number];
|
|
|
12
12
|
export interface GateShard {
|
|
13
13
|
id: string;
|
|
14
14
|
state: ShardState;
|
|
15
|
+
/** Kubernetes Job for the current attempt; lets the gate watchdog reconcile a lost completion callback. */
|
|
16
|
+
job?: string;
|
|
17
|
+
/** Attempt identity associated with the currently recorded Job/result marker. */
|
|
18
|
+
attemptId?: string;
|
|
19
|
+
/** Result JSON for the current attempt; retries replace this so an older marker cannot close a new Job. */
|
|
20
|
+
resultFile?: string;
|
|
15
21
|
startedAt?: string;
|
|
16
22
|
endedAt?: string;
|
|
17
23
|
/** 설치(install) 단계에 쓴 초. */
|
|
@@ -61,8 +67,14 @@ function shardOf(value: unknown): GateShard | null {
|
|
|
61
67
|
const waitReason = str(raw.waitReason);
|
|
62
68
|
const plannedMin = num(raw.plannedMin);
|
|
63
69
|
const host = str(raw.host, 120);
|
|
70
|
+
const job = str(raw.job, 120);
|
|
71
|
+
const attemptId = str(raw.attemptId, 120);
|
|
72
|
+
const resultFile = str(raw.resultFile, 200);
|
|
64
73
|
return {
|
|
65
74
|
id, state,
|
|
75
|
+
...(job ? { job } : {}),
|
|
76
|
+
...(attemptId ? { attemptId } : {}),
|
|
77
|
+
...(resultFile ? { resultFile } : {}),
|
|
66
78
|
...(startedAt ? { startedAt } : {}), ...(endedAt ? { endedAt } : {}),
|
|
67
79
|
...(installSec !== undefined ? { installSec } : {}), ...(rc !== undefined ? { rc } : {}),
|
|
68
80
|
...(waitReason ? { waitReason } : {}), ...(plannedMin !== undefined ? { plannedMin } : {}),
|
|
@@ -70,6 +82,55 @@ function shardOf(value: unknown): GateShard | null {
|
|
|
70
82
|
};
|
|
71
83
|
}
|
|
72
84
|
|
|
85
|
+
export type GateJobTerminal = 'complete' | 'failed';
|
|
86
|
+
|
|
87
|
+
/** Forget the prior child Job before a shard descends into a retry/split attempt. */
|
|
88
|
+
export function beginGateShardAttempt(shard: GateShard, now = new Date()): GateShard {
|
|
89
|
+
const next: GateShard = { ...shard, state: 'retry', startedAt: now.toISOString() };
|
|
90
|
+
delete next.endedAt;
|
|
91
|
+
delete next.waitReason;
|
|
92
|
+
delete next.host;
|
|
93
|
+
delete next.job;
|
|
94
|
+
delete next.resultFile;
|
|
95
|
+
delete next.attemptId;
|
|
96
|
+
return next;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Close each stale running row when its result marker or Kubernetes Job has terminal evidence.
|
|
101
|
+
* A result marker can close a row even when the Kubernetes status read is unavailable.
|
|
102
|
+
*/
|
|
103
|
+
export function finalizeTerminalGateShards(
|
|
104
|
+
file: GateShardsFile,
|
|
105
|
+
terminalJobs: ReadonlyMap<string, GateJobTerminal>,
|
|
106
|
+
results: ReadonlyMap<string, { completed?: boolean; jobName?: string; attemptId?: string; jobFailed?: boolean; rc?: number | null; reason?: 'timeout' | 'stall' }>,
|
|
107
|
+
now: Date = new Date(),
|
|
108
|
+
staleAfterMs = 120_000,
|
|
109
|
+
): GateShardsFile {
|
|
110
|
+
const active = file.shards.filter((shard) => shard.state === 'running' || shard.state === 'retry');
|
|
111
|
+
if (!active.length) return file;
|
|
112
|
+
const at = now.getTime();
|
|
113
|
+
const ready = active.map((shard) => {
|
|
114
|
+
const result = results.get(shard.id);
|
|
115
|
+
const resultTerminal = result?.completed === true && result.jobName === shard.job && result.attemptId === shard.attemptId;
|
|
116
|
+
const k8sTerminal = shard.job ? terminalJobs.get(shard.job) : undefined;
|
|
117
|
+
const startedAt = shard.startedAt ? Date.parse(shard.startedAt) : Number.NaN;
|
|
118
|
+
if (!resultTerminal && !k8sTerminal) return undefined;
|
|
119
|
+
if (!Number.isFinite(startedAt) || at - startedAt < staleAfterMs) return undefined;
|
|
120
|
+
return { shard, result, state: resultTerminal
|
|
121
|
+
? (result!.reason === 'timeout' ? 'timeout' as const : result!.reason === 'stall' || result!.jobFailed === true ? 'failed' as const : 'done' as const)
|
|
122
|
+
: k8sTerminal === 'failed' ? 'failed' as const : 'done' as const };
|
|
123
|
+
});
|
|
124
|
+
const finalized = ready.filter((entry): entry is NonNullable<typeof entry> => entry !== undefined);
|
|
125
|
+
if (!finalized.length) return file;
|
|
126
|
+
const byId = new Map(finalized.map(({ shard, result, state }) => {
|
|
127
|
+
const current = { ...shard };
|
|
128
|
+
delete current.waitReason;
|
|
129
|
+
return [shard.id, { ...current, state, endedAt: now.toISOString(), ...(result && typeof result.rc === 'number' ? { rc: result.rc } : {}) } satisfies GateShard];
|
|
130
|
+
}));
|
|
131
|
+
return { ...file, updatedAt: now.toISOString(), shards: file.shards.map((shard) => byId.get(shard.id) ?? shard) };
|
|
132
|
+
}
|
|
133
|
+
|
|
73
134
|
function verdictOf(value: unknown): GateShardsVerdict | undefined {
|
|
74
135
|
if (!value || typeof value !== 'object') return undefined;
|
|
75
136
|
const raw = value as Record<string, unknown>;
|
|
@@ -7,7 +7,7 @@ import { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
|
|
|
7
7
|
import { tmpdir } from 'node:os';
|
|
8
8
|
import { join } from 'node:path';
|
|
9
9
|
import { debug } from '../debug/log.js';
|
|
10
|
-
import {
|
|
10
|
+
import { runSelfGateCliAsync, type SelfGateCliOptions, type SelfGateCliResult } from '../self-implement/gate-cli.js';
|
|
11
11
|
import { dispatchHeavyCheck, isValidGateHost, type DispatchDeps, type DispatchOptions } from '../self-implement/gate-remote.js';
|
|
12
12
|
import { latestPublishedPreviousVersion } from '../../scripts/release-loop/unattended-release.js';
|
|
13
13
|
import { baseVersion, isReleaseVersion } from '../../scripts/release-loop/release-version.js';
|
|
@@ -29,6 +29,8 @@ export interface LightRcOptions {
|
|
|
29
29
|
/** Run on this machine (the remote child is re-invoked with it). */
|
|
30
30
|
local?: boolean;
|
|
31
31
|
shards?: number;
|
|
32
|
+
/** Maximum simultaneously active gate bundles, including per-file RSS samples (default three). */
|
|
33
|
+
shardConcurrency?: number;
|
|
32
34
|
/** OP FU — pass `--fixed-shard-distribution` to self gate (sorted round-robin into `shards`, no RSS pre-measurement).
|
|
33
35
|
* Opt-in; absent = the measured planner, unchanged. Also carried to the remote child. */
|
|
34
36
|
fixedShardDistribution?: boolean;
|
|
@@ -71,7 +73,7 @@ export interface LightRcDeps {
|
|
|
71
73
|
git?: (args: string[], cwd: string) => { rc: number | null; stdout: string };
|
|
72
74
|
previousVersion?: (version: string, ledgerRoot?: string) => string;
|
|
73
75
|
readFile?: (path: string) => string | undefined;
|
|
74
|
-
runGate?: (cwd: string, options: SelfGateCliOptions) => SelfGateCliResult
|
|
76
|
+
runGate?: (cwd: string, options: SelfGateCliOptions) => SelfGateCliResult | Promise<SelfGateCliResult>;
|
|
75
77
|
dispatch?: (opts: DispatchOptions, deps?: DispatchDeps) => Promise<number>;
|
|
76
78
|
/** Extra dispatch deps (runner · settings) — tests drive the real dispatch with a fake host. */
|
|
77
79
|
dispatchDeps?: Omit<DispatchDeps, 'write'>;
|
|
@@ -175,6 +177,7 @@ export async function runLightRc(version: string, opts: LightRcOptions = {}, dep
|
|
|
175
177
|
if (!isReleaseVersion(version)) throw new Error(`release version must be x.y.z: ${version}`);
|
|
176
178
|
const shards = opts.shards ?? LIGHT_RC_DEFAULT_SHARDS;
|
|
177
179
|
if (!Number.isSafeInteger(shards) || shards < 1) throw new Error(`invalid --shards count: ${opts.shards}`);
|
|
180
|
+
if (opts.shardConcurrency !== undefined && (!Number.isSafeInteger(opts.shardConcurrency) || opts.shardConcurrency < 1 || opts.shardConcurrency > 4)) throw new Error(`invalid --shard-concurrency: ${opts.shardConcurrency}`);
|
|
178
181
|
if (opts.remote !== undefined && !isValidGateHost(opts.remote)) throw new Error(`invalid --remote host: ${opts.remote}`);
|
|
179
182
|
const log = opts.log ?? ((line: string) => process.stderr.write(`${line}\n`));
|
|
180
183
|
const cwd = repoRoot(deps);
|
|
@@ -195,7 +198,7 @@ export async function runLightRc(version: string, opts: LightRcOptions = {}, dep
|
|
|
195
198
|
try {
|
|
196
199
|
const dir = checkout?.dir ?? cwd;
|
|
197
200
|
if (checkout) alwaysInclude = readList(dir);
|
|
198
|
-
local = (deps.runGate ??
|
|
201
|
+
local = await (deps.runGate ?? runSelfGateCliAsync)(dir, { base, shards, ...(opts.shardConcurrency !== undefined ? { shardConcurrency: opts.shardConcurrency } : {}), ...(opts.fixedShardDistribution ? { fixedShardDistribution: true } : {}), alwaysInclude, includeImporterTests: true });
|
|
199
202
|
if (opts.rehearsalTui) {
|
|
200
203
|
const command = async (cmd: string, args: string[], tree: string, limitMs?: number) => {
|
|
201
204
|
const run = spawnSync(cmd, args, { cwd: tree, encoding: 'utf8', timeout: limitMs });
|
|
@@ -212,7 +215,7 @@ export async function runLightRc(version: string, opts: LightRcOptions = {}, dep
|
|
|
212
215
|
// Keep the self-gate contract: an unavailable remote leaves this release check unmeasured; do not start a heavy gate locally.
|
|
213
216
|
tool: 'self-gate', repo: cwd, installPwa: true, refs: [base], json: true, commit: measuredCommit,
|
|
214
217
|
// The host re-runs this command with --local (and ELANOUS_GATE_REMOTE_CHILD=1), so it never recurses.
|
|
215
|
-
remoteArgv: (sha) => ['bun', 'bin/elanous.mjs', 'release', 'light-rc', '--version', version, '--base', sha(base), '--head', measuredCommit, '--shards', String(shards), ...(opts.fixedShardDistribution ? ['--fixed-shard-distribution'] : []), '--local', '--json', ...(opts.rehearsalTui ? ['--rehearsal-tui'] : [])],
|
|
218
|
+
remoteArgv: (sha) => ['bun', 'bin/elanous.mjs', 'release', 'light-rc', '--version', version, '--base', sha(base), '--head', measuredCommit, '--shards', String(shards), ...(opts.shardConcurrency !== undefined ? ['--shard-concurrency', String(opts.shardConcurrency)] : []), ...(opts.fixedShardDistribution ? ['--fixed-shard-distribution'] : []), '--local', '--json', ...(opts.rehearsalTui ? ['--rehearsal-tui'] : [])],
|
|
216
219
|
flags: { remote: opts.local ? undefined : opts.remote ?? true, local: !!opts.local },
|
|
217
220
|
runLocal,
|
|
218
221
|
}, {
|
|
@@ -495,7 +495,7 @@ export async function runRehearsalTick(opts: RehearsalOptions = {}, deps: Rehear
|
|
|
495
495
|
const introducedCount: number | null = stamp.outcome === 'unmeasured' || stamp.outcome === 'error' ? null : hard.introduced.length;
|
|
496
496
|
const preexistingCount: number | null = introducedCount === null ? null : hard.preexisting;
|
|
497
497
|
const totalFailures: number | null = introducedCount === null || preexistingCount === null ? null : introducedCount + preexistingCount;
|
|
498
|
-
stamp.summary = oneLine(`hard gate ${hard.outcome} · introduced ${introducedCount ?? 'UNKNOWN'} · preexisting ${preexistingCount ?? 'UNKNOWN'} · total failures ${totalFailures ?? 'UNKNOWN'} ·
|
|
498
|
+
stamp.summary = oneLine(`hard gate ${hard.outcome} · introduced ${introducedCount ?? 'UNKNOWN'} · preexisting ${preexistingCount ?? 'UNKNOWN'} · total failures ${totalFailures ?? 'UNKNOWN'} · 원격 Pod · 12 shards · runId ${hardGateRunId} · evidence ${hardGateLog}${cause ? ` · ${cause}` : ''}`);
|
|
499
499
|
} else {
|
|
500
500
|
const shardPlan = opts.shards === undefined ? (deps.shardPlan ?? planRehearsalShards)(plan.version, root, checkout, { ...deps.shardPlanDeps, remoteGate: true }) : undefined;
|
|
501
501
|
if (shardPlan) stamp.shardPlan = shardPlan;
|
package/src/repl/index.ts
CHANGED
|
@@ -198,6 +198,7 @@ function buildReplTools(): {
|
|
|
198
198
|
specs.push(wakeup.spec);
|
|
199
199
|
dispatchByName.set(wakeup.spec.name, wakeup.dispatch);
|
|
200
200
|
}
|
|
201
|
+
(require('../tui/sidetab/nl-tool.js') as typeof import('../tui/sidetab/nl-tool.js')).registerNextSidetabReplTool(specs, dispatchByName, process as unknown as import('../tui/sidetab/nl-tool.js').NextSidetabIpcProcess);
|
|
201
202
|
const planner = sr.createSearchPlannerState({ maxAutoNarrowCandidates: 2 });
|
|
202
203
|
const dispatch = async (name: string, args: Record<string, unknown>): Promise<unknown> => {
|
|
203
204
|
try {
|
|
@@ -342,6 +343,7 @@ async function runOneTurn(
|
|
|
342
343
|
jsonOutput: boolean,
|
|
343
344
|
nextTuiDelivery?: { pending: PendingTaskNotification[] },
|
|
344
345
|
onJsonDelta?: (delta: string) => void,
|
|
346
|
+
onJsonStatus?: (line: string) => void,
|
|
345
347
|
): Promise<{ reply: string; provider: string; model: string | null; durationMs: number; logPath: string | null }> {
|
|
346
348
|
const startedAt = Date.now();
|
|
347
349
|
const replyChunks: string[] = [];
|
|
@@ -374,6 +376,10 @@ async function runOneTurn(
|
|
|
374
376
|
userText,
|
|
375
377
|
systemPrompt,
|
|
376
378
|
userImages: userImages.length > 0 ? userImages : undefined,
|
|
379
|
+
...(process.env.ELANOUS_TEST_FAKE_LLM === '1' && Number.isFinite(Number(process.env.ELANOUS_TEST_FAKE_LLM_IDLE_TIMEOUT_MS))
|
|
380
|
+
&& Number(process.env.ELANOUS_TEST_FAKE_LLM_IDLE_TIMEOUT_MS) > 0
|
|
381
|
+
? { llmOpts: { streamIdleTimeoutMs: Number(process.env.ELANOUS_TEST_FAKE_LLM_IDLE_TIMEOUT_MS) } }
|
|
382
|
+
: {}),
|
|
377
383
|
onDelta: (d) => {
|
|
378
384
|
if (jsonOutput) {
|
|
379
385
|
replyChunks.push(d);
|
|
@@ -381,6 +387,7 @@ async function runOneTurn(
|
|
|
381
387
|
}
|
|
382
388
|
else process.stdout.write(d);
|
|
383
389
|
},
|
|
390
|
+
onStatusLine: (line) => { onJsonStatus?.(line); },
|
|
384
391
|
tools: replToolSpecs,
|
|
385
392
|
dispatchTool: tools?.dispatch,
|
|
386
393
|
onToolCall: (call) => {
|
|
@@ -785,6 +792,9 @@ export async function runRepl(opts: ReplOpts): Promise<number> {
|
|
|
785
792
|
process.env.ELANOUS_NEXT_TUI_STREAM === '1' && typeof turn.id === 'string'
|
|
786
793
|
? (delta) => { process.stdout.write(`${JSON.stringify({ event: 'delta', turnId: turn.id, text: delta })}\n`); }
|
|
787
794
|
: undefined,
|
|
795
|
+
process.env.ELANOUS_NEXT_TUI_STREAM === '1' && typeof turn.id === 'string'
|
|
796
|
+
? (text) => { process.stdout.write(`${JSON.stringify({ event: 'status', turnId: turn.id, text })}\n`); }
|
|
797
|
+
: undefined,
|
|
788
798
|
);
|
|
789
799
|
} catch (error) {
|
|
790
800
|
if (!backgroundBridge) throw error;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Research-only native fanout. The caller supplies Bloom's question ladder;
|
|
2
|
+
// each axis gets its own direct tool call and evidence stays attributed to it.
|
|
3
|
+
import type { BloomResearchQuestion, ResearchEvidenceEnvelope } from '../auto-research/question-ladder-contract.js';
|
|
4
|
+
import type { WebSearchHit } from '../web-search/provider.js';
|
|
5
|
+
|
|
6
|
+
export interface AxisToolCallPlan {
|
|
7
|
+
questionId: string;
|
|
8
|
+
tool: 'OmniSearch';
|
|
9
|
+
query: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface AxisEvidenceGroup {
|
|
13
|
+
questionId: string;
|
|
14
|
+
evidence: ResearchEvidenceEnvelope[];
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface AxisFanoutResult {
|
|
19
|
+
plan: AxisToolCallPlan[];
|
|
20
|
+
axes: AxisEvidenceGroup[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type AxisSearchHit = WebSearchHit & { engine?: string };
|
|
24
|
+
export interface AxisSearchResult {
|
|
25
|
+
hits: AxisSearchHit[];
|
|
26
|
+
errors: string[];
|
|
27
|
+
}
|
|
28
|
+
export type AxisSearch = (query: string) => Promise<AxisSearchHit[] | AxisSearchResult>;
|
|
29
|
+
|
|
30
|
+
export interface AxisFanoutDeps {
|
|
31
|
+
search?: AxisSearch;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Keep every query attached to the Bloom question that produced it. */
|
|
35
|
+
export function planAxisToolCalls(questions: readonly BloomResearchQuestion[]): AxisToolCallPlan[] {
|
|
36
|
+
return questions.flatMap(question => question.searchTerms
|
|
37
|
+
.map(query => query.trim())
|
|
38
|
+
.filter(Boolean)
|
|
39
|
+
.map(query => ({ questionId: question.id, tool: 'OmniSearch' as const, query })));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function directOmniSearch(query: string): Promise<AxisSearchResult> {
|
|
43
|
+
const { dispatchOmniSearch } = await import('../skills/tools/omni-search.js');
|
|
44
|
+
const hits: AxisSearchHit[] = [];
|
|
45
|
+
const result = await dispatchOmniSearch({ query }, { onSource: hit => { hits.push(hit); } });
|
|
46
|
+
if (Object.keys(result.metadata.perEngine).length === 0) {
|
|
47
|
+
throw new Error('no available web-search providers');
|
|
48
|
+
}
|
|
49
|
+
const errors = Object.entries(result.metadata.perEngine)
|
|
50
|
+
.flatMap(([engine, info]) => info.error ? [`${engine}: ${info.error}`] : []);
|
|
51
|
+
return { hits, errors };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function evidenceFromHit(question: BloomResearchQuestion, hit: AxisSearchHit): ResearchEvidenceEnvelope {
|
|
55
|
+
const published = hit.publishedAt;
|
|
56
|
+
const date = published !== undefined && Number.isFinite(published) && published > 0
|
|
57
|
+
? new Date(published) : undefined;
|
|
58
|
+
const observedAt = date && Number.isFinite(date.getTime()) ? date.toISOString() : undefined;
|
|
59
|
+
return {
|
|
60
|
+
questionId: question.id,
|
|
61
|
+
sourceKind: hit.engine ? `web-search:${hit.engine}` : 'web-search',
|
|
62
|
+
source: hit.url,
|
|
63
|
+
...(question.requestedWindow ? { requestedWindow: question.requestedWindow } : {}),
|
|
64
|
+
...(observedAt ? { observedAt } : {}),
|
|
65
|
+
content: [hit.title, hit.snippet].filter(Boolean).join(' — '),
|
|
66
|
+
outcome: hit.snippet ? 'complete' : 'partial',
|
|
67
|
+
truncated: true, // Search snippets are excerpts, not the complete source page.
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function failedEvidence(question: BloomResearchQuestion, query: string, message: string): ResearchEvidenceEnvelope {
|
|
72
|
+
return {
|
|
73
|
+
questionId: question.id,
|
|
74
|
+
sourceKind: 'search-query',
|
|
75
|
+
source: query,
|
|
76
|
+
...(question.requestedWindow ? { requestedWindow: question.requestedWindow } : {}),
|
|
77
|
+
content: message,
|
|
78
|
+
outcome: 'failed',
|
|
79
|
+
truncated: false,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Invoke all axis queries concurrently, preserving ladder order and partial failures. */
|
|
84
|
+
export async function fanOutAxisEvidence(
|
|
85
|
+
questions: readonly BloomResearchQuestion[],
|
|
86
|
+
deps: AxisFanoutDeps = {},
|
|
87
|
+
): Promise<AxisFanoutResult> {
|
|
88
|
+
const plan = planAxisToolCalls(questions);
|
|
89
|
+
if (new Set(questions.map(question => question.id)).size !== questions.length) {
|
|
90
|
+
throw new Error('research axis question IDs must be unique');
|
|
91
|
+
}
|
|
92
|
+
const search = deps.search ?? directOmniSearch;
|
|
93
|
+
const settled = await Promise.allSettled(plan.map(call => search(call.query)));
|
|
94
|
+
const axes: AxisEvidenceGroup[] = questions.map(question => ({ questionId: question.id, evidence: [] }));
|
|
95
|
+
const groups = new Map(axes.map(axis => [axis.questionId, axis]));
|
|
96
|
+
const byQuestion = new Map(questions.map(question => [question.id, question]));
|
|
97
|
+
for (const question of questions) {
|
|
98
|
+
if (!plan.some(call => call.questionId === question.id)) {
|
|
99
|
+
const group = groups.get(question.id)!;
|
|
100
|
+
group.error = 'no search terms';
|
|
101
|
+
group.evidence.push(failedEvidence(question, question.prompt, group.error));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
settled.forEach((outcome, index) => {
|
|
105
|
+
const call = plan[index]!;
|
|
106
|
+
const group = groups.get(call.questionId)!;
|
|
107
|
+
const question = byQuestion.get(call.questionId)!;
|
|
108
|
+
if (outcome.status === 'fulfilled') {
|
|
109
|
+
const response = Array.isArray(outcome.value) ? { hits: outcome.value, errors: [] } : outcome.value;
|
|
110
|
+
if (response.hits.length === 0 && response.errors.length === 0) {
|
|
111
|
+
group.evidence.push({ ...failedEvidence(question, call.query, 'no hits returned'), outcome: 'partial' });
|
|
112
|
+
}
|
|
113
|
+
for (const hit of response.hits) {
|
|
114
|
+
try {
|
|
115
|
+
group.evidence.push(evidenceFromHit(question, hit));
|
|
116
|
+
} catch (err) {
|
|
117
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
118
|
+
group.error = group.error ? `${group.error}; ${message}` : message;
|
|
119
|
+
group.evidence.push(failedEvidence(question, call.query, message));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (const message of response.errors) {
|
|
123
|
+
group.error = group.error ? `${group.error}; ${message}` : message;
|
|
124
|
+
group.evidence.push(failedEvidence(question, call.query, message));
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
const message = outcome.reason instanceof Error ? outcome.reason.message : String(outcome.reason);
|
|
128
|
+
group.error = group.error ? `${group.error}; ${message}` : message;
|
|
129
|
+
group.evidence.push(failedEvidence(question, call.query, message));
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
return { plan, axes };
|
|
133
|
+
}
|