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/session/chat.ts
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
type SessionMeta, type SerializedMessage, type CreateSessionOpts,
|
|
18
18
|
} from './index.js';
|
|
19
19
|
import { debug } from '../debug/log.js';
|
|
20
|
+
import { createRequestSizeGuard, formatRequestSizeStatus, type RequestSizeGuard } from './request-size-guard.js';
|
|
20
21
|
import type { InputSourceKind } from '../input/input-source-kind.js';
|
|
21
22
|
import {
|
|
22
23
|
getProviderForConfig, streamLLMWithTools, type LLMMessage, type LLMOpts, type LLMProvider,
|
|
@@ -400,65 +401,41 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
400
401
|
return trimToBudget(wire, opts.maxTokens ?? DEFAULT_TOKEN_BUDGET);
|
|
401
402
|
};
|
|
402
403
|
|
|
403
|
-
|
|
404
|
-
const requestSizeGuard: NonNullable<LLMOpts['requestSizeGuard']> | undefined =
|
|
404
|
+
const requestSizeGuard: RequestSizeGuard | undefined =
|
|
405
405
|
meta.source === 'tui' && provider.name === 'openai-codex'
|
|
406
|
-
? {
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
// The persisted compacted session includes this turn's
|
|
424
|
-
// user message. Drop that final persisted row here, then
|
|
425
|
-
// assembleTurnMessages re-adds the canonical userMsg and
|
|
426
|
-
// any image blocks from opts.userImages exactly once.
|
|
427
|
-
messages = refreshed.messages.slice(0, -1);
|
|
428
|
-
const rebuilt = assembleTurnMessages(effectiveSystemPrompt).kept;
|
|
429
|
-
return { messages: rebuilt, reason: `session-${result.reason}` };
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
const { runCompactPipeline } = await import('../compact/pipeline.js');
|
|
435
|
-
const { getDefaultCompactProvider } = await import('../compact/provider.js');
|
|
436
|
-
const compacted = await runCompactPipeline(currentMessages, {
|
|
437
|
-
sessionId: opts.sessionId,
|
|
438
|
-
provider: getDefaultCompactProvider(),
|
|
439
|
-
activeModelId: llmOpts?.model ?? provider.defaultModel,
|
|
440
|
-
policy: {
|
|
441
|
-
preserveLastN: opts.userConfig.chat.autoCompact.preserveLastN,
|
|
442
|
-
archiveEnabled: opts.userConfig.chat.compact.archiveEnabled,
|
|
443
|
-
},
|
|
406
|
+
? createRequestSizeGuard({
|
|
407
|
+
compactOptions: () => ({
|
|
408
|
+
sessionId: opts.sessionId,
|
|
409
|
+
activeModelId: llmOpts?.model ?? provider.defaultModel,
|
|
410
|
+
preserveLastN: opts.userConfig.chat.autoCompact.preserveLastN,
|
|
411
|
+
archiveEnabled: opts.userConfig.chat.compact.archiveEnabled,
|
|
412
|
+
}),
|
|
413
|
+
// The first request has only the persisted transcript plus this
|
|
414
|
+
// user turn, so use the shared session compactor and rebuild from
|
|
415
|
+
// the rewritten history. Later tool rounds compact their live
|
|
416
|
+
// message list (shared guard) so no just-produced tool context is lost.
|
|
417
|
+
compactFirstRequest: async () => {
|
|
418
|
+
const { compactSessionHistory } = await import('./compact-session.js');
|
|
419
|
+
const result = await compactSessionHistory(opts.sessionId, {
|
|
420
|
+
config: opts.userConfig.chat.autoCompact,
|
|
421
|
+
force: true,
|
|
422
|
+
modelId: llmOpts?.model ?? provider.defaultModel,
|
|
444
423
|
});
|
|
445
|
-
|
|
446
|
-
const
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
424
|
+
if (!result.fired) return null;
|
|
425
|
+
const refreshed = loadSession(opts.sessionId);
|
|
426
|
+
if (!refreshed) return null;
|
|
427
|
+
// The persisted compacted session includes this turn's
|
|
428
|
+
// user message. Drop that final persisted row here, then
|
|
429
|
+
// assembleTurnMessages re-adds the canonical userMsg and
|
|
430
|
+
// any image blocks from opts.userImages exactly once.
|
|
431
|
+
messages = refreshed.messages.slice(0, -1);
|
|
432
|
+
const rebuilt = assembleTurnMessages(effectiveSystemPrompt).kept;
|
|
433
|
+
return { messages: rebuilt, reason: `session-${result.reason}` };
|
|
453
434
|
},
|
|
454
435
|
onMeasured: (measurement) => {
|
|
455
|
-
|
|
456
|
-
opts.onStatusLine?.(
|
|
457
|
-
`ctx ${measurement.requestChars.toLocaleString()} chars / ${measurement.maxChars.toLocaleString()}`
|
|
458
|
-
+ (measurement.compacted ? ` · compact ${measurement.reason}` : ''),
|
|
459
|
-
);
|
|
436
|
+
opts.onStatusLine?.(formatRequestSizeStatus(measurement));
|
|
460
437
|
},
|
|
461
|
-
}
|
|
438
|
+
})
|
|
462
439
|
: undefined;
|
|
463
440
|
|
|
464
441
|
let kept: LLMMessage[] = [];
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// TUI-TOKEN-GUARD-WIRE — shared request-size guard (#32254 cap).
|
|
2
|
+
//
|
|
3
|
+
// The 400k-char cap used to be built only inside `session/chat.ts runTurn`.
|
|
4
|
+
// The production TUI does not run that function: it goes
|
|
5
|
+
// DashboardSession → bridgeCoreTurnToAcp → runCoreTurn/runGoalLoop, so the
|
|
6
|
+
// guard never reached `llm.ts` and no `request-size-compact` event fired
|
|
7
|
+
// (root cause: seat-state/OP/tmp/TUI-TOKEN-BURN-ROOT-CAUSE-1028.md).
|
|
8
|
+
//
|
|
9
|
+
// This module owns the guard construction so both paths share one policy:
|
|
10
|
+
// - `createRequestSizeGuard` — the `LLMOpts.requestSizeGuard` object.
|
|
11
|
+
// The first measured request may use a caller hook (`compactFirstRequest`)
|
|
12
|
+
// that compacts the caller's *persisted* history; every other request
|
|
13
|
+
// (and a first request whose hook declines) compacts the live message list.
|
|
14
|
+
// - `compactLiveMessages` — the live compaction (Layer 1/2 + optional
|
|
15
|
+
// Layer 3 summarize) shared by the guard and by hosts that compact their
|
|
16
|
+
// own history store.
|
|
17
|
+
// - `estimateRequestChars` — cheap pre-send estimate (JSON chars of the
|
|
18
|
+
// messages plus tool specs) used by the ACP bridge preflight.
|
|
19
|
+
//
|
|
20
|
+
// ⚠️ `llm.ts` applies the compacted list with `messages.splice(...)`, but the
|
|
21
|
+
// array it receives is a per-request copy (`mapProviderToolNamesInMessages`),
|
|
22
|
+
// not `streamLLMWithTools`'s `history`. Compaction therefore does not survive
|
|
23
|
+
// into the next tool round by itself — the guard re-measures each request —
|
|
24
|
+
// and only a host write-back (chat.ts session rewrite / dashboard history
|
|
25
|
+
// replace) makes it survive into the next prompt.
|
|
26
|
+
|
|
27
|
+
import type { LLMMessage, LLMOpts, LLMToolSpec } from '../llm.js';
|
|
28
|
+
import type { CompactProvider } from '../compact/provider.js';
|
|
29
|
+
|
|
30
|
+
/** #32254 — the wire cap for Codex TUI requests (serialized body chars). */
|
|
31
|
+
export const REQUEST_SIZE_MAX_CHARS = 400_000;
|
|
32
|
+
|
|
33
|
+
export type RequestSizeGuard = NonNullable<LLMOpts['requestSizeGuard']>;
|
|
34
|
+
export type RequestSizeMeasurement = Parameters<NonNullable<RequestSizeGuard['onMeasured']>>[0];
|
|
35
|
+
export type RequestSizeCompactInfo = Parameters<RequestSizeGuard['compactMessages']>[1];
|
|
36
|
+
export type RequestSizeCompactResult = Awaited<ReturnType<RequestSizeGuard['compactMessages']>>;
|
|
37
|
+
|
|
38
|
+
type RunCompactPipeline = typeof import('../compact/pipeline.js').runCompactPipeline;
|
|
39
|
+
|
|
40
|
+
export interface CompactLiveMessagesOptions {
|
|
41
|
+
sessionId?: string;
|
|
42
|
+
activeModelId?: string;
|
|
43
|
+
preserveLastN?: number;
|
|
44
|
+
archiveEnabled?: boolean;
|
|
45
|
+
/** Test seam — defaults to the real `runCompactPipeline` with the default compact provider. */
|
|
46
|
+
runCompactPipeline?: RunCompactPipeline;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Compact a live message list. Returns `null` when no layer changed anything. */
|
|
50
|
+
export async function compactLiveMessages(
|
|
51
|
+
messages: LLMMessage[],
|
|
52
|
+
opts: CompactLiveMessagesOptions,
|
|
53
|
+
): Promise<{ messages: LLMMessage[]; reason: string } | null> {
|
|
54
|
+
let run = opts.runCompactPipeline;
|
|
55
|
+
let provider: CompactProvider | undefined;
|
|
56
|
+
if (!run) {
|
|
57
|
+
run = (await import('../compact/pipeline.js')).runCompactPipeline;
|
|
58
|
+
provider = (await import('../compact/provider.js')).getDefaultCompactProvider();
|
|
59
|
+
}
|
|
60
|
+
const compacted = await run(messages, {
|
|
61
|
+
...(opts.sessionId !== undefined ? { sessionId: opts.sessionId } : {}),
|
|
62
|
+
...(provider !== undefined ? { provider } : {}),
|
|
63
|
+
...(opts.activeModelId !== undefined ? { activeModelId: opts.activeModelId } : {}),
|
|
64
|
+
policy: {
|
|
65
|
+
...(opts.preserveLastN !== undefined ? { preserveLastN: opts.preserveLastN } : {}),
|
|
66
|
+
...(opts.archiveEnabled !== undefined ? { archiveEnabled: opts.archiveEnabled } : {}),
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const diagnostics = compacted.diagnostics;
|
|
70
|
+
const changed = diagnostics.layer1ResponsesTrimmed > 0
|
|
71
|
+
|| diagnostics.layer2MicrocompactCleared > 0
|
|
72
|
+
|| diagnostics.layer3SummaryApplied === 1
|
|
73
|
+
|| diagnostics.layer5FallbackTruncated === 1;
|
|
74
|
+
return changed ? { messages: compacted.messages, reason: 'live-request-compact' } : null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface CreateRequestSizeGuardOptions {
|
|
78
|
+
maxChars?: number;
|
|
79
|
+
/** Live-compaction options, resolved lazily at compaction time (config is
|
|
80
|
+
* read only when a request is actually over the cap). */
|
|
81
|
+
compactOptions: () => CompactLiveMessagesOptions;
|
|
82
|
+
/** First measured request only: compact the caller's persisted history and
|
|
83
|
+
* return the rebuilt request. `null` falls through to live compaction. */
|
|
84
|
+
compactFirstRequest?: (
|
|
85
|
+
currentMessages: LLMMessage[],
|
|
86
|
+
info: RequestSizeCompactInfo,
|
|
87
|
+
) => Promise<RequestSizeCompactResult>;
|
|
88
|
+
onMeasured?: (measurement: RequestSizeMeasurement) => void;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function createRequestSizeGuard(opts: CreateRequestSizeGuardOptions): RequestSizeGuard {
|
|
92
|
+
let measuredProviderRequests = 0;
|
|
93
|
+
return {
|
|
94
|
+
maxChars: opts.maxChars ?? REQUEST_SIZE_MAX_CHARS,
|
|
95
|
+
compactMessages: async (currentMessages, info) => {
|
|
96
|
+
if (measuredProviderRequests === 0 && opts.compactFirstRequest) {
|
|
97
|
+
const first = await opts.compactFirstRequest(currentMessages, info);
|
|
98
|
+
if (first) return first;
|
|
99
|
+
}
|
|
100
|
+
return compactLiveMessages(currentMessages, opts.compactOptions());
|
|
101
|
+
},
|
|
102
|
+
onMeasured: (measurement) => {
|
|
103
|
+
measuredProviderRequests += 1;
|
|
104
|
+
opts.onMeasured?.(measurement);
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Cheap pre-send size estimate: JSON chars of the messages plus tool specs.
|
|
110
|
+
* It tracks the Codex wire body closely (the wire also serializes both). */
|
|
111
|
+
export function estimateRequestChars(messages: readonly LLMMessage[], tools: readonly LLMToolSpec[] = []): number {
|
|
112
|
+
try {
|
|
113
|
+
return JSON.stringify(messages).length + (tools.length > 0 ? JSON.stringify(tools).length : 0);
|
|
114
|
+
} catch {
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** One-line status text shared by chat.ts and the ACP bridge. */
|
|
120
|
+
export function formatRequestSizeStatus(measurement: RequestSizeMeasurement): string {
|
|
121
|
+
return `ctx ${measurement.requestChars.toLocaleString()} chars / ${measurement.maxChars.toLocaleString()}`
|
|
122
|
+
+ (measurement.compacted ? ` · compact ${measurement.reason}` : '');
|
|
123
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { resolveInstanceName } from '../instance-identity.js';
|
|
2
|
+
import type { LLMToolSpec } from '../llm.js';
|
|
2
3
|
import { listPtyManifestRows, type PtyManifestRow } from '../pty-shell/pty-manifest.js';
|
|
3
4
|
import { describePtyRunState } from '../pty-shell/tui-run-state.js';
|
|
4
5
|
|
|
@@ -174,3 +175,138 @@ export function formatSidetabLines(
|
|
|
174
175
|
if (mode === 'list' && lines.length < Math.floor(height)) lines.push(fit(' + new · /side new'));
|
|
175
176
|
return lines;
|
|
176
177
|
}
|
|
178
|
+
|
|
179
|
+
/** NL/IPC side-tab contract and action policy, kept independent from either TUI renderer. */
|
|
180
|
+
export const NEXT_SIDETAB_TOOL_NAME = 'NextSidetab';
|
|
181
|
+
const NEXT_SIDETAB_CALL = 'elanous.sidetab.call';
|
|
182
|
+
const NEXT_SIDETAB_RESULT = 'elanous.sidetab.result';
|
|
183
|
+
|
|
184
|
+
export type NextSidetabAction = 'list' | 'switch' | 'attach' | 'detach' | 'new' | 'kill';
|
|
185
|
+
export interface NextSidetabRequest {
|
|
186
|
+
action: NextSidetabAction;
|
|
187
|
+
target?: string;
|
|
188
|
+
character?: 'shell' | 'elanous';
|
|
189
|
+
confirm?: boolean;
|
|
190
|
+
}
|
|
191
|
+
export interface NextSidetabCall { type: typeof NEXT_SIDETAB_CALL; callId: string; request: NextSidetabRequest }
|
|
192
|
+
export interface NextSidetabResult { type: typeof NEXT_SIDETAB_RESULT; callId: string; result: unknown }
|
|
193
|
+
export type NextSidetabHandler = (request: NextSidetabRequest) => Promise<unknown>;
|
|
194
|
+
export interface NextSidetabHostDeps {
|
|
195
|
+
rows(): readonly SidetabRow[] | Promise<readonly SidetabRow[]>;
|
|
196
|
+
selected(): number;
|
|
197
|
+
switchSession(row: SidetabRow): Promise<unknown>;
|
|
198
|
+
attach(row: SidetabRow): Promise<unknown>;
|
|
199
|
+
detach(): unknown;
|
|
200
|
+
spawn(character: 'shell' | 'elanous'): unknown;
|
|
201
|
+
kill(row: SidetabRow): unknown;
|
|
202
|
+
}
|
|
203
|
+
export interface NextSidetabIpcProcess {
|
|
204
|
+
send?: (message: unknown) => boolean | void;
|
|
205
|
+
on(event: 'message', listener: (message: unknown) => void): unknown;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export const nextSidetabToolSpec: LLMToolSpec = {
|
|
209
|
+
name: NEXT_SIDETAB_TOOL_NAME,
|
|
210
|
+
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.',
|
|
211
|
+
parameters: {
|
|
212
|
+
type: 'object',
|
|
213
|
+
properties: {
|
|
214
|
+
action: { type: 'string', enum: ['list', 'switch', 'attach', 'detach', 'new', 'kill'] },
|
|
215
|
+
target: { type: 'string', description: 'Optional exact or partial row id/label; required for targeted actions.' },
|
|
216
|
+
character: { type: 'string', enum: ['shell', 'elanous'], description: 'Only used with action=new.' },
|
|
217
|
+
confirm: { type: 'boolean', description: 'Must be true only after the user explicitly confirmed killing the selected PTY.' },
|
|
218
|
+
},
|
|
219
|
+
required: ['action'],
|
|
220
|
+
additionalProperties: false,
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
export function isNextSidetabCall(value: unknown): value is NextSidetabCall {
|
|
225
|
+
const call = value as Partial<NextSidetabCall> | null;
|
|
226
|
+
return Boolean(call && call.type === NEXT_SIDETAB_CALL && typeof call.callId === 'string'
|
|
227
|
+
&& call.request && typeof call.request === 'object');
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export async function answerNextSidetabCall(handler: NextSidetabHandler, call: NextSidetabCall): Promise<NextSidetabResult> {
|
|
231
|
+
try { return { type: NEXT_SIDETAB_RESULT, callId: call.callId, result: await handler(call.request) }; }
|
|
232
|
+
catch (error) {
|
|
233
|
+
return { type: NEXT_SIDETAB_RESULT, callId: call.callId, result: { error: error instanceof Error ? error.message : String(error) } };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export function createNextSidetabHostHandler(deps: NextSidetabHostDeps): NextSidetabHandler {
|
|
238
|
+
return async (request) => {
|
|
239
|
+
if (!request || !['list', 'switch', 'attach', 'detach', 'new', 'kill'].includes(request.action)) {
|
|
240
|
+
return { error: '지원하지 않는 사이드탭 동작입니다' };
|
|
241
|
+
}
|
|
242
|
+
if (request.action === 'new') {
|
|
243
|
+
if (request.character !== 'shell' && request.character !== 'elanous') return { error: 'character는 shell 또는 elanous여야 합니다' };
|
|
244
|
+
return deps.spawn(request.character);
|
|
245
|
+
}
|
|
246
|
+
if (request.action === 'detach') return deps.detach();
|
|
247
|
+
const rows = await deps.rows();
|
|
248
|
+
if (request.action === 'list') return rows.map(({ id, label, kind, badge, sessionId }) => ({ id, label, kind, badge, ...(sessionId ? { sessionId } : {}) }));
|
|
249
|
+
const target = request.target?.trim();
|
|
250
|
+
const exact = target ? rows.find((item) => item.id === target)
|
|
251
|
+
?? rows.find((item) => item.label.toLowerCase() === target.toLowerCase()) : undefined;
|
|
252
|
+
const partial = target && !exact ? rows.filter((item) => item.label.toLowerCase().includes(target.toLowerCase())) : [];
|
|
253
|
+
if (partial.length > 1) return { error: `사이드탭 항목이 여러 개 일치합니다: ${target}` };
|
|
254
|
+
const row = exact ?? partial[0] ?? (target ? undefined : rows[deps.selected()]);
|
|
255
|
+
if (!row) return { error: target ? `사이드탭 항목을 찾지 못했습니다: ${target}` : '선택된 사이드탭 항목이 없습니다' };
|
|
256
|
+
if (request.action === 'switch') return row.kind === 'tui' ? deps.switchSession(row) : { error: 'Next TUI 세션만 전환할 수 있습니다' };
|
|
257
|
+
if (request.action === 'attach') return deps.attach(row);
|
|
258
|
+
if (row.currentProcess) return { error: '현재 TUI 세션은 사이드탭에서 종료할 수 없습니다' };
|
|
259
|
+
if (request.confirm !== true) return { needsConfirmation: true, message: `PTY 종료 확인 필요: ${row.label}` };
|
|
260
|
+
return deps.kill(row);
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export function createReplNextSidetabTool(
|
|
265
|
+
proc: NextSidetabIpcProcess,
|
|
266
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
267
|
+
timeoutMs = 15_000,
|
|
268
|
+
): { spec: LLMToolSpec; dispatch: (args: Record<string, unknown>) => Promise<unknown> } | null {
|
|
269
|
+
if (env.ELANOUS_NEXT_TUI_SIDETAB_IPC !== '1' || typeof proc.send !== 'function') return null;
|
|
270
|
+
const send = proc.send.bind(proc);
|
|
271
|
+
const waiting = new Map<string, (result: unknown) => void>();
|
|
272
|
+
let sequence = 0;
|
|
273
|
+
const listener = (message: unknown): void => {
|
|
274
|
+
const result = message as Partial<NextSidetabResult> | null;
|
|
275
|
+
if (!result || result.type !== NEXT_SIDETAB_RESULT || typeof result.callId !== 'string') return;
|
|
276
|
+
const resolve = waiting.get(result.callId);
|
|
277
|
+
if (!resolve) return;
|
|
278
|
+
waiting.delete(result.callId);
|
|
279
|
+
resolve(result.result);
|
|
280
|
+
};
|
|
281
|
+
proc.on('message', listener);
|
|
282
|
+
return {
|
|
283
|
+
spec: nextSidetabToolSpec,
|
|
284
|
+
dispatch: (args) => new Promise((resolve) => {
|
|
285
|
+
const callId = `s${++sequence}`;
|
|
286
|
+
const timer = setTimeout(() => {
|
|
287
|
+
if (!waiting.delete(callId)) return;
|
|
288
|
+
resolve({ error: 'Next TUI did not answer the side-tab request' });
|
|
289
|
+
}, timeoutMs);
|
|
290
|
+
waiting.set(callId, (result) => { clearTimeout(timer); resolve(result); });
|
|
291
|
+
try {
|
|
292
|
+
send({ type: NEXT_SIDETAB_CALL, callId, request: args as unknown as NextSidetabRequest } satisfies NextSidetabCall);
|
|
293
|
+
} catch (error) {
|
|
294
|
+
waiting.delete(callId);
|
|
295
|
+
clearTimeout(timer);
|
|
296
|
+
resolve({ error: `Next TUI IPC send failed: ${error instanceof Error ? error.message : String(error)}` });
|
|
297
|
+
}
|
|
298
|
+
}),
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export function registerNextSidetabReplTool(
|
|
303
|
+
specs: LLMToolSpec[],
|
|
304
|
+
dispatchByName: Map<string, (args: Record<string, unknown>) => Promise<unknown>>,
|
|
305
|
+
proc: NextSidetabIpcProcess,
|
|
306
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
307
|
+
): void {
|
|
308
|
+
const tool = createReplNextSidetabTool(proc, env);
|
|
309
|
+
if (!tool) return;
|
|
310
|
+
specs.push(tool.spec);
|
|
311
|
+
dispatchByName.set(tool.spec.name, tool.dispatch);
|
|
312
|
+
}
|
|
@@ -43,6 +43,17 @@ export type ParentHostSetting = Partial<ParentHostConfig> | readonly Partial<Par
|
|
|
43
43
|
export const PARENT_HOST_ENV = 'ELANOUS_TA_PARENT_HOST';
|
|
44
44
|
const DEFAULT_REMOTE_ELANOUS = '$HOME/.local/share/elanous/bin/elanous';
|
|
45
45
|
const DEFAULT_REMOTE_CONFIG_DIR = '$HOME/.elanous';
|
|
46
|
+
/**
|
|
47
|
+
* 원격 부모 상태 루트의 출처 태그 — 루트(`ELANOUS_STATE_DIR`)와 «한 벌»로 넘긴다(src/agent/identity-env.ts).
|
|
48
|
+
* HQ 가 git worktree/`--test` 라면 그 env 에 `derived` 가 실린다. 루트만 원격 값으로 바꾸고 태그를 그대로
|
|
49
|
+
* 흘리면 원격 부모는 «명시한 운영 루트 + 파생 태그»를 받아 자기 우주를 test 로 오독한다 —
|
|
50
|
+
* `SOURCE === 'derived'` 를 보는 codexCredentialRoot(src/budget/codex-reset-credit-state.ts)·
|
|
51
|
+
* harnessLaunchPolicyConfig(src/harness/harness-substrate-default.ts) 가 그 자리다.
|
|
52
|
+
* 떼어 띄운 운영 부모의 기존 꼴(src/task-orchestrator/surfaces/pod-si-warm-runner.ts)과 같은 `explicit` 를 찍는다.
|
|
53
|
+
*/
|
|
54
|
+
const REMOTE_STATE_DIR_SOURCE = 'explicit';
|
|
55
|
+
/** 원격 발사에서 HQ 값을 버리고 원격 기준으로 다시 찍는 상태 루트 env(한 벌). */
|
|
56
|
+
const STATE_ROOT_ENV_KEYS: ReadonlySet<string> = new Set(['ELANOUS_STATE_DIR', 'ELANOUS_STATE_DIR_SOURCE']);
|
|
46
57
|
const HOST_RE = /^[A-Za-z0-9][A-Za-z0-9._@-]{0,127}$/;
|
|
47
58
|
/** A parent can wait for a child for tens of minutes; the two-minute HTTP refresh floor is too short here. */
|
|
48
59
|
export const PARENT_CHILD_CREDENTIAL_MIN_REMAINING_MS = 60 * 60_000;
|
|
@@ -227,7 +238,9 @@ export function remoteLaunchScript(target: ParentHostConfig, args: readonly stri
|
|
|
227
238
|
const log = remoteParentLogPath(target, env.ELANOUS_RUN_ID ?? 'unknown');
|
|
228
239
|
// --config-dir keeps the parent's operational config/state; authStorePath()
|
|
229
240
|
// reads XDG_CONFIG_HOME/elanous/auth.json first, as the entrypoint test proves.
|
|
230
|
-
|
|
241
|
+
// 상태 루트는 태그와 한 벌로 넘긴다(REMOTE_STATE_DIR_SOURCE 주석) — HQ 의 derived 태그가
|
|
242
|
+
// 함께 흐르면 방금 명시한 운영 루트를 원격 부모가 test 우주로 오독한다.
|
|
243
|
+
const envPart = [...Object.entries(env).filter(([key]) => !STATE_ROOT_ENV_KEYS.has(key) && /^[A-Z_][A-Z0-9_]*$/.test(key)).map(([key, value]) => `${key}=${key === 'XDG_CONFIG_HOME' || key === 'CODEX_HOME' || key === 'GH_CONFIG_DIR' ? remotePath(value) : shellQuote(value)}`), `ELANOUS_STATE_DIR=${remotePath(configDir)}`, `ELANOUS_STATE_DIR_SOURCE=${shellQuote(REMOTE_STATE_DIR_SOURCE)}`].join(' ');
|
|
231
244
|
const argv = [remotePath(elanous), '--config-dir', remotePath(configDir), ...remoteParentArgs(args, target.podPool).map(shellQuote)].join(' ');
|
|
232
245
|
// 준비가 실패하면 «확실히 안 띄웠다»(not-launched=…)를 찍고 끝낸다 — 그때만 호출부가 로컬로 돌아간다.
|
|
233
246
|
// 띄운 뒤에는 짧게 살아 있는지 보고 pid 를 찍는다(조기 종료면 early-exit — 역시 «안 돈다»가 확실).
|
|
@@ -45,6 +45,7 @@ import { INFLIGHT_REGISTRY_FILE, registerInflight } from '../pr-tool/inflight-re
|
|
|
45
45
|
import { taskParentRoleEnv, taskParentRolePinsForChild } from './task-parent-role-llm.js';
|
|
46
46
|
import { runHarvestUnit, type ReviewInvocation } from './harvest-unit.js';
|
|
47
47
|
import { TASK_CARD_PREFIX } from './task-card-prefix.js';
|
|
48
|
+
import { childLlmEffortProblem } from '../intelligence-map/model-catalog.js';
|
|
48
49
|
|
|
49
50
|
export interface ResolveHandTextDeps {
|
|
50
51
|
cwd: string;
|
|
@@ -414,7 +415,7 @@ export interface TaskCard {
|
|
|
414
415
|
moveId?: string }>;
|
|
415
416
|
}
|
|
416
417
|
|
|
417
|
-
/** 구현 자식 LLM 선택 — 하니스 `--child-llm-provider/--child-llm-model/--child-llm-effort` 로
|
|
418
|
+
/** 구현 자식 LLM 선택 — 하니스 `--child-llm-provider/--child-llm-model/--child-llm-effort` 로 넘긴다. */
|
|
418
419
|
export interface TaskChildLlm { provider: string; model: string; effort?: string }
|
|
419
420
|
|
|
420
421
|
/**
|
|
@@ -431,6 +432,8 @@ export function parseChildLlm(value: string, effort?: string): TaskChildLlm {
|
|
|
431
432
|
const model = provider === 'openrouter' && !rest.startsWith('openrouter/') ? `openrouter/${rest}` : rest;
|
|
432
433
|
if (effort === undefined) return { provider, model };
|
|
433
434
|
if (!effort || /[\s\p{Cc}]/u.test(effort)) throw new Error(`--child-llm-effort 가 비었거나 공백·제어 문자를 담았다: ${JSON.stringify(effort)}`);
|
|
435
|
+
const problem = childLlmEffortProblem(model, effort);
|
|
436
|
+
if (problem) throw new Error(problem);
|
|
434
437
|
return { provider, model, effort };
|
|
435
438
|
}
|
|
436
439
|
|
|
@@ -125,6 +125,49 @@ export const POD_EXIT_CLASSES = ['oom-killed', 'deadline-exceeded', 'gh-login-fa
|
|
|
125
125
|
|
|
126
126
|
export type PodExitClass = typeof POD_EXIT_CLASSES[number];
|
|
127
127
|
|
|
128
|
+
/** Build the parent-ledger row for a terminal child attempt. A Job can complete
|
|
129
|
+
* successfully while its child result is still unsuccessful (for example,
|
|
130
|
+
* report-deficit after preserving a partial PR); retain both facts together. */
|
|
131
|
+
export function podChildEvidenceLedgerRow(input: {
|
|
132
|
+
job: string;
|
|
133
|
+
childRunId: string;
|
|
134
|
+
state: 'complete' | 'failed' | 'aborted';
|
|
135
|
+
result?: {
|
|
136
|
+
stage?: unknown;
|
|
137
|
+
ok?: unknown;
|
|
138
|
+
failureClassification?: unknown;
|
|
139
|
+
completionDisposition?: unknown;
|
|
140
|
+
error?: unknown;
|
|
141
|
+
childEvidence?: unknown;
|
|
142
|
+
} | null;
|
|
143
|
+
noResultDiagnostic?: string | null;
|
|
144
|
+
noResultLogEvidence?: Record<string, unknown> | null;
|
|
145
|
+
podTermination?: PodTermination | null;
|
|
146
|
+
}): Record<string, unknown> | null {
|
|
147
|
+
const { result } = input;
|
|
148
|
+
const persist = input.state === 'failed' || input.state === 'aborted' || input.noResultLogEvidence != null
|
|
149
|
+
|| (input.state === 'complete' && (input.noResultDiagnostic != null || result?.ok === false));
|
|
150
|
+
if (!persist) return null;
|
|
151
|
+
|
|
152
|
+
const childEvidence = input.noResultLogEvidence
|
|
153
|
+
? { ...(result?.childEvidence && typeof result.childEvidence === 'object' && !Array.isArray(result.childEvidence)
|
|
154
|
+
? result.childEvidence as Record<string, unknown> : {}), ...input.noResultLogEvidence }
|
|
155
|
+
: result?.childEvidence ?? null;
|
|
156
|
+
const completedButUnsuccessful = input.state === 'complete' && result?.ok === false;
|
|
157
|
+
const childResult = completedButUnsuccessful && result ? Object.fromEntries([
|
|
158
|
+
['stage', result.stage], ['ok', result.ok], ['failureClassification', result.failureClassification],
|
|
159
|
+
['completionDisposition', result.completionDisposition], ['error', result.error],
|
|
160
|
+
].filter(([, value]) => value !== undefined)) : null;
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
childEvidence,
|
|
164
|
+
childRunId: input.childRunId,
|
|
165
|
+
job: input.job,
|
|
166
|
+
...(input.podTermination ? { podTermination: input.podTermination } : {}),
|
|
167
|
+
...(childResult && Object.keys(childResult).length > 0 ? { childResult } : {}),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
128
171
|
const isPodBookkeepingLine = (line: string): boolean =>
|
|
129
172
|
/^(?:ELANOUS_(?:MEM|RUN_LEDGER|USAGE_ROLLUP|POD_)|\[graph\] |\[ask\]\s+\d+\)\s)/u.test(line) || /^(?:at\s+\S|\.\.\.\s+\d+\s+more\b|cleanup\s+(?:complete|done|finished)\b)/iu.test(line);
|
|
130
173
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
1
2
|
import { mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
2
3
|
import { join } from 'node:path';
|
|
3
4
|
|
|
@@ -39,6 +40,29 @@ export function captureFailedPodJobs(input: {
|
|
|
39
40
|
}
|
|
40
41
|
const location = { host: first.host, context: first.context, namespace: first.namespace, childRunId: first.childRunId, jobUid: first.jobUid };
|
|
41
42
|
const evidenceDir = join(artifactDir, 'pod-failure-capture', runId, job, first.childRunId as string);
|
|
43
|
+
// A failed kubectl/SSH read is itself the missing diagnostic. Keep its stderr in
|
|
44
|
+
// the private artifact directory and put only the path and exit status in the ledger.
|
|
45
|
+
const readFailure = (reason: string, result: { status: number | null; stderr: string }, extra: Record<string, unknown> = {}): void => {
|
|
46
|
+
let stderrEvidence: string | null = null;
|
|
47
|
+
let stderrCaptureStatus: 'saved' | 'redacted' | 'empty' | 'write-failed' = result.stderr ? 'saved' : 'empty';
|
|
48
|
+
if (result.stderr) {
|
|
49
|
+
try {
|
|
50
|
+
mkdirSync(evidenceDir, { recursive: true });
|
|
51
|
+
const tail = result.stderr.slice(-8192).split(/\r?\n/).map(line => {
|
|
52
|
+
if (!SECRET_VALUE.test(line)) return line;
|
|
53
|
+
stderrCaptureStatus = 'redacted';
|
|
54
|
+
return '[redacted credential line]';
|
|
55
|
+
}).join('\n');
|
|
56
|
+
const digest = createHash('sha256').update(tail).digest('hex').slice(0, 16);
|
|
57
|
+
stderrEvidence = join(evidenceDir, `${reason}-${digest}.stderr.log`);
|
|
58
|
+
try { writeFileSync(stderrEvidence, tail, { flag: 'wx', mode: 0o600 }); }
|
|
59
|
+
catch (error) {
|
|
60
|
+
if ((error as NodeJS.ErrnoException).code !== 'EEXIST' || readFileSync(stderrEvidence, 'utf8') !== tail) throw error;
|
|
61
|
+
}
|
|
62
|
+
} catch { stderrEvidence = null; stderrCaptureStatus = 'write-failed'; }
|
|
63
|
+
}
|
|
64
|
+
finish('failed', reason, { ...location, ...extra, kubectlStatus: result.status, stderrEvidence, stderrCaptureStatus });
|
|
65
|
+
};
|
|
42
66
|
const previous = rows.find(row => row.event === 'pod-failure-capture' && row.data?.job === job && row.data?.outcome === 'collected'
|
|
43
67
|
&& row.data.childRunId === first.childRunId && row.data.jobUid === first.jobUid
|
|
44
68
|
&& row.data.host === first.host && row.data.context === first.context && row.data.namespace === first.namespace);
|
|
@@ -54,8 +78,8 @@ export function captureFailedPodJobs(input: {
|
|
|
54
78
|
try {
|
|
55
79
|
const jobResult = kubectl(first.host as string, [...args, 'get', 'job', job, '-o', 'json']);
|
|
56
80
|
if (jobResult.status !== 0) {
|
|
57
|
-
|
|
58
|
-
|
|
81
|
+
if (/\bNotFound\b|not found/i.test(jobResult.stderr)) finish('vanished', 'job-not-found', { ...location, kubectlStatus: jobResult.status });
|
|
82
|
+
else readFailure('job-read-failed', jobResult);
|
|
59
83
|
return;
|
|
60
84
|
}
|
|
61
85
|
const jobBody = JSON.parse(jobResult.stdout) as { metadata?: { name?: string; uid?: string } };
|
|
@@ -78,7 +102,7 @@ export function captureFailedPodJobs(input: {
|
|
|
78
102
|
} catch { return false; }
|
|
79
103
|
});
|
|
80
104
|
const podResult = kubectl(first.host as string, [...args, 'get', 'pods', '-l', `job-name=${job}`, '-o', 'json']);
|
|
81
|
-
if (podResult.status !== 0) {
|
|
105
|
+
if (podResult.status !== 0) { readFailure('pods-read-failed', podResult, { jobEvidence }); return; }
|
|
82
106
|
const pods = JSON.parse(podResult.stdout) as { items?: Array<{ metadata?: { name?: string; ownerReferences?: Array<{ uid?: string }> } }> };
|
|
83
107
|
if (!pods.items?.length || pods.items.some(p => !p.metadata?.ownerReferences?.some(owner => owner.uid === jobBody.metadata?.uid))) {
|
|
84
108
|
finish('failed', 'pod-owner-mismatch', { ...location, jobEvidence }); return;
|
|
@@ -89,7 +113,8 @@ export function captureFailedPodJobs(input: {
|
|
|
89
113
|
finish('failed', 'pod-ambiguous', { ...location, jobEvidence, podEvidence }); return;
|
|
90
114
|
}
|
|
91
115
|
const logs = kubectl(first.host as string, [...args, 'logs', `pod/${podName}`, '-c', 'child']);
|
|
92
|
-
if (logs.status !== 0) {
|
|
116
|
+
if (logs.status !== 0) { readFailure('logs-read-failed', logs, { jobEvidence, podEvidence }); return; }
|
|
117
|
+
if (!logs.stdout.trim()) { finish('failed', 'logs-empty', { ...location, jobEvidence, podEvidence }); return; }
|
|
93
118
|
const logEvidence = save('child.log', logs.stdout);
|
|
94
119
|
finish('collected', 'job-failed', { ...location, jobEvidence, podEvidence, logEvidence });
|
|
95
120
|
} catch { finish('failed', 'capture-error', location); }
|