elanous 0.2.38 → 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/{RrjXTwz-urRAbChP1bX02 → 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/1178.1aa9cad0e7695427.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5203.51e5d8b5f1dcfe53.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/{7573.2376e13c9c21f1f8.js → 1765.679b29625c8e88d4.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.js → 1800.f7ff51dc4978a958.js} +1 -1
- 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/2073.689dcb2680113d76.js +1 -0
- 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/{8879.ac06755bcf3e44a1.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/2743.5d3f76948be32b34.js +41 -0
- package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +32 -0
- package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.js → 2fdf2931.b431eee4fb468bc3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.js → 2fe2c302.41b517f88d6fe502.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +79 -0
- 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/{b7478fef.5917716286213fcc.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/4156.ba4de4a3664f04b4.js +1 -0
- 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/{8911.bf5e712acb25fb6c.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/{5307.d7328020227880c2.js → 4667.97e31aa38c95c475.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.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/{8487.291666583bebe640.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/{89d6c04f-6b8ab341748e468a.js → 53aeb4ee-51c92f8d683f5220.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3291.f6c1005387d514bd.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/{3086.fb14b60ce98b53d3.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/{1632.7d87f998e714bede.js → 5744.b9415e18ad623100.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5300.677c97e0393742e6.js → 5892.2526d962339662d8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{7161-8f22db3ec5ed005e.js → 5947-135e26537d80a6b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{3124-561f7f037943cde2.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/6874.d5cf7eb8edb2cabe.js +2 -0
- 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/{2415.738b777642a02233.js → 7191.fdc955f7d96064a4.js} +1 -1
- 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/{1026-44010f405704050c.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/8464-e24f10451b658aac.js +1 -0
- 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/8880.64c445592f04acaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5638.107314dc479e2f37.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/{8019.21ca554a821dad01.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/9579.4a8169600fff2058.js +1 -0
- 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/{6493.27ad77de7aac7966.js → 9834.63ab2bbc3153172e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3389.012c70767a872f9b.js → 9869.81a1e24ca682d5a0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8994d93e.33ba491f95345fc2.js → a0a01613.6d1cca322238d7fe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{de8b930d.d94c0f42acf807fc.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-866aac5ff226a7f3.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/b2271e54.c1de3347976e90b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → c0c1a699.0ba79f97005965d4.js} +7 -7
- 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-marketer/fixtures/marketer-scenario.yaml +10 -0
- package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
- package/graphs/demo/persona-marketer/recipes.yaml +19 -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/video/explainer-line.yaml +4 -1
- package/graphs/work/research-report.yaml +11 -1
- package/package.json +1 -1
- package/scripts/dead-code/report.ts +169 -0
- 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/lib/morning-report-options.ts +3 -4
- package/scripts/lib/tui-regress-evidence.ts +56 -0
- package/scripts/llm-cost-ledger.ts +179 -8
- package/scripts/measure-nl-routing-corpus.ts +10 -2
- package/scripts/morning-report.ts +5 -1
- package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
- package/scripts/public-copy-lint.ts +163 -19
- package/scripts/public-export.ts +15 -7
- package/scripts/ratchets/train-side-invariants.sh +0 -1
- package/scripts/release-loop/export-check-node.ts +21 -3
- 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 +583 -64
- package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
- package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
- package/scripts/release-loop/gate-shard-receipts.ts +89 -0
- package/scripts/release-loop/gate-triage-node.ts +70 -10
- package/scripts/release-loop/gate-wall.ts +5 -5
- package/scripts/release-loop/preflight.ts +6 -2
- package/scripts/release-loop/resume-release.ts +267 -20
- package/scripts/release-loop/resume.ts +48 -0
- package/scripts/release-loop/traffic-node.ts +6 -3
- package/scripts/release-loop/unattended-release.ts +4 -2
- package/scripts/release-loop/version-node.ts +7 -2
- package/scripts/release-story/draft.ts +1 -1
- package/scripts/research-bench/README.md +53 -0
- package/scripts/research-bench/questions.json +66 -0
- package/scripts/research-bench/rubric.md +33 -0
- package/scripts/research-bench/run.ts +523 -0
- package/scripts/shadow-authoring-probe.ts +20 -0
- package/scripts/tui-regress.ts +85 -10
- package/scripts/ux-sim.ts +19 -2
- package/src/acp/core-turn-bridge.ts +94 -4
- package/src/agent/autonomous-tools.ts +10 -3
- package/src/agent/monad-agent-turn.ts +4 -1
- package/src/agent/registry.ts +26 -2
- package/src/agent/shared-app-tools.ts +1 -1
- package/src/agent/surface-ux/build.ts +12 -3
- package/src/agent/surface-ux/types.ts +1 -1
- package/src/agent/task-notification.ts +75 -6
- package/src/agent/types.ts +3 -0
- package/src/agent-mission/driver.ts +29 -3
- package/src/agent-mission/mission-cli.ts +2 -1
- package/src/agent-substrate/review-context-pack.ts +365 -0
- package/src/agent-substrate/self-review-cli.ts +291 -20
- package/src/ask-user-question/index.ts +6 -0
- package/src/ask-user-question/inline-resolver.ts +49 -0
- package/src/auto-research/question-ladder-contract.ts +22 -3
- package/src/auto-research/research-turn.ts +359 -17
- package/src/autopilot/agent-loop.ts +1 -1
- package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
- package/src/autopilot/pty-control-loop.ts +8 -1
- package/src/boot/daemon-tools/index.ts +4 -3
- package/src/boot/daemon-tools/self-implement.ts +312 -7
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/budget/llm-cost.ts +44 -5
- package/src/budget/shadow-arms.ts +52 -0
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +14 -0
- package/src/chat/index.ts +33 -7
- package/src/chat/pickers/state.ts +7 -1
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/intake-cli.ts +22 -1
- package/src/cli/lesson-cli.ts +19 -3
- package/src/cli/log-event-names.ts +6 -0
- package/src/cli/mcp-login.ts +8 -18
- package/src/cli/msg-cli.ts +57 -1
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pr-land-heavy-remote.ts +15 -9
- package/src/cli/pty-takeover-cli.ts +67 -7
- package/src/cli/release-cli.ts +79 -7
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/sim-cli.ts +7 -1
- package/src/cli/tasks-cli.ts +41 -13
- package/src/codex/models.ts +30 -15
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +47 -3
- package/src/core-turn/run-goal-loop.ts +240 -10
- package/src/core-turn/types.ts +9 -0
- package/src/dashboard/acp-boot.ts +72 -3
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +327 -27
- package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
- package/src/dashboard/input/external-input-host.ts +2 -0
- package/src/dashboard/sidetab-runtime.ts +228 -0
- package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +16 -18
- package/src/dashboard/turn-preamble.ts +14 -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/domains/knowledge.ts +1 -1
- package/src/esc-abort-gate.ts +33 -1
- package/src/execution-loop/launch-gate.ts +206 -1
- package/src/graph-runner/graph-cli.ts +27 -4
- package/src/graph-runner/in-process-registry.ts +37 -0
- package/src/graph-runner/runner.ts +63 -11
- package/src/graph-wizard/generate.ts +16 -7
- package/src/graph-wizard/mission-compose.ts +201 -0
- package/src/grok/agent-search.ts +8 -2
- package/src/grok/credential.ts +5 -0
- package/src/grounding/ref-index.ts +30 -0
- package/src/grounding/ref-vector.ts +61 -0
- package/src/grounding/sources-cli.ts +11 -3
- package/src/grounding/sources.ts +15 -1
- package/src/harness/harness-cli-command.ts +305 -23
- package/src/harness/harness-incidents.ts +312 -7
- package/src/harness/harness-pod-dispatch.ts +7 -1
- 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 +35 -5
- package/src/input/external-input-queue.ts +10 -0
- package/src/instance/dev-project.ts +25 -0
- package/src/intake-plane/collect-telegram-saved.ts +36 -1
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- package/src/intelligence-map/model-alias.ts +6 -5
- package/src/intelligence-map/model-catalog.ts +59 -2
- package/src/lessons/friction-ledger.ts +154 -0
- package/src/live-supply/collector.ts +149 -0
- package/src/live-supply/probes.ts +52 -0
- package/src/live-supply/snapshot.ts +40 -0
- package/src/llm/model-defaults.ts +4 -4
- package/src/llm.ts +473 -87
- package/src/loops/orchestrator/tick.ts +56 -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/nexus/api/harness-api.ts +2 -1
- package/src/output-truncation.ts +41 -12
- package/src/project/project-store.ts +48 -1
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +59 -3
- package/src/pty-shell/registry.ts +2 -0
- package/src/pty-shell/tui-run-state.ts +80 -3
- package/src/release-loop/gate-host-reservation.ts +157 -4
- package/src/release-loop/gate-shard-ledger.ts +68 -0
- package/src/release-loop/merged-pr-checklist.ts +25 -2
- package/src/release-loop/rehearsal-shard-plan.ts +6 -1
- package/src/release-loop/rehearsal.ts +27 -0
- package/src/release-loop/release-schedule.ts +90 -1
- package/src/research/bloom-exemplars.ts +135 -0
- package/src/research/edge-decision.ts +124 -15
- package/src/research/gap-followup.ts +249 -0
- package/src/research/lenses/counter-evidence.ts +100 -0
- package/src/research/lenses/working-backwards.ts +89 -0
- package/src/research/plugin-discovery.ts +242 -0
- package/src/research-bridge/invoke.ts +4 -2
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +73 -131
- package/src/self-dev/dev-cli.ts +19 -17
- package/src/self-dev/dev-pipeline.ts +8 -4
- package/src/self-dev/graph-front-nodes.ts +23 -0
- package/src/self-dev/graph-journey-route.ts +10 -2
- package/src/self-dev/launch-preflight-text.ts +2 -2
- package/src/self-dev/launch-preflight.ts +47 -11
- package/src/self-dev/orchestrate-cli.ts +1 -0
- package/src/self-dev/orchestrate.ts +15 -0
- package/src/self-dev/run-supervisor.ts +204 -3
- package/src/self-dev/run-types.ts +3 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +76 -58
- package/src/self-implement/gate-artifacts.ts +16 -0
- package/src/self-implement/gate-baseline.ts +75 -4
- package/src/self-implement/gate-cli.ts +368 -30
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +165 -24
- package/src/self-implement/goal-author-clarification.ts +205 -32
- package/src/self-implement/goal-author-decompose.ts +24 -15
- package/src/self-implement/goal-author.ts +86 -10
- 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 +124 -49
- package/src/self-implement/impl-findings-feedback.ts +188 -0
- package/src/self-implement/knowhow-pack.ts +227 -10
- package/src/self-implement/off-diff-evidence.ts +124 -0
- package/src/self-implement/orchestrator.ts +320 -28
- package/src/self-implement/run-ledger.ts +110 -14
- package/src/self-implement/run-stop.ts +33 -2
- package/src/self-implement/running-runs.ts +35 -12
- package/src/self-implement/seams.ts +6 -3
- package/src/self-implement/self-implement-cli.ts +40 -6
- package/src/self-implement/stop-autoheal-operational.ts +43 -0
- package/src/self-implement/stop-autoheal.ts +15 -6
- package/src/session/chat.ts +66 -15
- package/src/session/request-size-guard.ts +123 -0
- package/src/session-runtime/provider-circuit.ts +140 -0
- package/src/shell-runner/file-engine.ts +1 -0
- package/src/shell-runner/types.ts +4 -0
- package/src/sidetab-core/model.ts +312 -0
- package/src/skills/tools/schedule-wakeup.ts +23 -1
- package/src/skills/tools/shell.ts +51 -5
- package/src/steward/directive-audit.ts +354 -0
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/judge.ts +56 -0
- package/src/task-agent/parent-host.ts +14 -1
- package/src/task-agent/postland-card.ts +35 -2
- package/src/task-agent/rejudge-on-head.ts +46 -2
- package/src/task-agent/repair-cycle.ts +1 -1
- package/src/task-agent/task-hand.ts +133 -25
- package/src/task-agent/tier-split.ts +105 -21
- package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
- package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +70 -2
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +298 -45
- package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/entry.ts +25 -5
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/list.ts +36 -165
- package/src/tui/sidetab/nl-tool.ts +2 -136
- package/src/tui/sidetab/peek.ts +52 -0
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +10 -1
- package/src/user-config.ts +45 -9
- package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
- package/src/ux-sim/fake-land-queue.ts +88 -0
- 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/gate-shard-host-reroute.ts +82 -0
- package/src/ux-sim/goal-interim-trace.ts +24 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
- 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/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/explainer.ts +54 -2
- package/src/web-search/grok.ts +32 -6
- package/src/web-search/index.ts +8 -7
- package/src/workflow-runtime/node-catalog.ts +53 -4
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +0 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7628.6b16863ac3972333.js +0 -34
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7954.4f7a8832663ee979.js +0 -115
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
- package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +0 -226
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
- package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
- /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → GiOLWmt4MqDZePubBjA4Q}/_ssgManifest.js +0 -0
|
@@ -6,6 +6,7 @@ import { Database } from 'bun:sqlite';
|
|
|
6
6
|
import { checklistDevVersion, listChecklist, type ChecklistItem } from '../../release-loop/checklist.js';
|
|
7
7
|
import { readTrafficSignal } from '../../seat-loop/traffic-signal.js';
|
|
8
8
|
import { runHoldHygiene, type HygieneCell, type HygieneDeps } from '../../steward/hold-hygiene.js';
|
|
9
|
+
import { runDirectiveAudit, type DirectiveAuditDeps } from '../../steward/directive-audit.js';
|
|
9
10
|
import { effectiveInstanceRoot } from '../../instance/resolve.js';
|
|
10
11
|
import { getUserConfig, ORCHESTRATOR_DEFAULTS, resolveConfiguredAgentRoleLlm, type OrchestratorLoopConfig } from '../../user-config.js';
|
|
11
12
|
import { rubricPriority } from '../../release-loop/rubric.js';
|
|
@@ -55,6 +56,8 @@ export interface TickState {
|
|
|
55
56
|
/** ORCH-TA-HAND — cells handed to TASK-AGENT this run (card id · mode · launched). */
|
|
56
57
|
handed?: Array<{ key: string; cell: string; cardId: string; mode: 'shadow' | 'live'; launched: boolean }>;
|
|
57
58
|
queueOutcomes?: Array<{ queueId: string; key?: string; outcome: string }>;
|
|
59
|
+
/** COORD-ABSORB-OP-BRIDGES-FU — coordinator 수신 소비(버스 배수)의 이번 run 누적. 노드마다 배수한 replied·acknowledged 를 더해 durable 상태 파일에 남긴다. */
|
|
60
|
+
inbox?: { replied: number; acknowledged: number };
|
|
58
61
|
steps: Array<{ node: Node; reason: string; count: number; targetLoopId?: string }>;
|
|
59
62
|
nodes: Partial<Record<Node, 'ok' | 'skipped'>>;
|
|
60
63
|
missing: string[];
|
|
@@ -70,6 +73,7 @@ export interface TickDeps {
|
|
|
70
73
|
heartbeatIntervalMs?: number;
|
|
71
74
|
hygieneCells?: () => HygieneCell[];
|
|
72
75
|
hygienePaths?: Pick<HygieneDeps, 'trafficPath' | 'metaPath' | 'dispatcherDir'>;
|
|
76
|
+
directiveAudit?: DirectiveAuditDeps;
|
|
73
77
|
cards?: () => TaskCard[]; split?: SplitAdapter; placeCell?: PlaceAdapter;
|
|
74
78
|
degradation?: () => { llm: boolean; board: boolean };
|
|
75
79
|
gridHosts?: readonly GridHost[];
|
|
@@ -131,6 +135,47 @@ function handedKeys(path: string): Set<string> {
|
|
|
131
135
|
return keys;
|
|
132
136
|
}
|
|
133
137
|
|
|
138
|
+
/** COORD-ONE 조각 1 — coordinator shadow 의 TASK-AGENT 판정 소비 원장 행: `handKey`(넘김 원장 행 키, shadow: 접두 포함)가 중복 소비를 막는 식별자다. */
|
|
139
|
+
type ConsumedVerdictRow = { at: string; runId: string; key: string; cell: string; cardId: string; mode: 'shadow' | 'live'; launched: boolean; handKey: string; handRunId?: string; consumed: true };
|
|
140
|
+
function coordVerdictLedger(root: string): string { return join(root, 'loop', 'orchestrator', 'coord-verdicts.jsonl'); }
|
|
141
|
+
/** 소비 원장이 완료로 표시한 판정들의 넘김 행 키 — 같은 판정은 두 번 소비되지 않는다. */
|
|
142
|
+
function consumedVerdictHandKeys(path: string): Set<string> {
|
|
143
|
+
const keys = new Set<string>();
|
|
144
|
+
if (!existsSync(path)) return keys;
|
|
145
|
+
for (const line of readFileSync(path, 'utf8').split('\n')) {
|
|
146
|
+
if (!line.trim()) continue;
|
|
147
|
+
let row: Partial<ConsumedVerdictRow>;
|
|
148
|
+
try { row = JSON.parse(line) as typeof row; } catch { throw new Error('invalid coordinator verdict ledger'); }
|
|
149
|
+
if (row.consumed === true && typeof row.handKey === 'string') keys.add(row.handKey);
|
|
150
|
+
}
|
|
151
|
+
return keys;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* COORD-ONE 조각 1 — tick 진입에서 coordinator shadow 가 TASK-AGENT 판정 1건(완료 넘김 행)을 소비한다.
|
|
155
|
+
* 소비는 기록 전용이다: 소비 원장에 완료 표시 한 줄을 남길 뿐 넘김 원장·자리 저널·발사 어느 live 부수효과도 내지 않고
|
|
156
|
+
* seat-loop 기본 발사 경로도 그대로 둔다(스튜어드 흡수·좌석 이관은 후속 조각). 원장을 못 읽는 진입은 소비 0건으로 끝난다.
|
|
157
|
+
*/
|
|
158
|
+
function consumeTaskAgentVerdict(root: string, runId: string, now: Date): void {
|
|
159
|
+
try {
|
|
160
|
+
const handLedger = handedLedger(root);
|
|
161
|
+
if (!existsSync(handLedger)) return;
|
|
162
|
+
const path = coordVerdictLedger(root);
|
|
163
|
+
const consumed = consumedVerdictHandKeys(path);
|
|
164
|
+
const verdict = [...handedRows(handLedger)].find(([handKey]) => !consumed.has(handKey));
|
|
165
|
+
if (!verdict) return;
|
|
166
|
+
const [handKey, row] = verdict;
|
|
167
|
+
const key = handKey.replace(/^shadow:/, '');
|
|
168
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
169
|
+
appendFileSync(path, `${JSON.stringify({ at: now.toISOString(), runId, key, cell: row.cell, cardId: row.cardId,
|
|
170
|
+
mode: row.mode, launched: row.launched, handKey, ...(row.runId ? { handRunId: row.runId } : {}), consumed: true } as ConsumedVerdictRow)}\n`);
|
|
171
|
+
try { debug.log('loop.orchestrator', 'coord-verdict', { runId, key, mode: row.mode, launched: row.launched }); }
|
|
172
|
+
catch { /* 관측이 소비를 바꾸지 않는다 */ }
|
|
173
|
+
} catch (error) {
|
|
174
|
+
try { debug.log('loop.orchestrator', 'coord-verdict-unreadable', { error: String(error).slice(0, 200) }, { level: 'warn' }); }
|
|
175
|
+
catch { /* a failed observation cannot change the tick */ }
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
134
179
|
export function kstWindow(now: Date): Window {
|
|
135
180
|
const hour = Number(new Intl.DateTimeFormat('en-US', { timeZone: 'Asia/Seoul', hour: '2-digit', hourCycle: 'h23' }).format(now));
|
|
136
181
|
return hour < 12 ? '08' : hour < 18 ? '12' : '18';
|
|
@@ -527,11 +572,16 @@ export async function runOrchestratorNode(node: Node, deps: TickDeps = {}): Prom
|
|
|
527
572
|
...(deps.coordinatorKnowhow === undefined ? {} : { knowhow: deps.coordinatorKnowhow }),
|
|
528
573
|
...(deps.coordinatorContext ? { context: deps.coordinatorContext } : {}) });
|
|
529
574
|
}))();
|
|
575
|
+
// 생산 tick 경로의 실행 원문: 배수 결과를 이벤트로만 남기지 않고 run 상태에 누적해 다른 프로세스(보호자·리뷰)가 파일로 관측하게 한다.
|
|
576
|
+
state.inbox = { replied: (state.inbox?.replied ?? 0) + inbox.replied, acknowledged: (state.inbox?.acknowledged ?? 0) + inbox.acknowledged };
|
|
530
577
|
if (inbox.replied || inbox.acknowledged) {
|
|
531
578
|
observe('exchange', 'coordinator-inbox-replied', inbox.replied);
|
|
532
579
|
observe('exchange', 'coordinator-inbox-acknowledged', inbox.acknowledged);
|
|
533
580
|
}
|
|
534
581
|
}
|
|
582
|
+
// COORD-ONE 조각 1 — tick 진입에서 coordinator shadow 가 TASK-AGENT 판정 1건을 소비한다: 소비 원장 기록이 전부고
|
|
583
|
+
// live 부수효과(운영 발사·자리 루프 은퇴)는 0, seat-loop 기본 발사 경로는 그대로다(흡수·이관은 후속 조각).
|
|
584
|
+
if (mode !== 'off') consumeTaskAgentVerdict(root, runId, now);
|
|
535
585
|
if (mode !== 'off' && activeNode(node, window) && state.nodes[node] !== 'ok') {
|
|
536
586
|
if (node === 'intake') {
|
|
537
587
|
if (mode === 'live' && deps.cards) { state.cards = wishCards(deps.cards()); state.skippedCards = []; }
|
|
@@ -960,6 +1010,12 @@ export async function runOrchestratorNode(node: Node, deps: TickDeps = {}): Prom
|
|
|
960
1010
|
const sent = runHoldHygiene({ root, now, cells, ...deps.hygienePaths });
|
|
961
1011
|
for (const notice of sent) observe('exchange', `hold-hygiene:${notice.key}`, 1, SEAT_LOOP_IDS[notice.to]);
|
|
962
1012
|
} catch (error) { observe('hold-hygiene-failed', String(error).slice(0, 160), 0); }
|
|
1013
|
+
// COORD-DIRECTIVE-AUDIT — 지시 원장 행마다 로직 점검(원장·로그·config)을 실제로 돌린다.
|
|
1014
|
+
try {
|
|
1015
|
+
const audit = runDirectiveAudit({ root, now: currentTime, ...deps.directiveAudit });
|
|
1016
|
+
if (audit.alerts.length > 0) observe('directive-audit', `alerts:${audit.alerts.length}`, audit.alerts.length);
|
|
1017
|
+
for (const proposal of audit.proposals) observe('directive-audit', `repair-proposal:${proposal.id}`, 1);
|
|
1018
|
+
} catch (error) { observe('directive-audit-failed', String(error).slice(0, 160), 0); }
|
|
963
1019
|
}
|
|
964
1020
|
(deps.print ?? console.log)(reportLine(state));
|
|
965
1021
|
}
|
package/src/mcp/mcp-oauth.ts
CHANGED
|
@@ -144,6 +144,8 @@ export interface PrepareMcpOAuthAuthorizationOpts extends McpOAuthRuntimeOpts {
|
|
|
144
144
|
scope?: string;
|
|
145
145
|
/** 저장된 등록의 포트를 못 열었을 때 새 client_id 로 다시 등록한다. */
|
|
146
146
|
forceReregister?: boolean;
|
|
147
|
+
/** Discovery already verified against resourceUrl by this caller. */
|
|
148
|
+
discovered?: { resource: ProtectedResourceMetadata; metadata: AuthorizationServerMetadata };
|
|
147
149
|
}
|
|
148
150
|
|
|
149
151
|
/** ⛔⭐⭐ MCP 자격은 «우주를 따라가지 않는다» — 격리 매뉴얼 §6 의 전역 사용자 자산이다.
|
|
@@ -968,7 +970,7 @@ export async function getValidAccessToken(
|
|
|
968
970
|
export async function prepareMcpOAuthAuthorization(
|
|
969
971
|
opts: PrepareMcpOAuthAuthorizationOpts,
|
|
970
972
|
): Promise<McpOAuthAuthorization> {
|
|
971
|
-
const { resource, metadata } = await discoverMcpOAuth(opts.resourceMetadataUrl, opts);
|
|
973
|
+
const { resource, metadata } = opts.discovered ?? await discoverMcpOAuth(opts.resourceMetadataUrl, opts);
|
|
972
974
|
const registration = await ensureClientRegistration(metadata, {
|
|
973
975
|
...opts,
|
|
974
976
|
...(opts.forceReregister ? { forceReregister: true } : {}),
|
|
@@ -222,23 +222,23 @@ const CODEX: TierMap = {
|
|
|
222
222
|
status: 'shipping',
|
|
223
223
|
},
|
|
224
224
|
balanced: {
|
|
225
|
-
model: 'gpt-6-
|
|
225
|
+
model: 'gpt-6.1-terra',
|
|
226
226
|
reasoningLevel: 'low',
|
|
227
|
-
label: 'GPT-6
|
|
228
|
-
rationale: 'Default ·
|
|
227
|
+
label: 'GPT-6.1 Terra · low',
|
|
228
|
+
rationale: 'Default · Codex CLI low effort · elanous 경로 기본 effort medium은 유지',
|
|
229
229
|
status: 'shipping',
|
|
230
230
|
},
|
|
231
231
|
better: {
|
|
232
|
-
model: 'gpt-6-
|
|
232
|
+
model: 'gpt-6.1-terra',
|
|
233
233
|
reasoningLevel: 'medium',
|
|
234
|
-
label: 'GPT-6
|
|
235
|
-
rationale: '
|
|
234
|
+
label: 'GPT-6.1 Terra · medium',
|
|
235
|
+
rationale: '일상 코딩·구현 역할 · Codex CLI 기본 effort=low에서 한 단계 높임',
|
|
236
236
|
status: 'shipping',
|
|
237
237
|
},
|
|
238
238
|
best: {
|
|
239
|
-
model: 'gpt-6-sol',
|
|
239
|
+
model: 'gpt-6.1-sol',
|
|
240
240
|
reasoningLevel: 'high',
|
|
241
|
-
label: 'GPT-6 Sol · high',
|
|
241
|
+
label: 'GPT-6.1 Sol · high',
|
|
242
242
|
rationale: 'Hard reasoning · architecture (⚠️ 여기부터 과잉설계·scope creep 신고가 급증한다)',
|
|
243
243
|
status: 'shipping',
|
|
244
244
|
},
|
|
@@ -247,7 +247,7 @@ const CODEX: TierMap = {
|
|
|
247
247
|
// (2026-09-23 정정: 종전 문면 「terra 대비 4배/3.3배」는 terra 가격을 2.5/15 로 잘못 안 값이었다)
|
|
248
248
|
// 기본을 올리면 사다리 맨 위 칸의 비용이 조용히 곱해진다. 더 깊게 필요하면 그때 올린다
|
|
249
249
|
// (`llm.codexReasoning.effort` = high/xhigh/max · 상한 판정은 reasoningEffortCeiling).
|
|
250
|
-
//
|
|
250
|
+
// Daily coding uses 6.1 Terra; this loaded tier remains GPT-6 Astra.
|
|
251
251
|
loaded: {
|
|
252
252
|
model: 'gpt-6-astra',
|
|
253
253
|
reasoningLevel: 'medium',
|
|
@@ -14,7 +14,7 @@ export function explicitTurnTier(
|
|
|
14
14
|
try {
|
|
15
15
|
const resolved = resolveLlmTier(cfg.modelTier, cfg.llm.provider, { sessionId });
|
|
16
16
|
if (resolved.source !== 'session-override' && resolved.source !== 'user-config-surface') return undefined;
|
|
17
|
-
//
|
|
17
|
+
// Codex tiers can share a model while differing by reasoning level (low·medium·high),
|
|
18
18
|
// so carrying the model alone left the slider a no-op there (10-01 live).
|
|
19
19
|
const reasoningEffort = resolved.reasoningLevel ? REASONING_EFFORT[resolved.reasoningLevel] : undefined;
|
|
20
20
|
return { model: resolved.model, tier: resolved.tier, source: resolved.source, ...(reasoningEffort ? { reasoningEffort } : {}) };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import type { MsgMirrorTransport, MirrorTarget } from './msg-mirror-runner.js';
|
|
3
|
+
|
|
4
|
+
type GhExec = (args: string[]) => string;
|
|
5
|
+
type Comment = { body?: unknown };
|
|
6
|
+
type Issue = { number?: unknown; title?: unknown; body?: unknown; pull_request?: unknown };
|
|
7
|
+
const keyOf = (target: MirrorTarget) => `${target.repo}#${target.issueNumber}`;
|
|
8
|
+
|
|
9
|
+
function defaultGhExec(args: string[]): string {
|
|
10
|
+
return execFileSync('gh', ['api', ...args], { encoding: 'utf8', timeout: 30_000, maxBuffer: 16 * 1024 * 1024 });
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function flatPages(output: string): unknown[] {
|
|
14
|
+
const parsed: unknown = JSON.parse(output);
|
|
15
|
+
if (!Array.isArray(parsed) || !parsed.every(Array.isArray)) throw new Error('GitHub paginated response is malformed');
|
|
16
|
+
return parsed.flat();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function firstLine(body: string): string { return body.split(/\r?\n/, 1)[0] ?? ''; }
|
|
20
|
+
|
|
21
|
+
/** GitHub issue/comment API adapter. Constructed only when the mirror command runs. */
|
|
22
|
+
export class GitHubMsgMirrorTransport implements MsgMirrorTransport {
|
|
23
|
+
private readonly comments = new Map<string, { rows: Comment[]; markers: Set<string> }>();
|
|
24
|
+
|
|
25
|
+
constructor(private readonly gh: GhExec = defaultGhExec) {}
|
|
26
|
+
|
|
27
|
+
beginTick(): void { this.comments.clear(); }
|
|
28
|
+
|
|
29
|
+
private loadComments(target: MirrorTarget): { rows: Comment[]; markers: Set<string> } {
|
|
30
|
+
const key = keyOf(target);
|
|
31
|
+
const cached = this.comments.get(key);
|
|
32
|
+
if (cached) return cached;
|
|
33
|
+
const rows = flatPages(this.gh(['--paginate', '--slurp', `repos/${target.repo}/issues/${target.issueNumber}/comments?per_page=100`]))
|
|
34
|
+
.map(row => {
|
|
35
|
+
if (!row || typeof row !== 'object' || typeof (row as Comment).body !== 'string') throw new Error('GitHub comment response is malformed');
|
|
36
|
+
return row as Comment;
|
|
37
|
+
});
|
|
38
|
+
const result = { rows, markers: new Set(rows.map(row => firstLine(row.body as string))) };
|
|
39
|
+
this.comments.set(key, result);
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
countComments(target: MirrorTarget): number { return this.loadComments(target).rows.length; }
|
|
44
|
+
|
|
45
|
+
hasMarker(target: MirrorTarget, marker: string): boolean {
|
|
46
|
+
return this.loadComments(target).markers.has(marker);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
postComment(target: MirrorTarget, body: string): void {
|
|
50
|
+
const comments = this.loadComments(target);
|
|
51
|
+
this.gh(['-X', 'POST', `repos/${target.repo}/issues/${target.issueNumber}/comments`, '-f', `body=${body}`]);
|
|
52
|
+
comments.rows.push({ body });
|
|
53
|
+
comments.markers.add(firstLine(body));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
createNextChannel(target: MirrorTarget, idempotencyKey: string): MirrorTarget {
|
|
57
|
+
const title = `Elanous seat-message mirror · ${idempotencyKey}`;
|
|
58
|
+
const existing = flatPages(this.gh(['--paginate', '--slurp', `repos/${target.repo}/issues?state=all&per_page=100&sort=created&direction=desc`]))
|
|
59
|
+
.find((row): row is Issue => !!row && typeof row === 'object' && typeof (row as Issue).title === 'string'
|
|
60
|
+
&& (row as Issue).title === title && (row as Issue).pull_request === undefined);
|
|
61
|
+
if (existing) {
|
|
62
|
+
if (!Number.isSafeInteger(existing.number) || (existing.number as number) < 1) throw new Error('existing mirror issue has invalid number');
|
|
63
|
+
return { repo: target.repo, issueNumber: existing.number as number };
|
|
64
|
+
}
|
|
65
|
+
const body = `Automated seat-message mirror channel.\n\nRotation key: ${idempotencyKey}\n`;
|
|
66
|
+
const output = this.gh(['-X', 'POST', `repos/${target.repo}/issues`, '-f', `title=${title}`, '-f', `body=${body}`]);
|
|
67
|
+
const issue: unknown = JSON.parse(output);
|
|
68
|
+
if (!issue || typeof issue !== 'object' || !Number.isSafeInteger((issue as Issue).number)
|
|
69
|
+
|| ((issue as Issue).number as number) < 1) throw new Error('GitHub did not return the new mirror issue number');
|
|
70
|
+
return { repo: target.repo, issueNumber: (issue as Issue).number as number };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
linkAndCloseChannel(from: MirrorTarget, to: MirrorTarget): void {
|
|
74
|
+
const marker = `<!-- elanous-msg-mirror:rotated-to:${to.repo}#${to.issueNumber} -->`;
|
|
75
|
+
if (!this.hasMarker(from, marker)) {
|
|
76
|
+
this.postComment(from, `${marker}\nMirror channel moved to [#${to.issueNumber}](https://github.com/${to.repo}/issues/${to.issueNumber}).`);
|
|
77
|
+
}
|
|
78
|
+
this.gh(['-X', 'PATCH', `repos/${from.repo}/issues/${from.issueNumber}`, '-f', 'state=closed']);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Message } from './msg-store.js';
|
|
2
|
+
|
|
3
|
+
/** Public GitHub mirror policy for the seat-message ledger. */
|
|
4
|
+
export const MIRROR_EVENT_KINDS = ['incident', 'decision', 'correction'] as const;
|
|
5
|
+
export const MIRROR_SUMMARY_INTERVAL_MS = 2 * 60 * 60 * 1000;
|
|
6
|
+
export const MIRROR_ROTATE_AT = 2_300;
|
|
7
|
+
|
|
8
|
+
const mirrorKinds: ReadonlySet<string> = new Set(MIRROR_EVENT_KINDS);
|
|
9
|
+
|
|
10
|
+
export type MirrorEvent = Pick<Message, 'id' | 'from' | 'to' | 'body' | 'kind' | 'createdAt'>;
|
|
11
|
+
|
|
12
|
+
/** Routine reports and loop traffic never become public mirror comments. */
|
|
13
|
+
export function isMirrorEvent(message: Pick<Message, 'kind'>): boolean {
|
|
14
|
+
return typeof message.kind === 'string' && mirrorKinds.has(message.kind);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Returns only new eligible messages, in ledger order, without changing the input. */
|
|
18
|
+
export function selectMirrorEvents(messages: readonly MirrorEvent[], afterId: number): MirrorEvent[] {
|
|
19
|
+
if (!Number.isSafeInteger(afterId) || afterId < 0) throw new Error('afterId must be a nonnegative safe integer');
|
|
20
|
+
return messages
|
|
21
|
+
.filter(message => Number.isSafeInteger(message.id) && message.id > afterId && isMirrorEvent(message))
|
|
22
|
+
.slice()
|
|
23
|
+
.sort((a, b) => a.id - b.id);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Build a deterministic, non-LLM summary for one closed two-hour interval. */
|
|
27
|
+
export function buildMirrorSummary(
|
|
28
|
+
messages: readonly MirrorEvent[],
|
|
29
|
+
windowStart: string,
|
|
30
|
+
windowEnd: string,
|
|
31
|
+
): string | null {
|
|
32
|
+
const start = Date.parse(windowStart);
|
|
33
|
+
const end = Date.parse(windowEnd);
|
|
34
|
+
if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) throw new Error('invalid summary window');
|
|
35
|
+
const events = messages
|
|
36
|
+
.filter(message => isMirrorEvent(message) && Number.isFinite(Date.parse(message.createdAt)))
|
|
37
|
+
.filter(message => {
|
|
38
|
+
const at = Date.parse(message.createdAt);
|
|
39
|
+
return at >= start && at < end;
|
|
40
|
+
})
|
|
41
|
+
.sort((a, b) => a.id - b.id);
|
|
42
|
+
if (events.length === 0) return null;
|
|
43
|
+
|
|
44
|
+
const counts = new Map<string, number>();
|
|
45
|
+
for (const event of events) counts.set(event.kind!, (counts.get(event.kind!) ?? 0) + 1);
|
|
46
|
+
const breakdown = MIRROR_EVENT_KINDS
|
|
47
|
+
.filter(kind => counts.has(kind))
|
|
48
|
+
.map(kind => `${kind} ${counts.get(kind)}`)
|
|
49
|
+
.join(' · ');
|
|
50
|
+
const from = new Date(start).toISOString();
|
|
51
|
+
const to = new Date(end).toISOString();
|
|
52
|
+
return `## Seat message summary (${from} – ${to})\n\n${events.length} mirrored events · ${breakdown}\n\n` +
|
|
53
|
+
events.map(event => `- #${event.id} **${event.kind}** · ${event.from} → ${event.to}: ${event.body.trim()}`).join('\n');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Rotate before GitHub's hard comment wall; callers must persist the new channel pointer. */
|
|
57
|
+
export function shouldRotateMirrorChannel(commentCount: number, threshold: number = MIRROR_ROTATE_AT): boolean {
|
|
58
|
+
if (!Number.isSafeInteger(commentCount) || commentCount < 0) throw new Error('commentCount must be a nonnegative safe integer');
|
|
59
|
+
if (!Number.isSafeInteger(threshold) || threshold < 1 || threshold >= 2_500) throw new Error('threshold must be between 1 and 2499');
|
|
60
|
+
return commentCount >= threshold;
|
|
61
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import type { Message } from './msg-store.js';
|
|
2
|
+
import { buildMirrorSummary, isMirrorEvent, MIRROR_SUMMARY_INTERVAL_MS, selectMirrorEvents, shouldRotateMirrorChannel } from './msg-mirror-policy.js';
|
|
3
|
+
|
|
4
|
+
export interface MirrorTarget {
|
|
5
|
+
repo: string;
|
|
6
|
+
issueNumber: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface MsgMirrorState {
|
|
10
|
+
version: 1;
|
|
11
|
+
target: MirrorTarget;
|
|
12
|
+
messageCursor: number;
|
|
13
|
+
summaryWindowEnd: string;
|
|
14
|
+
rotationPending?: { from: MirrorTarget; to: MirrorTarget };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface MsgMirrorSource {
|
|
18
|
+
listAfter(afterId: number, limit: number): Message[];
|
|
19
|
+
listWindow(start: string, end: string): Message[];
|
|
20
|
+
latestId(): number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface MsgMirrorStateStore {
|
|
24
|
+
read(): MsgMirrorState | null;
|
|
25
|
+
write(state: MsgMirrorState): void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface MsgMirrorTransport {
|
|
29
|
+
beginTick?(): Promise<void> | void;
|
|
30
|
+
countComments(target: MirrorTarget): Promise<number> | number;
|
|
31
|
+
hasMarker(target: MirrorTarget, marker: string): Promise<boolean> | boolean;
|
|
32
|
+
postComment(target: MirrorTarget, body: string): Promise<void> | void;
|
|
33
|
+
createNextChannel(target: MirrorTarget, idempotencyKey: string): Promise<MirrorTarget> | MirrorTarget;
|
|
34
|
+
linkAndCloseChannel(from: MirrorTarget, to: MirrorTarget): Promise<void> | void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface MsgMirrorTickOptions {
|
|
38
|
+
configuredTarget?: MirrorTarget;
|
|
39
|
+
nowMs?: number;
|
|
40
|
+
dryRun?: boolean;
|
|
41
|
+
source: MsgMirrorSource;
|
|
42
|
+
state: MsgMirrorStateStore;
|
|
43
|
+
transport: MsgMirrorTransport;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface MsgMirrorTickResult {
|
|
47
|
+
status: 'disabled' | 'dry-run' | 'synced';
|
|
48
|
+
target: MirrorTarget | null;
|
|
49
|
+
scanned: number;
|
|
50
|
+
posted: number;
|
|
51
|
+
rotated: number;
|
|
52
|
+
summaries: number;
|
|
53
|
+
sourceCursor: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const VALID_REPO = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
57
|
+
|
|
58
|
+
export function validateMirrorTarget(value: unknown): MirrorTarget {
|
|
59
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('mirror target must be an object');
|
|
60
|
+
const target = value as Record<string, unknown>;
|
|
61
|
+
if (typeof target.repo !== 'string' || !VALID_REPO.test(target.repo)
|
|
62
|
+
|| typeof target.issueNumber !== 'number' || !Number.isSafeInteger(target.issueNumber) || target.issueNumber < 1) {
|
|
63
|
+
throw new Error('mirror target requires repo=owner/name and a positive issueNumber');
|
|
64
|
+
}
|
|
65
|
+
return { repo: target.repo, issueNumber: target.issueNumber as number };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Sparse settings are disabled by default; malformed nonempty settings are rejected. */
|
|
69
|
+
export function configuredMirrorTarget(raw: unknown): MirrorTarget | undefined {
|
|
70
|
+
if (raw === undefined) return undefined;
|
|
71
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) throw new Error('msgMirror config must be an object');
|
|
72
|
+
const target = (raw as Record<string, unknown>).target;
|
|
73
|
+
return target === undefined ? undefined : validateMirrorTarget(target);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function validateMsgMirrorState(value: unknown): MsgMirrorState {
|
|
77
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('invalid message mirror state');
|
|
78
|
+
const state = value as Record<string, unknown>;
|
|
79
|
+
if (state.version !== 1 || typeof state.messageCursor !== 'number' || !Number.isSafeInteger(state.messageCursor) || state.messageCursor < 0
|
|
80
|
+
|| typeof state.summaryWindowEnd !== 'string' || !Number.isFinite(Date.parse(state.summaryWindowEnd))) throw new Error('invalid message mirror state');
|
|
81
|
+
const target = validateMirrorTarget(state.target);
|
|
82
|
+
const pending = state.rotationPending;
|
|
83
|
+
const rotationPending = pending && typeof pending === 'object' && !Array.isArray(pending)
|
|
84
|
+
? { from: validateMirrorTarget((pending as Record<string, unknown>).from), to: validateMirrorTarget((pending as Record<string, unknown>).to) }
|
|
85
|
+
: undefined;
|
|
86
|
+
if (pending !== undefined && !rotationPending) throw new Error('invalid pending mirror rotation');
|
|
87
|
+
return { version: 1, target, messageCursor: state.messageCursor as number, summaryWindowEnd: new Date(state.summaryWindowEnd as string).toISOString(),
|
|
88
|
+
...(rotationPending ? { rotationPending } : {}) };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function initialState(target: MirrorTarget, nowMs: number, latestMessageId: number): MsgMirrorState {
|
|
92
|
+
if (!Number.isSafeInteger(latestMessageId) || latestMessageId < 0) throw new Error('source latest message ID is invalid');
|
|
93
|
+
const end = Math.floor(nowMs / MIRROR_SUMMARY_INTERVAL_MS) * MIRROR_SUMMARY_INTERVAL_MS;
|
|
94
|
+
return { version: 1, target, messageCursor: latestMessageId, summaryWindowEnd: new Date(end).toISOString() };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function eventMarker(id: number): string { return `<!-- elanous-msg-mirror:event:${id} -->`; }
|
|
98
|
+
function summaryMarker(start: string): string { return `<!-- elanous-msg-mirror:summary:${start} -->`; }
|
|
99
|
+
|
|
100
|
+
function renderEvent(message: Message): string {
|
|
101
|
+
return `## ${message.kind} · #${message.id}\n\n**${message.from} → ${message.to}** · ${message.createdAt}\n\n${message.body.trim()}`;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function prepareTarget(state: MsgMirrorState, transport: MsgMirrorTransport, dryRun: boolean): Promise<{
|
|
105
|
+
state: MsgMirrorState; rotated: number;
|
|
106
|
+
}> {
|
|
107
|
+
let current = state;
|
|
108
|
+
let rotated = 0;
|
|
109
|
+
if (current.rotationPending) {
|
|
110
|
+
if (dryRun) return { state: current, rotated };
|
|
111
|
+
await transport.linkAndCloseChannel(current.rotationPending.from, current.rotationPending.to);
|
|
112
|
+
current = { ...current, rotationPending: undefined };
|
|
113
|
+
}
|
|
114
|
+
const count = await transport.countComments(current.target);
|
|
115
|
+
if (!shouldRotateMirrorChannel(count)) return { state: current, rotated };
|
|
116
|
+
if (dryRun) return { state: current, rotated };
|
|
117
|
+
const oldTarget = current.target;
|
|
118
|
+
const nextTarget = validateMirrorTarget(await transport.createNextChannel(oldTarget,
|
|
119
|
+
`msg-mirror-rotate:${oldTarget.repo}#${oldTarget.issueNumber}`));
|
|
120
|
+
current = { ...current, target: nextTarget, rotationPending: { from: oldTarget, to: nextTarget } };
|
|
121
|
+
// Persist the pointer before closing the old issue. On restart the pending link/close is retried.
|
|
122
|
+
// If this write fails, the adapter's idempotency key prevents creating another channel.
|
|
123
|
+
return { state: current, rotated: 1 };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** One idempotent mirror pass. All GitHub effects are behind the injected transport. */
|
|
127
|
+
export async function runMsgMirrorTick(options: MsgMirrorTickOptions): Promise<MsgMirrorTickResult> {
|
|
128
|
+
const nowMs = options.nowMs ?? Date.now();
|
|
129
|
+
if (!Number.isFinite(nowMs)) throw new Error('nowMs must be finite');
|
|
130
|
+
const stored = options.state.read();
|
|
131
|
+
const configured = options.configuredTarget ? validateMirrorTarget(options.configuredTarget) : undefined;
|
|
132
|
+
if (!stored && !configured) return { status: 'disabled', target: null, scanned: 0, posted: 0, rotated: 0, summaries: 0, sourceCursor: 0 };
|
|
133
|
+
await options.transport.beginTick?.();
|
|
134
|
+
let state = stored ? validateMsgMirrorState(stored) : initialState(configured!, nowMs, options.source.latestId());
|
|
135
|
+
let scanned = 0, posted = 0, rotated = 0, summaries = 0;
|
|
136
|
+
if (!options.dryRun) options.state.write(state);
|
|
137
|
+
|
|
138
|
+
const startTarget = state.target;
|
|
139
|
+
const prepared = await prepareTarget(state, options.transport, options.dryRun === true);
|
|
140
|
+
state = prepared.state;
|
|
141
|
+
rotated += prepared.rotated;
|
|
142
|
+
if (!options.dryRun && state !== stored) options.state.write(state);
|
|
143
|
+
|
|
144
|
+
// A rotation is recorded before side effects that close the previous issue.
|
|
145
|
+
if (state.rotationPending && !options.dryRun) {
|
|
146
|
+
await options.transport.linkAndCloseChannel(state.rotationPending.from, state.rotationPending.to);
|
|
147
|
+
state = { ...state, rotationPending: undefined };
|
|
148
|
+
options.state.write(state);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
let page = options.source.listAfter(state.messageCursor, 1000);
|
|
152
|
+
while (page.length > 0) {
|
|
153
|
+
const eligible = new Map(selectMirrorEvents(page, state.messageCursor).map(message => [message.id, message]));
|
|
154
|
+
for (const message of page) {
|
|
155
|
+
scanned++;
|
|
156
|
+
const event = eligible.get(message.id);
|
|
157
|
+
if (event) {
|
|
158
|
+
const preparedNext = await prepareTarget(state, options.transport, options.dryRun === true);
|
|
159
|
+
if (preparedNext.rotated) {
|
|
160
|
+
state = preparedNext.state;
|
|
161
|
+
rotated += preparedNext.rotated;
|
|
162
|
+
if (!options.dryRun) {
|
|
163
|
+
options.state.write(state);
|
|
164
|
+
if (state.rotationPending) {
|
|
165
|
+
await options.transport.linkAndCloseChannel(state.rotationPending.from, state.rotationPending.to);
|
|
166
|
+
state = { ...state, rotationPending: undefined };
|
|
167
|
+
options.state.write(state);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const marker = eventMarker(event.id);
|
|
172
|
+
if (!options.dryRun && !(await options.transport.hasMarker(state.target, marker))) {
|
|
173
|
+
await options.transport.postComment(state.target, `${marker}\n${renderEvent(event)}`);
|
|
174
|
+
posted++;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
state = { ...state, messageCursor: message.id };
|
|
178
|
+
if (!options.dryRun) options.state.write(state);
|
|
179
|
+
}
|
|
180
|
+
if (page.length < 1000) break;
|
|
181
|
+
page = options.source.listAfter(state.messageCursor, 1000);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
let windowStart = Date.parse(state.summaryWindowEnd);
|
|
185
|
+
const nowWindowEnd = Math.floor(nowMs / MIRROR_SUMMARY_INTERVAL_MS) * MIRROR_SUMMARY_INTERVAL_MS;
|
|
186
|
+
while (windowStart + MIRROR_SUMMARY_INTERVAL_MS <= nowWindowEnd) {
|
|
187
|
+
const windowEnd = windowStart + MIRROR_SUMMARY_INTERVAL_MS;
|
|
188
|
+
const from = new Date(windowStart).toISOString();
|
|
189
|
+
const to = new Date(windowEnd).toISOString();
|
|
190
|
+
const summary = buildMirrorSummary(options.source.listWindow(from, to), from, to);
|
|
191
|
+
if (summary) {
|
|
192
|
+
const preparedNext = await prepareTarget(state, options.transport, options.dryRun === true);
|
|
193
|
+
if (preparedNext.rotated) {
|
|
194
|
+
state = preparedNext.state;
|
|
195
|
+
rotated += preparedNext.rotated;
|
|
196
|
+
if (!options.dryRun) {
|
|
197
|
+
options.state.write(state);
|
|
198
|
+
if (state.rotationPending) {
|
|
199
|
+
await options.transport.linkAndCloseChannel(state.rotationPending.from, state.rotationPending.to);
|
|
200
|
+
state = { ...state, rotationPending: undefined };
|
|
201
|
+
options.state.write(state);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const marker = summaryMarker(from);
|
|
206
|
+
if (!options.dryRun && !(await options.transport.hasMarker(state.target, marker))) {
|
|
207
|
+
await options.transport.postComment(state.target, `${marker}\n${summary}`);
|
|
208
|
+
posted++;
|
|
209
|
+
}
|
|
210
|
+
summaries++;
|
|
211
|
+
}
|
|
212
|
+
state = { ...state, summaryWindowEnd: to };
|
|
213
|
+
if (!options.dryRun) options.state.write(state);
|
|
214
|
+
windowStart = windowEnd;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return { status: options.dryRun ? 'dry-run' : 'synced', target: options.dryRun ? startTarget : state.target,
|
|
218
|
+
scanned, posted, rotated, summaries, sourceCursor: state.messageCursor };
|
|
219
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
5
|
+
import { validateMsgMirrorState, type MsgMirrorState, type MsgMirrorStateStore } from './msg-mirror-runner.js';
|
|
6
|
+
|
|
7
|
+
export function defaultMsgMirrorStatePath(): string {
|
|
8
|
+
return join(elanousStateRoot(), 'msg', 'github-mirror-state.json');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** One durable rotation pointer and progress cursor, stored atomically in the active state universe. */
|
|
12
|
+
export class JsonMsgMirrorStateStore implements MsgMirrorStateStore {
|
|
13
|
+
constructor(readonly path: string = defaultMsgMirrorStatePath()) {}
|
|
14
|
+
|
|
15
|
+
read(): MsgMirrorState | null {
|
|
16
|
+
if (!existsSync(this.path)) return null;
|
|
17
|
+
const parsed: unknown = JSON.parse(readFileSync(this.path, 'utf8'));
|
|
18
|
+
return validateMsgMirrorState(parsed);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
write(state: MsgMirrorState): void {
|
|
22
|
+
const normalized = validateMsgMirrorState(state);
|
|
23
|
+
mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 });
|
|
24
|
+
const temp = `${this.path}.${process.pid}.${randomUUID()}.tmp`;
|
|
25
|
+
try {
|
|
26
|
+
writeFileSync(temp, `${JSON.stringify(normalized, null, 2)}\n`, { flag: 'wx', mode: 0o600 });
|
|
27
|
+
renameSync(temp, this.path);
|
|
28
|
+
} catch (error) {
|
|
29
|
+
try { rmSync(temp, { force: true }); } catch { /* preserve the original write error */ }
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
package/src/msg/msg-store.ts
CHANGED
|
@@ -129,6 +129,7 @@ export class MsgStore {
|
|
|
129
129
|
created_at TEXT NOT NULL
|
|
130
130
|
);
|
|
131
131
|
CREATE INDEX IF NOT EXISTS idx_msg_messages_recipient_id ON msg_messages(recipient, id);
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_msg_messages_created_at_id ON msg_messages(created_at, id);
|
|
132
133
|
CREATE TABLE IF NOT EXISTS msg_cursors (
|
|
133
134
|
recipient TEXT PRIMARY KEY,
|
|
134
135
|
last_id INTEGER NOT NULL DEFAULT 0 CHECK(last_id >= 0)
|
|
@@ -307,6 +308,16 @@ export class MsgStore {
|
|
|
307
308
|
WHERE id > ? ORDER BY id ASC LIMIT ?`).all(after, limit) as MessageRow[]).map(fromRow));
|
|
308
309
|
}
|
|
309
310
|
|
|
311
|
+
/** Read a half-open UTC timestamp window for periodic message-mirror summaries. */
|
|
312
|
+
listCreatedBetween(start: string, end: string): Message[] {
|
|
313
|
+
const startMs = Date.parse(start);
|
|
314
|
+
const endMs = Date.parse(end);
|
|
315
|
+
if (!Number.isFinite(startMs) || !Number.isFinite(endMs) || endMs <= startMs) throw new Error('invalid message time window');
|
|
316
|
+
return this.readWithSchema(hasReplyTo => (this.db.query(`SELECT id, sender, recipient, body, kind,
|
|
317
|
+
${hasReplyTo ? 'reply_to' : 'NULL AS reply_to'}, created_at FROM msg_messages
|
|
318
|
+
WHERE created_at >= ? AND created_at < ? ORDER BY id ASC`).all(new Date(startMs).toISOString(), new Date(endMs).toISOString()) as MessageRow[]).map(fromRow));
|
|
319
|
+
}
|
|
320
|
+
|
|
310
321
|
latestId(): number {
|
|
311
322
|
return (this.db.query('SELECT COALESCE(MAX(id), 0) AS id FROM msg_messages').get() as { id: number }).id;
|
|
312
323
|
}
|
|
@@ -9,6 +9,7 @@ import { queryRunScreenKey } from '../../self-implement/run-ledger.js';
|
|
|
9
9
|
import { logsDbPath } from '../../mss/logging/log-store.js';
|
|
10
10
|
import { redactSecretText } from '../../debug/log.js';
|
|
11
11
|
import { runAskLaunchFlow, type AskLaunchFlowResult } from '../../self-dev/ask-launch-flow.js';
|
|
12
|
+
import { defaultGoalAuthorSelfResolve } from '../../self-implement/goal-author-clarification.js';
|
|
12
13
|
import * as askIo from '../../self-dev/ask-launch-io.js';
|
|
13
14
|
import { DAEMON_HARNESS_ASK_ENTRANCE } from '../../self-dev/entrance-registry.js';
|
|
14
15
|
import { prepareAskLaunch } from '../../self-dev/launch-preflight.js';
|
|
@@ -211,12 +212,12 @@ function defaultAskDeps(rows: Awaited<ReturnType<typeof askIo.readAskPreflightLo
|
|
|
211
212
|
print: () => {},
|
|
212
213
|
log: (event: string, data: Record<string, unknown>, level?: 'info' | 'warn' | 'error') => debug.log('harness-http', event, data, { level }),
|
|
213
214
|
readLine: async () => '',
|
|
214
|
-
readClarification: async () => '',
|
|
215
215
|
readFile: (file: string) => readFileSync(file, 'utf8'),
|
|
216
216
|
writeFile: (file: string, data: string) => writeFileSync(file, data, 'utf8'),
|
|
217
217
|
cwd: () => process.cwd(),
|
|
218
218
|
now: () => Date.now(),
|
|
219
219
|
isInteractive: () => false,
|
|
220
|
+
selfResolveClarification: defaultGoalAuthorSelfResolve,
|
|
220
221
|
buildPreflightDeps: askIo.buildAskPreflightDeps,
|
|
221
222
|
priorBlockSamples: () => askIo.priorBlockSamplesFrom(rows),
|
|
222
223
|
recentAuthoringSamples: () => askIo.recentAuthoringSamplesFrom(rows),
|