elanous 0.2.35 → 0.2.37
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/{T1mBQqmkwKDLGtyisDCOd → 8kITumG9GAZ1LwT9POrAR}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{9952.5daf5f94063a2b3e.js → 1262.a89bb27a5b2f844e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1746.3563617ea64023a3.js +115 -0
- package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1dc5a567.9b092bfae3d7099b.js → 1ed5e8af.cf424815c7c0efad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.js → 2002-a43a3f380df873ec.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{13.02a07436dec15f89.js → 210.90b2cbd64926cf34.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9512.5a76207a730e0491.js → 2283.edd9627b7bdfb546.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{6866-79aa5b4e47cac6aa.js → 2318-450e75d07605b8fe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{938.66ad1ef0e5abae1c.js → 2375.bf364c85dbb6f085.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +148 -0
- package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +27 -0
- package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3199.6a1a9b0e6cd01dc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.js → 3578.4e9f9948a9a6f2f4.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +36 -0
- package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +90 -0
- package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +226 -0
- package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +287 -0
- package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2018.a741297bce759490.js → 4313.76f232c304a15bde.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1165.bad13fc9151a7288.js → 4324.c99ba3e83eb1b691.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3f7c4ee5.3dde54f01a816613.js → 4337e36d.f42c3b391b3d8f20.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.js → 4383.18e5c54db3a22c88.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8557-e7898769499cd56f.js → 4725-34bed25720cc326b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5483-dd5d7697f6bdb106.js → 4833-7934c592c5569f00.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{8444.4c26b379ca2b9596.js → 4931.95cc6dbd230774ca.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3408.21d1570602f4b6c0.js → 5046.7fd5cbd859299448.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +104 -0
- package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +1 -0
- package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/58edce7d.f1b0c72acf13b123.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.js → 5f6af561-f90b7a67f4f75d13.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +74 -0
- package/apps/pwa/out/_next/static/chunks/6252.240578f10952e091.js +34 -0
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.js → 6680.6a693c28aae4cd19.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.js → 6745-5a63492933959dd9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{6236.e18cced2d5ba6afb.js → 6819.be5c9c4d67f22922.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2833-0fe47af99ed13c29.js → 6971-fb5f9dc0a2cb5d2d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.js → 709a918c.4fd3b4e2a32cb4e3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +41 -0
- package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7424.c0fe2a595d4232b5.js +23 -0
- package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +1 -0
- package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7644.17e37ba6f1d4226e.js → 7867.e8725745ddd1d940.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{0368f25d-ad84af92fefee68f.js → 7c5ed21f-f286708e57cf88f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{359-2250789a2d3499e7.js → 8080-40d781e7704d3671.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +77 -0
- package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +1 -0
- package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +286 -0
- package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +79 -0
- package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b2f6ba4d.fb56fdbbf798df33.js → 8c58d09b.e8724a299658d86f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1530.0e612369b6fd7ea0.js → 9151.a2c51e93f9156dae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4441-875b97f5821ed58a.js → 9175-7d383df15a82e2be.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +94 -0
- package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +1 -0
- package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +64 -0
- package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-3337c6a1328c2674.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-47c5d4db587266bd.js → page-1e5da297557d2354.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-1f5a60f70cb4dd0c.js → page-88a1edbff62eaf1d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-bac7dee94e5eae4a.js → page-443364c9e4a23b31.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-dc0a532f5b9196ec.js → page-ac2c1e6169cfce57.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{d06f9160.a3d9062f95de8ad7.js → d9815f84.4918f682a45a8502.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.js → de8446d3.31b73eb239fecd7b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +1 -0
- package/apps/pwa/out/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- 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 +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/docs/goal-context/05-authoring-lessons.jsonl +47 -0
- package/docs/goal-context/README.md +3 -0
- package/graphs/default-loop.yaml +6 -1
- package/graphs/drafts/recipes.yaml +27 -7
- package/graphs/implement-loop.yaml +24 -0
- package/graphs/release/recipes.yaml +6 -0
- package/graphs/release/release-loop.yaml +17 -4
- package/graphs/wizard/recipes.yaml +44 -0
- package/graphs/wizard/wizard-loop.yaml +44 -0
- package/graphs/work/draft-close.yaml +54 -0
- package/graphs/work/green-close.yaml +37 -0
- package/graphs/work/recipes.yaml +46 -1
- package/graphs/work/research-report.yaml +2 -0
- package/graphs/work/run-research.yaml +35 -0
- package/package.json +1 -1
- package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
- package/scripts/boundary-proof-mapping-audit.ts +88 -0
- package/scripts/ci-typecheck-changed.ts +139 -5
- package/scripts/codex-fallback-live-probe.ts +17 -15
- package/scripts/coord-role-pack.ts +1 -1
- package/scripts/first10-gate.ts +416 -0
- package/scripts/fleet/node-setup.sh +32 -2
- package/scripts/fleet/run-light-worker.sh +9 -0
- package/scripts/fleet/wsl-node-setup.sh +432 -0
- package/scripts/gate-0226-failure-census.ts +507 -0
- package/scripts/goals/authoring-metrics.ts +258 -0
- package/scripts/graph-units/draft-close-node.ts +222 -0
- package/scripts/hook-order-sweep.ts +7 -4
- package/scripts/land-global-checks.ts +69 -1
- package/scripts/measure-nl-routing-corpus.ts +207 -2
- package/scripts/release-loop/docs-node.ts +344 -8
- package/scripts/release-loop/gate-closure.ts +48 -0
- package/scripts/release-loop/gate-diff.ts +2 -1
- package/scripts/release-loop/gate-node.ts +249 -53
- package/scripts/release-loop/known-issues-node.ts +6 -4
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/notes-repair.ts +216 -0
- package/scripts/release-loop/prepare-node.ts +61 -5
- package/scripts/release-loop/resume-cap.ts +14 -34
- package/scripts/release-loop/resume-release.ts +151 -15
- package/scripts/release-loop/resume-test-traffic.ts +10 -0
- package/scripts/release-loop/traffic-node.ts +59 -0
- package/scripts/release-loop/traffic-transition.ts +159 -0
- package/scripts/release-loop/version-node.ts +81 -12
- package/scripts/rhythm/daily.ts +137 -3
- package/scripts/train/green-leg.ts +176 -0
- package/scripts/tui-continue-real-evidence.ts +47 -0
- package/scripts/ux-sim.ts +53 -0
- package/skills/README.md +1 -0
- package/src/acp/client.ts +31 -5
- package/src/acp/core-turn-bridge.ts +54 -6
- package/src/acp/stderr-summary.ts +49 -0
- package/src/agent/delegate-hint.ts +16 -0
- package/src/agent/monad-agent-turn.ts +1 -0
- package/src/agent/runner.ts +82 -2
- package/src/agent/task-notification.ts +56 -10
- package/src/agent/terminal-surface.ts +217 -0
- package/src/agent/types.ts +4 -0
- package/src/agent-substrate/pr-reviewer.ts +64 -4
- package/src/agent-substrate/review-intent.ts +29 -2
- package/src/agent-substrate/review-observation.ts +3 -0
- package/src/agent-substrate/self-review-cli.ts +490 -26
- package/src/autopilot/lineage/sources.ts +1 -1
- package/src/autopilot/mission-codebase-gate.ts +141 -12
- package/src/autopilot/pr-manager.ts +89 -18
- package/src/boot/daemon-runtime.ts +35 -3
- package/src/boot/daemon-tools/pty-shell.ts +2 -1
- package/src/boot/daemon-tools/self-implement.ts +1 -0
- package/src/budget/run-usage-rollup.ts +12 -7
- package/src/budget/unified-usage.ts +20 -0
- package/src/budget/usage-outcomes.ts +8 -4
- package/src/capture/tui-self-report.ts +132 -1
- package/src/chat/goal-continue-verdict.ts +41 -0
- package/src/chat/index.ts +30 -4
- package/src/chat/internal-turn-origin.ts +1 -0
- package/src/chat/paste-fold.ts +86 -0
- package/src/chat/tool-render/block.ts +32 -0
- package/src/chat/tool-render/dispatch.ts +2 -20
- package/src/chat/tool-render/result-text.ts +98 -0
- package/src/chat/turn-typeahead.ts +70 -7
- package/src/cli/autopilot-cli.ts +24 -9
- package/src/cli/config-audit.ts +119 -0
- package/src/cli/decisions-cli.ts +7 -4
- package/src/cli/doctor-cli.ts +137 -6
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/herdr-cli.ts +34 -0
- package/src/cli/light-entry-route.ts +6 -3
- package/src/cli/log-event-names.ts +2 -0
- package/src/cli/logs-cli.ts +357 -2
- package/src/cli/make-cli.ts +247 -11
- package/src/cli/memory-cli.ts +30 -1
- package/src/cli/msg-cli.ts +132 -14
- package/src/cli/pr-cli.ts +29 -16
- package/src/cli/pr-granularity.ts +5 -3
- package/src/cli/pr-land-base-read.ts +11 -2
- package/src/cli/pr-land-heavy-remote.ts +6 -3
- package/src/cli/pr-land-overlap-evidence.ts +23 -4
- package/src/cli/pr-land-recovery.ts +117 -1
- package/src/cli/pty-takeover-cli.ts +8 -7
- package/src/cli/release-checklist-read-cli.ts +109 -4
- package/src/cli/release-cli.ts +64 -15
- package/src/cli/release-single-flight.ts +1 -1
- package/src/cli/self-update.ts +23 -5
- package/src/cli/self-utterances-cli.ts +13 -16
- package/src/cli/tasks-card-show.ts +162 -0
- package/src/cli/tasks-cli.ts +868 -352
- package/src/cli/tasks-read-cli.ts +197 -0
- package/src/cli/usage-cli.ts +12 -10
- package/src/context-bus/claude-memory-import.ts +99 -0
- package/src/context-bus/long-term-memory.ts +125 -0
- package/src/core-turn/run-core-turn.ts +4 -2
- package/src/core-turn/run-goal-loop.ts +76 -16
- package/src/core-turn/types.ts +8 -1
- package/src/dashboard/chat/acp-chat.ts +9 -0
- package/src/dashboard/context/keys.ts +8 -31
- package/src/dashboard/index.ts +299 -62
- package/src/dashboard/input/agent-wake.ts +50 -1
- package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
- package/src/dashboard/input/chat-main-slash-command.ts +4 -2
- package/src/dashboard/input/goal-continue.ts +210 -0
- package/src/dashboard/input/goal-interim.ts +2 -0
- package/src/dashboard/input/internal-turn.ts +2 -8
- package/src/dashboard/input/seat-autowake.ts +9 -7
- package/src/dashboard/input/turn-autoheal.ts +52 -0
- package/src/dashboard/replay-preview.ts +25 -0
- package/src/dashboard/seat-boot-preamble.ts +132 -5
- package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -10
- package/src/dashboard/slash-runtime/model-choices.ts +15 -0
- package/src/dashboard/stale-install-check.ts +3 -99
- package/src/dashboard/synchronized-frame-output.ts +74 -0
- package/src/debug/batch-queue.ts +119 -0
- package/src/debug/tui-log-tag.ts +67 -0
- package/src/display/agent-surface.ts +7 -0
- package/src/display/coordinator.ts +45 -12
- package/src/display/resize-listener.ts +41 -20
- package/src/display/synchronized-output-region.ts +60 -0
- package/src/domains/standalone-log-sink.ts +15 -2
- package/src/domains/surface-events.ts +80 -1
- package/src/esc-abort-gate.ts +69 -0
- package/src/exec-requests/planner.ts +37 -2
- package/src/execution-loop/launch-gate.ts +4 -3
- package/src/git-fs/cli-stderr.ts +45 -0
- package/src/git-fs/gh-cli.ts +6 -3
- package/src/git-fs/git-cli.ts +11 -5
- package/src/git-fs/worktree.ts +95 -1
- package/src/graph-runner/graph-cli.ts +44 -2
- package/src/graph-runner/graph-run-api.ts +3 -2
- package/src/graph-runner/runner.ts +37 -16
- package/src/graph-wizard/generate.ts +131 -4
- package/src/graph-wizard/steps.ts +15 -0
- package/src/grounding/proactive-ground.ts +86 -0
- package/src/harness/control-inbox.ts +49 -1
- package/src/harness/harness-cli-command.ts +230 -40
- package/src/harness/harness-incidents.ts +52 -1
- package/src/harness/pod-control-send.ts +33 -5
- package/src/harness/review-adapter.ts +26 -6
- package/src/harness/self-send-remote.ts +69 -0
- package/src/harness/self-send-routing-guard.ts +6 -0
- package/src/harness/self-send-target.ts +4 -3
- package/src/index.ts +443 -25
- package/src/input-core/context-key-runtime.ts +21 -0
- package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
- package/src/light-cli.ts +6 -1
- package/src/llm/route-decision.ts +13 -0
- package/src/llm-tool-name.ts +37 -0
- package/src/llm-tool-schema.ts +35 -0
- package/src/llm-wellformed.ts +70 -0
- package/src/llm.ts +158 -15
- package/src/loops/checker.ts +100 -0
- package/src/loops/consensus.ts +26 -2
- package/src/loops/loop-cli.ts +9 -4
- package/src/loops/msg-wake.ts +35 -39
- package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
- package/src/loops/orchestrator/inbox.ts +59 -11
- package/src/loops/orchestrator/knowhow-pack.ts +364 -0
- package/src/loops/orchestrator/tick.ts +54 -5
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/model-tier/llm-tier-map.ts +12 -17
- package/src/models/prompts.ts +17 -2
- package/src/msg/msg-post-office.ts +116 -0
- package/src/msg/msg-store.ts +17 -0
- package/src/mss/logging/log-store.ts +79 -22
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/decisions-route.ts +38 -18
- package/src/nexus/api/graph-wizard-api.ts +46 -3
- package/src/nexus/api/grid.ts +24 -4
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/ops-api.ts +14 -6
- package/src/nexus/boot/register-mcp-clients.ts +263 -38
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
- package/src/nexus/state/state.ts +7 -1
- package/src/oauth/codex-account-store.ts +34 -1
- package/src/onboarding/first-run.ts +37 -6
- package/src/onboarding/web-first.ts +43 -11
- package/src/ops/loops-map.ts +46 -0
- package/src/ops/overview-cache.ts +22 -4
- package/src/ops/overview-collect.ts +12 -6
- package/src/ops/overview.ts +44 -8
- package/src/persona/loader.ts +11 -0
- package/src/persona/types.ts +8 -0
- package/src/policy/llm-policy.ts +3 -1
- package/src/prompt-enhance/enhance.ts +4 -4
- package/src/prompt-library/session-guidance.ts +14 -0
- package/src/provider-summary.ts +8 -0
- package/src/pty-shell/availability.ts +7 -0
- package/src/pty-shell/herdr-agent-report.ts +155 -37
- package/src/pty-shell/herdr-prompt.ts +266 -0
- package/src/pty-shell/herdr-prune-stale.ts +17 -0
- package/src/pty-shell/herdr-sequence-lease.ts +60 -0
- package/src/pty-shell/pty-control-ipc.ts +327 -15
- package/src/pty-shell/pty-special-keys.ts +42 -2
- package/src/pty-shell/registry.ts +25 -15
- package/src/pty-shell/stale-install-check.ts +99 -0
- package/src/pty-shell/tui-run-state.ts +249 -3
- package/src/release-loop/auto-start.ts +20 -2
- package/src/release-loop/checklist.ts +126 -9
- package/src/release-loop/feature-store.ts +9 -9
- package/src/release-loop/landed-but-yellow.ts +93 -12
- package/src/release-loop/rehearsal.ts +36 -20
- package/src/repl/index.ts +27 -1
- package/src/seat-loop/knowhow-lint.ts +1 -1
- package/src/seat-loop/seat-report.ts +1 -0
- package/src/self-dev/ask-launch-flow.ts +86 -10
- package/src/self-dev/decompose-proposal.ts +183 -20
- package/src/self-dev/decompose.ts +61 -0
- package/src/self-dev/dev-cli.ts +37 -3
- package/src/self-dev/dev-pipeline.ts +37 -9
- package/src/self-dev/draft-sweep.ts +241 -16
- package/src/self-dev/draft-triage-rules.ts +50 -5
- package/src/self-dev/glm-credential-guard.ts +77 -0
- package/src/self-dev/graph-journey-nodes.ts +1 -0
- package/src/self-dev/graph-journey-route.ts +12 -2
- package/src/self-dev/orchestrate-cli.ts +68 -3
- package/src/self-dev/orchestrate.ts +116 -17
- package/src/self-dev/review-provider-fallback.ts +45 -7
- package/src/self-dev/run-supervisor.ts +55 -2
- package/src/self-dev/run-types.ts +1 -1
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-run.ts +50 -3
- package/src/self-health/autoheal.ts +153 -0
- package/src/self-health/signatures.ts +6 -0
- package/src/self-implement/device-first.ts +116 -0
- package/src/self-implement/doctor-visit.ts +322 -1
- package/src/self-implement/evidence-command-budget.ts +80 -0
- package/src/self-implement/gate-artifacts.ts +6 -2
- package/src/self-implement/gate-baseline.ts +64 -1
- package/src/self-implement/gate-cli.ts +93 -9
- package/src/self-implement/gate-remote.ts +28 -4
- package/src/self-implement/gate-scope.ts +13 -1
- package/src/self-implement/goal-author-cli.ts +1 -0
- package/src/self-implement/goal-author-decompose.ts +265 -4
- package/src/self-implement/goal-author.ts +366 -26
- package/src/self-implement/goal-elaborate.ts +176 -22
- package/src/self-implement/goal-refine.ts +3 -0
- package/src/self-implement/goal-supervisor-fill.ts +75 -26
- package/src/self-implement/graph-variant.ts +40 -6
- package/src/self-implement/headless-elanous-driver.ts +19 -3
- package/src/self-implement/importer-test-index.ts +215 -2
- package/src/self-implement/knowhow-pack.ts +5 -5
- package/src/self-implement/off-diff-evidence.ts +58 -6
- package/src/self-implement/orchestrator.ts +536 -42
- package/src/self-implement/pod-warm-pool-profile.ts +1 -0
- package/src/self-implement/pwa-import-graph.ts +1 -1
- package/src/self-implement/review-round-brief.ts +300 -0
- package/src/self-implement/rework-policy.ts +44 -0
- package/src/self-implement/run-ledger.ts +278 -6
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/run-ttl.ts +38 -24
- package/src/self-implement/running-runs.ts +17 -3
- package/src/self-implement/scope-adjacency.ts +3 -1
- package/src/self-implement/seams.ts +72 -10
- package/src/self-implement/stop-autoheal.ts +1 -0
- package/src/self-implement/test-seams.ts +13 -1
- package/src/self-implement/train-reach-grouping.ts +8 -2
- package/src/self-implement/wiring-check.ts +358 -0
- package/src/session/chat.ts +7 -1
- package/src/session/id-prefix.ts +60 -0
- package/src/session/index.ts +4 -0
- package/src/session-runtime/index.ts +9 -1
- package/src/shell-env-bootstrap.ts +11 -4
- package/src/skills/runner.ts +4 -2
- package/src/skills/tools/agent.ts +290 -48
- package/src/skills/tools/pty.ts +5 -0
- package/src/skills/tools/schedule-wakeup.ts +23 -4
- package/src/skills/tools/shell.ts +61 -6
- package/src/skills/tools/terminal-modal-inject.ts +1 -2
- package/src/skills/tools/terminal-modal.ts +10 -8
- package/src/skills/url-router.ts +41 -1
- package/src/smart-wizard/run.ts +66 -0
- package/src/status/bar.ts +34 -6
- package/src/status/metrics.ts +12 -1
- package/src/status/status-provider-info.ts +37 -6
- package/src/steward/rejudge-tick.ts +22 -7
- package/src/steward/resync-tick.ts +31 -4
- package/src/steward/ta-repair-event-collect.ts +17 -6
- package/src/task-agent/actions.ts +202 -5
- package/src/task-agent/boundary-proof-mapping.ts +12 -0
- package/src/task-agent/boundary-proof-producer.ts +147 -0
- package/src/task-agent/completion-evidence.ts +2 -1
- package/src/task-agent/green-close-recipe.ts +239 -0
- package/src/task-agent/green-sweep.ts +64 -10
- package/src/task-agent/land-queue.ts +21 -8
- package/src/task-agent/live-moves.ts +70 -9
- package/src/task-agent/map-host-adapter.ts +134 -0
- package/src/task-agent/map-reduce.ts +158 -0
- package/src/task-agent/map-run-ledger.ts +226 -0
- package/src/task-agent/mission.ts +30 -0
- package/src/task-agent/parent-host.ts +21 -11
- package/src/task-agent/rejudge-on-head.ts +87 -5
- package/src/task-agent/repair-cycle.ts +179 -32
- package/src/task-agent/repair-next-move.ts +42 -4
- package/src/task-agent/repair-outcomes.ts +29 -0
- package/src/task-agent/repair-worker.ts +14 -4
- package/src/task-agent/review-prior-fix.ts +12 -2
- package/src/task-agent/shadow.ts +229 -8
- package/src/task-agent/task-card-prefix.ts +2 -0
- package/src/task-agent/task-hand.ts +630 -30
- package/src/task-agent/task-parent-role-llm.ts +45 -0
- package/src/task-agent/tier-split.ts +80 -10
- package/src/task-agent/work-order.ts +53 -2
- package/src/task-orchestrator/dispatcher.ts +46 -1
- package/src/task-orchestrator/generator-prompt.ts +6 -0
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +9 -0
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
- package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
- package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +11 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +126 -8
- package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
- package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +4 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +491 -36
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +612 -54
- package/src/task-orchestrator/surfaces/self-implement.ts +46 -2
- package/src/testing/linux-env.ts +177 -0
- package/src/tool-runtime/index.ts +15 -2
- package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
- package/src/tty-foreground.ts +155 -0
- package/src/tui/chat/goal-interim.ts +177 -0
- package/src/tui/chat/log-view.ts +205 -18
- package/src/tui/chat/self-health-status.ts +232 -0
- package/src/tui/entry.ts +623 -80
- package/src/tui/input/at-picker.ts +55 -0
- package/src/tui/input/composer.ts +8 -1
- package/src/tui/slash/compact-command.ts +7 -0
- package/src/tui/slash/compact.ts +1 -7
- package/src/tui/slash/resume.ts +98 -0
- package/src/tui/slash/signals.ts +114 -0
- package/src/tui/slash/term-next.ts +71 -0
- package/src/tui-client/local-chat-turn.ts +49 -5
- package/src/tui-client/next-dashboard-runtime.ts +8 -0
- package/src/tui-client/next-loop-command.ts +70 -0
- package/src/tui-client/next-wakeup.ts +191 -0
- package/src/tui.ts +37 -0
- package/src/ui/modal-adapter.ts +2 -2
- package/src/user-config.ts +19 -1
- package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
- package/src/ux-sim/classic-tui-seat-scenarios.ts +670 -0
- package/src/ux-sim/cli-config-audit-device.ts +121 -0
- package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
- package/src/ux-sim/event-monkey.ts +3 -2
- package/src/ux-sim/fake-bin.ts +45 -0
- package/src/ux-sim/fake-gh.ts +174 -0
- package/src/ux-sim/fake-herdr.ts +238 -0
- package/src/ux-sim/fake-kubectl.ts +142 -0
- package/src/ux-sim/fake-llm.ts +116 -6
- package/src/ux-sim/fault-glm-no-credential.ts +116 -0
- package/src/ux-sim/fault-nextmove-dispatch.ts +102 -1
- package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
- package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
- package/src/ux-sim/goal-device.ts +619 -0
- package/src/ux-sim/in-process-cli.ts +22 -5
- package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
- package/src/ux-sim/mock-authoring-first-run.ts +97 -0
- package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
- package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
- package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
- package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +749 -0
- package/src/ux-sim/onboarding-first-run-device.ts +269 -0
- package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
- package/src/ux-sim/resume-picker-device.ts +173 -0
- package/src/ux-sim/session-id-seed.ts +60 -0
- package/src/ux-sim/skills-tools-shell-device.ts +156 -0
- package/src/ux-sim/subagent-tools-device.ts +81 -0
- package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
- package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
- package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +0 -41
- package/apps/pwa/out/_next/static/chunks/1674.2a65fd5668e1cc5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
- package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
- package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
- package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3589.5444a06bcf6e775c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3677-4215f826f6aa68e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4346.8601952e73bf5803.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
- package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/56d372f2.681ab4ec4c998fae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
- package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
- package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
- package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
- package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
- package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8637.47f5b35afcae5e6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
- package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
- /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
package/src/cli/make-cli.ts
CHANGED
|
@@ -4,40 +4,276 @@ import { judge } from '../llm/judge-layer.js';
|
|
|
4
4
|
import { runPluginMake } from './plugin-cli.js';
|
|
5
5
|
import { workflowRun } from './workflow.js';
|
|
6
6
|
|
|
7
|
-
type MakeKind = 'plugin' | 'workflow';
|
|
7
|
+
export type MakeKind = 'plugin' | 'workflow';
|
|
8
|
+
|
|
9
|
+
/** A cell the route ruled out, together with the evidence that ruled it out. */
|
|
10
|
+
export type MakeExclusion = { kind: MakeKind; reason: string };
|
|
11
|
+
|
|
12
|
+
/** A classify-judge answer. It only counts when the judge supplied BOTH
|
|
13
|
+
* rationales: a bare `{"kind":"workflow"}` carries no reason and no exclusion
|
|
14
|
+
* ground, so the route treats it as an unanswered (unmeasured) request. */
|
|
15
|
+
export type MakeJudgeVerdict = { kind: MakeKind; reason: string; excluded: string };
|
|
16
|
+
|
|
17
|
+
/** What the production `cli.make/route` path judged for one natural-language request. */
|
|
18
|
+
export type MakeRouteEvidence = {
|
|
19
|
+
request: string;
|
|
20
|
+
/** Selected cell, or null when the request carries no usable evidence. */
|
|
21
|
+
kind: MakeKind | null;
|
|
22
|
+
/** Which arm produced `kind`. */
|
|
23
|
+
decidedBy: 'request-evidence' | 'classify-judge' | 'none';
|
|
24
|
+
/** false means "unmeasured": no rationale existed for any cell. */
|
|
25
|
+
measured: boolean;
|
|
26
|
+
/** Why the selected cell won. Never empty; a judge row quotes the judge's own reason verbatim. */
|
|
27
|
+
reason: string;
|
|
28
|
+
/** Phrases from the request that support the selected cell. A judge-decided row
|
|
29
|
+
* carries a `judge:<kind>` marker instead: the request had no phrases to cite. */
|
|
30
|
+
signals: string[];
|
|
31
|
+
/** Every cell that was not selected, with the reason it was excluded. */
|
|
32
|
+
excluded: MakeExclusion[];
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type JudgeCall = (args: { prompt: string; provider: string; model: string }) => Promise<{ text: string }>;
|
|
36
|
+
|
|
8
37
|
type MakeDeps = {
|
|
9
|
-
|
|
38
|
+
/** Test-only classify transport: only ever throws, so it can never deliver an answer. */
|
|
39
|
+
judgeCall?: JudgeCall;
|
|
10
40
|
pluginMake?: (request: string) => Promise<void>;
|
|
11
41
|
workflowMake?: (request: string) => Promise<number>;
|
|
12
42
|
};
|
|
13
43
|
|
|
14
|
-
|
|
44
|
+
const CELL_LABEL: Record<MakeKind, string> = { plugin: '플러그인', workflow: '워크플로' };
|
|
45
|
+
|
|
46
|
+
const OTHER_CELL: Record<MakeKind, MakeKind> = { plugin: 'workflow', workflow: 'plugin' };
|
|
47
|
+
|
|
48
|
+
/** A request that names a cell explicitly outranks every softer signal. */
|
|
49
|
+
const NAMED_CELL_WORDS: Record<MakeKind, readonly string[]> = {
|
|
50
|
+
plugin: ['플러그인', 'plugin'],
|
|
51
|
+
workflow: ['워크플로', 'workflow'],
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** Signal words that must not fire when every occurrence lives inside a longer
|
|
55
|
+
* compound: `메일` inside `이메일` is an email-domain word, not a mailing task,
|
|
56
|
+
* so '이메일 파싱 API' must not reach the workflow cell through it. */
|
|
57
|
+
const COMPOUND_GUARDS: ReadonlyArray<{ word: string; inside: string }> = [
|
|
58
|
+
{ word: '메일', inside: '이메일' },
|
|
59
|
+
{ word: '로드', inside: '업로드' },
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
/** Request phrases that point at each cell. Workflow is the upper cell: a workflow
|
|
63
|
+
* may use a connector, so its signals win over connector signals.
|
|
64
|
+
*
|
|
65
|
+
* 판정 기준(위에서 아래로):
|
|
66
|
+
* 1. 이름 지목 — '플러그인/plugin', '워크플로/workflow' 가 직접 나오면 그 칸.
|
|
67
|
+
* 2. 합성어 가드 — 신호 단어가 더 긴 합성어 안에만 있으면(예: '메일' ⊂ '이메일')
|
|
68
|
+
* 그 단어는 신호로 치지 않는다. '이메일 파싱 API' 는 이메일 도메인 처리
|
|
69
|
+
* 요청이지 메일 발송 워크플로가 아니다.
|
|
70
|
+
* 3. 가드를 통과한 신호가 한쪽에만 있으면 그 칸을 채택한다.
|
|
71
|
+
* 4. 양쪽에 신호가 남아 있으면(충돌) 상위 칸 워크플로가 하위 칸 플러그인을
|
|
72
|
+
* 흡수한다 — 워크플로는 커넥터를 부품으로 쓸 수 있지만 그 반대는 안 된다. */
|
|
73
|
+
const CELL_WORDS: Record<MakeKind, readonly string[]> = {
|
|
74
|
+
plugin: [
|
|
75
|
+
'읽', '파싱', 'parse', '불러', 'load', '로드', '열어', '변환', 'convert', '추출', 'extract',
|
|
76
|
+
'연동', '연결', '커넥터', 'connector', '스킬', 'skill', '도구', 'tool', 'api', '조회',
|
|
77
|
+
'ocr', 'hwp', 'pdf', 'xlsx', 'docx', 'csv', 'json', '이미지', '사진', '엑셀', '워드',
|
|
78
|
+
'번역', 'translate', '검색', 'search',
|
|
79
|
+
],
|
|
80
|
+
workflow: [
|
|
81
|
+
'매일', '매주', '매월', '매년', '매시간', '매번', '정기', '주기적', '스케줄', 'schedule',
|
|
82
|
+
'cron', '크론', '반복', 'daily', 'weekly', 'hourly', 'every ',
|
|
83
|
+
'올려', '올리', '게시', '발행', '포스팅', '업로드', 'upload', '배포', 'deploy', 'publish',
|
|
84
|
+
'보내', '전송', 'send', '알림', 'notify', '메일',
|
|
85
|
+
'하고 나서', '그다음', '순서대로', '단계별', '파이프라인', 'pipeline', '자동화', 'automation',
|
|
86
|
+
'자동으로', '일괄', 'batch', '모아', '수집해서', '시리즈',
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
function countOccurrences(text: string, needle: string): number {
|
|
91
|
+
let count = 0;
|
|
92
|
+
let at = text.indexOf(needle);
|
|
93
|
+
while (at >= 0) {
|
|
94
|
+
count += 1;
|
|
95
|
+
at = text.indexOf(needle, at + needle.length);
|
|
96
|
+
}
|
|
97
|
+
return count;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function matchWords(text: string, words: readonly string[]): string[] {
|
|
101
|
+
const hits: string[] = [];
|
|
102
|
+
for (const word of words) {
|
|
103
|
+
if (!text.includes(word)) continue;
|
|
104
|
+
const guarded = COMPOUND_GUARDS.some(
|
|
105
|
+
g => g.word === word && countOccurrences(text, g.inside) >= countOccurrences(text, word),
|
|
106
|
+
);
|
|
107
|
+
if (!guarded) hits.push(word);
|
|
108
|
+
}
|
|
109
|
+
return hits;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Deterministic judgement over the request text: picks a cell and says why it won
|
|
113
|
+
* and why the sibling cell lost. Runs before any model call, so the route always
|
|
114
|
+
* has a rationale to report. */
|
|
115
|
+
function evidenceFromRequest(request: string): MakeRouteEvidence {
|
|
116
|
+
const text = request.toLowerCase();
|
|
117
|
+
const pluginWords = matchWords(text, CELL_WORDS.plugin);
|
|
118
|
+
const workflowWords = matchWords(text, CELL_WORDS.workflow);
|
|
119
|
+
const namedPlugin = matchWords(text, NAMED_CELL_WORDS.plugin);
|
|
120
|
+
const namedWorkflow = matchWords(text, NAMED_CELL_WORDS.workflow);
|
|
121
|
+
const named: MakeKind | null = namedPlugin.length && !namedWorkflow.length
|
|
122
|
+
? 'plugin'
|
|
123
|
+
: namedWorkflow.length && !namedPlugin.length ? 'workflow' : null;
|
|
124
|
+
|
|
125
|
+
let kind: MakeKind | null = null;
|
|
126
|
+
let reason: string;
|
|
127
|
+
let signals: string[] = [];
|
|
128
|
+
|
|
129
|
+
if (named) {
|
|
130
|
+
kind = named;
|
|
131
|
+
signals = named === 'plugin' ? namedPlugin : namedWorkflow;
|
|
132
|
+
reason = `요청이 ${CELL_LABEL[named]} 칸을 이름으로 지목(${signals.join(', ')}) — 명시 지목이 최상위 근거`;
|
|
133
|
+
} else if (workflowWords.length) {
|
|
134
|
+
kind = 'workflow';
|
|
135
|
+
signals = workflowWords;
|
|
136
|
+
reason = `반복·게시·시퀀스 신호(${workflowWords.join(', ')}) — 상위 칸 워크플로 채택`;
|
|
137
|
+
} else if (pluginWords.length) {
|
|
138
|
+
kind = 'plugin';
|
|
139
|
+
signals = pluginWords;
|
|
140
|
+
reason = `커넥터·역량·형식 신호(${pluginWords.join(', ')}) — 하위 칸 플러그인 채택`;
|
|
141
|
+
} else {
|
|
142
|
+
reason = '필수 근거 없음 — 요청에서 플러그인·워크플로 신호를 찾지 못했다';
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const excluded: MakeExclusion[] = [];
|
|
146
|
+
if (kind === 'workflow') {
|
|
147
|
+
excluded.push({
|
|
148
|
+
kind: 'plugin',
|
|
149
|
+
reason: [
|
|
150
|
+
named === 'workflow'
|
|
151
|
+
? `요청이 워크플로를 이름으로 지목(${namedWorkflow.join(', ')})`
|
|
152
|
+
: `반복·게시·시퀀스 신호(${workflowWords.join(', ')})`,
|
|
153
|
+
pluginWords.length
|
|
154
|
+
? `플러그인 신호(${pluginWords.join(', ')})는 커넥터 단품이라 상위 칸에 흡수`
|
|
155
|
+
: '플러그인 신호 0건',
|
|
156
|
+
].join(' · '),
|
|
157
|
+
});
|
|
158
|
+
} else if (kind === 'plugin') {
|
|
159
|
+
excluded.push({
|
|
160
|
+
kind: 'workflow',
|
|
161
|
+
reason: [
|
|
162
|
+
named === 'plugin'
|
|
163
|
+
? `요청이 플러그인을 이름으로 지목(${namedPlugin.join(', ')})`
|
|
164
|
+
: `커넥터·역량 신호(${pluginWords.join(', ')})`,
|
|
165
|
+
workflowWords.length
|
|
166
|
+
? `워크플로 신호(${workflowWords.join(', ')})가 있으나 단품 칸이 채택`
|
|
167
|
+
: '워크플로 신호 0건',
|
|
168
|
+
].join(' · '),
|
|
169
|
+
});
|
|
170
|
+
} else {
|
|
171
|
+
excluded.push(
|
|
172
|
+
{ kind: 'plugin', reason: '플러그인 신호 0건 — 필수 근거 없음' },
|
|
173
|
+
{ kind: 'workflow', reason: '워크플로 신호 0건 — 필수 근거 없음' },
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
request,
|
|
179
|
+
kind,
|
|
180
|
+
decidedBy: kind ? 'request-evidence' : 'none',
|
|
181
|
+
measured: kind !== null,
|
|
182
|
+
reason,
|
|
183
|
+
signals,
|
|
184
|
+
excluded,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export async function classifyMakeRequest(request: string, call?: JudgeCall): Promise<MakeJudgeVerdict | null> {
|
|
15
189
|
if (!request.trim()) return null;
|
|
16
|
-
const result = await judge<
|
|
190
|
+
const result = await judge<MakeJudgeVerdict>({
|
|
17
191
|
site: 'cli.make',
|
|
18
192
|
...(call ? { call } : {}),
|
|
19
|
-
prompt: `Classify this request for an Elanous creator. Choose "plugin" for a reusable connector, integration, skill, or capability (including reading a file format). Choose "workflow" for a sequence of jobs, recurring schedule, automation, or publishing task, even when it uses a connector.
|
|
193
|
+
prompt: `Classify this request for an Elanous creator. Choose "plugin" for a reusable connector, integration, skill, or capability (including reading a file format). Choose "workflow" for a sequence of jobs, recurring schedule, automation, or publishing task, even when it uses a connector. Respond with JSON only, exactly {"kind":"plugin"|"workflow","reason":"<한 문장: 이 칸을 고른 근거>","excluded":"<한 문장: 다른 칸을 뺀 근거>"}. Return {"kind":"unclear"} when you cannot decide. An answer missing either rationale field is rejected as unmeasured. Do not execute the request.\nRequest: ${JSON.stringify(request)}`,
|
|
20
194
|
schema: value => {
|
|
21
195
|
if (!value || typeof value !== 'object' || Array.isArray(value)) return null;
|
|
22
196
|
const kind = (value as { kind?: unknown }).kind;
|
|
23
|
-
|
|
197
|
+
if (kind !== 'plugin' && kind !== 'workflow') return null;
|
|
198
|
+
const reason = (value as { reason?: unknown }).reason;
|
|
199
|
+
const excluded = (value as { excluded?: unknown }).excluded;
|
|
200
|
+
if (typeof reason !== 'string' || !reason.trim()) return null;
|
|
201
|
+
if (typeof excluded !== 'string' || !excluded.trim()) return null;
|
|
202
|
+
return { kind, reason: reason.trim(), excluded: excluded.trim() };
|
|
24
203
|
},
|
|
25
204
|
});
|
|
26
205
|
return result.ok ? result.value : null;
|
|
27
206
|
}
|
|
28
207
|
|
|
208
|
+
/** Production judgement path for `elanous make`: request evidence first, the
|
|
209
|
+
* classify judge only when the request carries no evidence at all. A judge
|
|
210
|
+
* answer without both rationales is reported as unmeasured, never as success;
|
|
211
|
+
* `skipJudge` leaves the judge uncalled so --route-only dumps stay
|
|
212
|
+
* deterministic (no model call, no dispatch). */
|
|
213
|
+
export async function routeMakeRequest(
|
|
214
|
+
request: string,
|
|
215
|
+
opts: { call?: JudgeCall; skipJudge?: boolean } = {},
|
|
216
|
+
): Promise<MakeRouteEvidence> {
|
|
217
|
+
const evidence = evidenceFromRequest(request);
|
|
218
|
+
if (evidence.measured) return evidence;
|
|
219
|
+
|
|
220
|
+
let verdict: MakeJudgeVerdict | null = null;
|
|
221
|
+
let note: string;
|
|
222
|
+
if (opts.skipJudge) {
|
|
223
|
+
note = '판정기 호출 생략(증거 전용 경로)';
|
|
224
|
+
} else {
|
|
225
|
+
try {
|
|
226
|
+
verdict = await classifyMakeRequest(request, opts.call);
|
|
227
|
+
note = verdict
|
|
228
|
+
? `classify judge 가 ${CELL_LABEL[verdict.kind]} 를 근거와 함께 반환`
|
|
229
|
+
: 'classify judge 가 근거 있는 판정을 반환하지 않음';
|
|
230
|
+
} catch (err) {
|
|
231
|
+
note = `classify judge 호출 실패(${err instanceof Error ? err.message : String(err)})`;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (!verdict) {
|
|
236
|
+
return { ...evidence, decidedBy: 'none', measured: false, reason: `${evidence.reason} · ${note}` };
|
|
237
|
+
}
|
|
238
|
+
const other = OTHER_CELL[verdict.kind];
|
|
239
|
+
return {
|
|
240
|
+
request,
|
|
241
|
+
kind: verdict.kind,
|
|
242
|
+
decidedBy: 'classify-judge',
|
|
243
|
+
measured: true,
|
|
244
|
+
reason: `요청 근거 없음(플러그인·워크플로 신호 0건) → ${note} — ${CELL_LABEL[verdict.kind]} 칸 채택 · 판정기 근거: ${verdict.reason}`,
|
|
245
|
+
signals: [`judge:${verdict.kind}`],
|
|
246
|
+
excluded: [{ kind: other, reason: `요청 근거 없음 · 판정기 배제 근거: ${verdict.excluded}` }],
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
|
|
29
250
|
export function registerMakeCommand(program: Command, deps: MakeDeps = {}): void {
|
|
30
251
|
program.command('make <request>')
|
|
31
252
|
.description('Classify a one-line request and make a plugin or build a workflow')
|
|
32
|
-
.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
253
|
+
.option('--route-only', 'print the cli.make/route evidence JSON and exit — no judge call, no plugin or workflow dispatch')
|
|
254
|
+
.action(async (request: string, opts: { routeOnly?: boolean }) => {
|
|
255
|
+
const evidence = await routeMakeRequest(request, {
|
|
256
|
+
...(deps.judgeCall ? { call: deps.judgeCall } : {}),
|
|
257
|
+
...(opts.routeOnly ? { skipJudge: true } : {}),
|
|
258
|
+
});
|
|
259
|
+
debug.log('cli.make', 'route', evidence);
|
|
260
|
+
if (!evidence.measured) {
|
|
261
|
+
debug.log('cli.make', 'route-unmeasured', {
|
|
262
|
+
request: evidence.request,
|
|
263
|
+
reason: evidence.reason,
|
|
264
|
+
excluded: evidence.excluded,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
if (opts.routeOnly) {
|
|
268
|
+
console.log(JSON.stringify(evidence));
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (!evidence.kind) {
|
|
36
272
|
console.log('플러그인(커넥터·스킬)을 만들까요, 워크플로(잡)를 만들까요?');
|
|
37
273
|
process.exitCode = 1;
|
|
38
274
|
return;
|
|
39
275
|
}
|
|
40
|
-
if (kind === 'plugin') await (deps.pluginMake ?? runPluginMake)(request);
|
|
276
|
+
if (evidence.kind === 'plugin') await (deps.pluginMake ?? runPluginMake)(request);
|
|
41
277
|
else process.exitCode = await (deps.workflowMake ?? ((text: string) => workflowRun('build-workflow', text)))(request);
|
|
42
278
|
});
|
|
43
279
|
}
|
package/src/cli/memory-cli.ts
CHANGED
|
@@ -10,6 +10,8 @@ import {
|
|
|
10
10
|
readIndex, memoryRoot, memoryIndexPath,
|
|
11
11
|
type MemoryType,
|
|
12
12
|
} from '../memory.js';
|
|
13
|
+
import { applyClaudeMemoryImport, claudeMemoryRoot, collectClaudeMemoryFiles } from '../context-bus/claude-memory-import.js';
|
|
14
|
+
import { importClaudeMemories } from '../context-bus/long-term-memory.js';
|
|
13
15
|
|
|
14
16
|
export function registerMemoryCommands(program: Command): void {
|
|
15
17
|
const memCmd = program.command('memory').description('Persistent memories injected into every chat turn (user / feedback / project / reference)');
|
|
@@ -179,4 +181,31 @@ export function registerMemoryCommands(program: Command): void {
|
|
|
179
181
|
console.log(`memory dir ${memoryRoot()}`);
|
|
180
182
|
console.log(`index file ${memoryIndexPath()}`);
|
|
181
183
|
});
|
|
182
|
-
|
|
184
|
+
|
|
185
|
+
// 대표 10-12 MEMORY-IMPORT-CLAUDE — Claude 자동 기억(~/.claude/projects/*/memory)을 엘라누스
|
|
186
|
+
// 장기 기억으로 가져온다. 에이전트 무관 — codex·elanous TUI 가 같은 기억을 바로 읽는다.
|
|
187
|
+
memCmd
|
|
188
|
+
.command('import-claude')
|
|
189
|
+
.description('Import Claude auto-memories (~/.claude/projects/*/memory) into elanous memories — same name overwrites')
|
|
190
|
+
.option('--root <path>', 'projects root or a single memory dir', claudeMemoryRoot())
|
|
191
|
+
.option('--as-of <date>', 'staleness basis «MM-DD 기준» (default: today)')
|
|
192
|
+
.option('--dry-run', 'preview without saving')
|
|
193
|
+
.action((opts: { root: string; asOf?: string; dryRun?: boolean }) => {
|
|
194
|
+
const asOf = opts.asOf ?? new Date().toISOString().slice(0, 10);
|
|
195
|
+
const files = collectClaudeMemoryFiles(opts.root);
|
|
196
|
+
if (opts.dryRun) {
|
|
197
|
+
const preview = importClaudeMemories(files, { asOf });
|
|
198
|
+
ui.header(`claude-memory (dry-run) ${files.length} files`);
|
|
199
|
+
for (const item of preview.items) console.log(` [${item.type.padEnd(9)}] ${item.name} ${item.summary}`);
|
|
200
|
+
if (preview.overwritten) console.log(` overwritten ${preview.overwritten}`);
|
|
201
|
+
for (const [reason, count] of Object.entries(preview.skipped)) console.log(` skipped ${reason}:${count}`);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const result = applyClaudeMemoryImport(files, { asOf }, {
|
|
205
|
+
list: () => listMemories().map(entry => ({ id: entry.id, name: entry.name })),
|
|
206
|
+
save: record => { saveMemory(record); },
|
|
207
|
+
});
|
|
208
|
+
ui.info(`claude-memory: ${result.saved} new · ${result.updated} overwritten · ${result.items.length} imported (${files.length} files from ${opts.root})`);
|
|
209
|
+
for (const [reason, count] of Object.entries(result.skipped)) ui.info(` skipped ${reason}:${count}`);
|
|
210
|
+
});
|
|
211
|
+
}
|
package/src/cli/msg-cli.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
2
|
import { ensureAuthToken } from '../auth/acp-token.js';
|
|
3
|
+
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
3
4
|
import { canonicalSeatId, openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
|
|
5
|
+
import { clearPostOffice, ensurePostOffice, writePostOffice } from '../msg/msg-post-office.js';
|
|
4
6
|
import { startMsgSseServer } from '../msg/msg-sse-server.js';
|
|
7
|
+
import type { AgentReplyAddress, AgentReplyInput, AgentReplyResult } from '../loops/agent-reply.js';
|
|
5
8
|
import { messageRouteFor, noReplyBodyNotice, unsupportedLoopAddressNotice } from '../loops/msg-address.js';
|
|
6
9
|
import { resolveWake, wakeRecipient, type WakeDeps, type WakeOutcome } from '../loops/msg-wake.js';
|
|
10
|
+
import type { RoleLlmSpec } from '../user-config.js';
|
|
11
|
+
|
|
12
|
+
/** The loop rows whose reply body is an LLM agent: `--agent-reply` picks one of these. */
|
|
13
|
+
const AGENT_REPLY_ROLES = { COORDINATOR: 'coordinator', GUARDIAN: 'guardian' } as const;
|
|
7
14
|
|
|
8
15
|
export interface MsgCliDeps {
|
|
9
16
|
openStore?: () => MsgStore;
|
|
@@ -21,6 +28,24 @@ export interface MsgCliDeps {
|
|
|
21
28
|
registerLogSink?: () => Promise<unknown>;
|
|
22
29
|
/** Wake the recipient after a durable post; never changes the post outcome. */
|
|
23
30
|
wake?: (address: string, msgId: number, message: { from: string; kind?: string }, deps: WakeDeps) => Promise<WakeOutcome>;
|
|
31
|
+
/**
|
|
32
|
+
* Agent auto-reply producer (`--agent-reply`). The default resolves the selected role LLM, loads its pack,
|
|
33
|
+
* and calls the real `replyWithAgent`; the seams exist so a test still traverses that producer.
|
|
34
|
+
*/
|
|
35
|
+
agentReply?: {
|
|
36
|
+
role?: RoleLlmSpec;
|
|
37
|
+
pack?: string;
|
|
38
|
+
/** Test seam: a fake turn still goes through `replyWithAgent` and its ledger transaction. */
|
|
39
|
+
runAgent?: AgentReplyInput['runAgent'];
|
|
40
|
+
/** Test seam for the role ladder — `undefined` means «역할 LLM 미설정». */
|
|
41
|
+
resolveRole?: (address: AgentReplyAddress) => RoleLlmSpec | undefined;
|
|
42
|
+
observationRoot?: string;
|
|
43
|
+
};
|
|
44
|
+
/** `msg serve --sse` discovery file root (default: the state root). `msg post` restarts a dead service found here. */
|
|
45
|
+
postOfficeStateRoot?: string;
|
|
46
|
+
postOfficeAlive?: (pid: number) => boolean;
|
|
47
|
+
postOfficeProbe?: (url: string) => Promise<boolean>;
|
|
48
|
+
postOfficeLaunch?: (input: { port: number }) => void;
|
|
24
49
|
/** Test seams for the existing self-send transport and the selected task-card ledger. */
|
|
25
50
|
readCard?: typeof import('../task-agent/task-hand.js').readTaskCard;
|
|
26
51
|
podFragmentsForRun?: typeof import('../harness/self-send-target.js').listPodFragmentsForRun;
|
|
@@ -32,7 +57,7 @@ export interface MsgCliDeps {
|
|
|
32
57
|
}
|
|
33
58
|
|
|
34
59
|
type CommonOptions = { json?: boolean };
|
|
35
|
-
type RecipientOptions = CommonOptions & { to?: string; after?: string; limit?: string };
|
|
60
|
+
type RecipientOptions = CommonOptions & { to?: string; after?: string; limit?: string; thread?: string };
|
|
36
61
|
|
|
37
62
|
function seat(raw: string | undefined, flag: string): string {
|
|
38
63
|
if (raw === undefined) throw new Error(`${flag} is required`);
|
|
@@ -160,16 +185,94 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
160
185
|
if (json) out.log(JSON.stringify(value));
|
|
161
186
|
else human();
|
|
162
187
|
};
|
|
188
|
+
const officeRoot = () => deps.postOfficeStateRoot ?? elanousStateRoot();
|
|
189
|
+
|
|
190
|
+
/** `--agent-reply <address>` — only the loop rows that answer with an LLM body. */
|
|
191
|
+
const agentReplyAddress = (raw: string | undefined): AgentReplyAddress | null => {
|
|
192
|
+
if (raw === undefined) return null;
|
|
193
|
+
const name = raw.trim().toUpperCase();
|
|
194
|
+
if (!Object.hasOwn(AGENT_REPLY_ROLES, name)) throw new Error('--agent-reply must be COORDINATOR or GUARDIAN');
|
|
195
|
+
return name as AgentReplyAddress;
|
|
196
|
+
};
|
|
197
|
+
const requireAgentTarget = (address: AgentReplyAddress, to: string): void => {
|
|
198
|
+
if (address !== to) throw new Error(`--agent-reply ${address} requires --to ${address}`);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Human-free live conversation: the selected address's LLM body answers the message that was just saved.
|
|
203
|
+
* The durable ledger stays authoritative — `replyWithAgent` owns the one-reply-per-request transaction and
|
|
204
|
+
* its dedupe, so a retry finds the existing link instead of generating again. A failure never changes the
|
|
205
|
+
* post's exit code; it is reported as one line on stderr.
|
|
206
|
+
*/
|
|
207
|
+
const autoReply = async (address: AgentReplyAddress, request: Message, json: boolean | undefined): Promise<void> => {
|
|
208
|
+
const seam = deps.agentReply;
|
|
209
|
+
let role = seam?.role;
|
|
210
|
+
if (role === undefined) {
|
|
211
|
+
if (seam?.resolveRole) role = seam.resolveRole(address);
|
|
212
|
+
else {
|
|
213
|
+
const { resolveConfiguredAgentRoleLlm } = await import('../user-config.js');
|
|
214
|
+
// Only an explicitly selected provider/tier/model starts an agent body; effort alone is not a selection.
|
|
215
|
+
role = resolveConfiguredAgentRoleLlm(AGENT_REPLY_ROLES[address]);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (role === undefined) {
|
|
219
|
+
out.error(`msg: ${address} 역할 LLM 미설정 — 자동 답 없음`);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
let pack = seam?.pack;
|
|
223
|
+
if (pack === undefined) {
|
|
224
|
+
try {
|
|
225
|
+
const { loadAgentRolePack } = await import('../loops/agent-reply.js');
|
|
226
|
+
pack = loadAgentRolePack(AGENT_REPLY_ROLES[address]);
|
|
227
|
+
} catch (error) {
|
|
228
|
+
out.error(`msg: ${address} 역할 팩 없음 — 자동 답 없음: ${error instanceof Error ? error.message : String(error)}`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
const { replyWithAgent } = await import('../loops/agent-reply.js');
|
|
234
|
+
const store = open();
|
|
235
|
+
let result: AgentReplyResult;
|
|
236
|
+
try {
|
|
237
|
+
result = await replyWithAgent({ address, role, pack, store,
|
|
238
|
+
request: { id: request.id, from: request.from, body: request.body,
|
|
239
|
+
...(request.kind === undefined ? {} : { kind: request.kind }) },
|
|
240
|
+
...(seam?.runAgent ? { runAgent: seam.runAgent } : {}),
|
|
241
|
+
...(seam?.observationRoot ? { observationRoot: seam.observationRoot } : {}) });
|
|
242
|
+
} finally { store.close(); }
|
|
243
|
+
emit({ agentReply: { address, requestId: request.id, ...result } }, json,
|
|
244
|
+
() => out.log(`자동 답 ${result.replyId === null ? '없음' : `#${result.replyId}`} (${address} → ${request.from})${result.posted ? '' : ' — 이미 있음'}`));
|
|
245
|
+
} catch (error) {
|
|
246
|
+
out.error(`msg: 자동 답 실패: ${error instanceof Error ? error.message : String(error)}`);
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Installed post-office supervision: a registered `msg serve --sse` that no longer answers is restarted on
|
|
252
|
+
* its recorded port. Nothing is spawned when no service registered itself, so a plain post is unchanged.
|
|
253
|
+
*/
|
|
254
|
+
const supervisePostOffice = async (): Promise<void> => {
|
|
255
|
+
const result = await ensurePostOffice({ stateRoot: officeRoot(),
|
|
256
|
+
...(deps.postOfficeAlive ? { alive: deps.postOfficeAlive } : {}),
|
|
257
|
+
...(deps.postOfficeProbe ? { probe: deps.postOfficeProbe } : {}),
|
|
258
|
+
...(deps.postOfficeLaunch ? { launch: deps.postOfficeLaunch } : {}) });
|
|
259
|
+
if (result.state === 'restarted')
|
|
260
|
+
out.error(`msg: post office 재시작 (port ${result.port}) — 원장이 정본이라 저장된 글은 다시 밀린다`);
|
|
261
|
+
};
|
|
163
262
|
|
|
164
263
|
msg.command('post [body]').description('Post a message; use - or omit body to read stdin')
|
|
165
264
|
.option('--from <seat>').option('--to <seat>').option('--kind <kind>').option('--body <text>')
|
|
166
265
|
.option('--reply-to <id>', 'point this reply at a question message ID')
|
|
266
|
+
.option('--agent-reply <address>', 'let this address\'s agent body (COORDINATOR · GUARDIAN) answer the saved message once')
|
|
167
267
|
.option('--origin-key <key>', 'deduplicate a channel mirror by coord:<commentId>:<recipient>').option('--json')
|
|
168
|
-
.action((body: string | undefined, opts: CommonOptions & { from?: string; to?: string; kind?: string; body?: string; replyTo?: string; originKey?: string }) => run(async () => {
|
|
268
|
+
.action((body: string | undefined, opts: CommonOptions & { from?: string; to?: string; kind?: string; body?: string; replyTo?: string; originKey?: string; agentReply?: string }) => run(async () => {
|
|
169
269
|
const from = seat(opts.from, '--from');
|
|
170
270
|
const unsupported = opts.to === undefined ? null : unsupportedLoopAddressNotice(opts.to);
|
|
171
271
|
if (unsupported) out.error(unsupported);
|
|
172
272
|
const to = seat(opts.to, '--to');
|
|
273
|
+
// Validate the auto-reply target before saving — a mismatched flag must not leave a stored message behind.
|
|
274
|
+
const agentAddress = agentReplyAddress(opts.agentReply);
|
|
275
|
+
if (agentAddress !== null) requireAgentTarget(agentAddress, to);
|
|
173
276
|
if (body !== undefined && body !== '-' && opts.body !== undefined) throw new Error('provide body once (argument or --body)');
|
|
174
277
|
const text = opts.body ?? (body !== undefined && body !== '-' ? body : await readStdin());
|
|
175
278
|
const envelope = { from, to, body: text,
|
|
@@ -192,10 +295,14 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
192
295
|
new Promise<void>(resolve => { sinkTimer = setTimeout(resolve, 1000); }),
|
|
193
296
|
]).finally(() => clearTimeout(sinkTimer));
|
|
194
297
|
} catch { /* observability is fail-open */ }
|
|
298
|
+
// 설치본을 갈아 끼우면 우편국(SSE)은 조용히 사라진다 — 등록해 둔 서비스가 응답하지 않으면 같은 포트로 다시 띄운다.
|
|
299
|
+
// 재시작도 관측도 post 의 성패를 바꾸지 않는다.
|
|
300
|
+
try { await supervisePostOffice(); } catch { /* post office is fail-open */ }
|
|
195
301
|
try {
|
|
196
302
|
await (deps.wake ?? wakeRecipient)(to, posted.id, { from, ...(opts.kind === undefined ? {} : { kind: opts.kind }) },
|
|
197
303
|
{ ...deps.wakeDeps, warn: noBody ? () => {} : line => out.error(line) });
|
|
198
304
|
} catch { /* the wake outcome is logged by wakeRecipient; the post is already durable */ }
|
|
305
|
+
if (agentAddress !== null) await autoReply(agentAddress, posted, opts.json);
|
|
199
306
|
})());
|
|
200
307
|
|
|
201
308
|
msg.command('route <address>').description('Show how a post to this address is read (replyBody) and woken (wake)')
|
|
@@ -209,14 +316,19 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
209
316
|
+ `\t(${wake.source}${wake.reason ? `: ${wake.reason}` : ''})`));
|
|
210
317
|
})());
|
|
211
318
|
|
|
212
|
-
msg.command('list').description('List messages for one recipient without acknowledging them')
|
|
213
|
-
.option('--to <seat>').option('--
|
|
319
|
+
msg.command('list').description('List messages for one recipient or one thread without acknowledging them')
|
|
320
|
+
.option('--to <seat>').option('--thread <id>', 'request ID; list it and its replies, regardless of recipient')
|
|
321
|
+
.option('--after <id>', 'exclusive message ID (default: acknowledged cursor for a recipient, 0 for a thread)')
|
|
214
322
|
.option('--limit <count>', 'maximum messages (1–1000)').option('--json')
|
|
215
323
|
.action((opts: RecipientOptions) => run(() => {
|
|
216
|
-
|
|
324
|
+
if (opts.thread !== undefined && opts.to !== undefined) throw new Error('--thread cannot be used with --to');
|
|
325
|
+
const to = opts.thread === undefined ? seat(opts.to, '--to') : undefined;
|
|
326
|
+
const threadId = opts.thread === undefined ? undefined : integer(opts.thread, '--thread', 0, 1, Number.MAX_SAFE_INTEGER);
|
|
217
327
|
const limit = integer(opts.limit, '--limit', 100, 1, 1000);
|
|
218
328
|
const after = opts.after === undefined ? undefined : integer(opts.after, '--after', 0, 0, Number.MAX_SAFE_INTEGER);
|
|
219
|
-
const messages = withStore(store =>
|
|
329
|
+
const messages = withStore(store => threadId === undefined
|
|
330
|
+
? store.list(to!, after ?? store.getCursor(to!), limit)
|
|
331
|
+
: store.listThread(threadId, after ?? 0, limit));
|
|
220
332
|
emit(messages, opts.json, () => {
|
|
221
333
|
if (!messages.length) out.log('No messages.');
|
|
222
334
|
for (const message of messages) out.log(formatMessage(message));
|
|
@@ -344,11 +456,14 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
344
456
|
|
|
345
457
|
msg.command('ask <recipient> <question>').description('Post a question and wait for its first reply')
|
|
346
458
|
.option('--from <seat>', 'asking seat (required)').option('--wait <seconds>', 'seconds to wait for a reply (default 60)', '60')
|
|
459
|
+
.option('--agent-reply <address>', 'let this address\'s agent body (COORDINATOR · GUARDIAN) answer before waiting')
|
|
347
460
|
.option('--json')
|
|
348
|
-
.action((recipient: string, question: string, opts: CommonOptions & { from?: string; wait?: string }) => run(async () => {
|
|
461
|
+
.action((recipient: string, question: string, opts: CommonOptions & { from?: string; wait?: string; agentReply?: string }) => run(async () => {
|
|
349
462
|
const from = seat(opts.from, '--from');
|
|
350
463
|
const to = canonicalSeatId(recipient);
|
|
351
464
|
const waitSeconds = integer(opts.wait, '--wait', 60, 0, 86400);
|
|
465
|
+
const agentAddress = agentReplyAddress(opts.agentReply);
|
|
466
|
+
if (agentAddress !== null) requireAgentTarget(agentAddress, to);
|
|
352
467
|
const interrupt = deps.signal === undefined ? new AbortController() : undefined;
|
|
353
468
|
const signal = deps.signal ?? interrupt!.signal;
|
|
354
469
|
const onInterrupt = () => interrupt?.abort();
|
|
@@ -362,6 +477,8 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
362
477
|
emit(asked, opts.json, () => out.log(`#${asked.id}`));
|
|
363
478
|
// msg ask uses the same saved-message handler before waiting for its linked reply.
|
|
364
479
|
await handleTaMessage(asked);
|
|
480
|
+
// 사람 없는 live 대화: 답할 몸이 있으면 «기다리기 전»에 답을 원장에 남긴다 — 같은 대기 루프가 그 답을 집는다.
|
|
481
|
+
if (agentAddress !== null) await autoReply(agentAddress, asked, opts.json);
|
|
365
482
|
const deadline = Date.now() + waitSeconds * 1000;
|
|
366
483
|
let reply: Message | undefined;
|
|
367
484
|
store = open();
|
|
@@ -387,18 +504,17 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
387
504
|
.action((id: string, opts: CommonOptions) => run(() => {
|
|
388
505
|
const target = integer(id, 'message ID', 0, 1, Number.MAX_SAFE_INTEGER);
|
|
389
506
|
const thread = withStore(store => {
|
|
390
|
-
const question = store.getMessage(target);
|
|
391
|
-
if (question === null) throw new Error(`message not found: #${target}`);
|
|
392
507
|
// Keep paging until a short page so a thread longer than one store page is never truncated.
|
|
393
|
-
const
|
|
508
|
+
const messages: Message[] = [];
|
|
394
509
|
let after = 0;
|
|
395
510
|
let page: Message[];
|
|
396
511
|
do {
|
|
397
|
-
page = store.
|
|
398
|
-
|
|
512
|
+
page = store.listThread(target, after, 100);
|
|
513
|
+
messages.push(...page);
|
|
399
514
|
after = page.at(-1)?.id ?? after;
|
|
400
515
|
} while (page.length === 100);
|
|
401
|
-
|
|
516
|
+
const [question, ...replies] = messages;
|
|
517
|
+
return { question: question!, replies };
|
|
402
518
|
});
|
|
403
519
|
emit(thread, opts.json, () => {
|
|
404
520
|
out.log(formatMessage(thread.question));
|
|
@@ -419,8 +535,10 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
419
535
|
try {
|
|
420
536
|
const service = startMsgSseServer({ store, token: (deps.authToken ?? (() => ensureAuthToken().token))(),
|
|
421
537
|
port, hostname: opts.host });
|
|
538
|
+
// 발견 줄 — 설치본을 갈아 끼운 뒤 `msg post` 가 이 줄을 읽어 죽은 서비스를 같은 포트로 다시 띄운다.
|
|
539
|
+
writePostOffice(officeRoot(), { port: service.port });
|
|
422
540
|
out.log(`msg SSE listening on ${opts.host}:${service.port}`);
|
|
423
|
-
const stop = () => { service.stop(); store.close(); };
|
|
541
|
+
const stop = () => { service.stop(); store.close(); clearPostOffice(officeRoot()); };
|
|
424
542
|
process.once('SIGINT', stop);
|
|
425
543
|
process.once('SIGTERM', stop);
|
|
426
544
|
} catch (error) { store.close(); throw error; }
|
package/src/cli/pr-cli.ts
CHANGED
|
@@ -62,8 +62,8 @@ import { admitLandingMerge } from '../self-implement/frozen-merges.js';
|
|
|
62
62
|
import { resolveOverlapEvidencePath, verifyAllSameHeadReviews, verifyAncestorAutoPass, verifyOverlapEvidence, verifyOverlapEvidenceVirtualRebase } from './pr-land-overlap-evidence.js';
|
|
63
63
|
import type { VerifyOverlapEvidenceInput } from './pr-land-overlap-evidence.js';
|
|
64
64
|
import { verifyVirtualRebasePatch } from './pr-land-virtual-rebase.js';
|
|
65
|
-
import { observeDirectPrLandRefusal, observePrLandRefusal } from './pr-land-refusal.js';
|
|
66
|
-
import {
|
|
65
|
+
import { classifyPrLandRefusal, observeDirectPrLandRefusal, observePrLandRefusal } from './pr-land-refusal.js';
|
|
66
|
+
import { bindPrLandRefusalToRecover, PR_LAND_CARD_ID_ENV } from './pr-land-recovery.js';
|
|
67
67
|
import { ensurePrLandHeavyRemote, type HeavyRemoteInput, type HeavyRemoteResult } from './pr-land-heavy-remote.js';
|
|
68
68
|
import { readPrBaseNameWithRetry } from './pr-land-base-read.js';
|
|
69
69
|
import { runHeavyOnPodShadow } from './pr-land-pod-shadow.js';
|
|
@@ -1319,26 +1319,39 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
|
|
|
1319
1319
|
};
|
|
1320
1320
|
// Observe actual merge refusals, including the measured remote gate and public export leak.
|
|
1321
1321
|
// Option syntax and unmeasured prerequisite errors do not describe a recovery edge.
|
|
1322
|
+
// LAND-REFUSAL-EDGES — a pinned refusal is also bound to the recover@1 edge with its raw line and card.
|
|
1323
|
+
// The card arrives only through the child env set by TA defaultLand — never a shell export.
|
|
1324
|
+
const cardId = process.env[PR_LAND_CARD_ID_ENV]?.trim() || undefined;
|
|
1325
|
+
const bindRecover = (message: string, context: { isDraft?: boolean } = {}) => {
|
|
1326
|
+
const pr = Number(opts.pr);
|
|
1327
|
+
if (!Number.isSafeInteger(pr) || pr <= 0 || !opts.expectedHead) return undefined;
|
|
1328
|
+
try { return bindPrLandRefusalToRecover({ refusal: message, pr, head: opts.expectedHead, isDraft: context.isDraft, cardId }); }
|
|
1329
|
+
catch { return undefined; }
|
|
1330
|
+
};
|
|
1322
1331
|
const refuse = (message: string, context: { isDraft?: boolean } = {}): void => {
|
|
1323
1332
|
out.error(message);
|
|
1324
1333
|
observePrLandRefusal(message, context);
|
|
1325
|
-
const
|
|
1326
|
-
if (
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
// Recovery observation must never replace the original landing refusal.
|
|
1336
|
-
}
|
|
1334
|
+
const plan = bindRecover(message, context);
|
|
1335
|
+
if (!plan) return;
|
|
1336
|
+
try {
|
|
1337
|
+
debug.log('pr.land', 'recover-shadow', {
|
|
1338
|
+
pr: Number(opts.pr), head: opts.expectedHead, label: plan.evidence.label, route: plan.evidence.route,
|
|
1339
|
+
outcome: plan.outcome, action: plan.result.action, reason: plan.result.reason,
|
|
1340
|
+
delayMs: plan.result.delayMs ?? null, execution: 'none',
|
|
1341
|
+
});
|
|
1342
|
+
} catch {
|
|
1343
|
+
// Recovery observation must never replace the original landing refusal.
|
|
1337
1344
|
}
|
|
1338
1345
|
};
|
|
1346
|
+
// A direct failure binds only when today's refusal shape is recognized — the same measured sample
|
|
1347
|
+
// as observeDirectPrLandRefusal (#28939). An unclassified direct error is not a landing refusal.
|
|
1348
|
+
const observeDirect = (message: string): void => {
|
|
1349
|
+
observeDirectPrLandRefusal(message);
|
|
1350
|
+
if (classifyPrLandRefusal(message) !== 'other') bindRecover(message);
|
|
1351
|
+
};
|
|
1339
1352
|
const refuseDirect = (message: string): void => {
|
|
1340
1353
|
out.error(message);
|
|
1341
|
-
|
|
1354
|
+
observeDirect(message);
|
|
1342
1355
|
};
|
|
1343
1356
|
if (opts.title !== undefined && opts.titleFile !== undefined) {
|
|
1344
1357
|
out.error('✗ title: --title과 --title-file은 함께 사용할 수 없습니다.');
|
|
@@ -2043,7 +2056,7 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
|
|
|
2043
2056
|
nextMdWarning(body ?? '', changedPaths, out);
|
|
2044
2057
|
if (!conflictMarkerBlock(changedPaths, cwd, out)) return 1;
|
|
2045
2058
|
publicLeakWarning(changedPaths, deps.runPublicLeakGate ?? ((files, sink) => runPrLandPublicLeakGate(files, sink, cwd, base)), out);
|
|
2046
|
-
if (!exportLeakBlock(changedPaths, () => (deps.runExportLeakCheck ?? runPrLandExportLeakCheck)(changedPaths ?? [], cwd), opts.allowPublicLeak === true, out, cwd,
|
|
2059
|
+
if (!exportLeakBlock(changedPaths, () => (deps.runExportLeakCheck ?? runPrLandExportLeakCheck)(changedPaths ?? [], cwd), opts.allowPublicLeak === true, out, cwd, observeDirect)) return 1;
|
|
2047
2060
|
if (!await exportImportBlock(changedPaths, () => (deps.runExportImportCheck ?? runPrLandExportImportCheck)(changedPaths ?? [], cwd), out)) return 1;
|
|
2048
2061
|
if (publicDocPaths(changedPaths, () => true).length > 0) {
|
|
2049
2062
|
const top = run('git', ['rev-parse', '--show-toplevel'], { cwd });
|