elanous 0.2.36 → 0.2.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 1026-44010f405704050c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 1632.7d87f998e714bede.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
- package/apps/pwa/out/_next/static/chunks/{7784.1f0ac4a16d190cf4.js → 2104.70e086d5174a4736.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6566.926a1d1b7c911442.js → 214.186a430da28338f1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 2415.738b777642a02233.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 3086.fb14b60ce98b53d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3148-98efd4869d660a87.js → 3124-561f7f037943cde2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 3291.f6c1005387d514bd.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 3528.e4b8ab70d339f965.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3031-85328a92fcce4da6.js → 4199-f7c6eb40cd0322f8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +90 -0
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
- package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 5307.d7328020227880c2.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5638.107314dc479e2f37.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6925.562d532110879886.js → 6493.27ad77de7aac7966.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 7161-8f22db3ec5ed005e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 7488.966b116789f3d41a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4116.a84a92a2492c080e.js → 7524.ce973525d30b3d52.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 7628.6b16863ac3972333.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 7954.4f7a8832663ee979.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 8019.21ca554a821dad01.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 8487.291666583bebe640.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 8879.ac06755bcf3e44a1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 8911.bf5e712acb25fb6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 8994d93e.33ba491f95345fc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{599.c39c571b6733f2a2.js → 9223.cbcc88e0e9950426.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8037.e254fd797aa224d1.js → 9581.da63ddf41acfad46.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-e7abc34a48a6f71e.js → page-291ab19fe2acb173.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-c15958835534404b.js → page-6b140f77593576eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → b7459770.6539b11860eb8a9c.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → b7478fef.5917716286213fcc.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{2812ca6a.3b9f4a7a08885744.js → de8b930d.d94c0f42acf807fc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → eaad0cba.771200940c529df7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
- package/apps/pwa/out/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/graphs/drafts/recipes.yaml +27 -7
- package/graphs/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/graphs/work/draft-close.yaml +54 -0
- package/graphs/work/green-close.yaml +37 -0
- package/graphs/work/recipes.yaml +46 -1
- package/graphs/work/run-research.yaml +35 -0
- package/package.json +1 -1
- package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/boundary-proof-mapping-audit.ts +88 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/codex-fallback-live-probe.ts +17 -15
- package/scripts/fleet/node-setup.sh +32 -2
- package/scripts/fleet/run-light-worker.sh +9 -0
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +546 -0
- package/scripts/goals/authoring-metrics.ts +258 -0
- package/scripts/graph-units/draft-close-node.ts +222 -0
- package/scripts/hook-order-sweep.ts +7 -4
- package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
- package/scripts/land-global-checks.ts +69 -1
- package/scripts/measure-nl-routing-corpus.ts +207 -2
- package/scripts/provision-export-redactions.ts +15 -0
- package/scripts/public-copy-lint.ts +122 -0
- package/scripts/public-export.ts +69 -2
- package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
- package/scripts/ratchets/train-side-invariants.sh +7 -1
- package/scripts/release-loop/cut-branch.ts +61 -12
- package/scripts/release-loop/docs-node.ts +140 -0
- package/scripts/release-loop/gate-closure.ts +48 -0
- package/scripts/release-loop/gate-diff.ts +2 -1
- package/scripts/release-loop/gate-node.ts +161 -25
- package/scripts/release-loop/gate-partial.ts +82 -3
- package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
- package/scripts/release-loop/gate-radius-live.ts +4 -2
- package/scripts/release-loop/known-issues-node.ts +6 -4
- package/scripts/release-loop/notes-repair.ts +216 -0
- package/scripts/release-loop/prepare-node.ts +61 -5
- package/scripts/release-loop/resume-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +406 -7
- package/scripts/release-loop/resume-test-traffic.ts +10 -0
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/traffic-node.ts +12 -4
- package/scripts/release-loop/traffic-transition.ts +53 -13
- package/scripts/release-loop/version-node.ts +109 -15
- package/scripts/train/green-leg.ts +176 -0
- package/scripts/tui-continue-real-evidence.ts +47 -0
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/client.ts +31 -5
- package/src/acp/core-turn-bridge.ts +12 -1
- package/src/acp/stderr-summary.ts +49 -0
- package/src/agent/monad-agent-turn.ts +1 -0
- package/src/agent/run-context.ts +1 -1
- package/src/agent/task-notification.ts +3 -1
- package/src/agent/terminal-surface.ts +217 -0
- package/src/agent-substrate/pr-reviewer.ts +11 -3
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +537 -57
- package/src/auto-research/question-ladder-contract.ts +137 -0
- package/src/auto-research/research-turn.ts +134 -0
- package/src/autopilot/discovery/doc-lint.ts +1 -1
- package/src/autopilot/lineage/sources.ts +1 -1
- package/src/autopilot/pr-manager.ts +64 -13
- package/src/boot/daemon-runtime.ts +35 -3
- package/src/boot/daemon-tools/pty-shell.ts +2 -1
- package/src/bots/screen-probe.ts +1 -1
- package/src/budget/run-usage-rollup.ts +12 -7
- package/src/budget/unified-usage.ts +20 -0
- package/src/capture/tui-self-report.ts +42 -5
- package/src/chat/index.ts +1 -0
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/autopilot-cli.ts +24 -9
- package/src/cli/decisions-cli.ts +7 -4
- package/src/cli/doctor-cli.ts +116 -7
- package/src/cli/guardian-cli.ts +3 -1
- package/src/cli/intake-cli.ts +48 -12
- package/src/cli/lesson-cli.ts +69 -9
- package/src/cli/logs-cli.ts +357 -2
- package/src/cli/memory-cli.ts +30 -1
- package/src/cli/msg-cli.ts +15 -11
- package/src/cli/pr-granularity.ts +5 -3
- package/src/cli/pr-land-overlap-evidence.ts +38 -5
- package/src/cli/pr-land-refusal.ts +1 -1
- package/src/cli/pty-takeover-cli.ts +58 -5
- package/src/cli/release-checklist-read-cli.ts +112 -4
- package/src/cli/release-cli.ts +89 -18
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +24 -6
- package/src/cli/self-utterances-cli.ts +13 -16
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +370 -33
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/cli/usage-cli.ts +12 -10
- package/src/context-bus/claude-memory-import.ts +99 -0
- package/src/context-bus/context-now.ts +86 -2
- package/src/context-bus/long-term-memory.ts +125 -0
- package/src/core-turn/run-core-turn.ts +9 -2
- package/src/core-turn/run-goal-loop.ts +5 -2
- package/src/core-turn/types.ts +5 -0
- package/src/dashboard/chat/acp-chat.ts +9 -0
- package/src/dashboard/index.ts +115 -30
- package/src/dashboard/input/agent-wake.ts +43 -0
- package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/replay-preview.ts +25 -0
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +19 -8
- package/src/dashboard/synchronized-frame-output.ts +74 -0
- package/src/dashboard/term-slash-runtime.ts +2 -0
- package/src/dashboard/turn-preamble.ts +28 -4
- package/src/display/coordinator.ts +45 -12
- package/src/display/resize-listener.ts +41 -20
- package/src/display/synchronized-output-region.ts +60 -0
- package/src/domains/guardian-tick.ts +9 -0
- package/src/domains/surface-events.ts +80 -1
- package/src/exec-requests/planner.ts +37 -2
- package/src/execution-loop/launch-gate.ts +4 -3
- package/src/git-fs/cli-stderr.ts +45 -0
- package/src/git-fs/gh-cli.ts +6 -3
- package/src/git-fs/git-cli.ts +11 -5
- package/src/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-cli.ts +26 -2
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/graph-run-api.ts +3 -2
- package/src/graph-runner/runner.ts +34 -7
- package/src/graph-wizard/generate.ts +29 -6
- package/src/grok/credential.ts +107 -36
- package/src/harness/harness-cli-command.ts +179 -33
- package/src/harness/review-adapter.ts +26 -6
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +151 -18
- package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
- package/src/intake-plane/collect-telegram-saved.ts +54 -5
- package/src/interactive-terminal-modal.ts +3 -0
- package/src/keybindings.ts +17 -22
- package/src/llm/provider-credentials.ts +1 -1
- package/src/llm/route-decision.ts +13 -0
- package/src/llm-tool-name.ts +37 -0
- package/src/llm-tool-schema.ts +55 -0
- package/src/llm.ts +203 -21
- package/src/loops/checker.ts +100 -0
- package/src/loops/consensus.ts +26 -2
- package/src/loops/loop-cli.ts +9 -4
- package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +55 -7
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/model-tier/llm-tier-map.ts +12 -17
- package/src/msg/msg-store.ts +17 -0
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/graph-wizard-api.ts +27 -2
- package/src/nexus/api/grid.ts +24 -4
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/ops-api.ts +14 -6
- package/src/nexus/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/nexus/state/state.ts +7 -1
- package/src/oauth/codex-account-store.ts +34 -1
- package/src/ops/loops-map.ts +46 -0
- package/src/ops/overview-cache.ts +22 -4
- package/src/ops/overview.ts +41 -5
- package/src/patents/ledger.ts +18 -1
- package/src/policy/llm-policy.ts +3 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +9 -4
- package/src/pty-shell/availability.ts +7 -0
- package/src/pty-shell/herdr-agent-report.ts +40 -31
- package/src/pty-shell/herdr-prune-stale.ts +17 -0
- package/src/pty-shell/herdr-sequence-lease.ts +60 -0
- package/src/pty-shell/pty-control-ipc.ts +187 -18
- package/src/pty-shell/pty-manifest.ts +16 -2
- package/src/pty-shell/registry.ts +25 -15
- package/src/pty-shell/tui-run-state.ts +235 -1
- package/src/release-loop/checklist.ts +50 -5
- package/src/release-loop/feature-store.ts +9 -9
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/landed-but-yellow.ts +93 -12
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/repl/index.ts +18 -0
- package/src/research/axis-fanout.ts +133 -0
- package/src/research/edge-decision.ts +88 -0
- package/src/research/output-router.ts +127 -0
- package/src/research-bridge/format.ts +16 -1
- package/src/research-bridge/index.ts +1 -0
- package/src/research-bridge/invoke.ts +41 -5
- package/src/seat-loop/seat-report.ts +1 -0
- package/src/self-dev/ask-launch-flow.ts +86 -10
- package/src/self-dev/decompose-proposal.ts +29 -18
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/dev-pipeline.ts +29 -7
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +254 -16
- package/src/self-dev/draft-triage-rules.ts +19 -5
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/review-provider-fallback.ts +45 -7
- package/src/self-dev/run-supervisor.ts +22 -7
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-run.ts +310 -6
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/doctor-visit.ts +108 -0
- package/src/self-implement/gate-artifacts.ts +6 -2
- package/src/self-implement/gate-baseline.ts +99 -1
- package/src/self-implement/gate-cli.ts +231 -82
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-remote.ts +30 -4
- package/src/self-implement/gate-scope.ts +13 -1
- package/src/self-implement/goal-author.ts +407 -21
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +110 -27
- package/src/self-implement/importer-test-index.ts +215 -2
- package/src/self-implement/knowhow-pack.ts +125 -12
- package/src/self-implement/l8-merge-queue.ts +198 -32
- package/src/self-implement/off-diff-evidence.ts +23 -0
- package/src/self-implement/orchestrator.ts +369 -33
- package/src/self-implement/pod-inplace-worktree.ts +82 -0
- package/src/self-implement/pod-warm-pool-profile.ts +2 -2
- package/src/self-implement/premise-review.ts +7 -5
- package/src/self-implement/review-round-brief.ts +300 -0
- package/src/self-implement/rework-policy.ts +14 -0
- package/src/self-implement/run-ledger.ts +428 -6
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/running-runs.ts +17 -3
- package/src/self-implement/seams.ts +45 -16
- package/src/self-implement/self-implement-cli.ts +26 -2
- package/src/self-implement/stop-autoheal.ts +1 -0
- package/src/self-implement/test-seams.ts +13 -1
- package/src/self-implement/train-reach-grouping.ts +8 -2
- package/src/session/channel-ask-op-envelope.ts +36 -0
- package/src/session/channel-op-reply-route.ts +200 -0
- package/src/session/chat.ts +10 -1
- package/src/session/id-prefix.ts +60 -0
- package/src/session/index.ts +6 -0
- package/src/session-runtime/index.ts +18 -23
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/pty.ts +5 -0
- package/src/skills/tools/schedule-wakeup.ts +1 -6
- package/src/status/bar.ts +3 -3
- package/src/status/metrics.ts +12 -1
- package/src/steward/rejudge-tick.ts +12 -5
- package/src/steward/resync-tick.ts +31 -4
- package/src/storage/file-lock.ts +17 -4
- package/src/task-agent/actions.ts +199 -4
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/boundary-proof-mapping.ts +12 -0
- package/src/task-agent/boundary-proof-producer.ts +147 -0
- package/src/task-agent/completion-evidence.ts +2 -1
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/green-close-recipe.ts +239 -0
- package/src/task-agent/green-sweep.ts +64 -10
- package/src/task-agent/live-moves.ts +48 -3
- package/src/task-agent/map-host-adapter.ts +134 -0
- package/src/task-agent/map-reduce.ts +158 -0
- package/src/task-agent/map-run-ledger.ts +226 -0
- package/src/task-agent/parent-host.ts +74 -17
- package/src/task-agent/rejudge-on-head.ts +72 -5
- package/src/task-agent/repair-cycle.ts +108 -8
- package/src/task-agent/repair-next-move.ts +12 -2
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/review-prior-fix.ts +12 -2
- package/src/task-agent/shadow.ts +188 -5
- package/src/task-agent/task-hand.ts +253 -20
- package/src/task-agent/task-parent-role-llm.ts +9 -0
- package/src/task-agent/tier-split.ts +40 -5
- package/src/task-agent/work-order.ts +53 -2
- package/src/task-orchestrator/dispatcher.ts +46 -1
- package/src/task-orchestrator/generator-prompt.ts +6 -0
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +77 -8
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +338 -79
- package/src/task-orchestrator/surfaces/self-implement.ts +37 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -0
- package/src/testing/linux-env.ts +177 -0
- package/src/tool-hints/gate.ts +6 -4
- package/src/tool-hints/signals.ts +33 -1
- package/src/tui/chat/background-job-status.ts +8 -2
- package/src/tui/chat/goal-interim.ts +5 -1
- package/src/tui/entry.ts +722 -30
- package/src/tui/input/at-picker.ts +55 -0
- package/src/tui/sidetab/attach.ts +304 -0
- package/src/tui/sidetab/list.ts +176 -0
- package/src/tui/sidetab/nl-tool.ts +136 -0
- package/src/tui/slash/resume-command.ts +23 -0
- package/src/tui/slash/resume.ts +38 -35
- package/src/tui/slash/signals.ts +114 -0
- package/src/tui/slash/term-next.ts +72 -0
- package/src/tui-client/local-chat-turn.ts +31 -9
- package/src/user-config.ts +30 -3
- package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
- package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
- package/src/ux-sim/fake-gh.ts +174 -0
- package/src/ux-sim/fake-kubectl.ts +142 -0
- package/src/ux-sim/fake-llm.ts +17 -6
- package/src/ux-sim/next-tui-seat-scenarios.ts +176 -6
- package/src/ux-sim/resume-picker-device.ts +173 -0
- package/src/ux-sim/session-id-seed.ts +60 -0
- package/src/ux-sim/skills-tools-shell-device.ts +156 -0
- package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
- package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +0 -64
- package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
- package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
- package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
- package/apps/pwa/out/_next/static/chunks/2986.45d7652e4f13557e.js +0 -2
- package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
- package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
- package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
- package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
- package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
- package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +0 -1
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
- package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
- package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7481.39f7a4654907bf6e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
- package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
- package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ccae1c4b-0cf414f5eff1b10d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
- package/scripts/migrate-monad-to-elanous.ts +0 -195
- package/scripts/rebrand-elanous.ts +0 -242
- /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** Convert legacy JSON Schema tuple `items` arrays to the modern
|
|
2
|
+
* `prefixItems` form used by Grok's OpenAI-compatible tool validator.
|
|
3
|
+
* Other schema keywords, including min/maxItems and coordinate constraints,
|
|
4
|
+
* are preserved recursively. */
|
|
5
|
+
export function sanitizeToolSchemaForGrok(schema: unknown): unknown {
|
|
6
|
+
if (Array.isArray(schema)) return schema.map(sanitizeToolSchemaForGrok);
|
|
7
|
+
if (!schema || typeof schema !== 'object') return schema;
|
|
8
|
+
|
|
9
|
+
const record = schema as Record<string, unknown>;
|
|
10
|
+
const tupleItems = Array.isArray(record.items) ? record.items : undefined;
|
|
11
|
+
const hasPrefixItems = Array.isArray(record.prefixItems);
|
|
12
|
+
const hasAdditionalItems = Object.prototype.hasOwnProperty.call(record, 'additionalItems');
|
|
13
|
+
const output: Record<string, unknown> = {};
|
|
14
|
+
|
|
15
|
+
for (const [key, value] of Object.entries(record)) {
|
|
16
|
+
if (key === 'additionalItems' || (key === 'items' && tupleItems)) continue;
|
|
17
|
+
output[key] = sanitizeToolSchemaForGrok(value);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (tupleItems) {
|
|
21
|
+
output.prefixItems = tupleItems.map(sanitizeToolSchemaForGrok);
|
|
22
|
+
}
|
|
23
|
+
if (hasAdditionalItems && (tupleItems || hasPrefixItems)) {
|
|
24
|
+
output.items = sanitizeToolSchemaForGrok(record.additionalItems);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return output;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Anthropic-backed Claude APIs reject top-level JSON Schema composition on tool inputs.
|
|
31
|
+
* Check every tool before serialization so a newly introduced tool cannot turn a whole
|
|
32
|
+
* Claude request into a 400 and trigger an unnoticed provider fallback. Nested schemas
|
|
33
|
+
* remain valid and are deliberately not inspected here. */
|
|
34
|
+
export function assertNoTopLevelToolSchemaCombinators(
|
|
35
|
+
tools: readonly { name: string; parameters: unknown }[] | undefined,
|
|
36
|
+
): void {
|
|
37
|
+
if (!tools?.length) return;
|
|
38
|
+
const combinators = ['anyOf', 'oneOf', 'allOf'] as const;
|
|
39
|
+
const invalid = tools.flatMap((tool) => {
|
|
40
|
+
if (!tool.parameters || typeof tool.parameters !== 'object' || Array.isArray(tool.parameters)) return [];
|
|
41
|
+
const schema = tool.parameters as Record<string, unknown>;
|
|
42
|
+
const found = combinators.filter((key) => Object.prototype.hasOwnProperty.call(schema, key));
|
|
43
|
+
return found.length ? [`${tool.name} (${found.join(', ')})`] : [];
|
|
44
|
+
});
|
|
45
|
+
if (invalid.length) {
|
|
46
|
+
throw new Error(`Claude tool schema has unsupported top-level composition: ${invalid.join('; ')}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** OpenRouter model ids may include the provider prefix; callers can pass
|
|
51
|
+
* either the catalog id or the already-normalized wire id. */
|
|
52
|
+
export function isOpenRouterGrokModel(model: string): boolean {
|
|
53
|
+
const wireModel = model.replace(/^openrouter\//i, '');
|
|
54
|
+
return /^x-ai\/grok(?:[-/]|$)/i.test(wireModel);
|
|
55
|
+
}
|
package/src/llm.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Auto-routes based on model name prefix, or picks the first available provider.
|
|
4
4
|
|
|
5
5
|
import { wellFormedLLMMessages } from './llm-wellformed.js';
|
|
6
|
-
import { createHash } from 'node:crypto';
|
|
6
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
7
7
|
import { testFakeLlmEnabled, testFakeLlmProvider } from './ux-sim/fake-llm.js';
|
|
8
8
|
import { realpathSync } from 'node:fs';
|
|
9
9
|
import { resolve } from 'node:path';
|
|
@@ -61,6 +61,8 @@ import { resolveModelAlias } from './intelligence-map/model-alias.js';
|
|
|
61
61
|
import { BUILTIN_CATALOG, reasoningEffortCeiling as reasoningEffortCeilingOf } from './intelligence-map/model-catalog.js';
|
|
62
62
|
import { inferProviderFromModel as registryInferProviderFromModel } from './registry/normalize.js';
|
|
63
63
|
import { closestMatches } from './tool-name-suggest.js';
|
|
64
|
+
import { createProviderToolNameMap } from './llm-tool-name.js';
|
|
65
|
+
import { assertNoTopLevelToolSchemaCombinators, isOpenRouterGrokModel, sanitizeToolSchemaForGrok } from './llm-tool-schema.js';
|
|
64
66
|
import { undoTurnRuntime } from './tool-runtime/undo-turn-runtime.js';
|
|
65
67
|
import { listSnapshots } from './undo-turn/index.js';
|
|
66
68
|
// Zero-dep spec module (no tool-runtime registry) — safe for this hot path.
|
|
@@ -276,6 +278,61 @@ export interface LLMToolSpec {
|
|
|
276
278
|
parameters: Record<string, unknown>; // JSONSchema
|
|
277
279
|
}
|
|
278
280
|
|
|
281
|
+
function toolUseNames(messages: readonly LLMMessage[]): string[] {
|
|
282
|
+
return messages.flatMap((message) => Array.isArray(message.content)
|
|
283
|
+
? message.content.flatMap((block) => block.type === 'tool_use' ? [block.name] : [])
|
|
284
|
+
: []);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function mapProviderToolNamesInMessages(
|
|
288
|
+
messages: readonly LLMMessage[],
|
|
289
|
+
mapName: (name: string) => string,
|
|
290
|
+
): LLMMessage[] {
|
|
291
|
+
return messages.map((message) => {
|
|
292
|
+
if (!Array.isArray(message.content)) return message;
|
|
293
|
+
let changed = false;
|
|
294
|
+
const content = message.content.map((block) => {
|
|
295
|
+
if (block.type !== 'tool_use') return block;
|
|
296
|
+
const name = mapName(block.name);
|
|
297
|
+
if (name === block.name) return block;
|
|
298
|
+
changed = true;
|
|
299
|
+
return { ...block, name };
|
|
300
|
+
});
|
|
301
|
+
return changed ? { ...message, content } : message;
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function restoreProviderToolCallNames(
|
|
306
|
+
events: AsyncIterable<LLMStreamEvent>,
|
|
307
|
+
mapName: (name: string) => string,
|
|
308
|
+
): AsyncIterableIterator<LLMStreamEvent> {
|
|
309
|
+
// Forward cancellation directly to the provider iterator. An async
|
|
310
|
+
// generator wrapper waits for a pending `next()` before servicing
|
|
311
|
+
// `return()`, which can strand the idle watchdog on a hanging stream.
|
|
312
|
+
const iterator = events[Symbol.asyncIterator]();
|
|
313
|
+
const mapped: AsyncIterableIterator<LLMStreamEvent> = {
|
|
314
|
+
[Symbol.asyncIterator]() { return mapped; },
|
|
315
|
+
async next(value?: unknown) {
|
|
316
|
+
const result = await iterator.next(value);
|
|
317
|
+
if (result.done) return { done: true, value: result.value };
|
|
318
|
+
const event = result.value;
|
|
319
|
+
return {
|
|
320
|
+
done: false,
|
|
321
|
+
value: event.type === 'tool_call' ? { ...event, name: mapName(event.name) } : event,
|
|
322
|
+
};
|
|
323
|
+
},
|
|
324
|
+
async return(value?: void) {
|
|
325
|
+
if (iterator.return) return iterator.return(value);
|
|
326
|
+
return { done: true, value };
|
|
327
|
+
},
|
|
328
|
+
async throw(error?: unknown) {
|
|
329
|
+
if (iterator.throw) return iterator.throw(error);
|
|
330
|
+
throw error;
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
return mapped;
|
|
334
|
+
}
|
|
335
|
+
|
|
279
336
|
/** Events produced by a streaming provider call. Text deltas arrive
|
|
280
337
|
* incrementally; tool_call events are emitted as COMPLETE units once
|
|
281
338
|
* the provider finishes streaming the tool_use block — callers don't
|
|
@@ -346,6 +403,9 @@ export type ToolChoice = 'auto' | 'required' | 'none' | { name: string };
|
|
|
346
403
|
|
|
347
404
|
export interface LLMOpts {
|
|
348
405
|
model?: string;
|
|
406
|
+
/** Explicit research surface verdict from the turn router. Relaxes early
|
|
407
|
+
* exploration guards while retaining a finite tool-loop hard stop. */
|
|
408
|
+
researchTurn?: boolean;
|
|
349
409
|
/** Reports the provider and model actually attempted, including fallbacks. */
|
|
350
410
|
onResolvedProvider?(provider: string, model: string): void;
|
|
351
411
|
temperature?: number;
|
|
@@ -359,6 +419,8 @@ export interface LLMOpts {
|
|
|
359
419
|
usageRole?: ModelRole;
|
|
360
420
|
/** Optional per-call metering phase; absent calls keep the existing ledger shape. */
|
|
361
421
|
usagePhase?: string;
|
|
422
|
+
/** Optional per-call self-dev job kind; absent calls keep the existing ledger shape. */
|
|
423
|
+
usageJobKind?: string;
|
|
362
424
|
/** Optional streamLLM usage-ledger site override (defaults to "stream-llm"). */
|
|
363
425
|
usageSite?: string;
|
|
364
426
|
/**
|
|
@@ -2556,7 +2618,7 @@ export function sanitizeToolSchemaForKimi(schema: unknown): unknown {
|
|
|
2556
2618
|
]));
|
|
2557
2619
|
}
|
|
2558
2620
|
|
|
2559
|
-
export function toOpenAITools(tools: LLMToolSpec[] | undefined, kimi = false): any[] | undefined {
|
|
2621
|
+
export function toOpenAITools(tools: LLMToolSpec[] | undefined, kimi = false, grokTupleItems = false): any[] | undefined {
|
|
2560
2622
|
const unique = dedupeToolsByName(tools);
|
|
2561
2623
|
if (!unique || unique.length === 0) return undefined;
|
|
2562
2624
|
return unique.map(t => ({
|
|
@@ -2565,7 +2627,9 @@ export function toOpenAITools(tools: LLMToolSpec[] | undefined, kimi = false): a
|
|
|
2565
2627
|
name: t.name, description: t.description,
|
|
2566
2628
|
parameters: kimi
|
|
2567
2629
|
? sanitizeToolSchemaForKimi(strictifyToolSchema(t.parameters))
|
|
2568
|
-
:
|
|
2630
|
+
: grokTupleItems
|
|
2631
|
+
? sanitizeToolSchemaForGrok(strictifyToolSchema(t.parameters))
|
|
2632
|
+
: strictifyToolSchema(t.parameters),
|
|
2569
2633
|
},
|
|
2570
2634
|
}));
|
|
2571
2635
|
}
|
|
@@ -4410,6 +4474,7 @@ function explainAndLogFallbackCandidates(
|
|
|
4410
4474
|
|
|
4411
4475
|
/** 스트림 중 끊김 재시도 상한 — codex `DEFAULT_STREAM_MAX_RETRIES`(5) 와 같은 값. */
|
|
4412
4476
|
const STREAM_DISCONNECT_MAX_RETRIES = 5;
|
|
4477
|
+
const STREAM_IDLE_TIMEOUT_MAX_RETRIES = 1;
|
|
4413
4478
|
let streamDisconnectRetryDelayMs: (attempt: number) => number = backoffMs;
|
|
4414
4479
|
|
|
4415
4480
|
/** @internal 시험 seam — 재시도 대기(기본 `backoffMs`)를 바꾼다. `undefined` 면 원복. */
|
|
@@ -4843,6 +4908,7 @@ export async function streamLLM(
|
|
|
4843
4908
|
);
|
|
4844
4909
|
activeProvider = finalized.provider;
|
|
4845
4910
|
const activeModel = finalized.model;
|
|
4911
|
+
if (getModelFamily(activeModel) === 'claude') assertNoTopLevelToolSchemaCombinators(opts.tools);
|
|
4846
4912
|
opts.onResolvedProvider?.(activeProvider.name, activeModel);
|
|
4847
4913
|
debug.log('llm.router', 'streamLLM', {
|
|
4848
4914
|
provider: activeProvider.name,
|
|
@@ -4868,7 +4934,7 @@ export async function streamLLM(
|
|
|
4868
4934
|
if (consumed.ok) {
|
|
4869
4935
|
if (consumed.usage !== 'unmeasured') {
|
|
4870
4936
|
try {
|
|
4871
|
-
logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole, phase: opts.usagePhase });
|
|
4937
|
+
logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole, phase: opts.usagePhase, jobKind: opts.usageJobKind });
|
|
4872
4938
|
} catch { /* best-effort observation */ }
|
|
4873
4939
|
}
|
|
4874
4940
|
debug.log('llm', 'outcome', { provider: activeProvider.name, status: 'ok', kind: 'streamLLM', durationMs: Date.now() - started });
|
|
@@ -5057,6 +5123,8 @@ export function resolveDefaultProvider(model?: string): LLMProvider {
|
|
|
5057
5123
|
export interface StreamWithToolsHandlers {
|
|
5058
5124
|
/** Streaming text delta — invoked for every text chunk across all turns. */
|
|
5059
5125
|
onText(delta: string, fullAcrossTurns: string): void;
|
|
5126
|
+
/** Optional status line for hosts that surface transient stream recovery. */
|
|
5127
|
+
onStatus?(line: string): void;
|
|
5060
5128
|
/** Dispatch a tool call. Returning undefined/null throws in the loop so
|
|
5061
5129
|
* callers should always return a JSON-serializable value (can be an
|
|
5062
5130
|
* error object — the model will see it as a tool_result either way).
|
|
@@ -7321,6 +7389,16 @@ function resultText(result: unknown): string {
|
|
|
7321
7389
|
return '';
|
|
7322
7390
|
}
|
|
7323
7391
|
|
|
7392
|
+
/** skill_exec returns structured host metadata, but its model-facing tool result is the answer body. */
|
|
7393
|
+
function toolResultContentForCall(toolName: string, result: unknown): string {
|
|
7394
|
+
if (toolName === 'skill_exec' && result && typeof result === 'object'
|
|
7395
|
+
&& typeof (result as { output?: unknown }).output === 'string') {
|
|
7396
|
+
if ((result as { ok?: unknown }).ok === false) return JSON.stringify(result);
|
|
7397
|
+
return (result as { output: string }).output;
|
|
7398
|
+
}
|
|
7399
|
+
return typeof result === 'string' ? result : JSON.stringify(result);
|
|
7400
|
+
}
|
|
7401
|
+
|
|
7324
7402
|
function detectExecutionFailure(result: unknown): boolean {
|
|
7325
7403
|
if (!result || typeof result !== 'object') return false;
|
|
7326
7404
|
const typed = result as Record<string, unknown>;
|
|
@@ -8104,17 +8182,19 @@ export function billingRouteForProvider(provider: string | undefined, model: str
|
|
|
8104
8182
|
}
|
|
8105
8183
|
|
|
8106
8184
|
/** Observe usage with optional site/role metadata; a provider-name string remains supported. */
|
|
8107
|
-
export function logAgentTurnUsage(model: string, usage: LLMUsage, providerNameOrOptions?: string | { providerName?: string; site?: string; role?: ModelRole; phase?: string }): void {
|
|
8185
|
+
export function logAgentTurnUsage(model: string, usage: LLMUsage, providerNameOrOptions?: string | { providerName?: string; site?: string; role?: ModelRole; phase?: string; jobKind?: string }): void {
|
|
8108
8186
|
try {
|
|
8109
8187
|
const providerName = typeof providerNameOrOptions === 'string' ? providerNameOrOptions : providerNameOrOptions?.providerName;
|
|
8110
8188
|
const site = (typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.site) ?? 'agent-turn';
|
|
8111
8189
|
const role = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.role;
|
|
8112
8190
|
const phase = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.phase;
|
|
8191
|
+
const jobKind = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.jobKind;
|
|
8113
8192
|
const billing = billingRouteForProvider(providerName, model);
|
|
8114
8193
|
debug.log('llm.usage', 'llm-usage', {
|
|
8115
8194
|
site,
|
|
8116
8195
|
...(role !== undefined ? { role } : {}),
|
|
8117
8196
|
...(phase !== undefined ? { phase } : {}),
|
|
8197
|
+
...(jobKind !== undefined ? { jobKind } : {}),
|
|
8118
8198
|
model,
|
|
8119
8199
|
...(usage.provider !== undefined && { provider: usage.provider }),
|
|
8120
8200
|
// ⭐ `provider` 는 «선 어댑터»(openai/anthropic)다 — 과금 주체는 별칭 칸으로(BACKLOG B10).
|
|
@@ -8241,6 +8321,10 @@ function applyCodexBehaviorGuard(
|
|
|
8241
8321
|
return enabled;
|
|
8242
8322
|
}
|
|
8243
8323
|
|
|
8324
|
+
function orchestrationId(): string {
|
|
8325
|
+
return randomUUID();
|
|
8326
|
+
}
|
|
8327
|
+
|
|
8244
8328
|
export async function streamLLMWithTools(
|
|
8245
8329
|
messages: LLMMessage[],
|
|
8246
8330
|
handlers: StreamWithToolsHandlers,
|
|
@@ -8261,10 +8345,13 @@ export async function streamLLMWithTools(
|
|
|
8261
8345
|
let blockedProviders: ProviderFallbackAttempt[] = [];
|
|
8262
8346
|
const effectiveModel = activeModel;
|
|
8263
8347
|
const modelFamily = getModelFamily(effectiveModel);
|
|
8348
|
+
const orchestration = orchestrationId();
|
|
8349
|
+
const followupHardStopStats = { wouldBlock: 0, blocked: 0 };
|
|
8264
8350
|
// Preserve pre-existing GPT-6 behavior while observing Codex-only sites.
|
|
8265
8351
|
const codexBehaviorGuards = usesCodexBehaviorGuards(effectiveModel);
|
|
8266
8352
|
const codexGuardCandidate = codexBehaviorGuards || isGpt6GenerationModel(effectiveModel);
|
|
8267
8353
|
debug.log('llm.router', 'streamLLMWithTools', {
|
|
8354
|
+
orchestrationId: orchestration,
|
|
8268
8355
|
provider: provider.name,
|
|
8269
8356
|
model: effectiveModel,
|
|
8270
8357
|
modelFamily,
|
|
@@ -8339,7 +8426,9 @@ export async function streamLLMWithTools(
|
|
|
8339
8426
|
const familyDefaultMaxTurns = resolved === 0 ? Number.POSITIVE_INFINITY : (resolved || baselineForFamily);
|
|
8340
8427
|
// `let` (not const) — the conditional budget-grant hook (opts.budgetGrant)
|
|
8341
8428
|
// may extend this mid-loop when a designated multi-round tool is called.
|
|
8342
|
-
let maxTurns = opts.maxTurns ??
|
|
8429
|
+
let maxTurns = opts.maxTurns ?? (opts.researchTurn
|
|
8430
|
+
? Math.min(32, Math.max(16, familyDefaultMaxTurns))
|
|
8431
|
+
: familyDefaultMaxTurns);
|
|
8343
8432
|
const budgetGrant = opts.budgetGrant;
|
|
8344
8433
|
// ⭐ Hydration-capable tool list (F2 gap④ · 2026-07-26). The provider tool
|
|
8345
8434
|
// array used to be `opts.tools`, FIXED for the whole loop. That made
|
|
@@ -8358,7 +8447,9 @@ export async function streamLLMWithTools(
|
|
|
8358
8447
|
} catch { /* config unreadable — default 비-면제·hot-path 는 config 손상에 안 막힌다 */ }
|
|
8359
8448
|
const inspectBudgetThreshold = getInspectBudgetThreshold(history, modelFamily, codexInspectExemptFlag);
|
|
8360
8449
|
const inspectFollowupMode = getInspectFollowupMode(history);
|
|
8361
|
-
const explorationThresholdForTurn =
|
|
8450
|
+
const explorationThresholdForTurn = opts.researchTurn
|
|
8451
|
+
? Number.POSITIVE_INFINITY
|
|
8452
|
+
: getExplorationThreshold(history, maxTurns, modelFamily);
|
|
8362
8453
|
const maxTurnsUnbounded = maxTurns === Infinity;
|
|
8363
8454
|
const familyDefaultMaxTurnsUnbounded = familyDefaultMaxTurns === Infinity;
|
|
8364
8455
|
const explorationUnbounded = !Number.isFinite(explorationThresholdForTurn);
|
|
@@ -8373,6 +8464,7 @@ export async function streamLLMWithTools(
|
|
|
8373
8464
|
inspectBudgetThreshold,
|
|
8374
8465
|
inspectFollowupMode,
|
|
8375
8466
|
explorationThresholdForTurn,
|
|
8467
|
+
researchTurn: opts.researchTurn === true,
|
|
8376
8468
|
// ★ Infinity 는 JSON 직렬화 시 null 이 되므로 boolean 으로도 남긴다(관측·제1원칙).
|
|
8377
8469
|
// true = 프론티어 면제로 read/search 스트릭 컷 없음(대표 방침 2026-07-17).
|
|
8378
8470
|
explorationUnbounded,
|
|
@@ -8761,7 +8853,7 @@ export async function streamLLMWithTools(
|
|
|
8761
8853
|
let turnOpts = buildTurnOpts();
|
|
8762
8854
|
// reasoning-heavy family(codex/claude/gemini/grok/local)는 침묵 추론 구간이 길어 idle watchdog 를
|
|
8763
8855
|
// family-aware 로 상향(2026-07-19 goal-exec → 아크4 전-family). fast/mini(gpt·other)만 45s 유지.
|
|
8764
|
-
const streamIdleTimeoutMs = usesLongReasoningIdle(modelFamily, activeProvider.name) ? STREAM_IDLE_TIMEOUT_MS_REASONING : STREAM_IDLE_TIMEOUT_MS;
|
|
8856
|
+
const streamIdleTimeoutMs = opts.streamIdleTimeoutMs ?? (usesLongReasoningIdle(modelFamily, activeProvider.name) ? STREAM_IDLE_TIMEOUT_MS_REASONING : STREAM_IDLE_TIMEOUT_MS);
|
|
8765
8857
|
// ⚠️ hang 진단(2026-07-17) — codex SSE 스트림이 완료 신호 없이 안 끝나는 케이스 확정용.
|
|
8766
8858
|
// consume-start 후 consume-end 가 없으면 = for-await(streamChat SSE) hang. lastEvType 로 어느
|
|
8767
8859
|
// 이벤트 뒤에서 멈추는지(usage/text/tool_call) 특정. 무장할 상한도 남겨 실험 런을 구별한다.
|
|
@@ -8777,6 +8869,7 @@ export async function streamLLMWithTools(
|
|
|
8777
8869
|
// ⭐ TUI-STREAM-RETRY(2026-10-14 실측) — 200 OK 로 흐르던 스트림이 소켓 끊김으로 죽으면 같은 공급자로
|
|
8778
8870
|
// 다시 건다(codex `stream_max_retries` 동형). 이 턴에서 받은 tool_call·image 가 있으면 재시도하지 않는다.
|
|
8779
8871
|
let streamDisconnectRetries = 0;
|
|
8872
|
+
let streamIdleTimeoutRetries = 0;
|
|
8780
8873
|
let streamEmittedImage = false;
|
|
8781
8874
|
// 끊긴 조각을 이력(turnText·fullText)에서 «조용히» 되감는다 — 화면엔 지우라고 알리지 않는다
|
|
8782
8875
|
// (TUI 의 빈 델타는 «커밋»이다). 이미 보인 글과 겹치는 재시도 본문은 `retryDisplay` 가 막는다.
|
|
@@ -8808,6 +8901,9 @@ export async function streamLLMWithTools(
|
|
|
8808
8901
|
while (true) {
|
|
8809
8902
|
let idleTimer: ReturnType<typeof setTimeout> | undefined;
|
|
8810
8903
|
let step: { idle: true } | { idle: false; r: IteratorResult<LLMStreamEvent, void> };
|
|
8904
|
+
// Validate before entering the provider stream's catch/fallback boundary.
|
|
8905
|
+
// An incompatible request is deterministic and must not be retried elsewhere.
|
|
8906
|
+
if (getModelFamily(activeModel) === 'claude') assertNoTopLevelToolSchemaCombinators(turnOpts.tools);
|
|
8811
8907
|
try {
|
|
8812
8908
|
if (!streamIter) {
|
|
8813
8909
|
const finalized = finalizeStreamingProviderModel(activeProvider, activeModel);
|
|
@@ -8821,14 +8917,73 @@ export async function streamLLMWithTools(
|
|
|
8821
8917
|
debug.log('llm.request', 'lone-surrogate-fixed', { site: 'tool-loop', provider: activeProvider.name, messages: wf.fixedMessages, strings: wf.fixedStrings }, { level: 'warn' });
|
|
8822
8918
|
history.splice(0, history.length, ...wf.messages);
|
|
8823
8919
|
}
|
|
8824
|
-
|
|
8920
|
+
// Provider function names have a narrower wire alphabet than MCP
|
|
8921
|
+
// names. Keep catalog/history names canonical inside the tool loop,
|
|
8922
|
+
// and translate only this request plus the corresponding response.
|
|
8923
|
+
const nameMap = createProviderToolNameMap([
|
|
8924
|
+
...(turnOpts.tools ?? []).map((tool) => tool.name),
|
|
8925
|
+
...toolUseNames(history),
|
|
8926
|
+
...(turnOpts.toolChoice && typeof turnOpts.toolChoice === 'object'
|
|
8927
|
+
? [turnOpts.toolChoice.name]
|
|
8928
|
+
: []),
|
|
8929
|
+
]);
|
|
8930
|
+
const providerOpts: LLMOpts = {
|
|
8931
|
+
...turnOpts,
|
|
8932
|
+
tools: turnOpts.tools?.map((tool) => ({ ...tool, name: nameMap.toProviderName(tool.name) })),
|
|
8933
|
+
toolChoice: turnOpts.toolChoice && typeof turnOpts.toolChoice === 'object'
|
|
8934
|
+
? { name: nameMap.toProviderName(turnOpts.toolChoice.name) }
|
|
8935
|
+
: turnOpts.toolChoice,
|
|
8936
|
+
};
|
|
8937
|
+
const providerMessages = mapProviderToolNamesInMessages(history, nameMap.toProviderName);
|
|
8938
|
+
streamIter = restoreProviderToolCallNames(
|
|
8939
|
+
activeProvider.streamChat!(providerMessages, providerOpts),
|
|
8940
|
+
nameMap.toOriginalName,
|
|
8941
|
+
)[Symbol.asyncIterator]();
|
|
8825
8942
|
}
|
|
8826
8943
|
step = await Promise.race([
|
|
8827
8944
|
streamIter.next().then((r) => ({ idle: false as const, r })),
|
|
8828
8945
|
new Promise<{ idle: true }>((res) => { idleTimer = setTimeout(() => res({ idle: true }), streamIdleTimeoutMs); }),
|
|
8829
8946
|
]);
|
|
8947
|
+
if (step.idle) {
|
|
8948
|
+
const error = new Error(`stream idle timeout after ${streamIdleTimeoutMs}ms`);
|
|
8949
|
+
error.name = 'StreamIdleTimeoutError';
|
|
8950
|
+
Object.assign(error, { code: 'ETIMEDOUT' });
|
|
8951
|
+
throw error;
|
|
8952
|
+
}
|
|
8830
8953
|
} catch (err) {
|
|
8831
8954
|
if (idleTimer) clearTimeout(idleTimer);
|
|
8955
|
+
if (err instanceof Error && err.name === 'StreamIdleTimeoutError') {
|
|
8956
|
+
debug.log('llm.stream', 'idle-timeout', {
|
|
8957
|
+
turn, evCount, lastEvType, idleMs: streamIdleTimeoutMs,
|
|
8958
|
+
textChars: turnText.length, pendingCalls: pendingCalls.length,
|
|
8959
|
+
}, { level: 'warn' });
|
|
8960
|
+
// A provider async iterator can queue return() behind the pending next().
|
|
8961
|
+
// Detach cleanup so it cannot keep the user turn busy forever.
|
|
8962
|
+
const timedOutIterator = streamIter;
|
|
8963
|
+
if (timedOutIterator?.return) {
|
|
8964
|
+
try { void Promise.resolve(timedOutIterator.return(undefined)).catch(() => {}); } catch { /* fail-soft cleanup */ }
|
|
8965
|
+
}
|
|
8966
|
+
if (streamIdleTimeoutRetries < STREAM_IDLE_TIMEOUT_MAX_RETRIES
|
|
8967
|
+
&& pendingCalls.length === 0 && !streamEmittedImage && !opts.signal?.aborted) {
|
|
8968
|
+
streamIdleTimeoutRetries++;
|
|
8969
|
+
debug.log('llm.retry', 'idle-timeout-retry', {
|
|
8970
|
+
provider: activeProvider.name, model: activeModel, turn,
|
|
8971
|
+
attempt: streamIdleTimeoutRetries, maxRetries: STREAM_IDLE_TIMEOUT_MAX_RETRIES,
|
|
8972
|
+
delayMs: 0, statusLine: '스트림 무응답 · 재시도',
|
|
8973
|
+
}, { level: 'warn' });
|
|
8974
|
+
handlers.onStatus?.(`스트림 무응답 · 재시도 ${streamIdleTimeoutRetries}/${STREAM_IDLE_TIMEOUT_MAX_RETRIES}`);
|
|
8975
|
+
rewindDisconnectedStream();
|
|
8976
|
+
streamIter = undefined;
|
|
8977
|
+
continue;
|
|
8978
|
+
}
|
|
8979
|
+
// Once a tool call/image escaped, keep the old behavior: finish this
|
|
8980
|
+
// provider turn and never replay or switch providers around side effects.
|
|
8981
|
+
if (pendingCalls.length > 0 || streamEmittedImage || opts.signal?.aborted) break;
|
|
8982
|
+
if (opts.provider) break; // pinned route preserves the prior partial-text result
|
|
8983
|
+
// The retry's text was already sent to the view; drop it from the
|
|
8984
|
+
// logical result before allowing the normal provider fallback path.
|
|
8985
|
+
if (pendingCalls.length === 0 && !streamEmittedImage) rewindDisconnectedStream();
|
|
8986
|
+
}
|
|
8832
8987
|
if (err instanceof OverloadFailoverError && !opts.provider) {
|
|
8833
8988
|
const switched = activeProvider.name === 'openai-codex'
|
|
8834
8989
|
? firstAvailableFallbackProvider(attemptedProviders, opts)
|
|
@@ -8843,6 +8998,7 @@ export async function streamLLMWithTools(
|
|
|
8843
8998
|
status: err.status,
|
|
8844
8999
|
kind: err.kind,
|
|
8845
9000
|
}, { level: 'warn' });
|
|
9001
|
+
handlers.onStatus?.(`⚠ 공급자 전환: ${activeProvider.name} → ${switched.name} (${err.kind ?? err.name ?? 'unknown'})`);
|
|
8846
9002
|
const finalized = finalizeStreamingProviderModel(switched, switched.defaultModel);
|
|
8847
9003
|
activeProvider = finalized.provider;
|
|
8848
9004
|
activeModel = finalized.model;
|
|
@@ -8853,7 +9009,8 @@ export async function streamLLMWithTools(
|
|
|
8853
9009
|
continue;
|
|
8854
9010
|
}
|
|
8855
9011
|
}
|
|
8856
|
-
if (
|
|
9012
|
+
if (!(err instanceof Error && err.name === 'StreamIdleTimeoutError')
|
|
9013
|
+
&& evCount > 0 && isStreamDisconnectRetryable(err, pendingCalls.length, streamEmittedImage) && !opts.signal?.aborted) {
|
|
8857
9014
|
const retryData = {
|
|
8858
9015
|
provider: activeProvider.name,
|
|
8859
9016
|
model: activeModel,
|
|
@@ -8922,6 +9079,7 @@ export async function streamLLMWithTools(
|
|
|
8922
9079
|
tools: activeTools.map((tool) => tool.name),
|
|
8923
9080
|
...(opts.model ? { modelOverrideDropped: opts.model } : {}),
|
|
8924
9081
|
}, { level: 'warn' });
|
|
9082
|
+
handlers.onStatus?.(`⚠ 공급자 전환: ${activeProvider.name} → ${fallback.name} (${verdict.category})`);
|
|
8925
9083
|
const finalized = finalizeStreamingProviderModel(fallback, fallback.defaultModel);
|
|
8926
9084
|
activeProvider = finalized.provider;
|
|
8927
9085
|
activeModel = finalized.model;
|
|
@@ -8934,9 +9092,9 @@ export async function streamLLMWithTools(
|
|
|
8934
9092
|
}
|
|
8935
9093
|
if (idleTimer) clearTimeout(idleTimer);
|
|
8936
9094
|
if (step.idle) {
|
|
8937
|
-
|
|
8938
|
-
|
|
8939
|
-
|
|
9095
|
+
// The race's idle branch is converted to StreamIdleTimeoutError above.
|
|
9096
|
+
// Keep a fail-closed guard for future changes to this loop.
|
|
9097
|
+
throw new Error('stream idle timeout branch escaped recovery');
|
|
8940
9098
|
}
|
|
8941
9099
|
if (step.r.done) break;
|
|
8942
9100
|
const ev = step.r.value;
|
|
@@ -8998,7 +9156,7 @@ export async function streamLLMWithTools(
|
|
|
8998
9156
|
// ⭐ 주 에이전트 턴의 토큰·비용을 «게이트 없이» 남긴다(2026-09-24 실측: 이 줄이 없어 3시간 `llm.usage`
|
|
8999
9157
|
// 18행이 전부 곁가지 두 자리였고, 하니스 런 비용의 거의 전부가 관측 밖이었다). 곁가지와 같은 모양 ·
|
|
9000
9158
|
// 모르는 모델은 금액 대신 `cost.kind='unknown'`. runId 는 debug.log 가 붙인다. 실패해도 턴은 계속.
|
|
9001
|
-
logAgentTurnUsage(activeModel, ev.usage, { providerName: activeProvider.name, role: opts.usageRole, phase: opts.usagePhase });
|
|
9159
|
+
logAgentTurnUsage(activeModel, ev.usage, { providerName: activeProvider.name, role: opts.usageRole, phase: opts.usagePhase, jobKind: opts.usageJobKind });
|
|
9002
9160
|
// Wave A1 (2026-05-04) — turn-level cache hit rate forensic.
|
|
9003
9161
|
// Each provider's usage event carries inputTokens / outputTokens
|
|
9004
9162
|
// / cacheReadInputTokens (when cache hit). Emit the per-turn
|
|
@@ -9388,13 +9546,23 @@ export async function streamLLMWithTools(
|
|
|
9388
9546
|
// done, just write the answer" UX which we must not preempt.
|
|
9389
9547
|
const codexImmediateInspectActionStop = followupInspectActionHeld && followupHardStopEnabled;
|
|
9390
9548
|
if (followupHardStopHeld) {
|
|
9391
|
-
|
|
9392
|
-
(codexImmediateInspectStop && codexInspectSynthesisGrace <= 0)
|
|
9549
|
+
const followupHardStopBlocked = (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0)
|
|
9393
9550
|
|| (codexImmediateRepairStop && codexRepairActionGrace <= 0)
|
|
9394
|
-
|| (codexImmediateInspectActionStop && codexInspectActionGrace <= 0)
|
|
9551
|
+
|| (codexImmediateInspectActionStop && codexInspectActionGrace <= 0);
|
|
9552
|
+
noteGpt6CodexGuard('followup-hard-stop', effectiveModel, followupHardStopBlocked);
|
|
9553
|
+
if (isGpt6GenerationModel(effectiveModel)) {
|
|
9554
|
+
followupHardStopStats.wouldBlock++;
|
|
9555
|
+
if (followupHardStopBlocked) followupHardStopStats.blocked++;
|
|
9556
|
+
debug.log('llm.router', 'tool-loop.followup-hard-stop.guard-observed', {
|
|
9557
|
+
orchestrationId: orchestration,
|
|
9558
|
+
guard: 'followup-hard-stop',
|
|
9559
|
+
...followupHardStopStats,
|
|
9560
|
+
});
|
|
9561
|
+
}
|
|
9395
9562
|
}
|
|
9396
9563
|
if (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0) {
|
|
9397
9564
|
debug.log('llm.router', 'tool-loop.inspect-synthesis-phase.codex-immediate-stop', {
|
|
9565
|
+
orchestrationId: orchestration,
|
|
9398
9566
|
turn,
|
|
9399
9567
|
maxTurns,
|
|
9400
9568
|
autoNarrowedReadCount,
|
|
@@ -10188,7 +10356,8 @@ export async function streamLLMWithTools(
|
|
|
10188
10356
|
// rejection without colliding with the auto-narrow path)
|
|
10189
10357
|
// - call is in SEARCH_ONLY_TOOLS
|
|
10190
10358
|
if (
|
|
10191
|
-
|
|
10359
|
+
!opts.researchTurn
|
|
10360
|
+
&& dispatchedReadCount === 0
|
|
10192
10361
|
&& autoNarrowedReadCount === 0
|
|
10193
10362
|
&& searchOnlyTurnStreak >= 3
|
|
10194
10363
|
&& SEARCH_ONLY_TOOLS.has(call.name)
|
|
@@ -10965,7 +11134,7 @@ export async function streamLLMWithTools(
|
|
|
10965
11134
|
resultBlocks.push({
|
|
10966
11135
|
type: 'tool_result',
|
|
10967
11136
|
tool_use_id: call.id,
|
|
10968
|
-
content:
|
|
11137
|
+
content: toolResultContentForCall(call.name, result),
|
|
10969
11138
|
...(isError ? { isError: true } : {}),
|
|
10970
11139
|
});
|
|
10971
11140
|
}
|
|
@@ -11144,7 +11313,8 @@ export async function streamLLMWithTools(
|
|
|
11144
11313
|
// synthesis attempt. Extended to gemini 2026-05-04 alongside
|
|
11145
11314
|
// W5-E/W5-F for the same pathology shape.
|
|
11146
11315
|
if (
|
|
11147
|
-
!
|
|
11316
|
+
!opts.researchTurn
|
|
11317
|
+
&& !forceSynthesisAttempted
|
|
11148
11318
|
&& noContentReadTurnStreak >= 4
|
|
11149
11319
|
&& (modelFamily === 'gemini'
|
|
11150
11320
|
|| applyCodexBehaviorGuard('force-synthesis', effectiveModel, codexGuardCandidate, true))
|
|
@@ -11399,7 +11569,13 @@ function makeOpenAICompatProvider(
|
|
|
11399
11569
|
throw new Error(`${name} unavailable: configure apiKey via \`elanous setup\``);
|
|
11400
11570
|
}
|
|
11401
11571
|
const activeModel = opts.model || model;
|
|
11402
|
-
|
|
11572
|
+
if (getModelFamily(activeModel) === 'claude') assertNoTopLevelToolSchemaCombinators(opts.tools);
|
|
11573
|
+
const wireModel = name === 'openrouter' ? openRouterWireModel(activeModel) : activeModel;
|
|
11574
|
+
const tools = toOpenAITools(
|
|
11575
|
+
opts.tools,
|
|
11576
|
+
name === 'openrouter' && openRouterNeedsKimiToolSchema(wireModel),
|
|
11577
|
+
name === 'openrouter' && isOpenRouterGrokModel(wireModel),
|
|
11578
|
+
);
|
|
11403
11579
|
const deepSeek = name === 'openrouter' && isOpenRouterDeepSeekWireModel(openRouterWireModel(activeModel));
|
|
11404
11580
|
// OR-TOOLCHOICE-PASS (2026-10-10) — OpenRouter 경로만 호출자 toolChoice 를 싣는다.
|
|
11405
11581
|
// ⛔ grok/openai 호환 경로는 손대지 않는다(무회귀). toolChoice 가 없거나 tools 가 없으면 키 자체를 안 싣는다.
|
|
@@ -12026,6 +12202,12 @@ const OPENROUTER_ROUTE_FOR_WIP_PROVIDER = {
|
|
|
12026
12202
|
glm: 'openrouter/z-ai/glm-5.3',
|
|
12027
12203
|
} as const;
|
|
12028
12204
|
|
|
12205
|
+
/** Resolve a review model shortcut before either provider inference or the wire call. */
|
|
12206
|
+
export function resolveReviewModelAlias(model: string): string {
|
|
12207
|
+
const resolved = resolveModelAlias(model.trim())!;
|
|
12208
|
+
return OPENROUTER_ROUTE_FOR_WIP_PROVIDER[resolved.toLowerCase() as keyof typeof OPENROUTER_ROUTE_FOR_WIP_PROVIDER] ?? resolved;
|
|
12209
|
+
}
|
|
12210
|
+
|
|
12029
12211
|
/** Top-level resolver. Honors user-config first; falls through to
|
|
12030
12212
|
* env-var / auto-detect when provider is 'auto'. */
|
|
12031
12213
|
export function getProviderForConfig(
|
package/src/loops/checker.ts
CHANGED
|
@@ -33,6 +33,9 @@ export interface CheckEntry {
|
|
|
33
33
|
expectedVersion?: string;
|
|
34
34
|
/** Registry graph path, supplied only by graph inventory. */
|
|
35
35
|
file?: string;
|
|
36
|
+
/** LOOP-PRUNE-1021-FU 판정 재료 — cron-shell·미등록 행이 실은 crontab 명세(그래프 루프에는 없다). */
|
|
37
|
+
cron?: string;
|
|
38
|
+
command?: string;
|
|
36
39
|
enabled: boolean;
|
|
37
40
|
registered: boolean;
|
|
38
41
|
}
|
|
@@ -317,3 +320,100 @@ export function observeLoopCheck(results: CheckResult[], scope: LoopScope, deps:
|
|
|
317
320
|
catch (error) { if (existsSync(tmp)) unlinkSync(tmp); throw error; }
|
|
318
321
|
return counts;
|
|
319
322
|
}
|
|
323
|
+
|
|
324
|
+
// ── LOOP-PRUNE-1021-FU 정리 판정 (내부 문서 `loop-lineage-1021` · 0.2.36) ─────
|
|
325
|
+
/** 무실행 은퇴 한계 — off 상태가 원장으로 최근 14일 실행이 증명될 때만 은퇴 후보가 된다. */
|
|
326
|
+
export const PRUNE_IDLE_DAYS = 14;
|
|
327
|
+
/** 활성 루프 상한 — alive 가 25 를 넘으면 접기·은퇴 판정을 먼저 치른다. */
|
|
328
|
+
export const PRUNE_ALIVE_LIMIT = 25;
|
|
329
|
+
|
|
330
|
+
export interface PruneFoldGroup { family: string; ids: string[]; }
|
|
331
|
+
export interface PruneUnregisteredRow { id: string; cron?: string; command?: string; }
|
|
332
|
+
export interface PruneJudgment {
|
|
333
|
+
/** 14일 무실행이 원장으로 증명된 은퇴 후보(off). */
|
|
334
|
+
idleRetire: string[];
|
|
335
|
+
/** 실행 기록이 없어 무실행을 증명할 수 없는 항목 — 은퇴 후보에서 제외한다. */
|
|
336
|
+
idleUnproven: string[];
|
|
337
|
+
/** 등록되지 않은 elanous 크론 행 — 등록/제거 판정에 넘긴다. */
|
|
338
|
+
unregistered: PruneUnregisteredRow[];
|
|
339
|
+
/** 같은 일을 하는 elanous:* 형제 슬롯 가족 — 그래프 루프·원장 해시는 접지 않는다. */
|
|
340
|
+
foldGroups: PruneFoldGroup[];
|
|
341
|
+
/** 활성 루프 수와 25 한도 판정. */
|
|
342
|
+
alive: { count: number; limit: number; within: boolean };
|
|
343
|
+
/** 운영 이름이 없는 원장 해시 id — 명명 대상. */
|
|
344
|
+
unnamed: string[];
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/** elanous:* 슬롯의 가족 이름 — namedCronIds 의 -N 접미와 자리 슬롯(:SEAT)을 원래 가족으로 되돌린다. */
|
|
348
|
+
function pruneFoldFamily(id: string): string | undefined {
|
|
349
|
+
if (!id.startsWith('elanous:')) return undefined;
|
|
350
|
+
const seat = /^elanous:([^:]+):[^:]+$/.exec(id);
|
|
351
|
+
if (seat) return `elanous:${seat[1]}`;
|
|
352
|
+
const sibling = /^elanous:(.+)-\d+$/.exec(id);
|
|
353
|
+
return `elanous:${sibling ? sibling[1] : id.slice('elanous:'.length)}`;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/** LOOP-PRUNE-1021-FU — CheckResult 원장 위에서 무실행 은퇴·미등록 정리·형제 접기·alive ≤ 25·이름 없는 해시를 판정한다. */
|
|
357
|
+
export function pruneJudgment(results: readonly CheckResult[], opts: { now?: Date } = {}): PruneJudgment {
|
|
358
|
+
const now = opts.now ?? new Date();
|
|
359
|
+
const idleMs = PRUNE_IDLE_DAYS * 24 * 60 * 60_000;
|
|
360
|
+
const idleRetire: string[] = [];
|
|
361
|
+
const idleUnproven: string[] = [];
|
|
362
|
+
const unregistered: PruneUnregisteredRow[] = [];
|
|
363
|
+
const unnamed: string[] = [];
|
|
364
|
+
const families = new Map<string, string[]>();
|
|
365
|
+
let aliveCount = 0;
|
|
366
|
+
for (const result of results) {
|
|
367
|
+
if (result.state === 'alive') aliveCount++;
|
|
368
|
+
if (result.state === 'unregistered') {
|
|
369
|
+
unregistered.push({
|
|
370
|
+
id: result.id,
|
|
371
|
+
...(result.cron ? { cron: result.cron } : {}),
|
|
372
|
+
...(result.command ? { command: result.command } : {}),
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
if (result.state === 'off') {
|
|
376
|
+
const ran = result.lastRunAt && Number.isFinite(Date.parse(result.lastRunAt)) ? Date.parse(result.lastRunAt) : undefined;
|
|
377
|
+
if (ran === undefined) idleUnproven.push(result.id);
|
|
378
|
+
else if (now.getTime() - ran > idleMs) idleRetire.push(result.id);
|
|
379
|
+
}
|
|
380
|
+
if (/^[0-9a-f]{8,}$/.test(result.id)) unnamed.push(result.id);
|
|
381
|
+
const family = pruneFoldFamily(result.id);
|
|
382
|
+
if (family) {
|
|
383
|
+
const group = families.get(family) ?? [];
|
|
384
|
+
group.push(result.id);
|
|
385
|
+
families.set(family, group);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
const foldGroups: PruneFoldGroup[] = [];
|
|
389
|
+
for (const [family, ids] of families) {
|
|
390
|
+
if (ids.length < 2) continue;
|
|
391
|
+
foldGroups.push({ family, ids: [...ids].sort() });
|
|
392
|
+
}
|
|
393
|
+
const judgment: PruneJudgment = {
|
|
394
|
+
idleRetire,
|
|
395
|
+
idleUnproven,
|
|
396
|
+
unregistered,
|
|
397
|
+
foldGroups,
|
|
398
|
+
alive: { count: aliveCount, limit: PRUNE_ALIVE_LIMIT, within: aliveCount <= PRUNE_ALIVE_LIMIT },
|
|
399
|
+
unnamed,
|
|
400
|
+
};
|
|
401
|
+
debug.log('loop.checker', 'prune', {
|
|
402
|
+
idleRetire: idleRetire.length, idleUnproven: idleUnproven.length, unregistered: unregistered.length,
|
|
403
|
+
folds: foldGroups.length, alive: aliveCount, unnamed: unnamed.length,
|
|
404
|
+
});
|
|
405
|
+
return judgment;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/** LOOP-PRUNE-1021-FU — PruneJudgment 을 사람용 정리 판정 줄로 렌더한다(loop status --all 인간 출력 꼬리). */
|
|
409
|
+
export function pruneText(judgment: PruneJudgment): string {
|
|
410
|
+
const lines = [
|
|
411
|
+
`무실행 은퇴 ${judgment.idleRetire.length}: ${judgment.idleRetire.join(', ') || '없음'}`,
|
|
412
|
+
`무실행 미증명 ${judgment.idleUnproven.length}: ${judgment.idleUnproven.join(', ') || '없음'}`,
|
|
413
|
+
`미등록 ${judgment.unregistered.length}: ${judgment.unregistered.map(row => row.command ? `${row.id} (${row.command})` : row.id).join(', ') || '없음'}`,
|
|
414
|
+
`형제 접기 ${judgment.foldGroups.length}: ${judgment.foldGroups.map(group => `${group.family}[${group.ids.join('+')}]`).join(', ') || '없음'}`,
|
|
415
|
+
`alive ${judgment.alive.count}/${judgment.alive.limit} ${judgment.alive.within ? '한도 이내' : '한도 초과'}`,
|
|
416
|
+
`이름 없는 해시 ${judgment.unnamed.length}: ${judgment.unnamed.join(', ') || '없음'}`,
|
|
417
|
+
];
|
|
418
|
+
return lines.join('\n');
|
|
419
|
+
}
|