elanous 0.2.37 → 0.2.38
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/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 1026-44010f405704050c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 1632.7d87f998e714bede.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4937-28d437999b77c9dd.js → 1923-5c1695332240246a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
- package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{3199.6a1a9b0e6cd01dc6.js → 2415.738b777642a02233.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 3086.fb14b60ce98b53d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3124-561f7f037943cde2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 3291.f6c1005387d514bd.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
- package/apps/pwa/out/_next/static/chunks/{6877-84d47b7e85d0c41e.js → 3341-f09b9efbd7a82f70.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 3528.e4b8ab70d339f965.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{4036.d54e55e1ebf5acdc.js → 4804.6012b5cd33c22792.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{757-4fbaf50942b8c424.js → 5255-1b60d50eabe9f057.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
- package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 5307.d7328020227880c2.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 5638.107314dc479e2f37.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6493.27ad77de7aac7966.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1224.2ceca6c180d5130b.js → 7000.28157393caaf5343.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 7161-8f22db3ec5ed005e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{2479-fe7e188bd9402d14.js → 7311-60a7ea80d23c7521.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5952.294fc574a8625184.js → 7488.966b116789f3d41a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 7628.6b16863ac3972333.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 7954.4f7a8832663ee979.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 8019.21ca554a821dad01.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 8487.291666583bebe640.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 8879.ac06755bcf3e44a1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 8911.bf5e712acb25fb6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 8994d93e.33ba491f95345fc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/{page-5c112c6d7c33656e.js → page-c348a3959c5b5fc6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-88a1edbff62eaf1d.js → page-d1d1210f99f620ae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/{page-b9af2ac1c4737ce8.js → page-7f569e533ddeecba.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/{page-fb9e639c107f5f72.js → page-a9d9a3e66459c1e0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → b7459770.6539b11860eb8a9c.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b7478fef.5917716286213fcc.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → bb6987f9.3647e1a23b0e3217.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/de8b930d.d94c0f42acf807fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → eaad0cba.771200940c529df7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.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/graphs/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/package.json +1 -1
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +39 -0
- package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
- package/scripts/provision-export-redactions.ts +15 -0
- package/scripts/public-copy-lint.ts +122 -0
- package/scripts/public-export.ts +69 -2
- package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
- package/scripts/ratchets/train-side-invariants.sh +7 -1
- package/scripts/release-loop/cut-branch.ts +61 -12
- package/scripts/release-loop/gate-node.ts +161 -25
- package/scripts/release-loop/gate-partial.ts +82 -3
- package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
- package/scripts/release-loop/gate-radius-live.ts +4 -2
- package/scripts/release-loop/resume-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +297 -8
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/traffic-node.ts +12 -4
- package/scripts/release-loop/traffic-transition.ts +53 -13
- package/scripts/release-loop/version-node.ts +29 -4
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/core-turn-bridge.ts +6 -1
- package/src/agent/run-context.ts +1 -1
- package/src/agent/task-notification.ts +3 -1
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +195 -27
- package/src/auto-research/question-ladder-contract.ts +137 -0
- package/src/auto-research/research-turn.ts +134 -0
- package/src/autopilot/discovery/doc-lint.ts +1 -1
- package/src/bots/screen-probe.ts +1 -1
- package/src/capture/tui-self-report.ts +10 -2
- package/src/chat/index.ts +1 -0
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/guardian-cli.ts +3 -1
- package/src/cli/intake-cli.ts +48 -12
- package/src/cli/lesson-cli.ts +69 -9
- package/src/cli/pr-land-overlap-evidence.ts +38 -5
- package/src/cli/pr-land-refusal.ts +1 -1
- package/src/cli/pty-takeover-cli.ts +58 -5
- package/src/cli/release-checklist-read-cli.ts +5 -2
- package/src/cli/release-cli.ts +47 -9
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +1 -1
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +62 -23
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/context-bus/context-now.ts +86 -2
- package/src/core-turn/run-core-turn.ts +9 -2
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/index.ts +18 -17
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -0
- package/src/dashboard/term-slash-runtime.ts +2 -0
- package/src/dashboard/turn-preamble.ts +28 -4
- package/src/domains/guardian-tick.ts +9 -0
- package/src/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/runner.ts +17 -2
- package/src/grok/credential.ts +107 -36
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +44 -14
- package/src/intake-plane/collect-telegram-saved.ts +54 -5
- package/src/interactive-terminal-modal.ts +3 -0
- package/src/keybindings.ts +17 -22
- package/src/llm/provider-credentials.ts +1 -1
- package/src/llm-tool-schema.ts +20 -0
- package/src/llm.ts +81 -11
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +6 -3
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/patents/ledger.ts +18 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +5 -0
- package/src/pty-shell/pty-manifest.ts +16 -2
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/repl/index.ts +10 -0
- package/src/research/axis-fanout.ts +133 -0
- package/src/research/edge-decision.ts +88 -0
- package/src/research/output-router.ts +127 -0
- package/src/research-bridge/format.ts +16 -1
- package/src/research-bridge/index.ts +1 -0
- package/src/research-bridge/invoke.ts +41 -5
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +29 -16
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/run-supervisor.ts +22 -7
- package/src/self-dev/shard-run.ts +260 -3
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/doctor-visit.ts +25 -0
- package/src/self-implement/gate-artifacts.ts +2 -2
- package/src/self-implement/gate-baseline.ts +44 -9
- package/src/self-implement/gate-cli.ts +151 -86
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-remote.ts +2 -0
- package/src/self-implement/goal-author.ts +74 -3
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +38 -4
- package/src/self-implement/knowhow-pack.ts +120 -7
- package/src/self-implement/l8-merge-queue.ts +198 -32
- package/src/self-implement/off-diff-evidence.ts +23 -0
- package/src/self-implement/orchestrator.ts +55 -12
- package/src/self-implement/pod-inplace-worktree.ts +82 -0
- package/src/self-implement/pod-warm-pool-profile.ts +2 -2
- package/src/self-implement/premise-review.ts +7 -5
- package/src/self-implement/run-ledger.ts +258 -0
- package/src/self-implement/seams.ts +33 -10
- package/src/self-implement/self-implement-cli.ts +26 -2
- package/src/session/channel-ask-op-envelope.ts +36 -0
- package/src/session/channel-op-reply-route.ts +200 -0
- package/src/session/chat.ts +3 -0
- package/src/session/index.ts +2 -0
- package/src/session-runtime/index.ts +9 -22
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/schedule-wakeup.ts +1 -6
- package/src/status/bar.ts +3 -3
- package/src/storage/file-lock.ts +17 -4
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/parent-host.ts +59 -12
- package/src/task-agent/repair-cycle.ts +67 -8
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/task-hand.ts +98 -10
- package/src/task-agent/tier-split.ts +37 -3
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
- package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +126 -48
- package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -0
- package/src/tool-hints/gate.ts +6 -4
- package/src/tool-hints/signals.ts +33 -1
- package/src/tui/chat/background-job-status.ts +8 -2
- package/src/tui/entry.ts +469 -31
- package/src/tui/sidetab/attach.ts +304 -0
- package/src/tui/sidetab/list.ts +176 -0
- package/src/tui/sidetab/nl-tool.ts +136 -0
- package/src/tui/slash/resume-command.ts +23 -0
- package/src/tui/slash/resume.ts +3 -23
- package/src/tui/slash/term-next.ts +2 -1
- package/src/tui-client/local-chat-turn.ts +29 -8
- package/src/user-config.ts +11 -2
- package/src/ux-sim/fake-llm.ts +11 -5
- package/src/ux-sim/next-tui-seat-scenarios.ts +53 -1
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3578.4e9f9948a9a6f2f4.js +0 -2
- package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
- package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4313.76f232c304a15bde.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4725-34bed25720cc326b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
- package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
- package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
- package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
- package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
- package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
- package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
- package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
- package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
- package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
- package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
- package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
- package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-3337c6a1328c2674.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
- package/scripts/migrate-monad-to-elanous.ts +0 -195
- package/scripts/rebrand-elanous.ts +0 -242
- /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
|
@@ -1,159 +1,8 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// interpret them
|
|
10
|
-
//
|
|
11
|
-
// Kept as a standalone module so the policy is unit-testable
|
|
12
|
-
// without standing up the full dashboard. dashboard.ts imports and
|
|
13
|
-
// wires it into the top of its stdin handler in a follow-up commit.
|
|
14
|
-
//
|
|
15
|
-
// P10 will extend this with Ctrl-B prefix handling (d=detach,
|
|
16
|
-
// s=switch, etc.) once a session registry exists to act on.
|
|
17
|
-
|
|
18
|
-
import type { InteractiveTerminalModalHandle } from '../../interactive-terminal-modal.js';
|
|
19
|
-
import type { KeyEvent } from '../../display/types.js';
|
|
20
|
-
import { debug } from '../../debug/log.js';
|
|
21
|
-
|
|
22
|
-
export type KeyRouteResult = 'consumed' | 'passthrough' | 'closed';
|
|
23
|
-
|
|
24
|
-
export interface TerminalModalRouter {
|
|
25
|
-
current(): InteractiveTerminalModalHandle | null;
|
|
26
|
-
/** Install a modal handle. Optional closePolicy controls what
|
|
27
|
-
* ESC/Ctrl-G does: 'kill' disposes the modal + PTY (default);
|
|
28
|
-
* 'detach' calls handle.dispose({keepPreview:true}) so the PTY
|
|
29
|
-
* survives for re-attach (session registry flow). An explicit
|
|
30
|
-
* onClose hook wins over closePolicy — that's how dashboard
|
|
31
|
-
* wires sessionRegistry.detach(session.id) on Esc. */
|
|
32
|
-
set(
|
|
33
|
-
handle: InteractiveTerminalModalHandle | null,
|
|
34
|
-
opts?: { closePolicy?: 'kill' | 'detach'; onClose?: () => void },
|
|
35
|
-
): void;
|
|
36
|
-
close(): void;
|
|
37
|
-
handleKey(ev: KeyEvent): KeyRouteResult;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// `exit` typed cleanly + Enter closes the popup. claude / codex don't
|
|
41
|
-
// recognize plain `exit` (their command is /exit or /quit), so a user
|
|
42
|
-
// typing `exit\n` would otherwise be stuck — the popup stays open
|
|
43
|
-
// because the child never exits, and the typed text just becomes chat
|
|
44
|
-
// input. elanous intercepts the exact sequence at the router so:
|
|
45
|
-
// • plain shell: same end result (we close before shell evaluates)
|
|
46
|
-
// • claude / codex: popup closes as the user expected
|
|
47
|
-
// Sequence is reset on any non-letter key (other than backspace, which
|
|
48
|
-
// rewinds), Ctrl/Alt modifiers, or any character outside `e/x/i/t` —
|
|
49
|
-
// so genuine words containing "exit" (e.g. typing "exit this loop"
|
|
50
|
-
// into a claude prompt without Enter) DON'T trigger the close. The
|
|
51
|
-
// trigger is specifically `e`, `x`, `i`, `t`, Enter with nothing else.
|
|
52
|
-
const EXIT_CHARS = ['e', 'x', 'i', 't'] as const;
|
|
53
|
-
|
|
54
|
-
export function createTerminalModalRouter(): TerminalModalRouter {
|
|
55
|
-
let handle: InteractiveTerminalModalHandle | null = null;
|
|
56
|
-
let closePolicy: 'kill' | 'detach' = 'kill';
|
|
57
|
-
let onClose: (() => void) | null = null;
|
|
58
|
-
let exitProgress = 0; // how many of EXIT_CHARS have been typed in order
|
|
59
|
-
|
|
60
|
-
const close = (): void => {
|
|
61
|
-
if (!handle) return;
|
|
62
|
-
const h = handle;
|
|
63
|
-
const cb = onClose;
|
|
64
|
-
if (debug.enabled) debug.log('window.terminalModalRouter.close', h.id, { id: h.id, closePolicy, hasOnClose: !!cb });
|
|
65
|
-
handle = null;
|
|
66
|
-
onClose = null;
|
|
67
|
-
exitProgress = 0;
|
|
68
|
-
try {
|
|
69
|
-
if (cb) cb();
|
|
70
|
-
else if (closePolicy === 'detach') h.dispose({ keepPreview: true });
|
|
71
|
-
else h.dispose();
|
|
72
|
-
} catch { /* already disposed */ }
|
|
73
|
-
closePolicy = 'kill';
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
return {
|
|
77
|
-
current: () => handle,
|
|
78
|
-
set: (h, opts) => {
|
|
79
|
-
if (handle && h && handle.id !== h.id) close();
|
|
80
|
-
handle = h;
|
|
81
|
-
closePolicy = opts?.closePolicy ?? 'kill';
|
|
82
|
-
onClose = opts?.onClose ?? null;
|
|
83
|
-
exitProgress = 0;
|
|
84
|
-
if (debug.enabled) {
|
|
85
|
-
debug.log('window.terminalModalRouter.set', h?.id ?? '(null)', {
|
|
86
|
-
id: h?.id ?? null,
|
|
87
|
-
closePolicy,
|
|
88
|
-
hasOnClose: !!onClose,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
|
-
close,
|
|
93
|
-
handleKey: (ev) => {
|
|
94
|
-
if (!handle) return 'passthrough';
|
|
95
|
-
const name = (ev.name ?? '').toLowerCase();
|
|
96
|
-
// ESC must NOT close the modal — claude / codex inside the popup
|
|
97
|
-
// use ESC to cancel an in-progress chat / tool turn. Closing the
|
|
98
|
-
// wrapper window on ESC made the only-way-to-cancel kill the
|
|
99
|
-
// whole popup. iTerm / ghostty don't close their own windows on
|
|
100
|
-
// ESC either; the wrapper should match. Modal close is reserved
|
|
101
|
-
// for: Ctrl+G (close + focus log), Ctrl+Shift+T (toggle off),
|
|
102
|
-
// typed `exit\n`, and the child's own `exit`. ESC just forwards.
|
|
103
|
-
if (ev.ctrl && (name === 'g' || name === 'ㅎ')) {
|
|
104
|
-
if (debug.enabled) debug.log('window.terminalModalRouter.handleKey.close', 'ctrl-g', { id: handle.id });
|
|
105
|
-
close();
|
|
106
|
-
return 'closed';
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Track typed `exit` followed by Enter so the user's natural
|
|
110
|
-
// mental model ("type exit to quit") works inside agent popups
|
|
111
|
-
// (claude / codex) where the child app doesn't recognize a bare
|
|
112
|
-
// `exit` command. See EXIT_CHARS comment above for false-positive
|
|
113
|
-
// avoidance.
|
|
114
|
-
const noMods = !ev.ctrl && !ev.alt;
|
|
115
|
-
if (noMods && name === 'enter' && exitProgress === EXIT_CHARS.length) {
|
|
116
|
-
if (debug.enabled) {
|
|
117
|
-
debug.log('window.terminalModalRouter.handleKey.close', 'typed-exit', {
|
|
118
|
-
id: handle.id,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
close();
|
|
122
|
-
return 'closed';
|
|
123
|
-
}
|
|
124
|
-
if (noMods && name === 'backspace') {
|
|
125
|
-
if (exitProgress > 0) exitProgress--;
|
|
126
|
-
} else if (noMods && name.length === 1 && exitProgress < EXIT_CHARS.length && name === EXIT_CHARS[exitProgress]) {
|
|
127
|
-
exitProgress++;
|
|
128
|
-
} else if (noMods && name === 'enter') {
|
|
129
|
-
// Enter without a complete `exit` prefix — reset and forward.
|
|
130
|
-
exitProgress = 0;
|
|
131
|
-
} else if (name.length === 1 || name === 'space' || ev.ctrl || ev.alt) {
|
|
132
|
-
// Any other printable key OR a modifier keystroke breaks the
|
|
133
|
-
// streak. Multi-char named keys (arrow / fn / etc.) leave the
|
|
134
|
-
// streak alone — the child may consume them without affecting
|
|
135
|
-
// the user's typed prompt buffer.
|
|
136
|
-
exitProgress = 0;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (debug.enabled) {
|
|
140
|
-
debug.log('window.terminalModalRouter.handleKey.forward', name || '(empty)', {
|
|
141
|
-
id: handle.id,
|
|
142
|
-
name,
|
|
143
|
-
ctrl: ev.ctrl ?? false,
|
|
144
|
-
shift: ev.shift ?? false,
|
|
145
|
-
alt: ev.alt ?? false,
|
|
146
|
-
exitProgress,
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
try {
|
|
150
|
-
handle.surface.onKey?.(ev);
|
|
151
|
-
} catch { /* surface disposed mid-event; treat as no-op */ }
|
|
152
|
-
return 'consumed';
|
|
153
|
-
},
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/** Singleton instance used by dashboard.ts. Exported as a separate
|
|
158
|
-
* factory + singleton so tests can inject a fresh router per case. */
|
|
159
|
-
export const terminalModalRouter = createTerminalModalRouter();
|
|
1
|
+
// Compatibility entry for dashboard-owned consumers. The routing policy is
|
|
2
|
+
// shared with the standalone Next TUI from src/terminal.
|
|
3
|
+
export {
|
|
4
|
+
createTerminalModalRouter,
|
|
5
|
+
terminalModalRouter,
|
|
6
|
+
type KeyRouteResult,
|
|
7
|
+
type TerminalModalRouter,
|
|
8
|
+
} from '../../terminal/terminal-modal-router.js';
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { loadSidetabRows, type SidetabRow } from '../tui/sidetab/list.js';
|
|
2
|
+
import { stripAnsi, termSize } from '../tui.js';
|
|
3
|
+
import { requestRemotePtyControl } from '../pty-shell/pty-control-ipc.js';
|
|
4
|
+
import type { SlashCommandRegistry } from './slash-runtime/registry.js';
|
|
5
|
+
import type { DashboardSlashContext, DashboardSlashReturn } from './slash-runtime/dashboard-handlers.js';
|
|
6
|
+
|
|
7
|
+
/** Classic /side: the Next TUI manifest is the sole source of list ordering. */
|
|
8
|
+
export function registerClassicSideSlash(
|
|
9
|
+
registry: SlashCommandRegistry<DashboardSlashContext, DashboardSlashReturn>,
|
|
10
|
+
loadRows: (sessionId?: string) => SidetabRow[] = (sessionId) => loadSidetabRows(false, sessionId),
|
|
11
|
+
snapshot: typeof requestRemotePtyControl = requestRemotePtyControl,
|
|
12
|
+
): void {
|
|
13
|
+
registry.register(['side'], async (args, ctx) => {
|
|
14
|
+
const sub = (args[0] ?? 'list').toLowerCase();
|
|
15
|
+
if (sub === 'new') {
|
|
16
|
+
if (args.length > 1) ctx.chatLines.push(ctx.warning(' 사용법: /side new'));
|
|
17
|
+
else ctx.termSlash.openNewTerminal();
|
|
18
|
+
ctx.setChatScrollOffset(-1);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (sub !== 'list' && sub !== 'attach') {
|
|
22
|
+
ctx.chatLines.push(ctx.muted(' 사용법: /side [list] | new | attach <번호>'));
|
|
23
|
+
ctx.setChatScrollOffset(-1);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Use the same filtered manifest rows for display and numeric resolution;
|
|
27
|
+
// never let an exited row shift the number shown to the user.
|
|
28
|
+
const rows = loadRows(ctx.chatPersona?.sessionId()).filter(row => row.badge !== 'exited');
|
|
29
|
+
if (sub === 'list') {
|
|
30
|
+
if (rows.length === 0) ctx.chatLines.push(ctx.muted(' 사이드탭 없음'));
|
|
31
|
+
rows.forEach((row, i) => ctx.chatLines.push(ctx.muted(` ${i + 1}. ${row.badge} ${row.label}`)));
|
|
32
|
+
ctx.setChatScrollOffset(-1);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const raw = args[1] ?? '';
|
|
36
|
+
const index = /^\d+$/.test(raw) ? Number(raw) - 1 : -1;
|
|
37
|
+
const row = rows[index];
|
|
38
|
+
if (args.length !== 2 || !row) {
|
|
39
|
+
ctx.chatLines.push(ctx.warning(' 사용법: /side attach <목록 번호>'));
|
|
40
|
+
} else if (row.currentProcess) {
|
|
41
|
+
ctx.chatLines.push(ctx.muted(' 현재 세션입니다'));
|
|
42
|
+
} else if (row.sessionId && ctx.termSlash.sessionRegistry.get(row.sessionId)) {
|
|
43
|
+
const { cols, rows: height } = termSize();
|
|
44
|
+
const session = ctx.termSlash.sessionRegistry.attach(row.sessionId, { termCols: cols, termRows: height });
|
|
45
|
+
if (session?.modal) ctx.termSlash.openSession(session);
|
|
46
|
+
else ctx.chatLines.push(ctx.warning(' PTY attach 실패'));
|
|
47
|
+
} else if (row.ptyId) {
|
|
48
|
+
try {
|
|
49
|
+
// A foreign child belongs to another PTY owner: snapshot only, no takeover.
|
|
50
|
+
const result = await snapshot(row.ptyId, 'snapshot', { ansi: false }, { timeoutMs: 450 });
|
|
51
|
+
if (result.status === 'success' && result.screen?.trim()) {
|
|
52
|
+
ctx.chatLines.push(ctx.muted(` ${row.label} · 읽기 전용 snapshot (입력은 전달되지 않습니다)`));
|
|
53
|
+
ctx.chatLines.push(...stripAnsi(result.screen).split('\n'));
|
|
54
|
+
} else ctx.chatLines.push(ctx.warning(` PTY 화면 읽기 실패 · ${result.status}`));
|
|
55
|
+
} catch (error) {
|
|
56
|
+
ctx.chatLines.push(ctx.warning(` PTY 화면 읽기 오류 · ${error instanceof Error ? error.message : String(error)}`));
|
|
57
|
+
}
|
|
58
|
+
} else ctx.chatLines.push(ctx.warning(' attach할 PTY가 없습니다'));
|
|
59
|
+
ctx.setChatScrollOffset(-1);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
@@ -387,6 +387,7 @@ import { readDashboardAskClarification } from './ask-clarification.js';
|
|
|
387
387
|
export { readDashboardAskClarification };
|
|
388
388
|
import { createLoopScheduler, type LoopScheduler } from '../loop-scheduler.js';
|
|
389
389
|
import { registerShellSlash } from './shell-slash.js';
|
|
390
|
+
import { registerClassicSideSlash } from '../side-basic-runtime.js';
|
|
390
391
|
export { registerShellSlash } from './shell-slash.js';
|
|
391
392
|
import { registerMissionSlash } from '../../tui/slash/mission.js';
|
|
392
393
|
// TUI-SLASH-SPLIT-MISSION(D4b) — /mission 은 src/tui/slash/mission.ts 로 이사. 옛 입구 re-export shim 은 slash-runtime/index.ts 한 곳뿐(RFC A5).
|
|
@@ -2577,6 +2578,7 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2577
2578
|
|
|
2578
2579
|
|
|
2579
2580
|
registerShellSlash(registry);
|
|
2581
|
+
registerClassicSideSlash(registry);
|
|
2580
2582
|
|
|
2581
2583
|
// ── B-3.b ─────────────────────────────────────────────────────────
|
|
2582
2584
|
|
|
@@ -127,6 +127,8 @@ export function createDashboardTermSlashRuntime(
|
|
|
127
127
|
deps.muted(' /term list List all alive sessions (fg / bg / exited).'),
|
|
128
128
|
deps.muted(' /term attach <id> Bring a backgrounded session to foreground.'),
|
|
129
129
|
deps.muted(' /term detach Send foreground session to background (PTY survives).'),
|
|
130
|
+
deps.muted(' Ctrl+B (while streaming) Background running child tasks; turn continues.'),
|
|
131
|
+
deps.muted(' Ctrl+X c (chat input) Enter control mode.'),
|
|
130
132
|
deps.muted(' /term switch Open the session picker modal.'),
|
|
131
133
|
deps.muted(' /term kill <id> Stop the PTY and remove the session.'),
|
|
132
134
|
deps.muted(' /term snapshot <id> [tail [bytes]] Capture current grid (snapshot) or last N bytes (tail).'),
|
|
@@ -25,6 +25,7 @@ import { buildConcisenessSystemMessages } from '../prompt-library/chat-concisene
|
|
|
25
25
|
import {
|
|
26
26
|
buildSessionRuntimeSystemMessages,
|
|
27
27
|
buildSessionRuntimeTurnSystemMessages,
|
|
28
|
+
buildResearchDateSystemMessage,
|
|
28
29
|
type SessionTurnProfile,
|
|
29
30
|
} from '../session-runtime/index.js';
|
|
30
31
|
import { buildExecutionAskSystemMessages } from '../ask-user-question/index.js';
|
|
@@ -208,9 +209,13 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
208
209
|
gitSnapshotStaleMs: DASHBOARD_GIT_SNAPSHOT_STALE_MS,
|
|
209
210
|
}));
|
|
210
211
|
const turnProfile = ctx.turnProfile;
|
|
212
|
+
const researchTurn = turnProfile?.surface.id === 'research/agent';
|
|
211
213
|
const surfaceSystemMsgs = turnProfile
|
|
212
214
|
? timed(builderMs, 'surface', () => buildSessionRuntimeTurnSystemMessages(turnProfile, ctx.userText))
|
|
213
215
|
: ([] as LLMMessage[]);
|
|
216
|
+
if (researchTurn) {
|
|
217
|
+
surfaceSystemMsgs.push(buildResearchDateSystemMessage());
|
|
218
|
+
}
|
|
214
219
|
// ⭐⭐ `tools.nativeStructure` 는 «어느 provider 에 켤지»를 목록으로 고를 수 있다(2026-08-18).
|
|
215
220
|
// ⛔ 목록이 없으면 종전대로 «전 provider» — 기존 설정을 쓰는 사람의 값이 안 바뀐다.
|
|
216
221
|
// ⛔ `config.llm.provider` 를 그대로 읽지 않는다. 그것은 `'auto'` 일 수 있고,
|
|
@@ -240,9 +245,9 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
240
245
|
nativeStructureEnabled,
|
|
241
246
|
...(nativeTools !== undefined ? { enabledTools: nativeTools } : {}),
|
|
242
247
|
}) as LLMMessage[]);
|
|
243
|
-
const concisenessSystemMsgs = timed(builderMs, 'conciseness', () =>
|
|
244
|
-
|
|
245
|
-
|
|
248
|
+
const concisenessSystemMsgs = timed(builderMs, 'conciseness', () => researchTurn
|
|
249
|
+
? [] as LLMMessage[]
|
|
250
|
+
: buildConcisenessSystemMessages(ctx.userConfig.chat.conciseness) as LLMMessage[]);
|
|
246
251
|
// ★ elanous 자기접근 규율 + 자기인지 ambient(P3 · 2026-07-13) — 텔레그램/디스코드
|
|
247
252
|
// (makeElanousAgentRunTurn)와 단일 출처(agent/self-ambient.ts). TUI 채팅에서도 미션
|
|
248
253
|
// 진단("P2 왜 실패?")·자율 시스템 관측·회상이 규율+ambient+툴(self-ops family) 3박자로
|
|
@@ -313,10 +318,29 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
313
318
|
let taskNotificationCount = 0;
|
|
314
319
|
try {
|
|
315
320
|
timed(builderMs, 'taskNotifications', () => {
|
|
321
|
+
// ACP may ask for a preamble while the session is idle. Keep queued
|
|
322
|
+
// completion receipts for the next actual user/auto-wake turn.
|
|
323
|
+
if (!ctx.userText.trim()) return;
|
|
324
|
+
const notificationOnlyWake = /(?:^|\n)(?:Question: )?\[자동 재개\] 위임 끝: .+ \((?:done|error|aborted)\) — <task-notification> 의 결과를 읽고 이어서 처리$/u
|
|
325
|
+
.test(ctx.userText);
|
|
326
|
+
if (notificationOnlyWake) {
|
|
327
|
+
preamble.push({ role: 'system', content: '[알림 전용 턴] 이것은 완료 알림을 전달한 비요청 status receipt다. 작업 요청으로 취급하지 말고 Agent 또는 SelfImplement 위임을 시작하지 않는다. 포함된 결과를 바탕으로 한 번의 간결한 상태 요약만 답하고 멈춘다. 결과가 전달되지 않았다면 결과가 아직 제공되지 않았다고 알리고 내용을 추측하지 않는다.' });
|
|
328
|
+
}
|
|
316
329
|
const pendingNotifications = globalTaskNotificationQueue.drain();
|
|
317
330
|
taskNotificationCount = pendingNotifications.length;
|
|
318
|
-
|
|
331
|
+
if (pendingNotifications.length === 0) {
|
|
332
|
+
if (notificationOnlyWake) {
|
|
333
|
+
debug.log('tui.notify', 'notification-only-turn', { notificationCount: 0, resultAvailable: false });
|
|
334
|
+
}
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const taskNotificationsXml = renderTaskNotificationsXml(pendingNotifications, {
|
|
338
|
+
statusReceipt: notificationOnlyWake,
|
|
339
|
+
});
|
|
319
340
|
if (taskNotificationsXml) {
|
|
341
|
+
debug.log('tui.notify', notificationOnlyWake ? 'notification-only-turn' : 'notification-with-user-request', {
|
|
342
|
+
notificationCount: pendingNotifications.length,
|
|
343
|
+
});
|
|
320
344
|
preamble.push({ role: 'user', content: taskNotificationsXml });
|
|
321
345
|
}
|
|
322
346
|
});
|
|
@@ -19,6 +19,8 @@ export interface GuardianDeps {
|
|
|
19
19
|
execute?: (command: string) => Promise<SpawnOutcome>;
|
|
20
20
|
/** Injected only for deterministic expiry-alert tests. Production reads the local Grok auth file. */
|
|
21
21
|
grokExpiry?: () => string | null;
|
|
22
|
+
/** Injected in tests; production reevaluates recorded doctor visits without dispatching a prescription. */
|
|
23
|
+
doctorShadow?: () => void | Promise<void>;
|
|
22
24
|
hostName?: string;
|
|
23
25
|
}
|
|
24
26
|
|
|
@@ -100,6 +102,13 @@ export async function guardianTick(now: Date, plan: GuardianPlan, deps: Guardian
|
|
|
100
102
|
errorName: error instanceof Error ? error.name : 'unknown',
|
|
101
103
|
});
|
|
102
104
|
}
|
|
105
|
+
try {
|
|
106
|
+
await deps.doctorShadow?.();
|
|
107
|
+
} catch (error) {
|
|
108
|
+
debug.log('guardian.doctor-shadow', 'reevaluation-failed', {
|
|
109
|
+
errorName: error instanceof Error ? error.name : 'unknown',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
103
112
|
const timeZone = plan.timeZone ?? resolveTimeZone().timeZone;
|
|
104
113
|
const wouldRun: string[] = [];
|
|
105
114
|
let executed = 0;
|
package/src/git-fs/watcher.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// ── git-fs watcher ──
|
|
2
2
|
//
|
|
3
|
-
// fs.watchFile()
|
|
3
|
+
// fs.watchFile() polls the small set of entries whose replacement indicates
|
|
4
4
|
// the branch or the current commit moved:
|
|
5
5
|
//
|
|
6
6
|
// <gitDir>/HEAD branch switch / detach
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// watching the whole working tree. The dirty probe is throttled
|
|
16
16
|
// separately.
|
|
17
17
|
|
|
18
|
-
import {
|
|
18
|
+
import { unwatchFile, watchFile, type Stats } from 'node:fs';
|
|
19
19
|
import { join } from 'node:path';
|
|
20
20
|
import type { GitHeadInfo } from './types.js';
|
|
21
21
|
import type { LocatedGit } from './locate.js';
|
|
@@ -24,9 +24,9 @@ type Listener = () => void;
|
|
|
24
24
|
|
|
25
25
|
export class GitFileWatcher {
|
|
26
26
|
private readonly listeners = new Set<Listener>();
|
|
27
|
-
private headWatcher:
|
|
28
|
-
private refWatcher:
|
|
29
|
-
private packedRefsWatcher:
|
|
27
|
+
private headWatcher: { stop: () => void } | null = null;
|
|
28
|
+
private refWatcher: { stop: () => void } | null = null;
|
|
29
|
+
private packedRefsWatcher: { stop: () => void } | null = null;
|
|
30
30
|
private currentBranch: string | null = null;
|
|
31
31
|
private disposed = false;
|
|
32
32
|
|
|
@@ -54,7 +54,7 @@ export class GitFileWatcher {
|
|
|
54
54
|
const next = head?.branch ?? null;
|
|
55
55
|
if (next === this.currentBranch) return;
|
|
56
56
|
this.currentBranch = next;
|
|
57
|
-
if (this.refWatcher) { this.refWatcher.
|
|
57
|
+
if (this.refWatcher) { this.refWatcher.stop(); this.refWatcher = null; }
|
|
58
58
|
this.installRefWatcher();
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -62,9 +62,9 @@ export class GitFileWatcher {
|
|
|
62
62
|
if (this.disposed) return;
|
|
63
63
|
this.disposed = true;
|
|
64
64
|
this.listeners.clear();
|
|
65
|
-
if (this.headWatcher) { try { this.headWatcher.
|
|
66
|
-
if (this.refWatcher) { try { this.refWatcher.
|
|
67
|
-
if (this.packedRefsWatcher) { try { this.packedRefsWatcher.
|
|
65
|
+
if (this.headWatcher) { try { this.headWatcher.stop(); } catch {} }
|
|
66
|
+
if (this.refWatcher) { try { this.refWatcher.stop(); } catch {} }
|
|
67
|
+
if (this.packedRefsWatcher) { try { this.packedRefsWatcher.stop(); } catch {} }
|
|
68
68
|
this.headWatcher = null;
|
|
69
69
|
this.refWatcher = null;
|
|
70
70
|
this.packedRefsWatcher = null;
|
|
@@ -77,10 +77,22 @@ export class GitFileWatcher {
|
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
private watchPath(path: string): { stop: () => void } {
|
|
81
|
+
const onChange = (current: Stats, previous: Stats) => {
|
|
82
|
+
if (current.mtimeMs !== previous.mtimeMs || current.ino !== previous.ino || current.size !== previous.size) {
|
|
83
|
+
this.fire();
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
watchFile(path, { interval: 250, persistent: false }, onChange);
|
|
87
|
+
return { stop: () => unwatchFile(path, onChange) };
|
|
88
|
+
}
|
|
89
|
+
|
|
80
90
|
private installHeadWatcher(): void {
|
|
81
|
-
const path = join(this.located.gitDir, 'HEAD');
|
|
82
91
|
try {
|
|
83
|
-
|
|
92
|
+
// Git replaces HEAD atomically via HEAD.lock + rename. fs.watch can stay
|
|
93
|
+
// attached to the old inode or miss the event on loaded hosts; stat
|
|
94
|
+
// polling follows the path and observes the replacement.
|
|
95
|
+
this.headWatcher = this.watchPath(join(this.located.gitDir, 'HEAD'));
|
|
84
96
|
} catch {
|
|
85
97
|
// HEAD may not exist during `git init` transient state; swallow.
|
|
86
98
|
}
|
|
@@ -89,19 +101,12 @@ export class GitFileWatcher {
|
|
|
89
101
|
private installRefWatcher(): void {
|
|
90
102
|
if (!this.currentBranch) return;
|
|
91
103
|
const path = join(this.located.commonGitDir, 'refs', 'heads', ...this.currentBranch.split('/'));
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
// Loose ref may be packed — rely on packed-refs watcher.
|
|
96
|
-
}
|
|
104
|
+
// Loose refs are atomically replaced on commit. Polling the path survives
|
|
105
|
+
// replacement and also detects a ref that is created after subscription.
|
|
106
|
+
this.refWatcher = this.watchPath(path);
|
|
97
107
|
}
|
|
98
108
|
|
|
99
109
|
private installPackedRefsWatcher(): void {
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
this.packedRefsWatcher = watch(path, { persistent: false }, () => this.fire());
|
|
103
|
-
} catch {
|
|
104
|
-
// No packed-refs yet — not an error.
|
|
105
|
-
}
|
|
110
|
+
this.packedRefsWatcher = this.watchPath(join(this.located.commonGitDir, 'packed-refs'));
|
|
106
111
|
}
|
|
107
112
|
}
|
package/src/git-fs/worktree.ts
CHANGED
|
@@ -61,13 +61,18 @@ function worktreeAddTimeoutForTrackedFileCount(trackedFileCount: number | null):
|
|
|
61
61
|
return { ms: Math.min(WORKTREE_ADD_TIMEOUT_MAX_MS, Math.max(WORKTREE_ADD_TIMEOUT_MS, scaledMs)), trackedFileCount, source: 'tracked-files' };
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
export function worktreeAddTimeoutSec(seconds: number | undefined): number | undefined {
|
|
65
|
+
return typeof seconds === 'number' && Number.isSafeInteger(seconds) && seconds > 0 && seconds <= 2_147_483
|
|
66
|
+
? seconds : undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
64
69
|
export function worktreeAddTimeoutForRepo(
|
|
65
70
|
repoRoot: string,
|
|
66
71
|
countTrackedFilesForRepo: (repoRoot: string, ref?: string) => number | null = countTrackedFiles,
|
|
67
72
|
trackedFileRef?: string,
|
|
68
73
|
): WorktreeAddTimeout {
|
|
69
|
-
const seconds = getUserConfig().harness?.worktreeAddTimeoutSec;
|
|
70
|
-
if (
|
|
74
|
+
const seconds = worktreeAddTimeoutSec(getUserConfig().harness?.worktreeAddTimeoutSec);
|
|
75
|
+
if (seconds !== undefined) {
|
|
71
76
|
return { ms: seconds * 1000, trackedFileCount: null, source: 'config' };
|
|
72
77
|
}
|
|
73
78
|
return worktreeAddTimeoutForTrackedFileCount(countTrackedFilesForRepo(repoRoot, trackedFileRef));
|
|
@@ -347,7 +352,18 @@ function bakedDependenciesMatch(repoTree: string, bakedTree: string): boolean {
|
|
|
347
352
|
} catch { return false; }
|
|
348
353
|
}
|
|
349
354
|
|
|
350
|
-
|
|
355
|
+
/** Pod source may omit node_modules while the image carries matching baked dependencies. */
|
|
356
|
+
export function worktreeDependenciesAvailable(repoRoot: string, fallbackRoot = GATE_DEPS_DIR): boolean {
|
|
357
|
+
for (const tree of GATE_DEPS_TREES) {
|
|
358
|
+
const repoTree = join(repoRoot, tree);
|
|
359
|
+
if (!existsSync(join(repoTree, 'package.json')) || !existsSync(join(repoTree, 'bun.lock'))) continue;
|
|
360
|
+
if (existsSync(join(repoTree, 'node_modules'))) continue;
|
|
361
|
+
if (!bakedDependenciesMatch(repoTree, join(fallbackRoot, tree))) return false;
|
|
362
|
+
}
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
export function prepareWorktreeDependencies(repoRoot: string, worktreePath: string, opts: Pick<CreateWorktreeOpts, 'dependencyFallbackRoot' | 'dependencyInstallTimeoutMs'>, deps: WorktreeAddDeps): void {
|
|
351
367
|
const fallbackRoot = opts.dependencyFallbackRoot?.trim() || GATE_DEPS_DIR;
|
|
352
368
|
const timeoutMs = opts.dependencyInstallTimeoutMs ?? WORKTREE_DEPENDENCY_INSTALL_TIMEOUT_MS;
|
|
353
369
|
if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) throw new Error('dependencyInstallTimeoutMs must be a positive integer');
|
|
@@ -3,13 +3,10 @@ import { DecisionLedger, type DecisionEntry } from '../decisions/decision-ledger
|
|
|
3
3
|
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
4
4
|
import { createGraphVariant } from '../self-implement/graph-variant.js';
|
|
5
5
|
import type { GraphEdgeSpec, GraphNodeSpec, GraphTemplateSpec } from '../self-implement/graph-yaml.js';
|
|
6
|
+
import type { ResearchEdgeDecisionRegistry, ResearchEdgeProposal, ResolvedResearchEdgeDecision } from '../research/edge-decision.js';
|
|
6
7
|
import { createLLMGrowthProposer } from './graph-grow-llm.js';
|
|
7
8
|
|
|
8
|
-
export
|
|
9
|
-
node: GraphNodeSpec;
|
|
10
|
-
returnTo?: string;
|
|
11
|
-
reason: string;
|
|
12
|
-
}
|
|
9
|
+
export type GrowthProposal = ResearchEdgeProposal;
|
|
13
10
|
|
|
14
11
|
export type GrowthProposer = (input: { graph: GraphTemplateSpec; nodeId: string; outcome: string; runId: string; output?: unknown }) => GrowthProposal | undefined | Promise<GrowthProposal | undefined>;
|
|
15
12
|
export type GrowthRecipeEffect = 'read-only' | 'external-effect' | 'unknown';
|
|
@@ -68,10 +65,41 @@ export function growthDecision(input: Parameters<GrowthProposer>[0], proposal: G
|
|
|
68
65
|
|
|
69
66
|
export async function proposeGrowth(input: Parameters<GrowthProposer>[0],
|
|
70
67
|
proposer: GrowthProposer = createLLMGrowthProposer(), classifyRecipe?: (node: GraphNodeSpec) => GrowthRecipeEffect | GrowthRecipeClassification,
|
|
71
|
-
decisionDeps: GrowthDecisionDeps = {}): Promise<
|
|
68
|
+
decisionDeps: GrowthDecisionDeps = {}, edgeDecisionRegistry?: ResearchEdgeDecisionRegistry): Promise<
|
|
69
|
+
| { ok: true; graph: GraphTemplateSpec; growth: GraphGrowth; edgeDecision?: ResolvedResearchEdgeDecision }
|
|
70
|
+
| { ok: false; reason: string; park?: boolean; growth?: GraphGrowth; decisionId?: string; decisionRef?: string; command?: GrowthCommand; approval?: string; edgeDecision?: ResolvedResearchEdgeDecision }
|
|
71
|
+
> {
|
|
72
72
|
let proposal: GrowthProposal | undefined;
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
const value = input.output;
|
|
74
|
+
const assessment = value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
75
|
+
&& Array.isArray((value as Record<string, unknown>).gaps)
|
|
76
|
+
&& Array.isArray((value as Record<string, unknown>).contradictions)
|
|
77
|
+
&& Array.isArray((value as Record<string, unknown>).verdicts)
|
|
78
|
+
? { gaps: (value as Record<string, unknown>).gaps as unknown[],
|
|
79
|
+
contradictions: (value as Record<string, unknown>).contradictions as unknown[],
|
|
80
|
+
verdicts: (value as Record<string, unknown>).verdicts as unknown[] }
|
|
81
|
+
: undefined;
|
|
82
|
+
let edgeDecision: ResolvedResearchEdgeDecision | undefined;
|
|
83
|
+
if (assessment) {
|
|
84
|
+
const [{ createResearchEdgeDecisionRegistry }, { debug }] = await Promise.all([
|
|
85
|
+
import('../research/edge-decision.js'), import('../debug/log.js'),
|
|
86
|
+
]);
|
|
87
|
+
edgeDecision = await (edgeDecisionRegistry ?? createResearchEdgeDecisionRegistry()).decide(assessment);
|
|
88
|
+
try {
|
|
89
|
+
debug.log('research.edge', 'decision', {
|
|
90
|
+
provider: edgeDecision.provider,
|
|
91
|
+
decision: edgeDecision.action,
|
|
92
|
+
reason: edgeDecision.reason,
|
|
93
|
+
});
|
|
94
|
+
} catch { /* observation must not change graph growth */ }
|
|
95
|
+
if (edgeDecision.action !== 'add') {
|
|
96
|
+
return { ok: false, reason: `edge decision ${edgeDecision.action}: ${edgeDecision.reason}`, edgeDecision };
|
|
97
|
+
}
|
|
98
|
+
proposal = edgeDecision.proposal;
|
|
99
|
+
} else {
|
|
100
|
+
try { proposal = await proposer(input); }
|
|
101
|
+
catch (error) { return { ok: false, reason: `proposer failed: ${String(error)}` }; }
|
|
102
|
+
}
|
|
75
103
|
if (!proposal) return { ok: false, reason: 'no proposal' };
|
|
76
104
|
if (!proposal.node || typeof proposal.reason !== 'string' || !proposal.reason.trim()) return { ok: false, reason: 'proposal requires a node and reason' };
|
|
77
105
|
let result: ReturnType<typeof createGraphVariant>;
|
|
@@ -99,5 +127,5 @@ export async function proposeGrowth(input: Parameters<GrowthProposer>[0],
|
|
|
99
127
|
growth: proposalGrowth(input, proposal) };
|
|
100
128
|
}
|
|
101
129
|
}
|
|
102
|
-
return { ok: true, graph: result.template, growth: proposalGrowth(input, proposal) };
|
|
130
|
+
return { ok: true, graph: result.template, growth: proposalGrowth(input, proposal), ...(edgeDecision ? { edgeDecision } : {}) };
|
|
103
131
|
}
|
|
@@ -17,6 +17,7 @@ import { recordFailureEvent } from '../self-implement/heal-intake.js';
|
|
|
17
17
|
import { growthApprovalRef, proposeGrowth, type GraphGrowth, type GrowthProposer, type GrowthRecipeEffect, type GrowthDecisionDeps, type GrowthCommand } from './graph-grow.js';
|
|
18
18
|
import { DecisionLedger, type DecisionEntry } from '../decisions/decision-ledger.js';
|
|
19
19
|
import { createLLMGrowthProposer } from './graph-grow-llm.js';
|
|
20
|
+
import type { ResearchEdgeDecisionRegistry } from '../research/edge-decision.js';
|
|
20
21
|
import { graphVersionHash, parseGraphTemplateYaml, type GraphEdgeSpec, type GraphNodeSpec, type GraphTemplateSpec } from '../self-implement/graph-yaml.js';
|
|
21
22
|
import { createGraphUnitResolver, resolveGraphUnit, UnitNotFoundError, type ResolvedGraphUnit } from '../self-implement/graph-unit-resolver.js';
|
|
22
23
|
import { flattenGraphUnits } from '../self-implement/graph-unit-flatten.js';
|
|
@@ -34,6 +35,7 @@ const DEFAULT_BASH_TIMEOUT_MS = 5 * 60 * 1_000;
|
|
|
34
35
|
// Independent of graph YAML and recipe snapshots: an already-wrong saved binding must fail closed.
|
|
35
36
|
const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?: string }>> = {
|
|
36
37
|
'version-release': { recipe: 'cmd:version-release', command: 'bun scripts/release-loop/version-node.ts release --json' },
|
|
38
|
+
'traffic-cut-start': { recipe: 'cmd:traffic-cut-start', command: 'bun scripts/release-loop/traffic-node.ts traffic-cut-start' },
|
|
37
39
|
cutoff: { recipe: 'cmd:cutoff', command: 'bun scripts/release-loop/node-verdict.ts cutoff' },
|
|
38
40
|
'checklist-gate': { recipe: 'cmd:checklist-gate', command: 'bun scripts/release-loop/checklist-gate-node.ts' },
|
|
39
41
|
prefetch: { recipe: 'cmd:docs', command: 'bun scripts/release-loop/docs-node.ts --json' },
|
|
@@ -55,9 +57,11 @@ const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?:
|
|
|
55
57
|
'approve-publish': { recipe: 'approval:publish' },
|
|
56
58
|
publish: { recipe: 'cmd:publish-command', command: 'bun scripts/release-loop/publish-node.ts' },
|
|
57
59
|
'npm-publish': { recipe: 'cmd:npm-publish', command: 'bun scripts/release-loop/npm-publish-node.ts' },
|
|
60
|
+
'traffic-npm-published': { recipe: 'cmd:traffic-npm-published', command: 'bun scripts/release-loop/traffic-node.ts traffic-npm-published' },
|
|
58
61
|
'docs-land': { recipe: 'cmd:docs-land', command: 'bun scripts/release-loop/docs-land-node.ts' },
|
|
59
62
|
verify: { recipe: 'cmd:verify', command: 'bun scripts/release-loop/verify-node.ts' },
|
|
60
63
|
'traffic-verify-complete': { recipe: 'cmd:traffic-verify-complete', command: 'bun scripts/release-loop/traffic-node.ts traffic-verify-complete' },
|
|
64
|
+
'traffic-failed-restore': { recipe: 'cmd:traffic-failed-restore', command: 'bun scripts/release-loop/traffic-node.ts traffic-failed-restore' },
|
|
61
65
|
'vault-note': { recipe: 'cmd:vault-note', command: 'bun scripts/release-loop/vault-note-node.ts' },
|
|
62
66
|
'release-story': { recipe: 'cmd:release-story', command: 'bun scripts/release-story/draft.ts --graph' },
|
|
63
67
|
'ops-upgrade': { recipe: 'cmd:ops-upgrade', command: 'bun scripts/release-loop/ops-upgrade-node.ts' },
|
|
@@ -248,6 +252,8 @@ export interface GraphRunOptions {
|
|
|
248
252
|
pinChildUniverse?: boolean;
|
|
249
253
|
/** Release resume: command checkout and cut tip, checked before every Bash dispatch. */
|
|
250
254
|
releaseCommandSource?: { root: string; cutTip: string; git?: (args: string[]) => string };
|
|
255
|
+
/** Optional per-run Bloom edge policy hook. */
|
|
256
|
+
researchEdgeDecisionRegistry?: ResearchEdgeDecisionRegistry;
|
|
251
257
|
deps?: { root?: string; runBash?: BashRun; callLLM?: (prompt: string) => Promise<string>; log?: (event: string, data: Record<string, unknown>) => void; beforeNode?: () => void; processStartMs?: (pid: number) => number | null; growthProposer?: GrowthProposer; growthLLM?: (prompt: string) => Promise<string>; classifyGrowthRecipe?: (node: GraphNodeSpec, resolved: { command?: string; approval?: string }) => GrowthRecipeEffect; growthDecision?: GrowthDecisionDeps & { list?: (filters: { status: 'all' }) => DecisionEntry[] } };
|
|
252
258
|
}
|
|
253
259
|
|
|
@@ -839,7 +845,16 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
839
845
|
const next = nextNode(graph.edges, prior.nodeId, prior.ok ? 'ok' : 'fail', typeof reported === 'string' ? reported : undefined);
|
|
840
846
|
if (next !== recorded.nodeId) throw new Error('saved run path does not follow graph edges');
|
|
841
847
|
} else if (recorded.nodeId !== unitEntryNode) throw new Error('saved run path does not start at entry node');
|
|
842
|
-
if (i < from && !recorded.ok)
|
|
848
|
+
if (i < from && !recorded.ok) {
|
|
849
|
+
// A warning-only node explicitly sends every outcome to the same next
|
|
850
|
+
// node. Its truthful failed record is safe to preserve when retrying a
|
|
851
|
+
// later release step; a branching failure is still a hard stop.
|
|
852
|
+
const edge = graph.edges.find((candidate) => candidate.from === recorded.nodeId);
|
|
853
|
+
const next = state.path[i + 1];
|
|
854
|
+
if (edge?.on !== 'outcome' || !next || !(['ok', 'fail', 'error'] as const).every((outcome) => edge.map?.[outcome] === next)) {
|
|
855
|
+
throw new Error('cannot preserve a failed predecessor when resuming');
|
|
856
|
+
}
|
|
857
|
+
}
|
|
843
858
|
const approved = resolveNodeRecipe(spec, recipes, catalogRoles).approval;
|
|
844
859
|
if (approved && i >= from) throw new Error('cannot restart across an approval decision');
|
|
845
860
|
if (approved && i < from) {
|
|
@@ -1363,7 +1378,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1363
1378
|
if (!resolved.command && !resolved.approval && candidate.recipe !== 'none') return 'unknown';
|
|
1364
1379
|
return { effect: resolved.approval ? 'unknown' : options.deps?.classifyGrowthRecipe?.(candidate, { command: resolved.command?.command }) ?? 'unknown',
|
|
1365
1380
|
command: resolved.command, approval: resolved.approval?.approval };
|
|
1366
|
-
}, { ...options.deps?.growthDecision, root });
|
|
1381
|
+
}, { ...options.deps?.growthDecision, root }, options.researchEdgeDecisionRegistry);
|
|
1367
1382
|
if (result.ok) {
|
|
1368
1383
|
graph = result.graph;
|
|
1369
1384
|
state.growth ??= [];
|