elanous 0.2.40 → 0.2.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4769.9fd582071301f382.js → 1063.2fb8a9dc55c731f2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
- package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{470.51a72a2348306455.js → 1262.e804feb8fd1acb8c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7219-15bdd9a80661af8e.js → 1455-530ca16c7e71baff.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1281.d81877e35b9068f4.js → 1487.2f67b79444062da6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
- package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
- package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
- package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{1350.59f40e39e02d91b1.js → 2456.b6de0e1c05f28843.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
- package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +115 -0
- package/apps/pwa/out/_next/static/chunks/{5436.fdf6fa8ae3e9588d.js → 2974.595d1e29d040cb6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5383.bdfa5d886e39a826.js → 3207.a756c95e9ec8c3c8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +93 -0
- package/apps/pwa/out/_next/static/chunks/{2177.df8547f9d7215c4e.js → 3347.f846266b5e5f3ede.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
- package/apps/pwa/out/_next/static/chunks/{9184.45afbf44fec87574.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
- package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{8099.1cccf31c1baa7e1c.js → 3741.9cf76acaa2ee5298.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4864a2ca.1c1c280a7772c5e5.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
- package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3330.7443183b7e6fdbdf.js → 4276.336d76d858fcdf1b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{3b355b3d.6f73c98bf6f9c749.js → 50061469.0326382241ef3b2d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +149 -0
- package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
- package/apps/pwa/out/_next/static/chunks/{8d173e38.18a2f7b4e1848bdb.js → 53c73f84.373b6160adfa89a4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1537-6bb97b5214928ea9.js → 5431-72a1dbde59400691.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
- package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{261.0d471e8aded799f3.js → 6131.348b7d6bdcd267ce.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{9175.2de5209a5ce6f68a.js → 6377.bc7df239edbff244.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2226.2cf61ec781827219.js → 6632.0eac1c554f8f2ef3.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
- package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
- package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b84cad00.594027ebe0531fe2.js → 73d2eb0e.4966ad55293c801a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{6257.c0037b8949239f5e.js → 7411.9b4b8b747dc7b802.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
- package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9189505a.980427ac048c8c60.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2566.beaffc3a5e1fcd2e.js → 8262.ddc03e06b733f184.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
- package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
- package/apps/pwa/out/_next/static/chunks/{8272-025653884f9645d2.js → 8546-6f03f8ea34dd61d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6051-0ae955eedb10adb9.js → 8673-bab689a55f7e13b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4351.0f37a6db2b34d50b.js → 9249.976f1e69a9d80754.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6749.0744ce6eb08d40e9.js → 9427.96aa912ddb5801e0.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7611.85f045bf232053ac.js → 9633.ce5bddc56784da72.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3746-f80a78f220bf37b5.js → 9656-374232558fd528d0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/{page-83d27757e2b8060a.js → page-0e3d7b9421b79dac.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-139d722de1dcd6c1.js → page-bf067887b3307423.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{409c787b.e48c5bec8ec10456.js → b450776b.3db34d8d965f82d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{ca3702f8.2913182e73889fa2.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
- package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
- 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 +23 -24
- 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 +22 -22
- 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 +23 -24
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -24
- 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/docs/goal-context/04-mock-scenarios.md +13 -0
- package/graphs/catalog/catalog.yaml +1 -1
- 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/heal/heal-loop.yaml +1 -0
- package/graphs/overlays/stop-heal-ladder.yaml +136 -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 +13 -10
- package/graphs/units/verbs/research.yaml +20 -0
- package/graphs/work/research-report.yaml +21 -3
- package/package.json +1 -1
- package/scripts/disk-steward.ts +46 -0
- package/scripts/fleet/node-setup.sh +50 -0
- package/scripts/graph-units/verbs/research.ts +55 -0
- package/scripts/heal/run-role.ts +99 -5
- package/scripts/land-global-checks.ts +6 -1
- package/scripts/lib/decompose-ab.ts +1 -0
- package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
- package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
- package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
- package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
- package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
- package/scripts/lib/tui-regress-checks.ts +33 -13
- package/scripts/llm-cost-ledger.ts +179 -8
- package/scripts/measure-nl-routing-corpus.ts +10 -2
- package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
- package/scripts/public-copy-lint.ts +163 -19
- package/scripts/ratchets/train-side-invariants.sh +0 -1
- package/scripts/release-loop/gate-autoheal.ts +117 -0
- package/scripts/release-loop/gate-baseline-receipt.ts +55 -10
- package/scripts/release-loop/gate-diff.ts +22 -3
- package/scripts/release-loop/gate-image-pin.ts +81 -0
- package/scripts/release-loop/gate-node-sim.ts +207 -0
- package/scripts/release-loop/gate-node.ts +489 -62
- package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
- package/scripts/release-loop/gate-radius-live.ts +97 -13
- package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
- package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
- package/scripts/release-loop/gate-train-receipts.ts +122 -0
- package/scripts/release-loop/gate-triage-node.ts +70 -10
- package/scripts/release-loop/resume-release.ts +330 -23
- package/scripts/release-loop/traffic-node.ts +6 -3
- package/scripts/release-loop/unattended-release.ts +4 -2
- package/scripts/shadow-authoring-probe.ts +20 -0
- package/scripts/ux-sim.ts +37 -3
- package/scripts/warm-pool-provider-config.ts +263 -0
- package/skills/omni-crawl/SKILL.md +5 -2
- package/skills/omni-crawl/scripts/main.ts +84 -23
- package/src/acp/core-turn-bridge.ts +99 -4
- package/src/agent/registry.ts +2 -0
- package/src/agent/task-notification.ts +25 -5
- package/src/agent/types.ts +6 -0
- package/src/agent-mission/mission-cli.ts +24 -0
- package/src/agent-mission/mission-out.ts +595 -0
- package/src/agent-mission/tool-install.ts +88 -2
- package/src/agent-substrate/context-strategy.ts +4 -4
- package/src/agent-substrate/self-review-cli.ts +267 -40
- package/src/auto-research/research-turn.ts +133 -51
- package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
- package/src/autopilot/pr-manager.ts +38 -7
- package/src/autopilot/pty-control-loop.ts +2 -0
- package/src/boot/daemon-tools/self-implement.ts +46 -9
- package/src/budget/shadow-arms.ts +52 -0
- package/src/capture/tui-self-report.ts +22 -6
- package/src/chat/index.ts +1 -1
- package/src/chat/pickers/state.ts +7 -1
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
- package/src/cli/log-event-names.ts +5 -0
- package/src/cli/mcp-login.ts +8 -18
- package/src/cli/msg-cli.ts +57 -1
- package/src/cli/pr-land-heavy-remote.ts +47 -9
- package/src/cli/pr-land-overlap-evidence.ts +100 -1
- package/src/cli/pr-land-pod-shadow-job.ts +60 -0
- package/src/cli/release-checklist-read-cli.ts +20 -10
- package/src/cli/release-cli.ts +27 -1
- package/src/cli/research-cli.ts +4 -5
- package/src/cli/sim-cli.ts +7 -1
- package/src/cli/tasks-cli.ts +12 -4
- package/src/codex/models.ts +30 -15
- package/src/compact/auto.ts +8 -1
- package/src/control-plane/ledger.ts +52 -2
- package/src/control-plane/server.ts +16 -2
- package/src/core-turn/run-core-turn.ts +313 -89
- package/src/core-turn/run-goal-loop.ts +106 -2
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/acp-boot.ts +72 -3
- package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
- package/src/dashboard/classic-sidetab-mission.ts +185 -0
- package/src/dashboard/index.ts +155 -15
- package/src/dashboard/input/agent-wake.ts +23 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
- package/src/dashboard/mission-cli-consumer.ts +153 -0
- package/src/dashboard/seat-boot-preamble.ts +171 -1
- package/src/dashboard/side-basic-runtime.ts +54 -1
- package/src/dashboard/sidetab-runtime.ts +90 -1
- package/src/dashboard/skill-catalog-preamble.ts +101 -0
- package/src/dashboard/skill-detection-runtime.ts +55 -15
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
- package/src/dashboard/turn-preamble.ts +65 -16
- package/src/dashboard/turn-prompt-runtime.ts +4 -2
- package/src/disk-steward/judge.ts +73 -0
- package/src/disk-steward/ledger.ts +122 -0
- package/src/disk-steward/steward.ts +373 -0
- package/src/domains/guardian-tick.ts +191 -2
- package/src/graph-runner/graph-cli.ts +44 -7
- package/src/graph-runner/graph-tick.ts +10 -2
- package/src/graph-runner/in-process-registry.ts +37 -0
- package/src/graph-runner/runner.ts +34 -4
- package/src/grok/agent-search.ts +14 -4
- package/src/grok/credential.ts +28 -11
- package/src/grounding/ref-index.ts +19 -0
- package/src/grounding/sources-cli.ts +9 -1
- package/src/harness/harness-cli-command.ts +267 -14
- package/src/harness/harness-incidents.ts +312 -7
- package/src/harness/harness-pod-dispatch.ts +81 -15
- package/src/harness/harness-space.ts +15 -1
- package/src/harness/harness-stop.ts +155 -11
- package/src/harness/progress-worker-entry.ts +59 -0
- package/src/harness/progress-worker-runtime.ts +11 -0
- package/src/index.ts +52 -7
- package/src/instance/dev-project.ts +25 -0
- package/src/instance/spawn-elanous.ts +6 -4
- package/src/intelligence-map/model-alias.ts +6 -5
- package/src/intelligence-map/model-catalog.ts +59 -2
- package/src/llm/model-defaults.ts +4 -4
- package/src/llm.ts +208 -19
- package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
- package/src/loops/orchestrator/tick.ts +61 -0
- package/src/maturity/feature-maturity.ts +1 -1
- 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/native-tool-catalog.ts +2 -2
- package/src/nexus/api/harness-traversal.ts +11 -0
- package/src/output-truncation.ts +41 -12
- package/src/pr-tool/census.ts +3 -2
- package/src/project/project-store.ts +48 -1
- package/src/pty-shell/tui-run-state.ts +188 -2
- package/src/release-loop/checklist-target-path-hint.ts +13 -0
- package/src/release-loop/checklist.ts +9 -1
- package/src/release-loop/gate-host-reservation.ts +144 -0
- package/src/release-loop/release-schedule.ts +90 -1
- package/src/repl/index.ts +43 -2
- package/src/research/axis-fanout.ts +121 -16
- package/src/research/bloom-exemplars.ts +137 -0
- package/src/research/gap-followup.ts +13 -1
- package/src/research/plugin-discovery.ts +36 -14
- package/src/research-bridge/invoke.ts +22 -5
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +39 -25
- package/src/self-dev/decompose.ts +119 -5
- package/src/self-dev/dev-cli.ts +17 -17
- package/src/self-dev/graph-front-nodes.ts +23 -0
- package/src/self-dev/launch-preflight-text.ts +5 -6
- package/src/self-dev/launch-preflight.ts +9 -4
- package/src/self-dev/orchestrate.ts +27 -2
- package/src/self-dev/review-provider-fallback.ts +9 -2
- package/src/self-dev/run-supervisor.ts +226 -6
- package/src/self-dev/run-types.ts +7 -0
- package/src/self-implement/doctor-visit.ts +88 -0
- package/src/self-implement/gate-artifacts.ts +13 -0
- package/src/self-implement/gate-cli.ts +54 -24
- package/src/self-implement/gate-remote.ts +23 -5
- package/src/self-implement/goal-author-clarification.ts +31 -12
- package/src/self-implement/goal-author.ts +403 -8
- package/src/self-implement/graph-overlay-yaml.ts +7 -0
- 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/headless-elanous-driver.ts +31 -2
- package/src/self-implement/heal-intake.ts +112 -4
- package/src/self-implement/heal-triage.ts +20 -0
- package/src/self-implement/host-regate.ts +31 -8
- package/src/self-implement/knowhow-pack.ts +38 -0
- package/src/self-implement/merge-train.ts +5 -0
- package/src/self-implement/orchestrator.ts +359 -30
- package/src/self-implement/regate-detail.ts +38 -1
- package/src/self-implement/rework-child-provider.ts +25 -0
- package/src/self-implement/run-chart.ts +119 -0
- package/src/self-implement/run-ledger.ts +176 -17
- package/src/self-implement/run-stop.ts +208 -5
- package/src/self-implement/running-runs.ts +35 -12
- package/src/self-implement/self-implement-cli.ts +36 -4
- package/src/self-implement/stop-autoheal-operational.ts +43 -0
- package/src/self-implement/stop-autoheal.ts +28 -6
- package/src/session/chat.ts +69 -58
- package/src/session/request-size-guard.ts +123 -0
- package/src/session-runtime/index.ts +98 -4
- package/src/session-runtime/tier-flip.ts +3 -3
- package/src/sidetab-core/model.ts +150 -0
- package/src/sidetab-core/visible-agent-mission.ts +186 -0
- package/src/skills/name-match.ts +20 -0
- package/src/skills/tools/agent.ts +30 -2
- package/src/skills/tools/omni-search.ts +67 -5
- package/src/task-agent/parent-host.ts +14 -1
- package/src/task-agent/pod-distributor-entry.ts +3 -0
- package/src/task-agent/task-hand.ts +31 -1
- package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +43 -0
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
- package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +163 -13
- package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +280 -60
- package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
- package/src/tokens.ts +35 -2
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
- package/src/tool-runtime/skill-exec-runtime.ts +33 -13
- package/src/tool-runtime/types.ts +1 -0
- package/src/tui/entry.ts +24 -7
- package/src/tui/sidetab/attach.ts +47 -0
- package/src/tui/sidetab/list.ts +45 -0
- package/src/tui/sidetab/nl-tool.ts +2 -136
- package/src/tui/sidetab/peek.ts +52 -0
- package/src/tui-client/dashboard-session.ts +3 -0
- package/src/tui-client/local-chat-turn.ts +26 -13
- package/src/tui.ts +22 -0
- package/src/user-config.ts +11 -5
- package/src/ux-sim/fake-kubectl.ts +37 -3
- 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/fault-pool-cap.ts +11 -6
- package/src/ux-sim/mock-scenario-catalog.json +41 -0
- package/src/ux-sim/mock-scenario-catalog.ts +156 -0
- package/src/ux-sim/release-sim-rig.ts +262 -0
- package/src/ux-sim/scenario.ts +116 -23
- package/src/ux-sim/seminar-rehearsal.ts +109 -0
- package/src/ux-sim/subagent-tools-device.ts +2 -2
- package/src/version/packed-revision.json +1 -1
- package/src/voice/voice-tts-singleton.ts +18 -3
- package/src/web-search/grok.ts +5 -9
- package/apps/pwa/out/_next/static/chunks/1060.014f1f01a17aec26.js +0 -115
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +0 -286
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +0 -90
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +0 -2
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066.a77257c8c350770a.js +0 -23
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2522.f2766b76d22c8bdf.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +0 -1
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +0 -24
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +0 -77
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +0 -36
- package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +0 -287
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +0 -1
- package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +0 -94
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +0 -148
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +0 -93
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8357.1aaa713b052a78b1.js +0 -309
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +0 -79
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +0 -1
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/d8de0de2-dd0f4ac8e5ab1832.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +0 -1
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
- package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
- /package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COORD-ENTRANCE-FOLD · 0.2.42 칸 · TASK-AGENT(OP 디스패처) — 셸 디스패처 은퇴 결정 카드.
|
|
3
|
+
*
|
|
4
|
+
* 배경: 대표 10-19 «중간층(런 닥터 r3·rework · 입구 디스패처)이 0.2.35 최우선 병목» ·
|
|
5
|
+
* seat-state/OP/PLAN-mid-tier-loops-2026-10-19.md §5.
|
|
6
|
+
*
|
|
7
|
+
* 판정 신호: 조율자 그림자가 ④ 빌더로 같은 칸·같은 지시서를 달력 기준 3일 연속
|
|
8
|
+
* 디스패치하면 «셸 디스패처 은퇴» 결정 카드를 기존 결정 원장(src/decisions/decision-ledger.ts,
|
|
9
|
+
* `decisions/decisions.jsonl`) 부가 형식 그대로 정확히 1장 올린다.
|
|
10
|
+
*
|
|
11
|
+
* 그림자 디스패치 원장(<root>/seat-state/OP/coordinator-shadow-dispatch.jsonl)은
|
|
12
|
+
* 조율자 그림자 디스패처가 한 줄씩 적는 JSONL 이다:
|
|
13
|
+
* {"date":"2026-03-02","agent":"builder-4","cell":"src/x/y.ts","directive":"DIR-123"}
|
|
14
|
+
* (별칭 허용: date=day · agent=target · cell=lane · directive=directiveId)
|
|
15
|
+
*/
|
|
16
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
import { DecisionLedger } from '../../decisions/decision-ledger.js';
|
|
19
|
+
import { withFileLockSync } from '../../storage/file-lock.js';
|
|
20
|
+
import { findGitDir } from '../../git-fs/locate.js';
|
|
21
|
+
|
|
22
|
+
export interface CoordinatorShadowDispatch {
|
|
23
|
+
/** 달력 날짜(YYYY-MM-DD, 생산 기록은 UTC ISO 날짜). */
|
|
24
|
+
date: string;
|
|
25
|
+
/** 대상 에이전트(예: builder-4). */
|
|
26
|
+
agent: string;
|
|
27
|
+
/** 작업을 받은 과제 소유 seat (`tasks hand --seat`). */
|
|
28
|
+
recipient?: string;
|
|
29
|
+
/** 칸(대상 경로). */
|
|
30
|
+
cell: string;
|
|
31
|
+
/** 지시서 id. */
|
|
32
|
+
directive: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface CoordinatorShadowStreak {
|
|
36
|
+
agent: string;
|
|
37
|
+
recipient?: string;
|
|
38
|
+
cell: string;
|
|
39
|
+
directive: string;
|
|
40
|
+
/** 연속을 이룬 세 달력 날짜(직전2일·오늘, 오름차순). */
|
|
41
|
+
dates: [string, string, string];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface CoordinatorShadowTickOptions {
|
|
45
|
+
/** 저장소/worktree 루트 — 그림자 디스패치 원장 기준 경로. 생산 기본: cwd 트리. */
|
|
46
|
+
root?: string;
|
|
47
|
+
/** 결정 원장 stateDir. 생산 기본: elanousStateRoot(). */
|
|
48
|
+
stateDir?: string;
|
|
49
|
+
/** 시계 주입(생산: 실제 Date). */
|
|
50
|
+
now?: () => Date;
|
|
51
|
+
/** 원장 행 직접 주입(시험용 — 생산 호출 경로는 그대로 지나간다). */
|
|
52
|
+
dispatches?: CoordinatorShadowDispatch[];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface CoordinatorShadowTickResult {
|
|
56
|
+
/** 판정 기준일(YYYY-MM-DD). */
|
|
57
|
+
checked: string;
|
|
58
|
+
evidence: CoordinatorShadowStreak | null;
|
|
59
|
+
/** 올라간(또는 이미 있던) 결정 카드 id. */
|
|
60
|
+
cardId?: string;
|
|
61
|
+
/** 같은 스탬프(칸+지시서+마지막 날) 카드가 이미 있어 1장만 유지됐을 때. */
|
|
62
|
+
skipped?: 'duplicate';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** 그림자 디스패치 원장 생산 기본 경로. */
|
|
66
|
+
export function coordinatorShadowJournalPath(root: string): string {
|
|
67
|
+
return join(root, 'seat-state', 'OP', 'coordinator-shadow-dispatch.jsonl');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Resolve the containing checkout when the CLI was started from a repository subdirectory. */
|
|
71
|
+
export function resolveCoordinatorShadowRoot(cwd = process.cwd()): string {
|
|
72
|
+
return findGitDir(cwd)?.root ?? cwd;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** launcher가 work-order를 받아들인 뒤 그림자 근거만 덧붙인다. 발사 결정·인자는 읽거나 바꾸지 않는다. */
|
|
76
|
+
export function recordCoordinatorShadowDispatch(
|
|
77
|
+
root: string,
|
|
78
|
+
row: CoordinatorShadowDispatch,
|
|
79
|
+
): void {
|
|
80
|
+
const path = coordinatorShadowJournalPath(root);
|
|
81
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
82
|
+
withFileLockSync(`${path}.lock`, () => appendFileSync(path, `${JSON.stringify(row)}\n`));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** ④ 빌더 판별 — «빌더④» «④빌더» «builder-4» «builder_4» «builder 4» «b4» 계열을 받는다. */
|
|
86
|
+
function fourthBuilderAgentKey(agent: string): string | null {
|
|
87
|
+
const key = agent.normalize('NFC').replace(/\s+/g, '').toLowerCase();
|
|
88
|
+
return /^(?:builder|b)[-_]?4$/.test(key) || /^④?빌더4$/.test(key) || key === '④빌더' || key === '빌더④'
|
|
89
|
+
? 'builder-4'
|
|
90
|
+
: null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function isFourthBuilderAgent(agent: string): boolean {
|
|
94
|
+
return fourthBuilderAgentKey(agent) !== null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function shiftDay(isoDay: string, delta: number): string {
|
|
98
|
+
const date = new Date(`${isoDay}T00:00:00Z`);
|
|
99
|
+
date.setUTCDate(date.getUTCDate() + delta);
|
|
100
|
+
return date.toISOString().slice(0, 10);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 조율자 그림자 디스패치 기록에서 오늘과 직전 2일치를 읽어,
|
|
107
|
+
* 대상이 ④ 빌더이고 칸·지시서가 같은 달력 기준 3일 연속인 모든 쌍을 반환한다.
|
|
108
|
+
* 연속 끊김(칸·지시서·대상이 다르거나 하루 무디스패치)이면 해당 streak 는 성립하지 않는다.
|
|
109
|
+
*/
|
|
110
|
+
export function detectBuilderThreeDayStreak(
|
|
111
|
+
dispatches: readonly CoordinatorShadowDispatch[],
|
|
112
|
+
today: string,
|
|
113
|
+
): CoordinatorShadowStreak | null {
|
|
114
|
+
return detectBuilderThreeDayStreaks(dispatches, today)[0] ?? null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** 오늘의 3일 창에서 모든 적격 (agent, cell, directive) 쌍을 돌려 각 쌍의 카드를 독립 판정한다. */
|
|
118
|
+
export function detectBuilderThreeDayStreaks(
|
|
119
|
+
dispatches: readonly CoordinatorShadowDispatch[],
|
|
120
|
+
today: string,
|
|
121
|
+
): CoordinatorShadowStreak[] {
|
|
122
|
+
if (!DAY_PATTERN.test(today)) throw new Error(`calendar day required: ${today}`);
|
|
123
|
+
const window: [string, string, string] = [shiftDay(today, -2), shiftDay(today, -1), today];
|
|
124
|
+
const groups = new Map<string, { agent: string; recipient?: string; recipientDate?: string; cell: string; directive: string; days: Set<string> }>();
|
|
125
|
+
for (const row of dispatches) {
|
|
126
|
+
if (!row || typeof row.date !== 'string' || !DAY_PATTERN.test(row.date)) continue;
|
|
127
|
+
const builderKey = fourthBuilderAgentKey(String(row.agent ?? ''));
|
|
128
|
+
if (!builderKey) continue;
|
|
129
|
+
const recipient = typeof row.recipient === 'string' ? row.recipient : undefined;
|
|
130
|
+
const cell = String(row.cell ?? '');
|
|
131
|
+
const directive = String(row.directive ?? '');
|
|
132
|
+
if (!cell || !directive) continue;
|
|
133
|
+
const key = `${builderKey}\u0000${cell}\u0000${directive}`;
|
|
134
|
+
const group = groups.get(key) ?? { agent: row.agent, cell, directive, days: new Set<string>() };
|
|
135
|
+
if (recipient && window.includes(row.date as typeof window[number])
|
|
136
|
+
&& (!group.recipientDate || row.date >= group.recipientDate)) {
|
|
137
|
+
group.recipient = recipient;
|
|
138
|
+
group.recipientDate = row.date;
|
|
139
|
+
}
|
|
140
|
+
group.days.add(row.date);
|
|
141
|
+
groups.set(key, group);
|
|
142
|
+
}
|
|
143
|
+
const keys = [...groups.keys()].sort();
|
|
144
|
+
return keys.flatMap(key => {
|
|
145
|
+
const group = groups.get(key)!;
|
|
146
|
+
return window.every(day => group.days.has(day))
|
|
147
|
+
? [{ agent: group.agent, ...(group.recipient ? { recipient: group.recipient } : {}), cell: group.cell, directive: group.directive, dates: [...window] as [string, string, string] }]
|
|
148
|
+
: [];
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function readDispatchJournal(path: string): CoordinatorShadowDispatch[] {
|
|
153
|
+
if (!existsSync(path)) return [];
|
|
154
|
+
const rows: CoordinatorShadowDispatch[] = [];
|
|
155
|
+
for (const line of readFileSync(path, 'utf8').split('\n')) {
|
|
156
|
+
if (!line.trim()) continue;
|
|
157
|
+
let raw: Record<string, unknown>;
|
|
158
|
+
try { raw = JSON.parse(line) as Record<string, unknown>; } catch { continue; }
|
|
159
|
+
// JSON.parse 가 성공하는 비객체 행(`null`·스칼라 등)도 파손 행이다 — 판독에서 건너뛴다.
|
|
160
|
+
if (typeof raw !== 'object' || raw === null) continue;
|
|
161
|
+
const date = raw.day ?? raw.date;
|
|
162
|
+
const agent = raw.target ?? raw.agent;
|
|
163
|
+
const recipient = raw.recipient ?? raw.seat;
|
|
164
|
+
const cell = raw.lane ?? raw.cell;
|
|
165
|
+
const directive = raw.directiveId ?? raw.directive;
|
|
166
|
+
if (typeof date === 'string' && typeof agent === 'string' && typeof cell === 'string' && typeof directive === 'string') {
|
|
167
|
+
rows.push({ date, agent, ...(typeof recipient === 'string' ? { recipient } : {}), cell, directive });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return rows;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** «셸 디스패처 은퇴» 결정 카드의 영구 idempotency ref(같은 칸+지시서에는 한 장만). */
|
|
174
|
+
export function retirementCardStamp(evidence: CoordinatorShadowStreak): string {
|
|
175
|
+
return `coordinator-shadow-streak:${evidence.cell}:${evidence.directive}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* 조율자 루프의 하루 틱 — 그림자 디스패치 3일 연속 판정 → 셸 디스패처 은퇴 결정 카드 1장.
|
|
180
|
+
* 카드는 기존 결정 원장(DecisionLedger.raise) 부가 형식 그대로 append 되고,
|
|
181
|
+
* 같은 3일 창에서 성립한 모든 칸+지시서 쌍을 각자 판정하고, 카드가 이미 있으면 재사용한다.
|
|
182
|
+
* (날짜가 바뀌어도 쌍마다 1장 유지).
|
|
183
|
+
*/
|
|
184
|
+
export async function tick(options: CoordinatorShadowTickOptions = {}): Promise<CoordinatorShadowTickResult> {
|
|
185
|
+
const root = resolveCoordinatorShadowRoot(options.root ?? process.cwd());
|
|
186
|
+
const now = options.now ?? (() => new Date());
|
|
187
|
+
const dispatches = options.dispatches ?? readDispatchJournal(coordinatorShadowJournalPath(root));
|
|
188
|
+
const today = now().toISOString().slice(0, 10);
|
|
189
|
+
const evidences = detectBuilderThreeDayStreaks(dispatches, today);
|
|
190
|
+
const evidence = evidences[0] ?? null;
|
|
191
|
+
if (!evidence) return { checked: today, evidence: null };
|
|
192
|
+
|
|
193
|
+
const ledger = new DecisionLedger({ ...(options.stateDir ? { stateDir: options.stateDir } : {}), now, repoRoot: root });
|
|
194
|
+
const outcomes = evidences.map(item => {
|
|
195
|
+
const stamp = retirementCardStamp(item);
|
|
196
|
+
const alreadyRaised = ledger.list({ status: 'all' }).some(entry =>
|
|
197
|
+
Array.isArray(entry.refs) && entry.refs.includes(stamp));
|
|
198
|
+
const entry = ledger.raiseOnce({
|
|
199
|
+
title: `셸 디스패처 은퇴 — ${item.cell} × ${item.directive} 3일 연속`,
|
|
200
|
+
category: 'other',
|
|
201
|
+
scqa: {
|
|
202
|
+
s: '조율자 그림자가 ④ 빌더로 같은 칸·같은 지시서를 달력 기준 3일 연속 디스패치했다.',
|
|
203
|
+
c: '중간층 입구 디스패처가 같은 지시를 반복 산출하는 0.2.35 최우선 병목 신호가 실측됐다.',
|
|
204
|
+
q: '셸 디스패처를 은퇴시키고 입구를 조율자 그림자로 고정할까?',
|
|
205
|
+
a: '셸 디스패처 은퇴 결정 카드를 원장에 올리고 후속 조치를 연다.',
|
|
206
|
+
},
|
|
207
|
+
options: [
|
|
208
|
+
{ key: 'a', label: '은퇴 승인', consequence: '입구 디스패처를 조율자 그림자로 고정하고 셸 디스패처를 은퇴시킨다' },
|
|
209
|
+
{ key: 'b', label: '관찰 연장', consequence: '은퇴를 보류하고 3일 연속 판정 관찰을 계속한다' },
|
|
210
|
+
],
|
|
211
|
+
recommendation: { option: 'a', why: '같은 칸·같은 지시서가 달력 기준 3일 연속 — 판정 신호 충족' },
|
|
212
|
+
raisedBy: { agent: 'orchestrator-tick', track: 'OP' },
|
|
213
|
+
refs: [
|
|
214
|
+
stamp,
|
|
215
|
+
`agent:${item.agent}`,
|
|
216
|
+
...(item.recipient ? [`recipient:${item.recipient}`] : []),
|
|
217
|
+
`cell:${item.cell}`,
|
|
218
|
+
`directive:${item.directive}`,
|
|
219
|
+
`dates:${item.dates.join(',')}`,
|
|
220
|
+
],
|
|
221
|
+
}, stamp);
|
|
222
|
+
return { evidence: item, cardId: entry.id, alreadyRaised };
|
|
223
|
+
});
|
|
224
|
+
return { checked: today, evidence, cardId: outcomes[0]!.cardId,
|
|
225
|
+
...(outcomes.every(outcome => outcome.alreadyRaised) ? { skipped: 'duplicate' as const } : {}) };
|
|
226
|
+
}
|
|
@@ -56,6 +56,8 @@ export interface TickState {
|
|
|
56
56
|
/** ORCH-TA-HAND — cells handed to TASK-AGENT this run (card id · mode · launched). */
|
|
57
57
|
handed?: Array<{ key: string; cell: string; cardId: string; mode: 'shadow' | 'live'; launched: boolean }>;
|
|
58
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 };
|
|
59
61
|
steps: Array<{ node: Node; reason: string; count: number; targetLoopId?: string }>;
|
|
60
62
|
nodes: Partial<Record<Node, 'ok' | 'skipped'>>;
|
|
61
63
|
missing: string[];
|
|
@@ -133,6 +135,47 @@ function handedKeys(path: string): Set<string> {
|
|
|
133
135
|
return keys;
|
|
134
136
|
}
|
|
135
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
|
+
|
|
136
179
|
export function kstWindow(now: Date): Window {
|
|
137
180
|
const hour = Number(new Intl.DateTimeFormat('en-US', { timeZone: 'Asia/Seoul', hour: '2-digit', hourCycle: 'h23' }).format(now));
|
|
138
181
|
return hour < 12 ? '08' : hour < 18 ? '12' : '18';
|
|
@@ -529,11 +572,16 @@ export async function runOrchestratorNode(node: Node, deps: TickDeps = {}): Prom
|
|
|
529
572
|
...(deps.coordinatorKnowhow === undefined ? {} : { knowhow: deps.coordinatorKnowhow }),
|
|
530
573
|
...(deps.coordinatorContext ? { context: deps.coordinatorContext } : {}) });
|
|
531
574
|
}))();
|
|
575
|
+
// 생산 tick 경로의 실행 원문: 배수 결과를 이벤트로만 남기지 않고 run 상태에 누적해 다른 프로세스(보호자·리뷰)가 파일로 관측하게 한다.
|
|
576
|
+
state.inbox = { replied: (state.inbox?.replied ?? 0) + inbox.replied, acknowledged: (state.inbox?.acknowledged ?? 0) + inbox.acknowledged };
|
|
532
577
|
if (inbox.replied || inbox.acknowledged) {
|
|
533
578
|
observe('exchange', 'coordinator-inbox-replied', inbox.replied);
|
|
534
579
|
observe('exchange', 'coordinator-inbox-acknowledged', inbox.acknowledged);
|
|
535
580
|
}
|
|
536
581
|
}
|
|
582
|
+
// COORD-ONE 조각 1 — tick 진입에서 coordinator shadow 가 TASK-AGENT 판정 1건을 소비한다: 소비 원장 기록이 전부고
|
|
583
|
+
// live 부수효과(운영 발사·자리 루프 은퇴)는 0, seat-loop 기본 발사 경로는 그대로다(흡수·이관은 후속 조각).
|
|
584
|
+
if (mode !== 'off') consumeTaskAgentVerdict(root, runId, now);
|
|
537
585
|
if (mode !== 'off' && activeNode(node, window) && state.nodes[node] !== 'ok') {
|
|
538
586
|
if (node === 'intake') {
|
|
539
587
|
if (mode === 'live' && deps.cards) { state.cards = wishCards(deps.cards()); state.skippedCards = []; }
|
|
@@ -1014,6 +1062,13 @@ export async function degradationDeps(node: Node, deps: { config?: () => Partial
|
|
|
1014
1062
|
return mode === 'live' ? { degradation: () => ({ llm: signal.llm, board: signal.board }) } : {};
|
|
1015
1063
|
}
|
|
1016
1064
|
|
|
1065
|
+
// COORD-ENTRANCE-FOLD (0.2.42 칸 · TASK-AGENT OP 디스패처) — 조율자 루프 하루 틱 생산 진입이
|
|
1066
|
+
// tick() 을 호출하게 배선한다: 그림자 디스패치(날짜·대상 에이전트·칸·지시서 id)에서 ④ 빌더
|
|
1067
|
+
// 같은 칸·같은 지시서 달력 기준 3일 연속을 감지하면 «셸 디스패처 은퇴» 결정 카드를 기존 결정
|
|
1068
|
+
// 원장(DecisionLedger) 부가 형식 그대로 1장 적는다(같은 스탬프=칸+지시서 중복 방지).
|
|
1069
|
+
// 구현 본체: src/loops/orchestrator/coordinator-shadow.ts · 완료 경계 시험: tick.test.ts.
|
|
1070
|
+
import { tick as runCoordinatorShadowTick } from './coordinator-shadow.js';
|
|
1071
|
+
|
|
1017
1072
|
if (import.meta.main) {
|
|
1018
1073
|
const node = process.argv[2];
|
|
1019
1074
|
const index = process.argv.indexOf('--window');
|
|
@@ -1030,6 +1085,12 @@ if (import.meta.main) {
|
|
|
1030
1085
|
void (async () => {
|
|
1031
1086
|
try { await (await import('../../domains/standalone-log-sink.js')).registerStandaloneLogSink('orchestrator'); }
|
|
1032
1087
|
catch { /* local execution can still use the per-run file */ }
|
|
1088
|
+
// 관측(그림자 틱)은 본 루프를 봉쇄할 수 없다: 파손 원장 등으로 reject 하면 원인만 warn 로그로 남기고 본 노드 실행은 계속한다.
|
|
1089
|
+
try { await runCoordinatorShadowTick({}); }
|
|
1090
|
+
catch (error) {
|
|
1091
|
+
try { debug.log('loop.orchestrator', 'coordinator-shadow-tick-failed', { node, error: String(error).slice(0, 200) }, { level: 'warn' }); }
|
|
1092
|
+
catch { /* even the diagnostic sink must not block the node */ }
|
|
1093
|
+
}
|
|
1033
1094
|
await runOrchestratorNode(node as Node, { window: window as Window | undefined, ...await degradationDeps(node as Node) });
|
|
1034
1095
|
})().catch(error => { console.error(`orchestrator ${node}: ${String(error)}`); process.exitCode = 1; });
|
|
1035
1096
|
}
|
|
@@ -77,7 +77,7 @@ export const FEATURE_MATURITY = {
|
|
|
77
77
|
'provider:rotate': 'beta', 'provider:use': 'beta', 'status-bar': 'beta',
|
|
78
78
|
schedule: 'beta', guardian: 'beta', intake: 'beta', logs: 'stable', retro: 'beta', ad: 'beta', docs: 'beta',
|
|
79
79
|
decisions: 'beta', directives: 'beta', claims: 'beta', lesson: 'beta', fleet: 'beta', ops: 'stable', outputs: 'beta', publish: 'beta',
|
|
80
|
-
env: 'beta', 'agent-mission': 'beta', dev: 'beta', keys: 'beta', finance: 'beta',
|
|
80
|
+
env: 'beta', 'agent-mission': 'beta', mission: 'beta', dev: 'beta', keys: 'beta', finance: 'beta',
|
|
81
81
|
config: 'stable', tasks: 'stable', brief: 'beta', notify: 'beta', away: 'beta', labels: 'beta', msg: 'beta', ask: 'stable',
|
|
82
82
|
onboarding: 'beta', login: 'stable', session: 'beta', chat: 'stable', repl: 'stable',
|
|
83
83
|
agent: 'stable', registry: 'beta', tier: 'stable', local: 'beta', scheduler: 'beta',
|
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
|
+
}
|