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
|
@@ -26,7 +26,7 @@ import { ZAI_OPENROUTER_FALLBACK_MODEL } from '../llm/zai-coding-plan.js';
|
|
|
26
26
|
import { debug } from '../debug/log.js';
|
|
27
27
|
import { ACP_BACKENDS, canonicalizeBackendId } from '../acp/backend-registry.js';
|
|
28
28
|
import { buildManualReviewIntent, intentFromPr, prIntentSectionCoverage, reviewIntentTruncationFromPr, reviewIntentTruncationObservation } from './review-intent.js';
|
|
29
|
-
import { budgetReviewerContext, isNoneSentinelFinding, reviewDiffBudgetObservation, splitDiffByFile, type ReviewImage, type ReviewInput, type ReviewerContextItem, type ReviewResult } from './pr-reviewer.js';
|
|
29
|
+
import { NO_VERDICT_LINE_REASON, budgetReviewerContext, isNoneSentinelFinding, reviewDiffBudgetObservation, splitDiffByFile, type ReviewImage, type ReviewInput, type ReviewerContextItem, type ReviewResult } from './pr-reviewer.js';
|
|
30
30
|
import type { ReferencedFileReader } from '../self-implement/goal-file-reader.js';
|
|
31
31
|
import { getUserConfig, type LLMProviderName, type ReviewerMixSpec, type RoleLlmSpec, type SubscriptionReviewerSpec } from '../user-config.js';
|
|
32
32
|
import { loadLlmPolicy } from '../policy/llm-policy.js';
|
|
@@ -96,6 +96,8 @@ export interface SelfReviewCliOpts {
|
|
|
96
96
|
save?: string | undefined;
|
|
97
97
|
/** Review only commits after a previously saved PR review head. */
|
|
98
98
|
sinceReview?: string | undefined;
|
|
99
|
+
/** Internal delta self-heal metadata; never parsed from user CLI arguments. */
|
|
100
|
+
deltaHeal?: { cause: string; prescription: string } | undefined;
|
|
99
101
|
/** One invocation past r5, only for a PR in OP's traffic.json allowlist; the reason is recorded before review starts. */
|
|
100
102
|
overCapReason?: string | undefined;
|
|
101
103
|
}
|
|
@@ -187,6 +189,7 @@ interface SavedReviewForDelta {
|
|
|
187
189
|
mustFix: string[];
|
|
188
190
|
reviewInputChars: number;
|
|
189
191
|
reviewDurationMs: number;
|
|
192
|
+
result: Record<string, unknown>;
|
|
190
193
|
}
|
|
191
194
|
|
|
192
195
|
function selectSavedReviewForDelta(pr: string, selector: string, root = effectiveInstanceRoot()):
|
|
@@ -206,17 +209,20 @@ function selectSavedReviewForDelta(pr: string, selector: string, root = effectiv
|
|
|
206
209
|
const row = raw as Record<string, unknown>;
|
|
207
210
|
const recordPr = typeof row.pr === 'string' ? row.pr
|
|
208
211
|
: Number.isSafeInteger(row.pr) ? String(row.pr) : undefined;
|
|
209
|
-
if (recordPr !== pr || row.reviewed !== true ||
|
|
212
|
+
if (recordPr !== pr || row.reviewed !== true || !['pass', 'warn', 'fail'].includes(String(row.verdict))
|
|
213
|
+
|| typeof row.headCommit !== 'string' || !COMMIT_OID.test(row.headCommit)) continue;
|
|
210
214
|
const named = name === token || name === `${token}.json` || name.startsWith(`${token}-${pr}-`);
|
|
211
215
|
const byHead = /^[a-f0-9]{7,64}$/i.test(token) && row.headCommit.toLowerCase().startsWith(token.toLowerCase());
|
|
212
216
|
if (!named && !byHead) continue;
|
|
213
|
-
if (!Array.isArray(row.mustFix)
|
|
217
|
+
if (!Array.isArray(row.mustFix)) continue;
|
|
218
|
+
const mustFix = row.mustFix.filter((item): item is string => typeof item === 'string');
|
|
219
|
+
if (mustFix.length !== row.mustFix.length) continue;
|
|
214
220
|
if (typeof row.reviewInputChars !== 'number' || !Number.isFinite(row.reviewInputChars) || row.reviewInputChars <= 0
|
|
215
221
|
|| typeof row.reviewDurationMs !== 'number' || !Number.isFinite(row.reviewDurationMs) || row.reviewDurationMs <= 0) continue;
|
|
216
222
|
let mtimeMs = 0;
|
|
217
223
|
try { mtimeMs = statSync(join(dir, name)).mtimeMs; } catch { continue; }
|
|
218
|
-
records.push({ file: name, headCommit: row.headCommit.toLowerCase(), mustFix
|
|
219
|
-
reviewInputChars: row.reviewInputChars, reviewDurationMs: row.reviewDurationMs, mtimeMs });
|
|
224
|
+
records.push({ file: name, headCommit: row.headCommit.toLowerCase(), mustFix,
|
|
225
|
+
reviewInputChars: row.reviewInputChars, reviewDurationMs: row.reviewDurationMs, result: row, mtimeMs });
|
|
220
226
|
}
|
|
221
227
|
const distinctHeads = [...new Set(records.map((record) => record.headCommit))];
|
|
222
228
|
if (distinctHeads.length > 1) return { error: 'saved-review-selector-ambiguous' };
|
|
@@ -1985,28 +1991,52 @@ async function runSelfReviewCliCommandPinned(
|
|
|
1985
1991
|
? `PR ${pr}: r5 상한 초과 리뷰는 OP traffic.json reviewOverCapAllow 허용 목록에 있어야 합니다.`
|
|
1986
1992
|
: `PR ${pr}: 저장된 서로 다른 head 리뷰 ${previousRoundCount}개로 r5 상한에 도달했습니다. OP 허용 상태와 --over-cap-reason <사유>가 필요합니다.`;
|
|
1987
1993
|
deps.observeDoctorReview?.('cap-refused', { pr, head: refusalHead, previousRoundCount, round: previousRoundCount + 1, reason: opAllowed ? 'missing-reason' : 'not-op-allowlisted' }, { level: 'warn' });
|
|
1994
|
+
if (opts.sinceReview !== undefined) deps.log('review.delta-heal', {
|
|
1995
|
+
pr, cause: 'cap-refused', prescription: 'retain-explicit-refusal', result: 'refused', headCommit: refusalHead,
|
|
1996
|
+
}, { level: 'warn' });
|
|
1988
1997
|
deps.error(message);
|
|
1989
|
-
if (opts.json || opts.save !== undefined) results.push({ pr, error: message, reviewed: false, refusal: 'cap-refused',
|
|
1998
|
+
if (opts.json || opts.save !== undefined) results.push({ pr, error: message, reviewed: false, refusal: 'cap-refused',
|
|
1999
|
+
...(opts.sinceReview !== undefined ? { verdict: null, deltaOutcome: 'refused', deltaRefusal: 'cap-refused' } : {}),
|
|
2000
|
+
previousRoundCount, headCommit: refusalHead });
|
|
1990
2001
|
failed += 1;
|
|
1991
2002
|
continue;
|
|
1992
2003
|
}
|
|
1993
2004
|
let deltaBase: SavedReviewForDelta | undefined;
|
|
2005
|
+
let deltaHeal = opts.deltaHeal;
|
|
1994
2006
|
if (opts.sinceReview !== undefined) {
|
|
1995
2007
|
const selected = selectSavedReviewForDelta(pr, opts.sinceReview);
|
|
1996
2008
|
if ('error' in selected) {
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2009
|
+
if (selected.error === 'saved-review-directory-missing'
|
|
2010
|
+
|| selected.error === 'saved-review-not-found-or-missing-efficiency-receipt') {
|
|
2011
|
+
deltaHeal = { cause: 'no-prior-reviewed-head', prescription: 'full-review-once' };
|
|
2012
|
+
} else {
|
|
2013
|
+
const message = `PR ${pr}: --since-review 기준을 읽지 못했습니다 (${selected.error}).`;
|
|
2014
|
+
deps.error(message);
|
|
2015
|
+
if (opts.json || opts.save !== undefined) results.push({ pr, error: message, reviewed: false, verdict: null,
|
|
2016
|
+
refusal: 'delta-base-invalid', deltaOutcome: 'refused', deltaRefusal: selected.error });
|
|
2017
|
+
failed += 1;
|
|
2018
|
+
continue;
|
|
2019
|
+
}
|
|
2020
|
+
} else {
|
|
2021
|
+
deltaBase = selected.review;
|
|
2002
2022
|
}
|
|
2003
|
-
deltaBase = selected.review;
|
|
2004
2023
|
}
|
|
2005
2024
|
const diffResult = deltaBase ? readDeltaDiffAtHead(pr, deltaBase.headCommit, deps) : { read: readDiffAtHead(pr, deps) };
|
|
2006
2025
|
if ('error' in diffResult) {
|
|
2026
|
+
if (diffResult.error === 'no-new-head-since-review' && deltaBase) {
|
|
2027
|
+
const reused = { ...deltaBase.result, deltaOutcome: 'reused', deltaHeal: {
|
|
2028
|
+
cause: 'no-new-head', prescription: 'reuse-saved-verdict', result: 'verdict-reused',
|
|
2029
|
+
} };
|
|
2030
|
+
deps.log('review.delta-heal', { pr, cause: 'no-new-head', prescription: 'reuse-saved-verdict',
|
|
2031
|
+
result: 'verdict-reused', headCommit: diffResult.headCommit ?? deltaBase.headCommit }, { level: 'info' });
|
|
2032
|
+
if (opts.json || opts.save !== undefined) results.push(reused);
|
|
2033
|
+
else deps.print(`\n━━ PR ${pr} (${String(deltaBase.result.model ?? 'saved review')}) ━━\n${deps.renderReview(reused as unknown as ReviewResult)}\n판정 재사용: ${deltaBase.headCommit}`);
|
|
2034
|
+
continue;
|
|
2035
|
+
}
|
|
2007
2036
|
const message = `PR ${pr}: 델타 리뷰를 고정하지 못했습니다 (${diffResult.error}).`;
|
|
2008
2037
|
deps.error(message);
|
|
2009
|
-
if (opts.json || opts.save !== undefined) results.push({ pr, error: message, reviewed: false,
|
|
2038
|
+
if (opts.json || opts.save !== undefined) results.push({ pr, error: message, reviewed: false, verdict: null,
|
|
2039
|
+
refusal: 'delta-base-invalid', deltaOutcome: 'refused', deltaRefusal: diffResult.error,
|
|
2010
2040
|
...(diffResult.headCommit ? { headCommit: diffResult.headCommit } : {}) });
|
|
2011
2041
|
failed += 1;
|
|
2012
2042
|
continue;
|
|
@@ -2494,41 +2524,63 @@ async function runSelfReviewCliCommandPinned(
|
|
|
2494
2524
|
claudeFallbackGlm = { reason, model: ZAI_OPENROUTER_FALLBACK_MODEL, glmReviewed: glmFailureReason === undefined,
|
|
2495
2525
|
...(glmFailureReason !== undefined ? { glmFailureReason } : {}) };
|
|
2496
2526
|
}
|
|
2527
|
+
if (deltaBase && review.reviewed !== true && review.failureReason === NO_VERDICT_LINE_REASON) {
|
|
2528
|
+
let retryReview: ReviewResult;
|
|
2529
|
+
try {
|
|
2530
|
+
retryReview = await deps.reviewPullRequest(reviewInput, llmReview ?? prAcpReviewLLM ?? makeApi());
|
|
2531
|
+
} catch (error) {
|
|
2532
|
+
retryReview = { verdict: 'fail', mustFix: [], shouldFix: [], reviewed: false,
|
|
2533
|
+
failureReason: safeLogText(error instanceof Error ? error.message : String(error), 400) };
|
|
2534
|
+
}
|
|
2535
|
+
if (retryReview.reviewed === true) {
|
|
2536
|
+
review = retryReview;
|
|
2537
|
+
deltaHeal = { cause: 'no-verdict-line', prescription: 'retry-delta-once' };
|
|
2538
|
+
} else {
|
|
2539
|
+
const retryResult = safeLogText(retryReview.failureReason === NO_VERDICT_LINE_REASON
|
|
2540
|
+
? 'no-verdict-line' : `retry-failed-${retryReview.failureReason || 'reviewed-false'}`, 400);
|
|
2541
|
+
deps.log('review.delta-heal', { pr, cause: 'no-verdict-line', prescription: 'retry-delta-once',
|
|
2542
|
+
result: retryResult, headCommit: diffRead.headCommit }, { level: 'warn' });
|
|
2543
|
+
reviewPin?.remove();
|
|
2544
|
+
const fallback = await runSelfReviewCliCommandPinned([pr], {
|
|
2545
|
+
...opts, sinceReview: undefined,
|
|
2546
|
+
reviewerMixCapClaimed: opts.reviewerMixCapClaimed || Boolean(claimedCapPath),
|
|
2547
|
+
deltaHeal: { cause: 'no-verdict-line', prescription: 'full-review-once-after-delta-retry' },
|
|
2548
|
+
}, deps, pins);
|
|
2549
|
+
results.push(...fallback.results);
|
|
2550
|
+
failed += fallback.failed;
|
|
2551
|
+
releaseCapClaim();
|
|
2552
|
+
continue;
|
|
2553
|
+
}
|
|
2554
|
+
}
|
|
2497
2555
|
const reviewDurationMs = Math.max(0, deps.now() - startedAt);
|
|
2498
2556
|
let deltaReceipt: Record<string, unknown> = {};
|
|
2499
2557
|
if (deltaBase) {
|
|
2500
2558
|
const assessed = assessDeltaReview(review, deltaBase);
|
|
2559
|
+
const inputRatio = reviewInputChars / deltaBase.reviewInputChars;
|
|
2560
|
+
const timeRatio = reviewDurationMs / deltaBase.reviewDurationMs;
|
|
2561
|
+
const maxRatio = 1 / 3;
|
|
2501
2562
|
const deltaEfficiency = {
|
|
2502
|
-
inputRatio
|
|
2503
|
-
|
|
2504
|
-
maxRatio: 1 / 3,
|
|
2563
|
+
inputRatio, timeRatio, maxRatio,
|
|
2564
|
+
withinTarget: inputRatio <= maxRatio && timeRatio <= maxRatio,
|
|
2505
2565
|
};
|
|
2506
|
-
const efficient = deltaEfficiency.inputRatio <= deltaEfficiency.maxRatio
|
|
2507
|
-
&& deltaEfficiency.timeRatio <= deltaEfficiency.maxRatio;
|
|
2508
2566
|
if (review.reviewed !== true) {
|
|
2509
2567
|
const reason = review.failureReason || 'delta-review-not-completed';
|
|
2510
2568
|
review = { ...review, reviewed: false, verdict: 'fail', mustFix: [], shouldFix: [], failureReason: reason };
|
|
2511
2569
|
deltaReceipt = { basedOn: deltaBase.headCommit, basedOnReview: deltaBase.file,
|
|
2512
2570
|
deltaInputChars: reviewInputChars, deltaDurationMs: reviewDurationMs, deltaEfficiency,
|
|
2513
|
-
deltaRefusal: 'delta-review-not-completed' };
|
|
2571
|
+
deltaOutcome: 'refused', deltaRefusal: 'delta-review-not-completed' };
|
|
2514
2572
|
} else if (!assessed.valid) {
|
|
2515
2573
|
review = { ...review, reviewed: false, verdict: 'fail', mustFix: [], shouldFix: [],
|
|
2516
2574
|
failureReason: assessed.reason };
|
|
2517
2575
|
deltaReceipt = { basedOn: deltaBase.headCommit, basedOnReview: deltaBase.file,
|
|
2518
2576
|
deltaInputChars: reviewInputChars, deltaDurationMs: reviewDurationMs, deltaEfficiency,
|
|
2519
|
-
deltaRefusal: assessed.reason };
|
|
2520
|
-
} else if (!efficient) {
|
|
2521
|
-
review = { ...review, reviewed: false, verdict: 'fail', mustFix: [], shouldFix: [],
|
|
2522
|
-
failureReason: 'delta-efficiency-limit-exceeded' };
|
|
2523
|
-
deltaReceipt = { basedOn: deltaBase.headCommit, basedOnReview: deltaBase.file,
|
|
2524
|
-
deltaFindings: assessed.deltaFindings, deltaInputChars: reviewInputChars,
|
|
2525
|
-
deltaDurationMs: reviewDurationMs, deltaEfficiency, deltaRefusal: 'delta-efficiency-limit-exceeded' };
|
|
2577
|
+
deltaOutcome: 'refused', deltaRefusal: assessed.reason };
|
|
2526
2578
|
} else {
|
|
2527
2579
|
review = { ...review, reviewed: true, verdict: assessed.mustFix.length ? 'fail' : 'pass',
|
|
2528
2580
|
mustFix: assessed.mustFix, shouldFix: [] };
|
|
2529
2581
|
deltaReceipt = { basedOn: deltaBase.headCommit, basedOnReview: deltaBase.file,
|
|
2530
2582
|
deltaFindings: assessed.deltaFindings, excludedNewFindings: assessed.excludedNewFindings,
|
|
2531
|
-
deltaInputChars: reviewInputChars, deltaDurationMs: reviewDurationMs, deltaEfficiency };
|
|
2583
|
+
deltaInputChars: reviewInputChars, deltaDurationMs: reviewDurationMs, deltaEfficiency, deltaOutcome: 'reviewed' };
|
|
2532
2584
|
}
|
|
2533
2585
|
}
|
|
2534
2586
|
reviewPin?.remove();
|
|
@@ -2661,12 +2713,22 @@ async function runSelfReviewCliCommandPinned(
|
|
|
2661
2713
|
continue;
|
|
2662
2714
|
}
|
|
2663
2715
|
const contextOutput = reviewerContextOutput(reviewerContext, decompositionContext);
|
|
2664
|
-
const jsonReview = review.reviewed === true ? review : { ...review, verdict: null
|
|
2716
|
+
const jsonReview = review.reviewed === true ? review : { ...review, verdict: null,
|
|
2717
|
+
...(deltaHeal ? { failureReason: safeLogText(review.failureReason || 'reviewed-false', 400) } : {}) };
|
|
2665
2718
|
// ⛔ 금지 백엔드가 낸 판정은 «근거 거부»다 — verdict·mustFix 를 그대로 실어 보내면 읽는 쪽이
|
|
2666
2719
|
// 그것을 착지 판정으로 쓴다(관문도 reviewed===true 를 근거 조건으로 본다).
|
|
2667
2720
|
const refusalOverride = landingGateAdmitted ? {} : { reviewed: false, verdict: null, refusal: 'review-forbidden-acp-backend' as const };
|
|
2721
|
+
const deltaHealResult = safeLogText(review.reviewed === true && landingGateAdmitted
|
|
2722
|
+
? `verdict-${review.verdict}` : `refused-${review.failureReason || (landingGateAdmitted ? 'reviewed-false' : 'landing-gate')}`, 400);
|
|
2723
|
+
if (deltaHeal) deps.log('review.delta-heal', { pr, cause: deltaHeal.cause,
|
|
2724
|
+
prescription: deltaHeal.prescription, result: deltaHealResult, headCommit: diffRead.headCommit },
|
|
2725
|
+
{ level: review.reviewed === true && landingGateAdmitted ? 'info' : 'warn' });
|
|
2726
|
+
const deltaHealOutput = deltaHeal ? {
|
|
2727
|
+
...(deltaBase ? {} : { deltaOutcome: review.reviewed === true && landingGateAdmitted ? 'healed-full-review' : 'refused' }),
|
|
2728
|
+
deltaHeal: { ...deltaHeal, result: deltaHealResult },
|
|
2729
|
+
} : {};
|
|
2668
2730
|
const resultOutput = { pr, model: selectedModel, ...jsonReview, reviewInputChars, reviewDurationMs,
|
|
2669
|
-
...(deltaBase ? deltaReceipt : {}), ...reviewProvenance, ...respondedOutput, ...reviewerSelection,
|
|
2731
|
+
...(deltaBase ? deltaReceipt : {}), ...deltaHealOutput, ...reviewProvenance, ...respondedOutput, ...reviewerSelection,
|
|
2670
2732
|
...reviewCwdOutput, ...provenance, ...contextOutput, ...refusalOverride, ...landingGateFields,
|
|
2671
2733
|
findingPathHeadChecks, pathWarnings, evidence: evidence.evidence, prDiffFiles: evidence.prDiffFiles,
|
|
2672
2734
|
...(evidence.authoredFiles !== undefined ? { authoredFiles: evidence.authoredFiles } : {}) };
|
|
@@ -23,6 +23,8 @@ export interface ResearchQuestionLadderRunOptions {
|
|
|
23
23
|
invokeOutputSkill?: (skill: string, args: string) => Promise<{ ok: boolean; output: string; error?: string }>;
|
|
24
24
|
/** Test seam for the bounded Bloom 4/5 evidence-gap follow-up. */
|
|
25
25
|
gapFollowup?: typeof runGapFollowup;
|
|
26
|
+
/** Test/config seam for an explicitly installed private Bloom exemplar pack. */
|
|
27
|
+
bloomExemplarPackPath?: string;
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
export interface ResearchGroundingResult {
|
|
@@ -238,8 +240,15 @@ export async function runResearchQuestionLadder(
|
|
|
238
240
|
let raw: string;
|
|
239
241
|
try {
|
|
240
242
|
const sectionIds = outputContract.sections.map((section) => section.id);
|
|
243
|
+
// Keep the premium exemplar bank outside the TUI's static import closure.
|
|
244
|
+
const { getBloomExemplarContext } = await import('../research/bloom-exemplars.js');
|
|
245
|
+
const exemplar = getBloomExemplarContext(request, options.bloomExemplarPackPath);
|
|
246
|
+
debug.log('research.turn', 'bloom-exemplars-selected', {
|
|
247
|
+
domain: exemplar.domain, domainSignal: exemplar.domainSignal,
|
|
248
|
+
source: exemplar.source, count: exemplar.count, levels: exemplar.levels,
|
|
249
|
+
});
|
|
241
250
|
raw = await (options.generate ?? ((prompt) => defaultGenerate(prompt, 'research-question-ladder')))(
|
|
242
|
-
`${buildResearchQuestionLadderPrompt(request, sectionIds)}\n\n${ladderContext}${retroGroundingContext(request)}`,
|
|
251
|
+
`${buildResearchQuestionLadderPrompt(request, sectionIds)}\n\n${exemplar.context ? `${exemplar.context}\n\n` : ''}${ladderContext}${retroGroundingContext(request)}`,
|
|
243
252
|
);
|
|
244
253
|
debug.log('research.turn', 'bloom-generated', { questionCount: 6 });
|
|
245
254
|
} catch (error) {
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
//
|
|
3
3
|
// 구 핸드오프의 생존 지식을 **문서 전체 요약이 아닌 claim 단위**로 추출해, 기존 하이브리드 검색으로
|
|
4
4
|
// 대상 WIKI-* living 페이지를 골라 doc-curate 큐에 제안한다. 핵심 규율(미션 불변식):
|
|
5
|
-
// · 각 claim proposal 에 원문 구절·출처 경로·마지막 검증 시점(provenance)
|
|
5
|
+
// · 각 claim proposal 에 원문 구절·출처 경로·마지막 검증 시점(provenance) 필수 — 하나라도 없으면
|
|
6
|
+
// 제안이 성립하지 않는다(rejected 관측): 어떤 페이지에도 자동 쓰기·고치기·링크 제안을 남기지 않는다.
|
|
6
7
|
// · 기존 claim 과 충돌하면 **덮어쓰지 않고** 병렬 근거 + contradiction 플래그(비파괴).
|
|
7
8
|
// · 출력은 doc-curate CurationProposal(큐) 로만 — 자동 이동·병합·archive 없음(HITL 승인 게이트).
|
|
8
9
|
// · 깨진 판정을 LLM 에 안 맡김(결정론 추출·검색/충돌만 주입). 새 큐/파서 안 만들고 재사용.
|
|
@@ -49,6 +50,7 @@ export function extractClaims(text: string, sourcePath: string, nowDate: string)
|
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
const WIKI_CLAIM_DISCARD_REASON = 'no-matching-wiki-page' as const;
|
|
53
|
+
const WIKI_CLAIM_REJECT_REASON = 'missing-provenance' as const;
|
|
52
54
|
|
|
53
55
|
export interface WikiClaimStatistics {
|
|
54
56
|
receivedClaims: number;
|
|
@@ -58,6 +60,12 @@ export interface WikiClaimStatistics {
|
|
|
58
60
|
reason: typeof WIKI_CLAIM_DISCARD_REASON;
|
|
59
61
|
sourcePaths: string[];
|
|
60
62
|
};
|
|
63
|
+
/** 가산 관측(근거 필수 불변식 시행) — provenance 없어 명시적 거부된 claim. 0건이면 기존 계약 보존을 위해 필드를 싣지 않는다. */
|
|
64
|
+
rejected?: {
|
|
65
|
+
reason: typeof WIKI_CLAIM_REJECT_REASON;
|
|
66
|
+
claims: number;
|
|
67
|
+
sourcePaths: string[];
|
|
68
|
+
};
|
|
61
69
|
}
|
|
62
70
|
|
|
63
71
|
export type WikiClaimItems = CurationItem[] & { statistics: WikiClaimStatistics };
|
|
@@ -85,12 +93,22 @@ export function defaultDetectConflict(claim: Claim, existing: string): boolean {
|
|
|
85
93
|
return hit >= 2 && neg;
|
|
86
94
|
}
|
|
87
95
|
|
|
96
|
+
/** 근거(provenance 3요소 — 원문 구절·출처 경로·마지막 검증 시점)가 온전한가. 하나라도 비면 제안이 성립하지 않는다. */
|
|
97
|
+
function hasCompleteProvenance(claim: Claim): boolean {
|
|
98
|
+
return claim.sourceQuote.trim() !== '' && claim.sourcePath.trim() !== '' && claim.lastVerified.trim() !== '';
|
|
99
|
+
}
|
|
100
|
+
|
|
88
101
|
/** claim → CurationItem (add/update · provenance · 충돌 시 contradiction 플래그·비파괴 diff). 순수+주입. */
|
|
89
102
|
export function proposeWikiClaimItems(claims: readonly Claim[], deps: WikiClaimDeps): WikiClaimItems {
|
|
90
103
|
const detect = deps.detectConflict ?? defaultDetectConflict;
|
|
91
104
|
const items = [] as unknown as WikiClaimItems;
|
|
92
105
|
const discardedSourcePaths: string[] = [];
|
|
106
|
+
const rejectedSourcePaths: string[] = [];
|
|
93
107
|
for (const c of claims) {
|
|
108
|
+
if (!hasCompleteProvenance(c)) {
|
|
109
|
+
rejectedSourcePaths.push(c.sourcePath);
|
|
110
|
+
continue; // 근거 필수 불변식 — provenance 없는 claim 은 쓰기·고치기·링크 제안으로 성립하지 않는다.
|
|
111
|
+
}
|
|
94
112
|
const page = deps.findWikiPage(c);
|
|
95
113
|
if (!page) {
|
|
96
114
|
discardedSourcePaths.push(c.sourcePath);
|
|
@@ -121,6 +139,9 @@ export function proposeWikiClaimItems(claims: readonly Claim[], deps: WikiClaimD
|
|
|
121
139
|
proposedItems: items.length,
|
|
122
140
|
discardedClaims: discardedSourcePaths.length,
|
|
123
141
|
discarded: { reason: WIKI_CLAIM_DISCARD_REASON, sourcePaths: discardedSourcePaths },
|
|
142
|
+
...(rejectedSourcePaths.length > 0
|
|
143
|
+
? { rejected: { reason: WIKI_CLAIM_REJECT_REASON, claims: rejectedSourcePaths.length, sourcePaths: rejectedSourcePaths } }
|
|
144
|
+
: {}),
|
|
124
145
|
};
|
|
125
146
|
Object.defineProperty(items, 'statistics', { value: statistics, enumerable: false });
|
|
126
147
|
try {
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
// - onProgress ← ux.progress (각 스테이지 진행을 서피스로).
|
|
14
14
|
// - 큰 gate log → ux.spillFile (파일 첨부).
|
|
15
15
|
|
|
16
|
-
import { basename, join } from 'node:path';
|
|
16
|
+
import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
17
17
|
import { createHash, randomUUID } from 'node:crypto';
|
|
18
|
-
import { existsSync, linkSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
18
|
+
import { existsSync, linkSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
19
19
|
import type { LLMToolSpec } from '../../llm.js';
|
|
20
20
|
import { childLifetimeSignal } from '../../turn-abort-scope.js';
|
|
21
21
|
import { buildSelfImplementSpec } from '../../self-implement/self-implement-runtime.js';
|
|
@@ -48,7 +48,13 @@ export function resolveDispatchEntry(ctx: DaemonToolDispatchCtx): import('../../
|
|
|
48
48
|
|
|
49
49
|
/** 데몬 서피스용 스펙 — 내부 툴과 단일 출처(buildSelfImplementSpec) 공유. */
|
|
50
50
|
export function buildSelfImplementDaemonSpec(): LLMToolSpec {
|
|
51
|
-
|
|
51
|
+
const spec = buildSelfImplementSpec();
|
|
52
|
+
const properties = spec.parameters.properties as Record<string, Record<string, unknown>>;
|
|
53
|
+
properties.goalFile = {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: '기존 SelfImplement 골 문서를 재개할 때만 지정한다. 문서에 결정을 반영한 뒤 같은 골을 다시 실행하며, 저장소 내부 GOAL-* 문서 경로만 허용된다.',
|
|
56
|
+
};
|
|
57
|
+
return spec;
|
|
52
58
|
}
|
|
53
59
|
|
|
54
60
|
// ⭐ 판정은 `../../self-implement/observe-only.js` **한 자리**가 한다 — 이 스위치를 타는 경로가
|
|
@@ -90,7 +96,7 @@ const END_STAGES: readonly SelfImplementProgressStage[] = ['pr-opened', 'aborted
|
|
|
90
96
|
export type SelfImplementLaunchedToolResult = SelfImplementResult & { runId: string; kind: 'launched'; message: string; next: string; missing: string[] };
|
|
91
97
|
export type SelfImplementPendingToolResult = Partial<SelfImplementResult> & { kind: 'pending'; message: string; next: string; missing: string[] };
|
|
92
98
|
export type SelfImplementObservedOnlyToolResult = { kind: 'observed-only'; observed: true; message: string; next: string; missing: ['runId', 'node'] };
|
|
93
|
-
export type SelfImplementFailedToolResult = Partial<SelfImplementResult> & { kind: 'failed'; reason: string; message: string; next: string; missing: string[] };
|
|
99
|
+
export type SelfImplementFailedToolResult = Partial<SelfImplementResult> & { kind: 'failed'; reason: string; message: string; next: string; missing: string[]; goalFile?: string };
|
|
94
100
|
export type SelfImplementToolResult = SelfImplementLaunchedToolResult | SelfImplementPendingToolResult | SelfImplementObservedOnlyToolResult | SelfImplementFailedToolResult;
|
|
95
101
|
|
|
96
102
|
/** 하니스가 런을 맡았다 — 파일 편집은 하니스 몫이므로 모델의 직접 Write/Edit 을 문면으로 막는다. */
|
|
@@ -220,6 +226,7 @@ const GOAL_ORIGINAL_TEXT_LIMIT = null;
|
|
|
220
226
|
|
|
221
227
|
type GoalAuthorSummary = {
|
|
222
228
|
authored: boolean;
|
|
229
|
+
reused: boolean;
|
|
223
230
|
goalFile: string | null;
|
|
224
231
|
userTextState: 'absent' | 'empty' | 'present';
|
|
225
232
|
originalChars: number | null;
|
|
@@ -231,10 +238,23 @@ type GoalAuthorSummary = {
|
|
|
231
238
|
function emitGoalAuthorSummary(ux: SurfaceUx, summary: GoalAuthorSummary): void {
|
|
232
239
|
const message = summary.authored
|
|
233
240
|
? `goal-author authored ${basename(summary.goalFile!)} (${summary.userTextState}; ${summary.storedChars} chars; truncated=${summary.truncated})`
|
|
234
|
-
:
|
|
241
|
+
: summary.reused
|
|
242
|
+
? `goal-author resumed ${basename(summary.goalFile!)} (${summary.userTextState})`
|
|
243
|
+
: `goal-author not authored (${summary.userTextState}; no goal source)`;
|
|
235
244
|
ux.progress(message, { phase: 'delta' });
|
|
236
245
|
}
|
|
237
246
|
|
|
247
|
+
function resolveResumableGoalFile(requestedPath: string, cwd: string): string {
|
|
248
|
+
const root = realpathSync(cwd);
|
|
249
|
+
const candidate = realpathSync(isAbsolute(requestedPath) ? requestedPath : resolve(root, requestedPath));
|
|
250
|
+
const relativePath = relative(root, candidate);
|
|
251
|
+
if (!relativePath || relativePath === '..' || relativePath.startsWith(`..${sep}`) || isAbsolute(relativePath)
|
|
252
|
+
|| !/^GOAL-[^/\\]+\.(?:md|txt)$/i.test(basename(candidate))) {
|
|
253
|
+
throw new Error('goalFile must point to an existing GOAL-*.md or GOAL-*.txt document inside the repository');
|
|
254
|
+
}
|
|
255
|
+
return candidate;
|
|
256
|
+
}
|
|
257
|
+
|
|
238
258
|
/** Observability only; tool selection remains model-led. */
|
|
239
259
|
function harnessMentionState(userText: string | undefined): 'absent' | 'matched' | 'not-matched' {
|
|
240
260
|
if (userText === undefined) return 'absent';
|
|
@@ -293,7 +313,18 @@ export async function dispatchSelfImplement(
|
|
|
293
313
|
}
|
|
294
314
|
|
|
295
315
|
let goalFile: string | undefined;
|
|
296
|
-
|
|
316
|
+
let resumedGoal = false;
|
|
317
|
+
if (args.goalFile !== undefined) {
|
|
318
|
+
if (typeof args.goalFile !== 'string' || !args.goalFile.trim()) {
|
|
319
|
+
return buildFailedToolResult('goalFile must be a non-empty path to an existing authored goal document');
|
|
320
|
+
}
|
|
321
|
+
try {
|
|
322
|
+
goalFile = resolveResumableGoalFile(args.goalFile, ctx.cwd);
|
|
323
|
+
resumedGoal = true;
|
|
324
|
+
} catch (error) {
|
|
325
|
+
return buildFailedToolResult(error instanceof Error ? error.message : String(error));
|
|
326
|
+
}
|
|
327
|
+
} else if (goalSourceText !== undefined) {
|
|
297
328
|
const recentStepCounts = readRecentStepCountsFailOpen(recentStepCountReader);
|
|
298
329
|
goalFile = (await authorGoal(goalSourceText, ctx.cwd, {
|
|
299
330
|
goalTitle: feature,
|
|
@@ -334,7 +365,7 @@ export async function dispatchSelfImplement(
|
|
|
334
365
|
if (clarification.decisionRequired.length > 0) {
|
|
335
366
|
const ledger = decisionLedgerFactory?.() ?? new DecisionLedger();
|
|
336
367
|
const decisions = clarification.decisionRequired.map((item) => {
|
|
337
|
-
const ref = `self-implement-clarification:${
|
|
368
|
+
const ref = `self-implement-clarification:${goalFile}:${item.questionId}`;
|
|
338
369
|
return ledger.raiseOnce({
|
|
339
370
|
title: `SelfImplement 확인 필요: ${item.header}`.slice(0, 120),
|
|
340
371
|
category: item.category,
|
|
@@ -360,7 +391,12 @@ export async function dispatchSelfImplement(
|
|
|
360
391
|
unanswered: clarification.decisionRequired.length,
|
|
361
392
|
reason: 'safety-critical-clarification-requires-recorded-decision',
|
|
362
393
|
});
|
|
363
|
-
|
|
394
|
+
const reason = `goal author clarification requires a recorded decision before launch (${decisions.map((decision) => decision.id).join(', ')})`;
|
|
395
|
+
const next = `Edit ${goalFile} with the explicit answer, then rerun SelfImplement using the same feature and goalFile=${goalFile}; the decision card alone does not launch or resume work`;
|
|
396
|
+
return {
|
|
397
|
+
kind: 'failed', reason, goalFile, next, missing: ['runId', 'node'],
|
|
398
|
+
message: `SelfImplement did not launch: ${reason}. Record the answer in ${goalFile}, then rerun the same feature with goalFile=${goalFile}. A decision-card choice alone does not resume the run.`,
|
|
399
|
+
};
|
|
364
400
|
}
|
|
365
401
|
if (clarification.unanswered > 0) {
|
|
366
402
|
debug.log('daemon-tools.self-implement', 'goal-clarification-assumption-incomplete', {
|
|
@@ -372,7 +408,8 @@ export async function dispatchSelfImplement(
|
|
|
372
408
|
}
|
|
373
409
|
}
|
|
374
410
|
const goalAuthorSummary: GoalAuthorSummary = {
|
|
375
|
-
authored: goalFile !== undefined,
|
|
411
|
+
authored: goalFile !== undefined && !resumedGoal,
|
|
412
|
+
reused: resumedGoal,
|
|
376
413
|
goalFile: goalFile ?? null,
|
|
377
414
|
userTextState: originalUserText === undefined ? 'absent' : originalUserText === '' ? 'empty' : 'present',
|
|
378
415
|
originalChars,
|
|
@@ -75,3 +75,55 @@ export function planShadowArms(input: PlanShadowArmsInput): ShadowArmsPlan {
|
|
|
75
75
|
|
|
76
76
|
return { fire, skipped, remainingUsd };
|
|
77
77
|
}
|
|
78
|
+
|
|
79
|
+
// ── SHADOW-MODEL-ARMS · 그림자 «1팔» probe(명시 실행 · 관측만) ─────────────────────
|
|
80
|
+
/**
|
|
81
|
+
* ⭐ 그림자 1팔 probe — `planShadowArms` 를 일일 상한 안에서 «실제 호출»해
|
|
82
|
+
* 난이도·모델·예상/실제 비용·결과를 기록한다.
|
|
83
|
+
* ⛔ 관측만 한다 — 라이브 LLM 호출 0 · 파일 원장 쓰기 0. 팔은 «계획»이고 실행은 후속 조각이다.
|
|
84
|
+
* ⛔ 후보가 여러 개여도 첫 후보 «1팔»만 계획한다(저작 단계 팔은 단일 팔이다).
|
|
85
|
+
*/
|
|
86
|
+
export interface ShadowArmProbeRecord {
|
|
87
|
+
stage: ShadowStage;
|
|
88
|
+
difficulty: ShadowDifficulty;
|
|
89
|
+
model: string;
|
|
90
|
+
result: 'fire' | 'skipped';
|
|
91
|
+
skipReason: 'over-daily-cap' | 'unknown-price' | null;
|
|
92
|
+
expectedUsd: number | null;
|
|
93
|
+
actualUsd: number;
|
|
94
|
+
remainingUsd: number;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** 그림자 1팔을 실제 호출해 기록을 낸다 — 실제 지출은 없다(계획만, actualUsd=0). */
|
|
98
|
+
export function probeShadowArm(input: PlanShadowArmsInput): ShadowArmProbeRecord {
|
|
99
|
+
const model = input.candidates[0] ?? '';
|
|
100
|
+
const plan = planShadowArms({ ...input, candidates: [model] });
|
|
101
|
+
const fired = plan.fire[0];
|
|
102
|
+
const skipped = plan.skipped[0];
|
|
103
|
+
return {
|
|
104
|
+
stage: input.stage,
|
|
105
|
+
difficulty: input.difficulty,
|
|
106
|
+
model,
|
|
107
|
+
result: fired ? 'fire' : 'skipped',
|
|
108
|
+
skipReason: skipped?.reason ?? null,
|
|
109
|
+
expectedUsd: fired?.estUsd ?? null,
|
|
110
|
+
actualUsd: 0,
|
|
111
|
+
remainingUsd: plan.remainingUsd,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** 한 줄 원장 형식 — 예상 비용이 없으면 `expectedUsd=unknown`, fire 사유는 `under-daily-cap` 이다. */
|
|
116
|
+
export function formatShadowArmProbeRecord(record: ShadowArmProbeRecord): string {
|
|
117
|
+
const reason = record.skipReason ?? 'under-daily-cap';
|
|
118
|
+
const expectedUsd = record.expectedUsd === null ? 'unknown' : `${record.expectedUsd}`;
|
|
119
|
+
return [
|
|
120
|
+
`shadow-arm stage=${record.stage}`,
|
|
121
|
+
`difficulty=${record.difficulty}`,
|
|
122
|
+
`model=${record.model}`,
|
|
123
|
+
`result=${record.result}`,
|
|
124
|
+
`reason=${reason}`,
|
|
125
|
+
`expectedUsd=${expectedUsd}`,
|
|
126
|
+
`actualUsd=${record.actualUsd}`,
|
|
127
|
+
`remainingUsd=${record.remainingUsd}`,
|
|
128
|
+
].join(' ');
|
|
129
|
+
}
|
|
@@ -237,7 +237,13 @@ export function createPickerState(deps: PickerDeps): PickerState {
|
|
|
237
237
|
|
|
238
238
|
const filteredSlash = (buf: PickerBufferView): SlashCommand[] => {
|
|
239
239
|
const { role, showBeta } = readTuiSlashAudience();
|
|
240
|
-
|
|
240
|
+
// /directive is intentionally outside the compact first-use menu, but an owner must be able
|
|
241
|
+
// to discover its ops-only command in the live palette. Keep that role-specific exception local
|
|
242
|
+
// to the palette so the shared first-use menu and help catalog remain at their 15-command policy.
|
|
243
|
+
const paletteCommands = role === 'owner'
|
|
244
|
+
? deps.commands.map((command) => command.name === 'directive' ? { ...command, hidden: false } : command)
|
|
245
|
+
: deps.commands;
|
|
246
|
+
return filterSlashCommands((buf.lines[0] ?? '').slice(1), paletteCommands)
|
|
241
247
|
.filter((cmd) => (role === 'owner' && slashMaturity(cmd.name) === undefined) || slashVisibleFor(cmd.name, role, { showBeta }));
|
|
242
248
|
};
|
|
243
249
|
|
|
@@ -201,6 +201,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
201
201
|
"chain-step-failed",
|
|
202
202
|
"change",
|
|
203
203
|
"chat-error",
|
|
204
|
+
"chat-history-compacted",
|
|
204
205
|
"chat-input-consumed",
|
|
205
206
|
"chat-main",
|
|
206
207
|
"chat-main.await",
|
|
@@ -1075,6 +1076,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1075
1076
|
"read-error",
|
|
1076
1077
|
"read.path-resolved",
|
|
1077
1078
|
"readiness-threw",
|
|
1079
|
+
"readonly-tool-repeat-suppressed",
|
|
1078
1080
|
"ready",
|
|
1079
1081
|
"ready.timeout",
|
|
1080
1082
|
"rebuild",
|
|
@@ -1140,6 +1142,9 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1140
1142
|
"reply.tts.ok",
|
|
1141
1143
|
"request",
|
|
1142
1144
|
"request-received",
|
|
1145
|
+
"request-size",
|
|
1146
|
+
"request-size-compact",
|
|
1147
|
+
"request-size-compact-error",
|
|
1143
1148
|
"request-watch-fail",
|
|
1144
1149
|
"request.error",
|
|
1145
1150
|
"request.out",
|
package/src/cli/mcp-login.ts
CHANGED
|
@@ -11,6 +11,8 @@ import {
|
|
|
11
11
|
prepareMcpOAuthAuthorization,
|
|
12
12
|
authorizeMcpDevice,
|
|
13
13
|
type McpOAuthFetch,
|
|
14
|
+
type AuthorizationServerMetadata,
|
|
15
|
+
type ProtectedResourceMetadata,
|
|
14
16
|
} from '../mcp/mcp-oauth.js';
|
|
15
17
|
import { parseWwwAuthenticate } from '../mcp/client.js';
|
|
16
18
|
import { debug } from '../debug/log.js';
|
|
@@ -129,6 +131,7 @@ export async function runMcpLogin(opts: McpLoginOpts): Promise<McpLoginResult> {
|
|
|
129
131
|
early: callbackListener,
|
|
130
132
|
serverId: opts.serverId,
|
|
131
133
|
resourceMetadataUrl: challenge.resourceMetadata,
|
|
134
|
+
discovered,
|
|
132
135
|
...(challenge.scope ? { scope: challenge.scope } : {}),
|
|
133
136
|
resourceUrl: spec.url,
|
|
134
137
|
...oauthOpts,
|
|
@@ -245,6 +248,7 @@ function loginFailureStage(error: unknown): 'authorization' | 'token' | 'login'
|
|
|
245
248
|
async function openLoginListener(opts: {
|
|
246
249
|
serverId: string;
|
|
247
250
|
resourceMetadataUrl: string;
|
|
251
|
+
discovered: { resource: ProtectedResourceMetadata; metadata: AuthorizationServerMetadata };
|
|
248
252
|
scope?: string;
|
|
249
253
|
resourceUrl: string;
|
|
250
254
|
fetch?: McpOAuthFetch;
|
|
@@ -253,13 +257,14 @@ async function openLoginListener(opts: {
|
|
|
253
257
|
onListener?: (server: Server) => void;
|
|
254
258
|
early: Awaited<ReturnType<typeof listenForCallback>>;
|
|
255
259
|
}): Promise<{ listener: Awaited<ReturnType<typeof listenForCallback>>; authorization: Awaited<ReturnType<typeof prepareMcpOAuthAuthorization>> }> {
|
|
256
|
-
const prior =
|
|
260
|
+
const prior = loadStoredRegistration(opts.discovered.metadata.issuer, opts);
|
|
257
261
|
const preferred = loopbackRedirectPort(prior?.redirectUri);
|
|
258
262
|
if (preferred === null && (prior === null || prior.redirectUri)) {
|
|
259
263
|
const listener = opts.early;
|
|
260
264
|
debug.log('mcp.login', 'callback-port', { serverId: opts.serverId, source: 'fresh' });
|
|
261
265
|
const authorization = await prepareMcpOAuthAuthorization({
|
|
262
266
|
resourceMetadataUrl: opts.resourceMetadataUrl,
|
|
267
|
+
discovered: opts.discovered,
|
|
263
268
|
scope: opts.scope,
|
|
264
269
|
redirectUri: listener.redirectUri,
|
|
265
270
|
resourceUrl: opts.resourceUrl,
|
|
@@ -276,6 +281,7 @@ async function openLoginListener(opts: {
|
|
|
276
281
|
debug.log('mcp.login', 'callback-port', { serverId: opts.serverId, source: 'registered' });
|
|
277
282
|
const authorization = await prepareMcpOAuthAuthorization({
|
|
278
283
|
resourceMetadataUrl: opts.resourceMetadataUrl,
|
|
284
|
+
discovered: opts.discovered,
|
|
279
285
|
scope: opts.scope,
|
|
280
286
|
redirectUri: listener.redirectUri,
|
|
281
287
|
resourceUrl: opts.resourceUrl,
|
|
@@ -296,6 +302,7 @@ async function openLoginListener(opts: {
|
|
|
296
302
|
});
|
|
297
303
|
const authorization = await prepareMcpOAuthAuthorization({
|
|
298
304
|
resourceMetadataUrl: opts.resourceMetadataUrl,
|
|
305
|
+
discovered: opts.discovered,
|
|
299
306
|
scope: opts.scope,
|
|
300
307
|
redirectUri: listener.redirectUri,
|
|
301
308
|
resourceUrl: opts.resourceUrl,
|
|
@@ -306,23 +313,6 @@ async function openLoginListener(opts: {
|
|
|
306
313
|
return { listener, authorization };
|
|
307
314
|
}
|
|
308
315
|
|
|
309
|
-
async function priorRegistration(opts: {
|
|
310
|
-
resourceMetadataUrl: string;
|
|
311
|
-
resourceUrl: string;
|
|
312
|
-
fetch?: McpOAuthFetch;
|
|
313
|
-
storePath?: string;
|
|
314
|
-
}): Promise<ReturnType<typeof loadStoredRegistration>> {
|
|
315
|
-
try {
|
|
316
|
-
const discovered = await discoverMcpOAuth(opts.resourceMetadataUrl, {
|
|
317
|
-
resourceUrl: opts.resourceUrl,
|
|
318
|
-
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
319
|
-
});
|
|
320
|
-
return loadStoredRegistration(discovered.metadata.issuer, opts);
|
|
321
|
-
} catch {
|
|
322
|
-
return null;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
316
|
function isAddressInUse(error: unknown): boolean {
|
|
327
317
|
return Boolean(error && typeof error === 'object' && 'code' in error && (error as { code: unknown }).code === 'EADDRINUSE');
|
|
328
318
|
}
|