elanous 0.2.40 → 0.2.41
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/README.md +7 -7
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → GiOLWmt4MqDZePubBjA4Q}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +36 -0
- package/apps/pwa/out/_next/static/chunks/{9184.45afbf44fec87574.js → 1178.1aa9cad0e7695427.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2829-734fe8bf2eee7347.js → 1197-54da59d250a6e476.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6749.0744ce6eb08d40e9.js → 1219.7e17964e0e7cd8e5.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +287 -0
- package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +90 -0
- package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{2226.2cf61ec781827219.js → 1800.f7ff51dc4978a958.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9175.2de5209a5ce6f68a.js → 2073.689dcb2680113d76.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +1 -0
- package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5383.bdfa5d886e39a826.js → 2263.e09b6edea33bad2d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9069.657590a84afb8fac.js → 2743.5d3f76948be32b34.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{6624.981ef7caeb680560.js → 2773.0e80b9d325fb5635.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4864a2ca.1c1c280a7772c5e5.js → 2fdf2931.b431eee4fb468bc3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9189505a.980427ac048c8c60.js → 2fe2c302.41b517f88d6fe502.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9992.07ce73c10bd5e6a1.js → 3097.864e92bdaa2f4d15.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +1 -0
- package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +74 -0
- package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b84cad00.594027ebe0531fe2.js → 385e4574.e9886ab32759eda3.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8086.1ab9103c41be884f.js → 4156.ba4de4a3664f04b4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +148 -0
- package/apps/pwa/out/_next/static/chunks/{1281.d81877e35b9068f4.js → 4527.a69f2894d1bc9f4a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{8357.1aaa713b052a78b1.js → 4667.97e31aa38c95c475.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/{5436.fdf6fa8ae3e9588d.js → 4702.4a4adc1f16d7c93b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{4769.9fd582071301f382.js → 5159.115f1c2ca471386c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/530.d26346e18089640a.js +115 -0
- package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{d8de0de2-dd0f4ac8e5ab1832.js → 53aeb4ee-51c92f8d683f5220.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6257.c0037b8949239f5e.js → 5471.1e611302ed3a7c53.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2566.beaffc3a5e1fcd2e.js → 5574.f35accf4f132b29d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{2066.a77257c8c350770a.js → 5744.b9415e18ad623100.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4351.0f37a6db2b34d50b.js → 5937.c2df9e3447e1f667.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{6051-0ae955eedb10adb9.js → 5947-135e26537d80a6b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{3746-f80a78f220bf37b5.js → 5964-7e21164a8f2cf0ce.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +62 -0
- package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{2047.8f23e210995d4548.js → 6874.d5cf7eb8edb2cabe.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +122 -0
- package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7191.fdc955f7d96064a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8272-025653884f9645d2.js → 8050-9b364bdef8f71927.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{2281-b8cede695c6c650e.js → 8464-e24f10451b658aac.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5622.94893f5aea7185d0.js → 8880.64c445592f04acaf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1452.162bb2d9d699e82a.js → 8981.c706964c8ba27aff.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{470.51a72a2348306455.js → 9048.212083de42d25be3.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2177.df8547f9d7215c4e.js → 9507.7026657a2f47eb64.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7515.1ad6efe157fa4448.js → 9579.4a8169600fff2058.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{2499.02fbfd18126c10c0.js → 9834.63ab2bbc3153172e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{409c787b.e48c5bec8ec10456.js → a0a01613.6d1cca322238d7fe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6cc1d1d6.9a98dd4622f1afc6.js → addc2b32.8c4ff8f0aefe987d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-ba957ff875a026a0.js → page-14949db884bfa672.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{c696986b.5dc8bb1143af16d1.js → b2271e54.c1de3347976e90b0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{ca3702f8.2913182e73889fa2.js → c0c1a699.0ba79f97005965d4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.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/bin/elanous.mjs +6 -1
- package/catalog/models/openai/gpt-6.1-sol.yaml +16 -0
- package/catalog/models/openai/gpt-6.1-terra.yaml +16 -0
- package/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
- package/graphs/demo/persona-teacher/recipes.yaml +17 -0
- package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
- package/graphs/overlays/stop-heal-ladder.yaml +23 -2
- package/graphs/release/release-loop.yaml +3 -1
- package/graphs/units/gate/gate.yaml +20 -0
- package/graphs/units/git/git.yaml +26 -0
- package/graphs/units/implement/implement.yaml +19 -0
- package/graphs/units/landing/landing.yaml +18 -0
- package/graphs/units/review/review.yaml +20 -0
- package/graphs/units/verbs/recipes.yaml +3 -0
- package/graphs/units/verbs/research.yaml +20 -0
- package/graphs/work/research-report.yaml +11 -1
- package/package.json +1 -1
- package/scripts/disk-steward.ts +46 -0
- package/scripts/fleet/node-setup.sh +50 -0
- package/scripts/graph-units/verbs/research.ts +55 -0
- package/scripts/llm-cost-ledger.ts +179 -8
- package/scripts/measure-nl-routing-corpus.ts +10 -2
- package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
- package/scripts/public-copy-lint.ts +163 -19
- package/scripts/ratchets/train-side-invariants.sh +0 -1
- package/scripts/release-loop/gate-autoheal.ts +117 -0
- package/scripts/release-loop/gate-baseline-receipt.ts +8 -1
- package/scripts/release-loop/gate-diff.ts +22 -3
- package/scripts/release-loop/gate-node.ts +205 -17
- package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
- package/scripts/release-loop/gate-triage-node.ts +70 -10
- package/scripts/release-loop/resume-release.ts +247 -15
- package/scripts/release-loop/traffic-node.ts +6 -3
- package/scripts/release-loop/unattended-release.ts +4 -2
- package/scripts/shadow-authoring-probe.ts +20 -0
- package/scripts/ux-sim.ts +19 -2
- package/src/acp/core-turn-bridge.ts +86 -4
- package/src/agent-substrate/self-review-cli.ts +91 -29
- package/src/auto-research/research-turn.ts +10 -1
- package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
- package/src/boot/daemon-tools/self-implement.ts +46 -9
- package/src/budget/shadow-arms.ts +52 -0
- package/src/chat/pickers/state.ts +7 -1
- package/src/cli/log-event-names.ts +5 -0
- package/src/cli/mcp-login.ts +8 -18
- package/src/cli/msg-cli.ts +57 -1
- package/src/cli/pr-land-heavy-remote.ts +15 -9
- package/src/cli/release-cli.ts +27 -1
- package/src/cli/sim-cli.ts +7 -1
- package/src/cli/tasks-cli.ts +5 -4
- package/src/codex/models.ts +30 -15
- package/src/core-turn/run-core-turn.ts +3 -0
- package/src/core-turn/run-goal-loop.ts +88 -2
- package/src/dashboard/acp-boot.ts +72 -3
- package/src/dashboard/index.ts +6 -0
- package/src/dashboard/turn-preamble.ts +12 -1
- package/src/disk-steward/judge.ts +73 -0
- package/src/disk-steward/ledger.ts +122 -0
- package/src/disk-steward/steward.ts +373 -0
- package/src/domains/guardian-tick.ts +191 -2
- package/src/graph-runner/graph-cli.ts +21 -0
- package/src/graph-runner/in-process-registry.ts +37 -0
- package/src/graph-runner/runner.ts +33 -3
- package/src/grounding/ref-index.ts +19 -0
- package/src/grounding/sources-cli.ts +9 -1
- package/src/harness/harness-cli-command.ts +267 -14
- package/src/harness/harness-incidents.ts +312 -7
- package/src/harness/harness-space.ts +15 -1
- package/src/harness/progress-worker-entry.ts +59 -0
- package/src/harness/progress-worker-runtime.ts +11 -0
- package/src/index.ts +18 -2
- package/src/instance/dev-project.ts +25 -0
- package/src/intelligence-map/model-alias.ts +6 -5
- package/src/intelligence-map/model-catalog.ts +59 -2
- package/src/llm/model-defaults.ts +4 -4
- package/src/llm.ts +42 -11
- package/src/loops/orchestrator/tick.ts +48 -0
- package/src/mcp/mcp-oauth.ts +3 -1
- package/src/model-tier/llm-tier-map.ts +9 -9
- package/src/model-tier/turn-tier.ts +1 -1
- package/src/msg/msg-mirror-github.ts +80 -0
- package/src/msg/msg-mirror-policy.ts +61 -0
- package/src/msg/msg-mirror-runner.ts +219 -0
- package/src/msg/msg-mirror-state.ts +33 -0
- package/src/msg/msg-store.ts +11 -0
- package/src/output-truncation.ts +41 -12
- package/src/project/project-store.ts +48 -1
- package/src/release-loop/gate-host-reservation.ts +144 -0
- package/src/release-loop/release-schedule.ts +90 -1
- package/src/research/bloom-exemplars.ts +135 -0
- package/src/self-dev/ask-launch-flow.ts +39 -25
- package/src/self-dev/dev-cli.ts +17 -17
- package/src/self-dev/graph-front-nodes.ts +23 -0
- package/src/self-dev/launch-preflight.ts +9 -4
- package/src/self-dev/orchestrate.ts +15 -0
- package/src/self-dev/run-supervisor.ts +185 -3
- package/src/self-dev/run-types.ts +3 -0
- package/src/self-implement/gate-artifacts.ts +13 -0
- package/src/self-implement/gate-cli.ts +54 -24
- package/src/self-implement/gate-remote.ts +23 -5
- package/src/self-implement/goal-author-clarification.ts +31 -12
- package/src/self-implement/goal-author.ts +77 -5
- package/src/self-implement/graph-stage-units.ts +172 -0
- package/src/self-implement/graph-templates.ts +162 -1
- package/src/self-implement/graph-variant.ts +37 -4
- package/src/self-implement/host-regate.ts +4 -4
- package/src/self-implement/knowhow-pack.ts +38 -0
- package/src/self-implement/orchestrator.ts +235 -21
- package/src/self-implement/run-ledger.ts +64 -6
- package/src/self-implement/run-stop.ts +21 -2
- package/src/self-implement/running-runs.ts +35 -12
- package/src/self-implement/self-implement-cli.ts +36 -4
- package/src/self-implement/stop-autoheal-operational.ts +43 -0
- package/src/self-implement/stop-autoheal.ts +15 -6
- package/src/session/chat.ts +31 -54
- package/src/session/request-size-guard.ts +123 -0
- package/src/sidetab-core/model.ts +136 -0
- package/src/task-agent/parent-host.ts +14 -1
- package/src/task-agent/task-hand.ts +4 -1
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +43 -0
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +116 -16
- package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
- package/src/tui/entry.ts +10 -3
- package/src/tui/sidetab/list.ts +45 -0
- package/src/tui/sidetab/nl-tool.ts +2 -136
- package/src/tui/sidetab/peek.ts +52 -0
- package/src/tui-client/dashboard-session.ts +3 -0
- package/src/user-config.ts +11 -5
- package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
- package/src/ux-sim/fault-pod-child-result.ts +42 -0
- package/src/ux-sim/release-sim-rig.ts +262 -0
- package/src/ux-sim/seminar-rehearsal.ts +109 -0
- package/src/ux-sim/subagent-tools-device.ts +2 -2
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1060.014f1f01a17aec26.js +0 -115
- package/apps/pwa/out/_next/static/chunks/1350.59f40e39e02d91b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +0 -286
- package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +0 -90
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2522.f2766b76d22c8bdf.js +0 -34
- package/apps/pwa/out/_next/static/chunks/261.0d471e8aded799f3.js +0 -226
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +0 -1
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3330.7443183b7e6fdbdf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +0 -24
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +0 -77
- package/apps/pwa/out/_next/static/chunks/3b355b3d.6f73c98bf6f9c749.js +0 -122
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +0 -36
- package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +0 -287
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +0 -1
- package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +0 -94
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +0 -148
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +0 -93
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-139d722de1dcd6c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +0 -1
- package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +0 -1
- package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
- /package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → GiOLWmt4MqDZePubBjA4Q}/_ssgManifest.js +0 -0
package/src/cli/msg-cli.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
+
import { mkdirSync } from 'node:fs';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
2
4
|
import { ensureAuthToken } from '../auth/acp-token.js';
|
|
3
5
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
4
6
|
import { canonicalSeatId, openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
|
|
5
7
|
import { clearPostOffice, ensurePostOffice, writePostOffice } from '../msg/msg-post-office.js';
|
|
8
|
+
import { acquireLockSync } from '../storage/file-lock.js';
|
|
9
|
+
import { GitHubMsgMirrorTransport } from '../msg/msg-mirror-github.js';
|
|
10
|
+
import { configuredMirrorTarget, runMsgMirrorTick, type MirrorTarget, type MsgMirrorStateStore, type MsgMirrorTransport } from '../msg/msg-mirror-runner.js';
|
|
11
|
+
import { JsonMsgMirrorStateStore } from '../msg/msg-mirror-state.js';
|
|
6
12
|
import { startMsgSseServer } from '../msg/msg-sse-server.js';
|
|
13
|
+
import { debug } from '../debug/log.js';
|
|
7
14
|
import type { AgentReplyAddress, AgentReplyInput, AgentReplyResult } from '../loops/agent-reply.js';
|
|
8
15
|
import { messageRouteFor, noReplyBodyNotice, unsupportedLoopAddressNotice } from '../loops/msg-address.js';
|
|
9
16
|
import { resolveWake, wakeRecipient, type WakeDeps, type WakeOutcome } from '../loops/msg-wake.js';
|
|
10
|
-
import type
|
|
17
|
+
import { getUserConfig, type RoleLlmSpec } from '../user-config.js';
|
|
11
18
|
|
|
12
19
|
/** The loop rows whose reply body is an LLM agent: `--agent-reply` picks one of these. */
|
|
13
20
|
const AGENT_REPLY_ROLES = { COORDINATOR: 'coordinator', GUARDIAN: 'guardian' } as const;
|
|
@@ -22,6 +29,9 @@ export interface MsgCliDeps {
|
|
|
22
29
|
signal?: AbortSignal;
|
|
23
30
|
fetch?: typeof fetch;
|
|
24
31
|
authToken?: () => string;
|
|
32
|
+
mirrorTarget?: MirrorTarget | null;
|
|
33
|
+
mirrorState?: MsgMirrorStateStore;
|
|
34
|
+
mirrorTransport?: MsgMirrorTransport;
|
|
25
35
|
/** Wake-path resolution for `msg route` (tests inject; default reads pty manifest ⊕ seat folders). */
|
|
26
36
|
wakeDeps?: WakeDeps;
|
|
27
37
|
/** Attach the logs.db sink so `msg.wake` reaches `elanous logs` (a short CLI otherwise writes only the file trail). */
|
|
@@ -198,6 +208,52 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
198
208
|
if (address !== to) throw new Error(`--agent-reply ${address} requires --to ${address}`);
|
|
199
209
|
};
|
|
200
210
|
|
|
211
|
+
msg.command('mirror').description('Mirror selected seat messages to the configured GitHub issue')
|
|
212
|
+
.option('--dry-run', 'read the configured channel and ledger without writing')
|
|
213
|
+
.option('--watch', 'repeat until interrupted')
|
|
214
|
+
.option('--interval <seconds>', 'poll interval in watch mode (default 60)', '60')
|
|
215
|
+
.option('--json')
|
|
216
|
+
.action((opts: CommonOptions & { dryRun?: boolean; watch?: boolean; interval?: string }) => run(async () => {
|
|
217
|
+
const intervalSeconds = integer(opts.interval, '--interval', 60, 1, 3600);
|
|
218
|
+
const state = deps.mirrorState ?? new JsonMsgMirrorStateStore();
|
|
219
|
+
const configTarget = deps.mirrorTarget === undefined
|
|
220
|
+
? configuredMirrorTarget(getUserConfig().raw.msgMirror) : deps.mirrorTarget ?? undefined;
|
|
221
|
+
const existingState = state.read();
|
|
222
|
+
if (!configTarget && !existingState) {
|
|
223
|
+
const result = { status: 'disabled', reason: 'msgMirror.target is not configured', target: null };
|
|
224
|
+
debug.log('msg.mirror', 'disabled', result);
|
|
225
|
+
out.log(opts.json ? JSON.stringify(result) : 'msg mirror 비활성: msgMirror.target 미설정');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const store = openRead();
|
|
229
|
+
const transport = deps.mirrorTransport ?? new GitHubMsgMirrorTransport();
|
|
230
|
+
const signal = deps.signal;
|
|
231
|
+
try {
|
|
232
|
+
do {
|
|
233
|
+
let release = () => {};
|
|
234
|
+
if (state instanceof JsonMsgMirrorStateStore) {
|
|
235
|
+
mkdirSync(dirname(state.path), { recursive: true, mode: 0o700 });
|
|
236
|
+
release = acquireLockSync(`${state.path}.lock`, { breakDeadHolder: true });
|
|
237
|
+
}
|
|
238
|
+
let result: Awaited<ReturnType<typeof runMsgMirrorTick>>;
|
|
239
|
+
try {
|
|
240
|
+
result = await runMsgMirrorTick({
|
|
241
|
+
...(configTarget ? { configuredTarget: configTarget } : {}),
|
|
242
|
+
...(opts.dryRun ? { dryRun: true } : {}),
|
|
243
|
+
source: { listAfter: (after, limit) => store.listAfter(after, limit),
|
|
244
|
+
listWindow: (start, end) => store.listCreatedBetween(start, end), latestId: () => store.latestId() },
|
|
245
|
+
state, transport,
|
|
246
|
+
});
|
|
247
|
+
} finally { release(); }
|
|
248
|
+
debug.log('msg.mirror', 'tick', result);
|
|
249
|
+
out.log(opts.json ? JSON.stringify(result)
|
|
250
|
+
: `msg mirror ${result.status} · scanned ${result.scanned} · posted ${result.posted} · rotated ${result.rotated} · summaries ${result.summaries}`);
|
|
251
|
+
if (!opts.watch || signal?.aborted) break;
|
|
252
|
+
await sleep(intervalSeconds * 1000);
|
|
253
|
+
} while (!signal?.aborted);
|
|
254
|
+
} finally { store.close(); }
|
|
255
|
+
})());
|
|
256
|
+
|
|
201
257
|
/**
|
|
202
258
|
* Human-free live conversation: the selected address's LLM body answers the message that was just saved.
|
|
203
259
|
* The durable ledger stays authoritative — `replyWithAgent` owns the one-reply-per-request transaction and
|
|
@@ -8,10 +8,8 @@ import { debug, redactSecretText } from '../debug/log.js';
|
|
|
8
8
|
import { gateRemoteHostCap, realGateRemoteRunner, resolveGateRemoteSettings, runOnRemote, type GateRemoteRunner, type RemoteRunOutcome } from '../self-implement/gate-remote.js';
|
|
9
9
|
|
|
10
10
|
const SHA = /^[0-9a-f]{40}$/i;
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// allowlisted as the third slot while node-b/node-c keep discovery order — the recorded host order stays part of the
|
|
14
|
-
// evidence contract.
|
|
11
|
+
// This is the stable fallback order when settings.host is unavailable; an explicitly configured allowlisted host
|
|
12
|
+
// always leads, and the remaining allowlisted hosts retain their relative order.
|
|
15
13
|
export const PR_LAND_HEAVY_HOSTS = ['node-b', 'node-c', 'host-e-wsl'] as const;
|
|
16
14
|
export const PR_LAND_HEAVY_HOST = PR_LAND_HEAVY_HOSTS[0];
|
|
17
15
|
export type PrLandHeavyHost = typeof PR_LAND_HEAVY_HOSTS[number];
|
|
@@ -74,14 +72,23 @@ function evidencePath(input: HeavyRemoteInput): string {
|
|
|
74
72
|
return join(input.evidenceDir ?? join(effectiveInstanceRoot(), 'pr-land-heavy-results'), `${input.pr}.json`);
|
|
75
73
|
}
|
|
76
74
|
|
|
75
|
+
function validRootPlan(value: unknown): value is RootPlanSummary | null {
|
|
76
|
+
if (value === null) return true;
|
|
77
|
+
if (!value || typeof value !== 'object') return false;
|
|
78
|
+
const plan = value as Partial<RootPlanSummary>;
|
|
79
|
+
return (plan.mode === 'affected' || plan.mode === 'full')
|
|
80
|
+
&& (plan.roots === null || (Number.isSafeInteger(plan.roots) && plan.roots >= 0))
|
|
81
|
+
&& typeof plan.promoted === 'boolean'
|
|
82
|
+
&& (plan.reason === null || typeof plan.reason === 'string');
|
|
83
|
+
}
|
|
84
|
+
|
|
77
85
|
function matchingEvidence(path: string, input: HeavyRemoteInput): HeavyRemoteEvidence | null {
|
|
78
86
|
if (!existsSync(path)) return null;
|
|
79
87
|
try {
|
|
80
88
|
const data: HeavyRemoteEvidence = JSON.parse(readFileSync(path, 'utf8'));
|
|
81
89
|
return data.schema === 2 && data.pr === input.pr && data.head === input.head
|
|
82
90
|
&& data.main === input.main && allowedHost(data.host) && Number.isFinite(data.elapsedMs)
|
|
83
|
-
&& typeof data.interferenceMeasured === 'boolean'
|
|
84
|
-
&& (data.rootPlan === null || (data.rootPlan?.mode === 'affected' || data.rootPlan?.mode === 'full')) ? data : null;
|
|
91
|
+
&& typeof data.interferenceMeasured === 'boolean' && validRootPlan(data.rootPlan) ? data : null;
|
|
85
92
|
} catch { return null; }
|
|
86
93
|
}
|
|
87
94
|
|
|
@@ -214,9 +221,8 @@ export function ensurePrLandHeavyRemote(input: HeavyRemoteInput, deps: HeavyRemo
|
|
|
214
221
|
const started = now();
|
|
215
222
|
const deadline = started + settings.slotWaitSeconds * 1000;
|
|
216
223
|
let outcome: RemoteRunOutcome = { kind: 'busy' };
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
const hosts = [primaryHost, ...PR_LAND_HEAVY_HOSTS.filter((candidate) => candidate !== primaryHost)];
|
|
224
|
+
let selectedHost: PrLandHeavyHost = PR_LAND_HEAVY_HOSTS[0];
|
|
225
|
+
const hosts: readonly PrLandHeavyHost[] = [settings.host, ...PR_LAND_HEAVY_HOSTS.filter((host) => host !== settings.host)];
|
|
220
226
|
wait: for (;;) {
|
|
221
227
|
for (const host of hosts) {
|
|
222
228
|
selectedHost = host;
|
package/src/cli/release-cli.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
// elanous release resume --run <runId> --from <node> [--waive <node> --reason <text>] [--accepted-regressions <json>] [--gate-executor <pod|host> [--gate-host <ssh-host>]] [--gate-pod-pool <pool>] [--json]
|
|
10
10
|
// elanous release auto-start [--window-minutes <n>] [--apply] [--json]
|
|
11
11
|
// elanous release recover --run <runId> --pick <sha...> [--from export-check] [--command-root <path>] [--repo-root <path>] [--no-partial] [--json]
|
|
12
|
+
// elanous release recover-landing --run <runId> --merge <full-sha> [--from export-check] [--repo-root <path>] [--no-partial] [--json]
|
|
12
13
|
// elanous release rehearsal tick [--apply] [--checkout <dir>] [--shards <n>] [--remote <host>] [--recovery-run <id>] [--json]
|
|
13
14
|
// elanous release preflight --version <x.y.z> [--publish-at <iso>] [--json] (컷 − 60분 main export 포함 사전 점검 · 읽기 전용 · ⛔ 있으면 exit 1)
|
|
14
15
|
// elanous release cut-branch --version <x.y.z> [--base <sha>] --pick <sha>... [--append] [--dry-run]
|
|
@@ -45,7 +46,7 @@ import { isIsolatedLedgerWriteRoot } from '../hq/ledger-write-target.js';
|
|
|
45
46
|
import { runUnattendedRelease, type UnattendedReleaseDeps } from '../../scripts/release-loop/unattended-release.js';
|
|
46
47
|
import { publishAtError } from '../../scripts/release-loop/publish-at.js';
|
|
47
48
|
import { cutReleaseBranch } from '../../scripts/release-loop/cut-branch.js';
|
|
48
|
-
import { planResumeReleaseRun, recoverReleaseRun, resumeReleaseRun, ReleaseRecoverStopped, type RecoverReleaseDeps } from '../../scripts/release-loop/resume-release.js';
|
|
49
|
+
import { planResumeReleaseRun, recoverLandingPartialOption, recoverReleaseRun, recoverReleaseRunFromLanding, resumeReleaseRun, ReleaseRecoverStopped, type RecoverReleaseDeps } from '../../scripts/release-loop/resume-release.js';
|
|
49
50
|
import type { AcceptedRegression } from '../../scripts/release-loop/resume.js';
|
|
50
51
|
import type { PrereleaseKind } from '../../scripts/release-loop/release-version.js';
|
|
51
52
|
import { releaseReadiness } from '../../scripts/release-loop/release-readiness.js';
|
|
@@ -1388,6 +1389,31 @@ export function registerReleaseCommands(program: Command, releaseRunDeps: Unatte
|
|
|
1388
1389
|
}
|
|
1389
1390
|
}, (r) => r.stages.every((stage) => stage.outcome === 'ok'));
|
|
1390
1391
|
});
|
|
1392
|
+
release.command('recover-landing')
|
|
1393
|
+
.description('착지 알림 수동 재생 입구 — merge SHA로 중복을 억제하고 append → tip 고정 → export-check 재개를 수행한다. release-loop event hook 착지 전에는 사람이 직접 호출한다')
|
|
1394
|
+
.requiredOption('--run <runId>', '실패한 release-loop 런 ID')
|
|
1395
|
+
.requiredOption('--merge <sha>', 'main에 착지한 수리 커밋의 전체 40자리 SHA')
|
|
1396
|
+
.option('--from <node>', '재개 시작 노드 — 기본 export-check')
|
|
1397
|
+
.option('--command-root <path>', '재개 명령을 실행할 checkout — 생략 시 append tip 임시 checkout')
|
|
1398
|
+
.option('--repo-root <path>', 'append를 실행할 checkout — origin remote 필요')
|
|
1399
|
+
.option('--no-partial', 'Pod image digest 등이 맞지 않으면 전체 gate를 실행하며 부분 재검을 사용하지 않음')
|
|
1400
|
+
.option('--json', '결과 한 줄 JSON(stdout) · 사람 줄은 stderr')
|
|
1401
|
+
.action(async (o: { run: string; merge: string; from?: string; commandRoot?: string; repoRoot?: string; partial?: boolean; json?: boolean }) => {
|
|
1402
|
+
await jsonAction(o.json, async (log) => {
|
|
1403
|
+
try {
|
|
1404
|
+
const partial = recoverLandingPartialOption(o.partial);
|
|
1405
|
+
return await recoverReleaseRunFromLanding({ runId: o.run, mergeSha: o.merge,
|
|
1406
|
+
...(o.from === undefined ? {} : { from: o.from }),
|
|
1407
|
+
...(o.commandRoot === undefined ? {} : { commandRoot: o.commandRoot }),
|
|
1408
|
+
...(o.repoRoot === undefined ? {} : { repoRoot: o.repoRoot }),
|
|
1409
|
+
...(partial === undefined ? {} : { partial }) },
|
|
1410
|
+
{ ...resumeDeps, onSource: log });
|
|
1411
|
+
} catch (caught) {
|
|
1412
|
+
if (!(caught instanceof ReleaseRecoverStopped)) throw caught;
|
|
1413
|
+
return { ok: false as const, error: caught.message, stages: [...caught.stages], notRun: [...caught.notRun], duplicate: false };
|
|
1414
|
+
}
|
|
1415
|
+
}, (r) => r.duplicate || r.stages.every((stage) => stage.outcome === 'ok'));
|
|
1416
|
+
});
|
|
1391
1417
|
release.command('gate-history')
|
|
1392
1418
|
.description('GATE-FAIL-HISTORY (0.2.29) — 판을 넘는 게이트 실패 표 — 모든 release-loop·light-rc 런 원장 ⊕ gate-verdict 에서 시험 파일별 introduced·preexisting·env·flaky 횟수 · 마지막 실패 판 · 원인 PR(수리 PR 본문 «원인 #N»)')
|
|
1393
1419
|
.option('--since <판|일>', '이 판(x.y.z)부터 · 또는 그 날(YYYY-MM-DD) 이후 시작된 런부터')
|
package/src/cli/sim-cli.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
+
import { getTestStateRoot } from '../nexus/paths.js';
|
|
3
|
+
import { runReleaseSimRigIfFile } from '../ux-sim/release-sim-rig.js';
|
|
2
4
|
import { runScenarioFile } from '../ux-sim/scenario.js';
|
|
3
5
|
|
|
4
6
|
export function registerSimCommands(program: Command): void {
|
|
@@ -7,7 +9,11 @@ export function registerSimCommands(program: Command): void {
|
|
|
7
9
|
.description('등록된 UX simulation 시나리오를 test 우주에서 실행한다')
|
|
8
10
|
.action(async (scenarioFile: string) => {
|
|
9
11
|
try {
|
|
10
|
-
|
|
12
|
+
// Enforce isolation before either runner inspects the supplied path. Otherwise
|
|
13
|
+
// release-graph dispatch can leak a path-validation error outside test mode.
|
|
14
|
+
if (!getTestStateRoot()) throw new Error('scenario runner requires --test isolated mode');
|
|
15
|
+
const releaseResult = await runReleaseSimRigIfFile(scenarioFile);
|
|
16
|
+
const result = releaseResult ?? await runScenarioFile(scenarioFile);
|
|
11
17
|
console.log(JSON.stringify(result));
|
|
12
18
|
if (!result.pass) process.exitCode = 1;
|
|
13
19
|
} catch (error) {
|
package/src/cli/tasks-cli.ts
CHANGED
|
@@ -473,14 +473,15 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
473
473
|
return null;
|
|
474
474
|
}
|
|
475
475
|
|
|
476
|
-
/**
|
|
477
|
-
function
|
|
476
|
+
/** Advisory lines may precede the actual fatal error. Keep the full stderr as evidence. */
|
|
477
|
+
function actionableStderrLine(path: string): string {
|
|
478
478
|
try {
|
|
479
479
|
const fd = openSync(path, 'r');
|
|
480
480
|
try {
|
|
481
481
|
const buf = Buffer.alloc(4096);
|
|
482
482
|
const n = readSync(fd, buf, 0, buf.length, 0);
|
|
483
|
-
|
|
483
|
+
const lines = buf.subarray(0, n).toString('utf8').split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
484
|
+
return lines.find((line) => /^(?:❌|error:|fatal:)/i.test(line)) ?? lines[0] ?? '';
|
|
484
485
|
} finally { closeSync(fd); }
|
|
485
486
|
} catch { return ''; }
|
|
486
487
|
}
|
|
@@ -529,7 +530,7 @@ export async function defaultTaskLauncher(args: string[], cwd?: string, context?
|
|
|
529
530
|
: undefined;
|
|
530
531
|
if (timer) clearTimeout(timer);
|
|
531
532
|
if (early && early.code !== 0) {
|
|
532
|
-
const first =
|
|
533
|
+
const first = actionableStderrLine(stderrPath);
|
|
533
534
|
const cause = `child rc=${early.code ?? early.signal ?? 'unknown'}${first ? `: ${first}` : ''}`;
|
|
534
535
|
const { boundRunStopCause, recordRunStop, runStopRecorded, RUN_STOP_EVENT } = await import('../self-implement/run-stop.js');
|
|
535
536
|
const hasStop = deps.hasStop ?? ((id: string) => {
|
package/src/codex/models.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// ── OpenAI Codex model catalog ──
|
|
2
2
|
//
|
|
3
|
-
// Curated subset of the full OpenAI Codex CLI model roster
|
|
4
|
-
//
|
|
5
|
-
// the onboarding picker. Source: omni-crawl sweep on 2026-04-14 across
|
|
3
|
+
// Curated subset of the full OpenAI Codex CLI model roster, covering
|
|
4
|
+
// common use cases without overwhelming the onboarding picker. Source: omni-crawl sweep on 2026-04-14 across
|
|
6
5
|
// - developers.openai.com/api/docs/models/{all,codex-mini-latest,gpt-5-codex}
|
|
7
6
|
// - developers.openai.com/codex/models
|
|
8
7
|
// - platform.openai.com/docs/models
|
|
@@ -20,10 +19,9 @@
|
|
|
20
19
|
// 2026-09-09 refresh (live 1차 대조 — developers.openai.com/api/내부 문서 `gpt-6-astra`
|
|
21
20
|
// ⊕ openai.com/api/pricing/ ⊕ `codex exec --model gpt-6-astra` 실호출):
|
|
22
21
|
// + gpt-6-astra (2026-09-03 출시 · 현 최상단)
|
|
23
|
-
// + gpt-5.6-terra (
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
// astra 는 recommended 가 «아니다» — terra 대비 input 4배·output 3.3배라 기본값이 될 수 없다.
|
|
22
|
+
// + gpt-5.6-terra (at the time, the configured `llm.model` default)
|
|
23
|
+
// GPT-6.1 refresh (2026-10-28): recommended is GPT-6.1 Terra; Sol is available for higher-cost deep work.
|
|
24
|
+
// `recommended` means a safe default, not the strongest model; Astra remains opt-in due to its higher cost.
|
|
27
25
|
|
|
28
26
|
export type CodexModelTier = 'flagship' | 'balanced' | 'cheap' | 'specialist' | 'legacy';
|
|
29
27
|
|
|
@@ -44,11 +42,21 @@ export interface CodexModel {
|
|
|
44
42
|
recommended?: boolean;
|
|
45
43
|
}
|
|
46
44
|
|
|
47
|
-
/**
|
|
48
|
-
*
|
|
45
|
+
/** Curated models for the 1-point setup picker. Ordering reflects the UI:
|
|
46
|
+
* recommended first, then by descending tier. */
|
|
49
47
|
export const CODEX_MODELS: CodexModel[] = [
|
|
50
48
|
{
|
|
51
|
-
|
|
49
|
+
id: 'gpt-6.1-terra',
|
|
50
|
+
label: 'GPT-6.1 Terra',
|
|
51
|
+
tier: 'balanced',
|
|
52
|
+
description: 'Recommended everyday Codex model. 500K context; $1/$5 per million tokens, cached input $0.05.',
|
|
53
|
+
contextWindow: 500_000,
|
|
54
|
+
pricingUsd: { inputPerM: 1.0, outputPerM: 5.0, cacheReadPerM: 0.05 },
|
|
55
|
+
recommended: true,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
// Cache-read rates: Astra $1.00/M, GPT-6.1 Sol $0.10/M, Terra $0.05/M, Luna $0.01/M.
|
|
59
|
+
// Per OP 2026-10-28 price direction, legacy GPT-6 Sol also uses $0.10/M for cost estimates.
|
|
52
60
|
id: 'gpt-6-astra',
|
|
53
61
|
label: 'GPT-6 Astra (frontier)',
|
|
54
62
|
tier: 'flagship',
|
|
@@ -56,14 +64,21 @@ export const CODEX_MODELS: CodexModel[] = [
|
|
|
56
64
|
contextWindow: 1_050_000,
|
|
57
65
|
pricingUsd: { inputPerM: 10.0, outputPerM: 50.0, cacheReadPerM: 1.0 },
|
|
58
66
|
},
|
|
67
|
+
{
|
|
68
|
+
id: 'gpt-6.1-sol',
|
|
69
|
+
label: 'GPT-6.1 Sol',
|
|
70
|
+
tier: 'flagship',
|
|
71
|
+
description: 'Higher-capability reasoning and coding model. 500K context; $2/$10 per million tokens, cached input $0.10.',
|
|
72
|
+
contextWindow: 500_000,
|
|
73
|
+
pricingUsd: { inputPerM: 2.0, outputPerM: 10.0, cacheReadPerM: 0.1 },
|
|
74
|
+
},
|
|
59
75
|
{
|
|
60
76
|
id: 'gpt-6-sol',
|
|
61
|
-
label: 'GPT-6 Sol',
|
|
62
|
-
tier: '
|
|
63
|
-
description: '
|
|
77
|
+
label: 'GPT-6 Sol',
|
|
78
|
+
tier: 'legacy',
|
|
79
|
+
description: 'Legacy GPT-6 Sol retained for compatibility; GPT-6.1 Sol is its higher-performing successor at the same price, while Terra is a lower-cost default.',
|
|
64
80
|
contextWindow: 1_050_000,
|
|
65
|
-
pricingUsd: { inputPerM: 2.0, outputPerM: 10.0, cacheReadPerM: 0.
|
|
66
|
-
recommended: true,
|
|
81
|
+
pricingUsd: { inputPerM: 2.0, outputPerM: 10.0, cacheReadPerM: 0.1 },
|
|
67
82
|
},
|
|
68
83
|
{
|
|
69
84
|
id: 'gpt-6-luna',
|
|
@@ -33,6 +33,8 @@ import type {
|
|
|
33
33
|
CoreTurnStopReason,
|
|
34
34
|
} from './types.js';
|
|
35
35
|
|
|
36
|
+
const CORE_TURN_TOOL_RESULT_INLINE_LIMIT_BYTES = 50 * 1024;
|
|
37
|
+
|
|
36
38
|
/** Classify an error thrown out of `streamLLMWithTools` into the
|
|
37
39
|
* Core-turn stop-reason set. Abort wins over everything else;
|
|
38
40
|
* credential rejection (`isAuthRejectionError`) is distinct from a
|
|
@@ -329,6 +331,7 @@ export async function runCoreTurn(
|
|
|
329
331
|
researchTurn,
|
|
330
332
|
signal: ctx.signal,
|
|
331
333
|
...(ctx.requestSizeGuard ? { requestSizeGuard: ctx.requestSizeGuard } : {}),
|
|
334
|
+
toolResultInlineLimitBytes: CORE_TURN_TOOL_RESULT_INLINE_LIMIT_BYTES,
|
|
332
335
|
...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}),
|
|
333
336
|
...(ctx.maxToolTurns !== undefined ? { maxTurns: ctx.maxToolTurns } : {}),
|
|
334
337
|
...(ctx.initialProvider !== undefined
|
|
@@ -211,6 +211,40 @@ export function isInterimReportShaped(text: string): boolean {
|
|
|
211
211
|
return INTERIM_REPORT_SHAPED.test(text);
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
+
// TUI-FACT-TOOL-REPEAT — 턴 안에서 같은 값을 보장하는 안정 read-only 도구만 억제한다.
|
|
215
|
+
// Registry-wide readOnly metadata는 없다(FU). Live/poll·stream-consuming 조회(MsgList,
|
|
216
|
+
// ChecklistList, PtyShellPoll, AgentOutput), 외부 조회와 쓰기 동작은 이 좁은 목록 밖이다.
|
|
217
|
+
const GOAL_LOOP_READ_ONLY_TOOL_NAMES: ReadonlySet<string> = new Set([
|
|
218
|
+
'Read', 'Grep', 'Glob', 'ListDir', 'release_status', 'self_recall', 'ops_seats', 'decisions_pending', 'proact_meter',
|
|
219
|
+
]);
|
|
220
|
+
|
|
221
|
+
/** TUI-FACT-TOOL-REPEAT — 중복 판정 키: 도구명 + 인자의 stable 직렬화(키 순서와 무관하게 같은 내용=같은 키). */
|
|
222
|
+
function goalLoopReadOnlyCallKey(name: string, args: Record<string, unknown>): string {
|
|
223
|
+
return `${name}:${stableSerializeToolArgs(args)}`;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function stableSerializeToolArgs(value: unknown): string {
|
|
227
|
+
if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? String(value);
|
|
228
|
+
if (Array.isArray(value)) return `[${value.map(stableSerializeToolArgs).join(',')}]`;
|
|
229
|
+
const entries = Object.entries(value as Record<string, unknown>)
|
|
230
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
231
|
+
.map(([key, entry]) => `${JSON.stringify(key)}:${stableSerializeToolArgs(entry)}`);
|
|
232
|
+
return `{${entries.join(',')}}`;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
type ReadOnlyRepeatCacheEntry =
|
|
236
|
+
| { kind: 'inflight'; pending: Promise<unknown> }
|
|
237
|
+
| { kind: 'ok'; result: unknown }
|
|
238
|
+
| { kind: 'error'; error: unknown };
|
|
239
|
+
|
|
240
|
+
/** TUI-FACT-TOOL-REPEAT — 오류 캐시 적중 시 재호출 없이 돌려주는 억제 안내: 실패 근거를 실어
|
|
241
|
+
* 이 도구를 다시 호출하지 말고, 이 실패를 설명하는 최종 답으로 종결하게 유도한다. */
|
|
242
|
+
function buildReadOnlyRepeatSuppressedNotice(name: string, error: unknown): string {
|
|
243
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
244
|
+
return `[tool repeat suppressed] ${name} 은(는) 이 턴에서 이미 같은 인자로 실패했습니다(오류: ${reason}). `
|
|
245
|
+
+ `재시도는 억제되어 실제로 실행하지 않았습니다 — 이 도구를 다시 호출하지 말고, 이 실패 근거를 설명하는 최종 답을 지금 작성하세요.`;
|
|
246
|
+
}
|
|
247
|
+
|
|
214
248
|
/** 목표 실행 계약 — 첫 turn 앞에 leading system 메시지로 주입. codex 자체 prompt.md /
|
|
215
249
|
* ext-goal continuation.md 의 지속·anti-shrink·증거완료 언어 이식. ASCII + 한국어. */
|
|
216
250
|
export const GOAL_SYSTEM_PREAMBLE = [
|
|
@@ -790,6 +824,30 @@ export async function runGoalLoop(
|
|
|
790
824
|
let turnNewMessages: LLMMessage[] = [];
|
|
791
825
|
let dispatchCount = 0;
|
|
792
826
|
toolCallsThisIteration = 0;
|
|
827
|
+
// TUI-FACT-TOOL-REPEAT — 이번 core 턴의 read-only 중복 억제 캐시. 턴 시작마다 새로 만든다
|
|
828
|
+
// (캐시는 현재 턴 밖으로 유지하지 않는다 — 다음 반복은 새 턴이라 같은 조회도 다시 실제 실행된다).
|
|
829
|
+
const readOnlyRepeatCache = new Map<string, ReadOnlyRepeatCacheEntry>();
|
|
830
|
+
let readOnlyRepeatGeneration = 0;
|
|
831
|
+
const invalidateReadOnlyRepeatCache = () => {
|
|
832
|
+
readOnlyRepeatGeneration += 1;
|
|
833
|
+
readOnlyRepeatCache.clear();
|
|
834
|
+
};
|
|
835
|
+
const dispatchEffect = (
|
|
836
|
+
name: string, args: Record<string, unknown>, dctx: Parameters<CoreTurnContext["dispatchTool"]>[2],
|
|
837
|
+
ack?: () => Promise<unknown>,
|
|
838
|
+
) => {
|
|
839
|
+
// A write or external effect can change a later read in this same turn. Clear before dispatch,
|
|
840
|
+
// then clear again on settlement so an in-flight read cannot repopulate stale data.
|
|
841
|
+
invalidateReadOnlyRepeatCache();
|
|
842
|
+
let dispatched: Promise<unknown>;
|
|
843
|
+
try {
|
|
844
|
+
dispatched = Promise.resolve(seatDispatch(name, args, dctx, ack ? (() => ack()) : undefined));
|
|
845
|
+
} catch (error) {
|
|
846
|
+
invalidateReadOnlyRepeatCache();
|
|
847
|
+
return Promise.reject(error);
|
|
848
|
+
}
|
|
849
|
+
return dispatched.finally(invalidateReadOnlyRepeatCache);
|
|
850
|
+
};
|
|
793
851
|
let iterInputTokens = 0;
|
|
794
852
|
let iterOutputTokens = 0;
|
|
795
853
|
let iterCacheReadTokens = 0;
|
|
@@ -932,9 +990,37 @@ export async function runGoalLoop(
|
|
|
932
990
|
// 종결 신호는 예산 거부를 받지 않는다(#28503 terminalToolNames 계약과 같은 방향). 그 밖의 진행 선언
|
|
933
991
|
// (in_progress·blocked)은 도구 한 번으로 세고 상한 뒤엔 같은 안내로 거부한다(리뷰 r2 — 61번 넘게 불러도 안 막히던 구멍).
|
|
934
992
|
if ((args as { status?: unknown }).status === 'complete') return ack();
|
|
935
|
-
return
|
|
993
|
+
return dispatchEffect(name, args, dctx, ack);
|
|
994
|
+
}
|
|
995
|
+
// TUI-FACT-TOOL-REPEAT — update_goal 가로채기 판정 «뒤» read-only 실 실행 직전:
|
|
996
|
+
// 동일 read-only tool+args 는 이 턴에서 실제 실행 1회 이하(성공 결과 재사용 · 오류 재시도 억제).
|
|
997
|
+
// 쓰기·외부 효과 도구는 허용목록 밖이라 억제 없이 매번 실제 실행된다(경계 보존).
|
|
998
|
+
if (GOAL_LOOP_READ_ONLY_TOOL_NAMES.has(name)) {
|
|
999
|
+
const repeatKey = goalLoopReadOnlyCallKey(name, args);
|
|
1000
|
+
const cachedRepeat = readOnlyRepeatCache.get(repeatKey);
|
|
1001
|
+
if (cachedRepeat !== undefined) {
|
|
1002
|
+
try {
|
|
1003
|
+
debug.log('goal.loop', 'readonly-tool-repeat-suppressed', {
|
|
1004
|
+
sessionId: ctx.sessionId, ...runAttribution, iteration: iterations,
|
|
1005
|
+
tool: name, dispatch: dispatchCount, outcome: cachedRepeat.kind,
|
|
1006
|
+
}, { level: 'info' });
|
|
1007
|
+
} catch {
|
|
1008
|
+
// Observability must not change the suppressed result.
|
|
1009
|
+
}
|
|
1010
|
+
if (cachedRepeat.kind === 'inflight') return cachedRepeat.pending;
|
|
1011
|
+
if (cachedRepeat.kind === 'ok') return Promise.resolve(cachedRepeat.result);
|
|
1012
|
+
return Promise.resolve(buildReadOnlyRepeatSuppressedNotice(name, cachedRepeat.error));
|
|
1013
|
+
}
|
|
1014
|
+
const generation = readOnlyRepeatGeneration;
|
|
1015
|
+
const dispatchedRead = Promise.resolve(seatDispatch(name, args, dctx));
|
|
1016
|
+
readOnlyRepeatCache.set(repeatKey, { kind: 'inflight', pending: dispatchedRead });
|
|
1017
|
+
dispatchedRead.then(
|
|
1018
|
+
(result) => { if (generation === readOnlyRepeatGeneration) readOnlyRepeatCache.set(repeatKey, { kind: 'ok', result }); },
|
|
1019
|
+
(error) => { if (generation === readOnlyRepeatGeneration) readOnlyRepeatCache.set(repeatKey, { kind: 'error', error }); },
|
|
1020
|
+
);
|
|
1021
|
+
return dispatchedRead;
|
|
936
1022
|
}
|
|
937
|
-
return
|
|
1023
|
+
return dispatchEffect(name, args, dctx);
|
|
938
1024
|
},
|
|
939
1025
|
callbacks: {
|
|
940
1026
|
...ctx.callbacks,
|
|
@@ -135,6 +135,17 @@ export interface DashboardAcpBootDeps {
|
|
|
135
135
|
* blocks). Dashboard stashes this into its history store so the
|
|
136
136
|
* next turn sees real tool evidence. */
|
|
137
137
|
pushTurnToolHistory(messages: readonly LLMMessage[]): void;
|
|
138
|
+
/** TUI-TOKEN-GUARD-WIRE — replace the chat history store in place after the
|
|
139
|
+
* request-size cap compacted it, so the next prompt reads the compacted
|
|
140
|
+
* history (not the original 400+ messages). Absent = no write-back. */
|
|
141
|
+
replaceChatHistory?(messages: readonly ChatMessage[]): void;
|
|
142
|
+
/** Test seam — request-size cap override (defaults to 400k chars). */
|
|
143
|
+
requestSizeMaxChars?: number;
|
|
144
|
+
/** Test seam — the live compactor used for the history write-back. */
|
|
145
|
+
compactHistoryMessages?: (
|
|
146
|
+
messages: LLMMessage[],
|
|
147
|
+
ctx: { sessionId: string; activeModelId?: string },
|
|
148
|
+
) => Promise<{ messages: LLMMessage[]; reason: string } | null>;
|
|
138
149
|
/** Optional: agent name/version piped into the ACP handshake. */
|
|
139
150
|
agentName?: string;
|
|
140
151
|
agentVersion?: string;
|
|
@@ -219,6 +230,7 @@ export async function bootDashboardAcpSession(
|
|
|
219
230
|
const gateway = deps.approvalGateway;
|
|
220
231
|
const opts: DashboardSessionOptions = {
|
|
221
232
|
cwd: deps.getCwd(),
|
|
233
|
+
tuiRouting: true,
|
|
222
234
|
getMessages: ({ sessionId, userText }) => buildTurnMessages(deps, sessionId, userText),
|
|
223
235
|
getTools: ({ sessionId, userText }) => {
|
|
224
236
|
const tools = [...deps.getTools({ userText })];
|
|
@@ -229,6 +241,13 @@ export async function bootDashboardAcpSession(
|
|
|
229
241
|
onTurnComplete: ({ newMessages }) => {
|
|
230
242
|
deps.pushTurnToolHistory(newMessages);
|
|
231
243
|
},
|
|
244
|
+
...(deps.replaceChatHistory
|
|
245
|
+
? {
|
|
246
|
+
compactPersistedHistory: ({ sessionId, userText }: { sessionId: string; userText: string }) =>
|
|
247
|
+
compactDashboardChatHistory(deps, { sessionId, userText }),
|
|
248
|
+
}
|
|
249
|
+
: {}),
|
|
250
|
+
...(deps.requestSizeMaxChars !== undefined ? { requestSizeMaxChars: deps.requestSizeMaxChars } : {}),
|
|
232
251
|
resolveModel: ({ userText }) => {
|
|
233
252
|
const model = deps.getActiveModel({ userText });
|
|
234
253
|
return model ?? undefined;
|
|
@@ -413,6 +432,58 @@ export function createDefaultRequestPermissionHandler(
|
|
|
413
432
|
* contains the latest user message for the direct path, so this
|
|
414
433
|
* helper does NOT append another one; callers that haven't stored
|
|
415
434
|
* the user message yet should do so before invoking `.send()`. */
|
|
435
|
+
/** TUI-TOKEN-GUARD-WIRE — compact the dashboard chat history store in place.
|
|
436
|
+
* Keeps a trailing current-turn user message verbatim (buildTurnMessages
|
|
437
|
+
* detects it) and writes the result back through `replaceChatHistory`. */
|
|
438
|
+
export async function compactDashboardChatHistory(
|
|
439
|
+
deps: Pick<DashboardAcpBootDeps, 'getChatHistory' | 'replaceChatHistory' | 'getActiveModel' | 'compactHistoryMessages'>,
|
|
440
|
+
ctx: { sessionId: string; userText: string },
|
|
441
|
+
): Promise<{ fired: boolean; reason: string }> {
|
|
442
|
+
if (!deps.replaceChatHistory) return { fired: false, reason: 'no-history-writer' };
|
|
443
|
+
const history = [...deps.getChatHistory()];
|
|
444
|
+
const last = history[history.length - 1];
|
|
445
|
+
const trailingUser = isCurrentDashboardUser(last, ctx.userText) ? last : undefined;
|
|
446
|
+
const body = (trailingUser ? history.slice(0, -1) : history) as unknown as LLMMessage[];
|
|
447
|
+
if (body.length === 0) return { fired: false, reason: 'empty-history' };
|
|
448
|
+
const activeModelId = deps.getActiveModel({ userText: ctx.userText }) ?? undefined;
|
|
449
|
+
const compacted = deps.compactHistoryMessages
|
|
450
|
+
? await deps.compactHistoryMessages(body, { sessionId: ctx.sessionId, ...(activeModelId ? { activeModelId } : {}) })
|
|
451
|
+
: await (async () => {
|
|
452
|
+
const { compactLiveMessages } = await import('../session/request-size-guard.js');
|
|
453
|
+
const { getUserConfig } = await import('../user-config.js');
|
|
454
|
+
const chatCfg = getUserConfig().chat;
|
|
455
|
+
return compactLiveMessages(body, {
|
|
456
|
+
sessionId: ctx.sessionId,
|
|
457
|
+
...(activeModelId ? { activeModelId } : {}),
|
|
458
|
+
...(chatCfg?.autoCompact?.preserveLastN !== undefined ? { preserveLastN: chatCfg.autoCompact.preserveLastN } : {}),
|
|
459
|
+
...(chatCfg?.compact?.archiveEnabled !== undefined ? { archiveEnabled: chatCfg.compact.archiveEnabled } : {}),
|
|
460
|
+
});
|
|
461
|
+
})();
|
|
462
|
+
if (!compacted) return { fired: false, reason: 'compaction-no-op' };
|
|
463
|
+
const next = [
|
|
464
|
+
...(compacted.messages as unknown as ChatMessage[]),
|
|
465
|
+
...(trailingUser ? [trailingUser] : []),
|
|
466
|
+
];
|
|
467
|
+
deps.replaceChatHistory(next);
|
|
468
|
+
debug.log('dashboard.acp', 'chat-history-compacted', {
|
|
469
|
+
before: history.length,
|
|
470
|
+
after: next.length,
|
|
471
|
+
reason: compacted.reason,
|
|
472
|
+
});
|
|
473
|
+
return { fired: true, reason: `history-${compacted.reason}` };
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
function isCurrentDashboardUser(
|
|
477
|
+
message: ChatMessage | undefined,
|
|
478
|
+
userText: string,
|
|
479
|
+
): message is ChatMessage {
|
|
480
|
+
if (message?.role !== 'user') return false;
|
|
481
|
+
if (typeof message.content === 'string') return message.content === userText;
|
|
482
|
+
return message.content.some((block) =>
|
|
483
|
+
Boolean(block && typeof block === 'object' && 'text' in block
|
|
484
|
+
&& typeof block.text === 'string' && block.text === userText));
|
|
485
|
+
}
|
|
486
|
+
|
|
416
487
|
function buildTurnMessages(
|
|
417
488
|
deps: DashboardAcpBootDeps,
|
|
418
489
|
sessionId: string,
|
|
@@ -425,9 +496,7 @@ function buildTurnMessages(
|
|
|
425
496
|
// don't need to re-add. This mirrors the dashboard's current flow
|
|
426
497
|
// where `chat.history.push(userMsg)` runs BEFORE streamLLMWithTools.
|
|
427
498
|
const last = history[history.length - 1];
|
|
428
|
-
const hasTrailingUser = last
|
|
429
|
-
&& typeof last.content === 'string'
|
|
430
|
-
&& last.content.includes(userText);
|
|
499
|
+
const hasTrailingUser = isCurrentDashboardUser(last as ChatMessage | undefined, userText);
|
|
431
500
|
if (hasTrailingUser) {
|
|
432
501
|
return [...preamble, ...history];
|
|
433
502
|
}
|
package/src/dashboard/index.ts
CHANGED
|
@@ -15491,6 +15491,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15491
15491
|
pushTurnToolHistory: (msgs) => {
|
|
15492
15492
|
for (const m of msgs) chat.history.push(m as ChatMessage);
|
|
15493
15493
|
},
|
|
15494
|
+
// TUI-TOKEN-GUARD-WIRE — the request-size cap writes its compaction back here so the
|
|
15495
|
+
// next prompt reads the compacted history instead of reloading the original.
|
|
15496
|
+
replaceChatHistory: (msgs) => {
|
|
15497
|
+
chat.history.length = 0;
|
|
15498
|
+
for (const m of msgs) chat.history.push(m);
|
|
15499
|
+
},
|
|
15494
15500
|
// F1 — Phase 3 · ACP `requestPermission` gateway. Routes
|
|
15495
15501
|
// every inbound permission request to the dashboard's shared
|
|
15496
15502
|
// approval modal so the UX matches direct-dispatch approvers
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import type { LLMMessage } from '../llm.js';
|
|
17
17
|
import type { ModelFamily } from '../models/prompts.js';
|
|
18
|
-
import { debug } from '../debug/log.js';
|
|
18
|
+
import { debug, redactSecretText } from '../debug/log.js';
|
|
19
19
|
import type { NativeToolCatalogEntry } from '../native-tool-catalog.js';
|
|
20
20
|
import { buildUniversalPreamble } from '../prompt-library/universal-preamble.js';
|
|
21
21
|
import { buildSeatBootSystemMessages, type SeatBootDeps } from './seat-boot-preamble.js';
|
|
@@ -343,6 +343,17 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
343
343
|
debug.log('tui.notify', notificationOnlyWake ? 'notification-only-turn' : 'notification-with-user-request', {
|
|
344
344
|
notificationCount: pendingNotifications.length,
|
|
345
345
|
});
|
|
346
|
+
// Preserve bounded, secret-redacted evidence of the exact XML body
|
|
347
|
+
// delivered to the model. This lets live TUI diagnosis distinguish
|
|
348
|
+
// an opened turn from a notification whose fields were dropped.
|
|
349
|
+
const safeXml = redactSecretText(taskNotificationsXml);
|
|
350
|
+
const xmlPreview = safeXml.slice(0, 2_000);
|
|
351
|
+
debug.log('tui.notify', 'notification-payload', {
|
|
352
|
+
notificationCount: pendingNotifications.length,
|
|
353
|
+
xmlChars: taskNotificationsXml.length,
|
|
354
|
+
xmlPreview,
|
|
355
|
+
xmlPreviewTruncated: safeXml.length > xmlPreview.length,
|
|
356
|
+
}, { compact: { stringMax: 2_100 } });
|
|
346
357
|
preamble.push({ role: 'user', content: taskNotificationsXml });
|
|
347
358
|
}
|
|
348
359
|
});
|