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
|
@@ -70,7 +70,10 @@ export function recordPodSourceIoSummary(logs: string, job: string, runId: strin
|
|
|
70
70
|
if (!ioSummary) return;
|
|
71
71
|
try {
|
|
72
72
|
const measured = JSON.parse(ioSummary) as Record<string, unknown>;
|
|
73
|
-
|
|
73
|
+
const pushCounterReady = /^ELANOUS_POD_GIT_PUSH_COUNTER ready\r?$/m.test(logs);
|
|
74
|
+
const pushCalls = (logs.match(/^ELANOUS_POD_GIT_PUSH_ATTEMPT\r?$/gm) ?? []).length;
|
|
75
|
+
log('pod.source', 'io-summary', { job, runId, runIdSource, ...measured, hostOriginCalls,
|
|
76
|
+
...(pushCounterReady ? { pushCalls } : {}) });
|
|
74
77
|
} catch (error) {
|
|
75
78
|
log('pod.source', 'io-summary-invalid', { job, runId, runIdSource, reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
|
|
76
79
|
}
|
|
@@ -137,7 +140,7 @@ import { ZAI_POD_EGRESS_LABEL, checkZaiPodSecret, countActiveZaiJobs, decideZaiP
|
|
|
137
140
|
import { ZAI_CODING_DEFAULT_MODEL, ZAI_OPENROUTER_FALLBACK_MODEL, zaiSettingsFromConfig, type ZaiCodingPlanSettings } from '../../llm/zai-coding-plan.js';
|
|
138
141
|
import { normalizePlanningFallbackReason, selectEnhanceLlm } from '../../prompt-enhance/enhance.js';
|
|
139
142
|
import { inferProviderFromModel } from '../../llm.js';
|
|
140
|
-
import { classifyPodExit, extractPodFailureReason, podChildFailureAttribution, podDeadlineResultMarker, podJobConditionReason, podTerminalRow, POD_TERMINATION_JOB_JSONPATH, POD_TERMINATION_PODS_JSONPATH, readPodTermination, type PodExitClass, type PodTermination } from './pod-failure-reason.js';
|
|
143
|
+
import { classifyPodExit, extractPodFailureReason, podChildEvidenceLedgerRow, podChildFailureAttribution, podDeadlineResultMarker, podJobConditionReason, podTerminalRow, POD_TERMINATION_JOB_JSONPATH, POD_TERMINATION_PODS_JSONPATH, readPodTermination, type PodExitClass, type PodTermination } from './pod-failure-reason.js';
|
|
141
144
|
import { kubectlTransientReason, retryKubectlTransient } from './kubectl-transient-retry.js';
|
|
142
145
|
import { OLD_DOOR_STAMP_ENV } from '../../self-dev/old-door.js';
|
|
143
146
|
import { resolveDefaultSourceHead, seedMirrorOnce, type MirrorSeedResult } from './pod-mirror-seed.js';
|
|
@@ -771,9 +774,10 @@ export function podGitPushGuardScript(runId?: string): string {
|
|
|
771
774
|
' *) echo "[pod] git-guard: refused push to $rref (only this run\'s branches)" >&2; exit 1 ;;',
|
|
772
775
|
' esac',
|
|
773
776
|
'done',
|
|
777
|
+
'case "$2" in https://github.com/*|http://github.com/*|git@github.com:*|ssh://git@github.com/*) printf \'ELANOUS_POD_GIT_PUSH_ATTEMPT\\n\' >&2 ;; esac',
|
|
774
778
|
'exit 0',
|
|
775
779
|
'ELANOUS_PRE_PUSH',
|
|
776
|
-
`chmod 755 "${POD_GIT_HOOKS_DIR}/pre-push" && git config --global core.hooksPath "${POD_GIT_HOOKS_DIR}"`,
|
|
780
|
+
`chmod 755 "${POD_GIT_HOOKS_DIR}/pre-push" && git config --global core.hooksPath "${POD_GIT_HOOKS_DIR}" && printf 'ELANOUS_POD_GIT_PUSH_COUNTER ready\\n'`,
|
|
777
781
|
].join('\n');
|
|
778
782
|
}
|
|
779
783
|
|
|
@@ -1604,19 +1608,42 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
1604
1608
|
}
|
|
1605
1609
|
if (options.siWarmAttempt) {
|
|
1606
1610
|
const done = (async (): Promise<SelfImplementJobDone> => {
|
|
1611
|
+
// POD-REUSE-REQUEST-CLEAN-FU — one fail-soft row per request decision. `runId` is the
|
|
1612
|
+
// ledger partition (warm child, then parent run, then the legacy spaceId fallback);
|
|
1613
|
+
// `correlationId` always names the request's spaceId. `warm-path-selected` is recorded
|
|
1614
|
+
// before transport, so only the later return/quarantine row settles whether reuse completed.
|
|
1615
|
+
// A ledger write failure is an observation failure only.
|
|
1616
|
+
const recordWarmRequestDecision = (data: Record<string, unknown>, runId?: string) => {
|
|
1617
|
+
const parentRunId = env.ELANOUS_RUN_ID;
|
|
1618
|
+
const ledgerRunId = runId ?? parentRunId ?? input.spaceId;
|
|
1619
|
+
const runIdSource = runId ? 'warm-child-run' : parentRunId ? 'parent-run' : 'space-id-fallback';
|
|
1620
|
+
try { writeWarmLedger({ runId: ledgerRunId, event: 'pod-reuse-request-decision',
|
|
1621
|
+
data: { ...data, correlationId: input.spaceId, runIdSource } }); }
|
|
1622
|
+
catch (error) { debug.log('pod.reuse', 'ledger-unavailable', { spaceId: input.spaceId,
|
|
1623
|
+
event: 'pod-reuse-request-decision',
|
|
1624
|
+
reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' }); }
|
|
1625
|
+
};
|
|
1607
1626
|
let attempt: SiWarmChildAttempt;
|
|
1608
1627
|
try {
|
|
1609
1628
|
const acquired = await options.siWarmAttempt!(input);
|
|
1610
1629
|
if (!acquired) {
|
|
1611
1630
|
// No lease was fenced: use the existing one-shot Job path.
|
|
1631
|
+
recordWarmRequestDecision({ spaceId: input.spaceId, outcome: 'cold-job',
|
|
1632
|
+
workerId: null, leaseId: null, generation: null, podUid: null });
|
|
1612
1633
|
const { siWarmAttempt: _unused, siWarmHostPostprocess: _postprocess, ...coldOptions } = options;
|
|
1613
1634
|
return podSelfImplementSpawn(coldOptions)(input).done;
|
|
1614
1635
|
}
|
|
1615
1636
|
attempt = acquired;
|
|
1637
|
+
recordWarmRequestDecision({ spaceId: input.spaceId, outcome: 'warm-path-selected',
|
|
1638
|
+
workerId: acquired.command?.workerId ?? null, leaseId: acquired.command?.leaseId ?? null,
|
|
1639
|
+
generation: acquired.command?.generation ?? null, podUid: acquired.command?.podUid ?? null },
|
|
1640
|
+
acquired.command?.runId);
|
|
1616
1641
|
}
|
|
1617
1642
|
catch (error) {
|
|
1618
1643
|
// A lost exec reply may conceal an already opened PR. Never start another child here.
|
|
1619
1644
|
const message = error instanceof Error ? error.message : String(error);
|
|
1645
|
+
recordWarmRequestDecision({ spaceId: input.spaceId, outcome: 'acquire-failed', reason: message,
|
|
1646
|
+
workerId: null, leaseId: null, generation: null, podUid: null });
|
|
1620
1647
|
debug.log('pod.reuse', 'attempt-unavailable', { spaceId: input.spaceId, reason: message }, { level: 'warn' });
|
|
1621
1648
|
return { exitCode: 1, output: '', error: { code: 'si-warm-reconcile-only', message } };
|
|
1622
1649
|
}
|
|
@@ -1985,7 +2012,8 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
1985
2012
|
return 'pool-slot-unavailable';
|
|
1986
2013
|
};
|
|
1987
2014
|
const recordSlotObservation = (attempt: { observationKey: string; requestedAtMs: number; requestedAt: string },
|
|
1988
|
-
outcome: 'requested' | 'queued' | 'admitted' | 'rejected', reasonCode: string
|
|
2015
|
+
outcome: 'requested' | 'queued' | 'admitted' | 'rejected', reasonCode: string,
|
|
2016
|
+
cancellation?: { abortReason?: string; waitReason: string | null }): void => {
|
|
1989
2017
|
const pool = options.pool;
|
|
1990
2018
|
let occupants: Record<string, number> | null = null;
|
|
1991
2019
|
try { occupants = pool ? pool.snapshot() : null; } catch { /* observation must not change scheduling */ }
|
|
@@ -1994,6 +2022,8 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
1994
2022
|
observationKey: attempt.observationKey, runId: childRunId, host: resolveHostId(env),
|
|
1995
2023
|
requestedAt: attempt.requestedAt, waitedMs: Math.max(0, slotNow() - attempt.requestedAtMs),
|
|
1996
2024
|
queued: outcome === 'queued', poolCapacity, occupants, reasonCode, parentId: ledgerRunId, outcome,
|
|
2025
|
+
...(cancellation ? { waitReason: cancellation.waitReason,
|
|
2026
|
+
...(cancellation.abortReason === undefined ? {} : { abortReason: cancellation.abortReason }) } : {}),
|
|
1997
2027
|
};
|
|
1998
2028
|
debug.log('pod.slot', outcome, data, { level: outcome === 'admitted' || outcome === 'requested' ? 'info' : 'warn' });
|
|
1999
2029
|
try {
|
|
@@ -2045,6 +2075,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2045
2075
|
const attempt = { observationKey: `${childRunId}:pod-slot:${requestedAtMs}:${++slotAttemptNumber}`,
|
|
2046
2076
|
requestedAtMs, requestedAt: new Date(requestedAtMs).toISOString() };
|
|
2047
2077
|
let firstSlotReasonCode: string | undefined;
|
|
2078
|
+
stageReason['pool-slot'] = null;
|
|
2048
2079
|
let slotQueuedRecorded = false;
|
|
2049
2080
|
const stop = watchStall('pool-slot');
|
|
2050
2081
|
// MINIH-MODE (0.2.37): the location is declared by the launch env — absent/unknown keeps the configured
|
|
@@ -2110,7 +2141,10 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2110
2141
|
let member: PodPoolMember | null;
|
|
2111
2142
|
try { member = await acquireSlot(); } catch (error) { podAdmitError(error); throw error; }
|
|
2112
2143
|
if (options.pool && !member) {
|
|
2113
|
-
if (lastSlotAttempt) recordSlotObservation(lastSlotAttempt, 'rejected', lastSlotReasonCode ?? 'aborted'
|
|
2144
|
+
if (lastSlotAttempt) recordSlotObservation(lastSlotAttempt, 'rejected', lastSlotReasonCode ?? 'aborted', {
|
|
2145
|
+
waitReason: stageReason['pool-slot'] ?? null,
|
|
2146
|
+
...(typeof input.signal?.reason === 'string' ? { abortReason: input.signal.reason } : {}),
|
|
2147
|
+
});
|
|
2114
2148
|
exitJourneyNode('pool-admit', { provenance: 'self-implement-pod', outcome: 'refused', data: { spaceId: input.spaceId, reason: 'no-slot' } });
|
|
2115
2149
|
return { exitCode: null, output: '', error: { code: 'aborted', message: 'aborted before a pool slot opened', ...(lastSlotReasonCode ? { reasonCode: lastSlotReasonCode } : {}) } };
|
|
2116
2150
|
}
|
|
@@ -3005,7 +3039,8 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3005
3039
|
}
|
|
3006
3040
|
}
|
|
3007
3041
|
try {
|
|
3008
|
-
appendRunLedgerEntry({ runId: ledgerRunId,
|
|
3042
|
+
appendRunLedgerEntry({ runId: ledgerRunId, timestamp: new Date((options.now ?? Date.now)()).toISOString(),
|
|
3043
|
+
event: 'pod-child-run', data: { childRunId: liveChildRunId, job: name, attempt: oomRetried ? 2 : 1, ...(goalFile ? { goalFile } : {}) } }, ledgerDir);
|
|
3009
3044
|
appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-job-applied', data: { job: name, childRunId: liveChildRunId, jobUid: lifecycleJobUid, host: member?.sshHost ?? resolveHostId(env), context, namespace } }, ledgerDir);
|
|
3010
3045
|
if (lastPlacement) appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-placement', data: { job: name, childRunId: liveChildRunId, attempt: oomRetried ? 2 : 1, member: lastPlacement.member, kind: lastPlacement.kind, outcome: lastPlacement.outcome, preferred: lastPlacement.preferred, reason: lastPlacement.reason } }, ledgerDir);
|
|
3011
3046
|
appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-memory-selected', data: { job: name, childRunId: liveChildRunId, attempt: oomRetried ? 2 : 1, limit: memoryLimit, ...(appliedMemoryRequest ? { request: appliedMemoryRequest } : {}), tier: oomRetried ? retryTier : memoryTier, source: oomRetried ? 'oom-retry' : memorySource, reason: oomRetried ? 'OOMKilled' : memoryReason, declaredGoalType: selectedGoalType } }, ledgerDir);
|
|
@@ -3181,8 +3216,8 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3181
3216
|
if (seen !== null) {
|
|
3182
3217
|
releaseAdmission?.observed?.();
|
|
3183
3218
|
state = seen === 0 ? 'complete' : 'failed';
|
|
3184
|
-
// The child's own rc
|
|
3185
|
-
|
|
3219
|
+
// The child's own rc is the parent's exit code even when 0 — the condition path below yields none here.
|
|
3220
|
+
containerExitCode = seen;
|
|
3186
3221
|
if (seen !== 0) podTermination = readPodTermination({ kubectl, namespace, job: name, path: 'result-marker', jobUid: lifecycleJobUid });
|
|
3187
3222
|
if (seen !== 0) captureFailedJob(liveChildRunId);
|
|
3188
3223
|
debug.log('self-implement.pod', 'result-marker-early', { job: name, waitedMs: Date.now() - waitStartedAt, rc: seen });
|
|
@@ -3498,12 +3533,57 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3498
3533
|
// exitCode stays null when the container's code was not read (never filled in as 0).
|
|
3499
3534
|
const finishedRow = { job: name, run: launchRunId, ...(liveChildRunId !== launchRunId ? { childRun: liveChildRunId } : {}),
|
|
3500
3535
|
attempt: oomRetried ? 2 : 1, phase: state, exitCode: containerExitCode,
|
|
3501
|
-
reason: failedReason || containerReason || (state === 'complete' ? 'complete' : 'unknown')
|
|
3536
|
+
reason: failedReason || containerReason || (state === 'complete' ? 'complete' : 'unknown'),
|
|
3537
|
+
// POD-TERMINAL-EVIDENCE-JOIN: keep classifier and termination cause on this Job/childRun/attempt row.
|
|
3538
|
+
failureClassification: disposition?.failureClassification ?? null,
|
|
3539
|
+
classificationBasis: disposition?.childEvidence?.classificationBasis ?? null,
|
|
3540
|
+
// The child-run status is a different axis from the implementation's abandoned classification.
|
|
3541
|
+
// Preserve it even when the child did not emit a parseable self-implement disposition.
|
|
3542
|
+
podExitClass: state === 'failed' ? classifyPodExit({ containerReason: containerReason ?? null,
|
|
3543
|
+
containerExitCode: containerExitCode ?? null, jobReason: failedReason || null, logs }).class : null,
|
|
3544
|
+
childFailureStage: childFailure?.stage ?? null,
|
|
3545
|
+
terminationReason: typeof disposition?.childEvidence?.terminationReason === 'string'
|
|
3546
|
+
? redactSecretText(disposition.childEvidence.terminationReason).slice(0, 200) : null };
|
|
3502
3547
|
try { appendRunLedgerEntry({ runId: ledgerRunId, event: POD_LAUNCH_FINISHED_EVENT, timestamp: new Date((options.now ?? Date.now)()).toISOString(), data: finishedRow }, ledgerDir); }
|
|
3503
3548
|
catch (error) { debug.log('pod.provenance', 'history-unavailable', { job: name, row: 'finished', reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' }); }
|
|
3504
3549
|
debug.log('pod.provenance', 'job-finished', finishedRow);
|
|
3505
|
-
|
|
3550
|
+
// Keep report-deficit incidents queryable as one bounded event. The child detail field is
|
|
3551
|
+
// intentionally capped elsewhere, so cause evidence must not depend on that full payload.
|
|
3552
|
+
const reportDeficit = disposition?.failureClassification === 'report-deficit';
|
|
3553
|
+
const noResultIncident = state === 'failed' && failedReason !== 'DeadlineExceeded' && !disposition;
|
|
3554
|
+
if (reportDeficit || noResultIncident) {
|
|
3555
|
+
const evidence = disposition?.childEvidence;
|
|
3556
|
+
const diagnosticLines = [
|
|
3557
|
+
...(Array.isArray(evidence?.podLogTail) ? evidence.podLogTail : []),
|
|
3558
|
+
...(typeof evidence?.detail === 'string' ? evidence.detail.split('\n') : []),
|
|
3559
|
+
...(typeof evidence?.detailTail === 'string' ? evidence.detailTail.split('\n') : []),
|
|
3560
|
+
...(typeof evidence?.stderr === 'string' ? evidence.stderr.split('\n') : []),
|
|
3561
|
+
...(Array.isArray(noResultLogEvidence?.logTail) ? noResultLogEvidence.logTail as string[] : []),
|
|
3562
|
+
...(Array.isArray(noResultLogEvidence?.podLogTail) ? noResultLogEvidence.podLogTail as string[] : []),
|
|
3563
|
+
...(typeof noResultLogEvidence?.stderr === 'string' ? noResultLogEvidence.stderr.split('\n') : []),
|
|
3564
|
+
].slice(-12).map((line) => redactSecretText(line).slice(0, 500));
|
|
3565
|
+
debug.log('pod.child', reportDeficit ? 'report-deficit-cause' : 'terminal-cause', {
|
|
3566
|
+
job: name, run: launchRunId, childRun: liveChildRunId, attempt: oomRetried ? 2 : 1,
|
|
3567
|
+
// A missing parsed result is an incident trigger, not proof of the child's classifier.
|
|
3568
|
+
classification: disposition?.failureClassification ?? null,
|
|
3569
|
+
...(noResultIncident ? { trigger: 'no-result' } : {}),
|
|
3570
|
+
podExitClass: finishedRow.podExitClass,
|
|
3571
|
+
classificationBasis: evidence?.classificationBasis ?? null,
|
|
3572
|
+
phase: state, exitCode: containerExitCode,
|
|
3573
|
+
reason: failedReason || containerReason || 'unknown',
|
|
3574
|
+
terminationReason: evidence?.terminationReason ?? null,
|
|
3575
|
+
providerErrors: disposition?.providerErrors ?? null,
|
|
3576
|
+
oomKilled, podTermination: podTermination ?? null,
|
|
3577
|
+
detailTail: evidence?.detailTail ?? null,
|
|
3578
|
+
lastLines: diagnosticLines,
|
|
3579
|
+
}, { level: 'warn', compact: { stringMax: 4_500 } });
|
|
3580
|
+
}
|
|
3581
|
+
debug.log('self-implement.pod', 'job-finished', { job: name, ...(member ? { context: member.context } : {}), state, containerReason, stage: disposition?.stage ?? null, prUrl: disposition?.prUrl ?? null, childRunId: liveChildRunId, attempt: oomRetried ? 2 : 1, ledgerCompleteness,
|
|
3582
|
+
...(noResultLogEvidence ? { stopEvidenceTail: podStopEvidenceTail(noResultLogEvidence) } : {}),
|
|
3506
3583
|
...(podTermination ? { podTermination } : {}),
|
|
3584
|
+
failureClassification: finishedRow.failureClassification,
|
|
3585
|
+
classificationBasis: finishedRow.classificationBasis,
|
|
3586
|
+
terminationReason: finishedRow.terminationReason,
|
|
3507
3587
|
...(state === 'failed' && !oomKilled && failedReason !== 'DeadlineExceeded'
|
|
3508
3588
|
? { ...(childFailure ? { childStage: childFailure.stage } : disposition?.stage ? { childStage: disposition.stage } : {}),
|
|
3509
3589
|
// POD-NORESULT: a parsed result row without error text is not a missing result line (UX 10-07 01:01: 28 of 28 exit-2 Jobs printed one).
|
|
@@ -3569,7 +3649,10 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3569
3649
|
if (!await acquireAdmission()) return admissionFailure();
|
|
3570
3650
|
member = await acquireSlot();
|
|
3571
3651
|
if (options.pool && !member) {
|
|
3572
|
-
if (lastSlotAttempt) recordSlotObservation(lastSlotAttempt, 'rejected', lastSlotReasonCode ?? 'aborted'
|
|
3652
|
+
if (lastSlotAttempt) recordSlotObservation(lastSlotAttempt, 'rejected', lastSlotReasonCode ?? 'aborted', {
|
|
3653
|
+
waitReason: stageReason['pool-slot'] ?? null,
|
|
3654
|
+
...(typeof input.signal?.reason === 'string' ? { abortReason: input.signal.reason } : {}),
|
|
3655
|
+
});
|
|
3573
3656
|
return { exitCode: null, output: '', error: { code: 'aborted', message: 'aborted before a pool slot opened', ...(lastSlotReasonCode ? { reasonCode: lastSlotReasonCode } : {}) } };
|
|
3574
3657
|
}
|
|
3575
3658
|
if (member) context = member.context;
|
|
@@ -3595,13 +3678,21 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3595
3678
|
}
|
|
3596
3679
|
// The host still has the complete Pod log here. The CLI only retains a short stdout tail,
|
|
3597
3680
|
// so preserve the parsed child facts in the parent ledger before that tail is returned.
|
|
3598
|
-
|
|
3681
|
+
const childEvidenceRow = podChildEvidenceLedgerRow({
|
|
3682
|
+
job: name,
|
|
3683
|
+
childRunId: liveChildRunId,
|
|
3684
|
+
state,
|
|
3685
|
+
result: disposition ?? null,
|
|
3686
|
+
noResultDiagnostic,
|
|
3687
|
+
noResultLogEvidence,
|
|
3688
|
+
podTermination,
|
|
3689
|
+
});
|
|
3690
|
+
if (childEvidenceRow) {
|
|
3599
3691
|
// Every terminal attempt writes a marker, including one with no parseable child facts.
|
|
3600
3692
|
// The next attempt must never inherit an earlier Pod's classification.
|
|
3601
|
-
|
|
3602
|
-
|
|
3603
|
-
|
|
3604
|
-
try { appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-child-evidence', data: { childEvidence, childRunId: liveChildRunId, job: name, ...(podTermination ? { podTermination } : {}) } }, ledgerDir); }
|
|
3693
|
+
// Also persist completed Jobs whose child result is unsuccessful; Kubernetes
|
|
3694
|
+
// Completed is container success, not proof the requested work converged.
|
|
3695
|
+
try { appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-child-evidence', data: childEvidenceRow }, ledgerDir); }
|
|
3605
3696
|
catch (error) { debug.log('self-implement.pod', 'child-evidence-write-failed', { job: name, childRunId: liveChildRunId, reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' }); }
|
|
3606
3697
|
}
|
|
3607
3698
|
let prLookup: OpenPrByBranch | undefined;
|
|
@@ -3831,6 +3922,15 @@ function boundedPodLogText(source: string, maxChars: number): string {
|
|
|
3831
3922
|
return redacted.length > maxChars ? `${redacted.slice(0, maxChars)}…[truncated]` : redacted;
|
|
3832
3923
|
}
|
|
3833
3924
|
|
|
3925
|
+
/** A compact, redacted stop clue carried on the attempt-scoped finished row. */
|
|
3926
|
+
function podStopEvidenceTail(evidence: Record<string, unknown>): string[] {
|
|
3927
|
+
const raw = Array.isArray(evidence.logTail) ? evidence.logTail
|
|
3928
|
+
: Array.isArray(evidence.podLogTail) ? evidence.podLogTail
|
|
3929
|
+
: typeof evidence.stderr === 'string' ? evidence.stderr.split(/\r\n|\n|\r/u) : [];
|
|
3930
|
+
return raw.slice(-12).filter((line): line is string => typeof line === 'string' && line.length > 0)
|
|
3931
|
+
.map((line) => redactSecretText(line).slice(0, 240));
|
|
3932
|
+
}
|
|
3933
|
+
|
|
3834
3934
|
/** 로그 꼬리 — 마지막 N줄만, 한 줄씩 비밀값 마스킹. */
|
|
3835
3935
|
export function podNoResultLogTailLines(source: string, maxLines: number = POD_NO_RESULT_LOG_TAIL_LINES): string[] {
|
|
3836
3936
|
const lines = source.replace(/\r\n/g, '\n').split('\n');
|
|
@@ -123,6 +123,8 @@ export interface PodChildEvidence {
|
|
|
123
123
|
/** Bounded, redacted diagnostics copied only from a failed child terminal result. */
|
|
124
124
|
error?: string;
|
|
125
125
|
detail?: string;
|
|
126
|
+
/** Tail of the child detail, retained separately so long reports keep their final diagnostic lines. */
|
|
127
|
+
detailTail?: string;
|
|
126
128
|
stderr?: string;
|
|
127
129
|
/** Bounded, redacted complete Pod log tail. Separate from child stderr to avoid replacing stronger child facts. */
|
|
128
130
|
podLogTail?: string[];
|
|
@@ -130,6 +132,8 @@ export interface PodChildEvidence {
|
|
|
130
132
|
podLogUnavailable?: string;
|
|
131
133
|
exitCode?: number;
|
|
132
134
|
classification?: string;
|
|
135
|
+
/** Why the child assigned its failure classification; independent from the label itself. */
|
|
136
|
+
classificationBasis?: string;
|
|
133
137
|
scopeEscape?: true;
|
|
134
138
|
outOfScopeEdits?: unknown;
|
|
135
139
|
/** SCOPE-ESCAPE-AS-REFINE — why held out-of-scope edits stop the run (deletion · protected path · cap). Present only with scopeEscape. */
|
|
@@ -156,6 +160,14 @@ export interface PodChildEvidence {
|
|
|
156
160
|
goalPlanRevision?: SelfDevJobResult['goalPlanRevision'];
|
|
157
161
|
}
|
|
158
162
|
|
|
163
|
+
function utf8Tail(value: string, maxBytes: number): string {
|
|
164
|
+
const bytes = Buffer.from(value, 'utf8');
|
|
165
|
+
let start = Math.max(0, bytes.length - maxBytes);
|
|
166
|
+
// Move past continuation bytes so decoding starts at a complete UTF-8 code point.
|
|
167
|
+
while (start < bytes.length && (bytes[start]! & 0xc0) === 0x80) start++;
|
|
168
|
+
return bytes.subarray(start).toString('utf8');
|
|
169
|
+
}
|
|
170
|
+
|
|
159
171
|
const SCOPE_STOP_REASON_ORDER: readonly ScopeStopReason[] = SCOPE_STOP_REASONS;
|
|
160
172
|
|
|
161
173
|
/** Stop reasons for held out-of-scope edits: the child's own `scopeStopReasons` (orchestrator decideScopeExpansion) plus
|
|
@@ -218,12 +230,18 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
|
|
|
218
230
|
const classification = scopeEscape ? 'scope-escape'
|
|
219
231
|
: typeof abandoned?.classification === 'string' ? redactSecretText(abandoned.classification)
|
|
220
232
|
: typeof o.failureClassification === 'string' ? redactSecretText(o.failureClassification) : undefined;
|
|
233
|
+
const rawClassificationBasis = abandoned?.classificationBasis ?? o.classificationBasis;
|
|
234
|
+
const classificationBasis = typeof rawClassificationBasis === 'string' && rawClassificationBasis.trim()
|
|
235
|
+
? redactSecretText(rawClassificationBasis).slice(0, 200) : undefined;
|
|
221
236
|
const evidence: PodChildEvidence = {
|
|
222
237
|
...(failedText(o.error) ? { error: failedText(o.error) } : {}),
|
|
223
238
|
...(failedText(o.detail) ? { detail: failedText(o.detail) } : {}),
|
|
239
|
+
...(o.ok === false && typeof o.detail === 'string' && o.detail.trim()
|
|
240
|
+
? { detailTail: utf8Tail(redactSecretText(o.detail), 4_096) } : {}),
|
|
224
241
|
...(failedText(o.stderr) ? { stderr: failedText(o.stderr) } : {}),
|
|
225
242
|
...(failureExitCode !== undefined ? { exitCode: failureExitCode } : {}),
|
|
226
243
|
...(classification ? { classification } : {}),
|
|
244
|
+
...(classificationBasis ? { classificationBasis } : {}),
|
|
227
245
|
...(scopeEscape ? { scopeEscape: true, scopeStopReasons } : {}),
|
|
228
246
|
...(outOfScopeEdits !== undefined ? { outOfScopeEdits } : {}),
|
|
229
247
|
...(newScope ? { newScope } : {}),
|
package/src/tui/entry.ts
CHANGED
|
@@ -346,9 +346,11 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
346
346
|
const sidetabLines = sidetabOpen
|
|
347
347
|
? sidetabApi!.formatSidetabLines(sidetabRows, sidetabSelected, sidetabWidth, Math.max(1, rows - 1), sidetabMode)
|
|
348
348
|
: [];
|
|
349
|
-
const
|
|
350
|
-
|
|
351
|
-
|
|
349
|
+
const screenLineCount = sidetabOpen ? Math.max(lines.length, sidetabLines.length) : lines.length;
|
|
350
|
+
const screenLines = Array.from({ length: screenLineCount }, (_, index) => {
|
|
351
|
+
const line = lines[index] ?? '';
|
|
352
|
+
return sidetabOpen ? `${sidetabLines[index] ?? ' '.repeat(sidetabWidth)}│${line}` : line;
|
|
353
|
+
});
|
|
352
354
|
process.stdout.write(`\x1b[H\x1b[2J${screenLines.join('\n')}\x1b[${promptRow};${prompt.cursorCol + (sidetabOpen ? sidetabWidth + 1 : 0)}H\x1b[?25h`);
|
|
353
355
|
if (sidetabAttachments?.hasModal() && !paintingCoordinatorFrame) sidetabAttachments.refresh();
|
|
354
356
|
};
|
|
@@ -1258,10 +1260,15 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
1258
1260
|
}
|
|
1259
1261
|
if (submitted === '/help' || submitted === '/help next') {
|
|
1260
1262
|
activity.push(
|
|
1263
|
+
'Commands',
|
|
1261
1264
|
'Next TUI: /side · /sidetab — 세션/PTY 목록',
|
|
1262
1265
|
'사이드탭: Ctrl+\\ 토글 · ↑↓ 선택 · 빈 prompt Enter=attach · /side new · /side kill',
|
|
1263
1266
|
'새 PTY: s shell · e elanous · c codex 구독 · l claude code 구독',
|
|
1264
1267
|
'PTY 분리: Ctrl+\\ 후 d · /term help 는 읽기 전용 목록 명령',
|
|
1268
|
+
'',
|
|
1269
|
+
'Keys',
|
|
1270
|
+
'Enter 전송 · Esc 취소 · PgUp/PgDn 대화 스크롤 · Ctrl+Q 종료',
|
|
1271
|
+
'Ctrl+\\ 사이드탭 토글 · ↑/↓ 목록 이동 · Esc 입력으로 돌아오기',
|
|
1265
1272
|
);
|
|
1266
1273
|
status = 'Enter 전송';
|
|
1267
1274
|
render();
|
package/src/tui/sidetab/list.ts
CHANGED
|
@@ -1,2 +1,47 @@
|
|
|
1
1
|
/** Compatibility entry point for existing Next TUI callers. Shared behavior lives in sidetab-core. */
|
|
2
2
|
export * from '../../sidetab-core/model.js';
|
|
3
|
+
import {
|
|
4
|
+
formatSidetabLines as formatCoreSidetabLines,
|
|
5
|
+
loadSidetabRows as loadCoreSidetabRows,
|
|
6
|
+
type SidetabRow,
|
|
7
|
+
} from '../../sidetab-core/model.js';
|
|
8
|
+
import { listPtyManifestRows } from '../../pty-shell/pty-manifest.js';
|
|
9
|
+
import { formatSidetabPeekLines } from './peek.js';
|
|
10
|
+
|
|
11
|
+
type PreviewSidetabRow = SidetabRow & { readonly previewSource?: string };
|
|
12
|
+
|
|
13
|
+
/** Attach the latest manifest snapshot without changing the shared row contract. */
|
|
14
|
+
export function loadSidetabRows(all = false, currentSessionId?: string): SidetabRow[] {
|
|
15
|
+
const snapshots = new Map<string, string>(listPtyManifestRows().map((row) => [row.id, row.snapshot || row.frame] as const));
|
|
16
|
+
return loadCoreSidetabRows(all, currentSessionId).map((row) => ({
|
|
17
|
+
...row,
|
|
18
|
+
previewSource: snapshots.get(row.id) ?? '',
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Render the core list and reserve a bounded tail preview for the selected PTY row. */
|
|
23
|
+
export function formatSidetabLines(
|
|
24
|
+
rows: readonly SidetabRow[],
|
|
25
|
+
selected: number,
|
|
26
|
+
width: number,
|
|
27
|
+
height = Number.POSITIVE_INFINITY,
|
|
28
|
+
mode: 'list' | 'new' = 'list',
|
|
29
|
+
): string[] {
|
|
30
|
+
const selectedRow = rows[selected] as PreviewSidetabRow | undefined;
|
|
31
|
+
const peekLines = mode === 'list' && selectedRow
|
|
32
|
+
? formatSidetabPeekLines(selectedRow.previewSource ?? '', width)
|
|
33
|
+
: [];
|
|
34
|
+
if (peekLines.length === 0) return formatCoreSidetabLines(rows, selected, width, height, mode);
|
|
35
|
+
|
|
36
|
+
const reservedRows = peekLines.length + 1;
|
|
37
|
+
const coreLines = formatCoreSidetabLines(rows, selected, width, Math.max(0, height - reservedRows), mode);
|
|
38
|
+
// The core formatter reserves the leading ` › ` token for selection; a
|
|
39
|
+
// session label may itself contain `›`, so searching anywhere in the line
|
|
40
|
+
// can place the preview under the wrong row.
|
|
41
|
+
const selectedLine = coreLines.findIndex((line) => line.startsWith(' › '));
|
|
42
|
+
if (selectedLine < 0) return coreLines;
|
|
43
|
+
|
|
44
|
+
const lines = [...coreLines];
|
|
45
|
+
lines.splice(selectedLine + 1, 0, ' '.repeat(width), ...peekLines);
|
|
46
|
+
return Number.isFinite(height) ? lines.slice(0, Math.max(0, Math.floor(height))) : lines;
|
|
47
|
+
}
|
|
@@ -1,136 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export const NEXT_SIDETAB_TOOL_NAME = 'NextSidetab';
|
|
5
|
-
const CALL = 'elanous.sidetab.call';
|
|
6
|
-
const RESULT = 'elanous.sidetab.result';
|
|
7
|
-
|
|
8
|
-
export type NextSidetabAction = 'list' | 'switch' | 'attach' | 'detach' | 'new' | 'kill';
|
|
9
|
-
export interface NextSidetabRequest {
|
|
10
|
-
action: NextSidetabAction;
|
|
11
|
-
target?: string;
|
|
12
|
-
character?: 'shell' | 'elanous';
|
|
13
|
-
confirm?: boolean;
|
|
14
|
-
}
|
|
15
|
-
export interface NextSidetabCall { type: typeof CALL; callId: string; request: NextSidetabRequest }
|
|
16
|
-
export interface NextSidetabResult { type: typeof RESULT; callId: string; result: unknown }
|
|
17
|
-
export type NextSidetabHandler = (request: NextSidetabRequest) => Promise<unknown>;
|
|
18
|
-
export interface NextSidetabHostDeps {
|
|
19
|
-
rows(): readonly SidetabRow[] | Promise<readonly SidetabRow[]>;
|
|
20
|
-
selected(): number;
|
|
21
|
-
switchSession(row: SidetabRow): Promise<unknown>;
|
|
22
|
-
attach(row: SidetabRow): Promise<unknown>;
|
|
23
|
-
detach(): unknown;
|
|
24
|
-
spawn(character: 'shell' | 'elanous'): unknown;
|
|
25
|
-
kill(row: SidetabRow): unknown;
|
|
26
|
-
}
|
|
27
|
-
export interface NextSidetabIpcProcess {
|
|
28
|
-
send?: (message: unknown) => boolean | void;
|
|
29
|
-
on(event: 'message', listener: (message: unknown) => void): unknown;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export const nextSidetabToolSpec: LLMToolSpec = {
|
|
33
|
-
name: NEXT_SIDETAB_TOOL_NAME,
|
|
34
|
-
description: 'Control the Next TUI side tab: list/view sessions and PTYs, switch sessions, attach or detach, start a local shell or elanous PTY, or kill a PTY. Ask the user to confirm before calling kill with confirm=true. Starting coding agents is not supported.',
|
|
35
|
-
parameters: {
|
|
36
|
-
type: 'object',
|
|
37
|
-
properties: {
|
|
38
|
-
action: { type: 'string', enum: ['list', 'switch', 'attach', 'detach', 'new', 'kill'] },
|
|
39
|
-
target: { type: 'string', description: 'Optional exact or partial row id/label; required for targeted actions.' },
|
|
40
|
-
character: { type: 'string', enum: ['shell', 'elanous'], description: 'Only used with action=new.' },
|
|
41
|
-
confirm: { type: 'boolean', description: 'Must be true only after the user explicitly confirmed killing the selected PTY.' },
|
|
42
|
-
},
|
|
43
|
-
required: ['action'],
|
|
44
|
-
additionalProperties: false,
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export function isNextSidetabCall(value: unknown): value is NextSidetabCall {
|
|
49
|
-
const call = value as Partial<NextSidetabCall> | null;
|
|
50
|
-
return Boolean(call && call.type === CALL && typeof call.callId === 'string'
|
|
51
|
-
&& call.request && typeof call.request === 'object');
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export async function answerNextSidetabCall(handler: NextSidetabHandler, call: NextSidetabCall): Promise<NextSidetabResult> {
|
|
55
|
-
try { return { type: RESULT, callId: call.callId, result: await handler(call.request) }; }
|
|
56
|
-
catch (error) {
|
|
57
|
-
return { type: RESULT, callId: call.callId, result: { error: error instanceof Error ? error.message : String(error) } };
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export function createNextSidetabHostHandler(deps: NextSidetabHostDeps): NextSidetabHandler {
|
|
62
|
-
return async (request) => {
|
|
63
|
-
if (!request || !['list', 'switch', 'attach', 'detach', 'new', 'kill'].includes(request.action)) {
|
|
64
|
-
return { error: '지원하지 않는 사이드탭 동작입니다' };
|
|
65
|
-
}
|
|
66
|
-
if (request.action === 'new') {
|
|
67
|
-
if (request.character !== 'shell' && request.character !== 'elanous') return { error: 'character는 shell 또는 elanous여야 합니다' };
|
|
68
|
-
return deps.spawn(request.character);
|
|
69
|
-
}
|
|
70
|
-
if (request.action === 'detach') return deps.detach();
|
|
71
|
-
const rows = await deps.rows();
|
|
72
|
-
if (request.action === 'list') return rows.map(({ id, label, kind, badge, sessionId }) => ({ id, label, kind, badge, ...(sessionId ? { sessionId } : {}) }));
|
|
73
|
-
const target = request.target?.trim();
|
|
74
|
-
const exact = target ? rows.find((item) => item.id === target)
|
|
75
|
-
?? rows.find((item) => item.label.toLowerCase() === target.toLowerCase()) : undefined;
|
|
76
|
-
const partial = target && !exact ? rows.filter((item) => item.label.toLowerCase().includes(target.toLowerCase())) : [];
|
|
77
|
-
if (partial.length > 1) return { error: `사이드탭 항목이 여러 개 일치합니다: ${target}` };
|
|
78
|
-
const row = exact ?? partial[0] ?? (target ? undefined : rows[deps.selected()]);
|
|
79
|
-
if (!row) return { error: target ? `사이드탭 항목을 찾지 못했습니다: ${target}` : '선택된 사이드탭 항목이 없습니다' };
|
|
80
|
-
if (request.action === 'switch') return row.kind === 'tui' ? deps.switchSession(row) : { error: 'Next TUI 세션만 전환할 수 있습니다' };
|
|
81
|
-
if (request.action === 'attach') return deps.attach(row);
|
|
82
|
-
if (row.currentProcess) return { error: '현재 TUI 세션은 사이드탭에서 종료할 수 없습니다' };
|
|
83
|
-
if (request.confirm !== true) return { needsConfirmation: true, message: `PTY 종료 확인 필요: ${row.label}` };
|
|
84
|
-
return deps.kill(row);
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function createReplNextSidetabTool(
|
|
89
|
-
proc: NextSidetabIpcProcess,
|
|
90
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
91
|
-
timeoutMs = 15_000,
|
|
92
|
-
): { spec: LLMToolSpec; dispatch: (args: Record<string, unknown>) => Promise<unknown> } | null {
|
|
93
|
-
if (env.ELANOUS_NEXT_TUI_SIDETAB_IPC !== '1' || typeof proc.send !== 'function') return null;
|
|
94
|
-
const send = proc.send.bind(proc);
|
|
95
|
-
const waiting = new Map<string, (result: unknown) => void>();
|
|
96
|
-
let sequence = 0;
|
|
97
|
-
const listener = (message: unknown): void => {
|
|
98
|
-
const result = message as Partial<NextSidetabResult> | null;
|
|
99
|
-
if (!result || result.type !== RESULT || typeof result.callId !== 'string') return;
|
|
100
|
-
const resolve = waiting.get(result.callId);
|
|
101
|
-
if (!resolve) return;
|
|
102
|
-
waiting.delete(result.callId);
|
|
103
|
-
resolve(result.result);
|
|
104
|
-
};
|
|
105
|
-
proc.on('message', listener);
|
|
106
|
-
return {
|
|
107
|
-
spec: nextSidetabToolSpec,
|
|
108
|
-
dispatch: (args) => new Promise((resolve) => {
|
|
109
|
-
const callId = `s${++sequence}`;
|
|
110
|
-
const timer = setTimeout(() => {
|
|
111
|
-
if (!waiting.delete(callId)) return;
|
|
112
|
-
resolve({ error: 'Next TUI did not answer the side-tab request' });
|
|
113
|
-
}, timeoutMs);
|
|
114
|
-
waiting.set(callId, (result) => { clearTimeout(timer); resolve(result); });
|
|
115
|
-
try {
|
|
116
|
-
send({ type: CALL, callId, request: args as unknown as NextSidetabRequest } satisfies NextSidetabCall);
|
|
117
|
-
} catch (error) {
|
|
118
|
-
waiting.delete(callId);
|
|
119
|
-
clearTimeout(timer);
|
|
120
|
-
resolve({ error: `Next TUI IPC send failed: ${error instanceof Error ? error.message : String(error)}` });
|
|
121
|
-
}
|
|
122
|
-
}),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export function registerNextSidetabReplTool(
|
|
127
|
-
specs: LLMToolSpec[],
|
|
128
|
-
dispatchByName: Map<string, (args: Record<string, unknown>) => Promise<unknown>>,
|
|
129
|
-
proc: NextSidetabIpcProcess,
|
|
130
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
131
|
-
): void {
|
|
132
|
-
const tool = createReplNextSidetabTool(proc, env);
|
|
133
|
-
if (!tool) return;
|
|
134
|
-
specs.push(tool.spec);
|
|
135
|
-
dispatchByName.set(tool.spec.name, tool.dispatch);
|
|
136
|
-
}
|
|
1
|
+
/** Compatibility entry point for Next TUI callers. Shared contracts and policy live in sidetab-core. */
|
|
2
|
+
export * from '../../sidetab-core/model.js';
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const graphemes = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
2
|
+
|
|
3
|
+
const ANSI_CONTROL = /\x1b(?:\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1b\\)|[PX^_].*?\x1b\\|.)/gs;
|
|
4
|
+
const NON_TEXT_CONTROL = /[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g;
|
|
5
|
+
const MAX_PEEK_SOURCE_CHARS = 16_384;
|
|
6
|
+
|
|
7
|
+
function fitLine(value: string, width: number): string {
|
|
8
|
+
if (width <= 0) return '';
|
|
9
|
+
if (Bun.stringWidth(value) <= width) return value;
|
|
10
|
+
const maxTextWidth = Math.max(0, width - 1);
|
|
11
|
+
let result = '';
|
|
12
|
+
let used = 0;
|
|
13
|
+
for (const { segment } of graphemes.segment(value)) {
|
|
14
|
+
const cells = Bun.stringWidth(segment);
|
|
15
|
+
if (used + cells > maxTextWidth) break;
|
|
16
|
+
result += segment;
|
|
17
|
+
used += cells;
|
|
18
|
+
}
|
|
19
|
+
return `${result}…`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Return up to three recent plain-text output lines for the selected sidebar row. */
|
|
23
|
+
export function formatSidetabPeekLines(
|
|
24
|
+
source: string,
|
|
25
|
+
width: number,
|
|
26
|
+
maxLines = 3,
|
|
27
|
+
): string[] {
|
|
28
|
+
if (!source || width < 5 || maxLines <= 0) return [];
|
|
29
|
+
|
|
30
|
+
let start = Math.max(0, source.length - MAX_PEEK_SOURCE_CHARS);
|
|
31
|
+
// Keep a surrogate pair intact when the bounded tail starts in its second code unit.
|
|
32
|
+
const firstCodeUnit = source.charCodeAt(start);
|
|
33
|
+
if (start > 0 && firstCodeUnit >= 0xdc00 && firstCodeUnit <= 0xdfff) start++;
|
|
34
|
+
let bounded = source.slice(start);
|
|
35
|
+
// The cut may land in an ANSI sequence or line. Drop that partial prefix; recent complete lines follow it.
|
|
36
|
+
if (start > 0) {
|
|
37
|
+
const firstLineBreak = bounded.search(/[\r\n]/);
|
|
38
|
+
if (firstLineBreak >= 0) bounded = bounded.slice(firstLineBreak + 1);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const clean = bounded
|
|
42
|
+
.replace(ANSI_CONTROL, '')
|
|
43
|
+
.replace(NON_TEXT_CONTROL, '')
|
|
44
|
+
.replace(/\r\n?/g, '\n');
|
|
45
|
+
const recent = clean.split('\n')
|
|
46
|
+
.map((line) => line.trimEnd())
|
|
47
|
+
.filter((line) => line.trim().length > 0)
|
|
48
|
+
.slice(-Math.min(3, Math.floor(maxLines)));
|
|
49
|
+
const prefix = ' ↳ ';
|
|
50
|
+
const textWidth = Math.max(1, width - Bun.stringWidth(prefix));
|
|
51
|
+
return recent.map((line) => `${prefix}${fitLine(line, textWidth)}`);
|
|
52
|
+
}
|
|
@@ -211,6 +211,9 @@ export class DashboardSession {
|
|
|
211
211
|
? { resolveMaxToolTurns: opts.resolveMaxToolTurns }
|
|
212
212
|
: {}),
|
|
213
213
|
...(opts.abortPollMs !== undefined ? { abortPollMs: opts.abortPollMs } : {}),
|
|
214
|
+
// TUI-TOKEN-GUARD-WIRE — the host history write-back for the request-size cap.
|
|
215
|
+
...(opts.compactPersistedHistory ? { compactPersistedHistory: opts.compactPersistedHistory } : {}),
|
|
216
|
+
...(opts.requestSizeMaxChars !== undefined ? { requestSizeMaxChars: opts.requestSizeMaxChars } : {}),
|
|
214
217
|
});
|
|
215
218
|
|
|
216
219
|
const serverPromise = runAcpServer({
|