elanous 0.2.36 → 0.2.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 1026-44010f405704050c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 1632.7d87f998e714bede.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
- package/apps/pwa/out/_next/static/chunks/{7784.1f0ac4a16d190cf4.js → 2104.70e086d5174a4736.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6566.926a1d1b7c911442.js → 214.186a430da28338f1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 2415.738b777642a02233.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 3086.fb14b60ce98b53d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3148-98efd4869d660a87.js → 3124-561f7f037943cde2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 3291.f6c1005387d514bd.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 3528.e4b8ab70d339f965.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3031-85328a92fcce4da6.js → 4199-f7c6eb40cd0322f8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +90 -0
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
- package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 5307.d7328020227880c2.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5638.107314dc479e2f37.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6925.562d532110879886.js → 6493.27ad77de7aac7966.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 7161-8f22db3ec5ed005e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 7488.966b116789f3d41a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4116.a84a92a2492c080e.js → 7524.ce973525d30b3d52.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 7628.6b16863ac3972333.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 7954.4f7a8832663ee979.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 8019.21ca554a821dad01.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 8487.291666583bebe640.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 8879.ac06755bcf3e44a1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 8911.bf5e712acb25fb6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 8994d93e.33ba491f95345fc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{599.c39c571b6733f2a2.js → 9223.cbcc88e0e9950426.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8037.e254fd797aa224d1.js → 9581.da63ddf41acfad46.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-e7abc34a48a6f71e.js → page-291ab19fe2acb173.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-c15958835534404b.js → page-6b140f77593576eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → b7459770.6539b11860eb8a9c.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → b7478fef.5917716286213fcc.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{2812ca6a.3b9f4a7a08885744.js → de8b930d.d94c0f42acf807fc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → eaad0cba.771200940c529df7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
- package/apps/pwa/out/_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/graphs/drafts/recipes.yaml +27 -7
- package/graphs/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- 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/run-research.yaml +35 -0
- package/package.json +1 -1
- package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/boundary-proof-mapping-audit.ts +88 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/codex-fallback-live-probe.ts +17 -15
- package/scripts/fleet/node-setup.sh +32 -2
- package/scripts/fleet/run-light-worker.sh +9 -0
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +546 -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/intake-collect-telegram-saved-stage.ts +48 -0
- package/scripts/land-global-checks.ts +69 -1
- package/scripts/measure-nl-routing-corpus.ts +207 -2
- package/scripts/provision-export-redactions.ts +15 -0
- package/scripts/public-copy-lint.ts +122 -0
- package/scripts/public-export.ts +69 -2
- package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
- package/scripts/ratchets/train-side-invariants.sh +7 -1
- package/scripts/release-loop/cut-branch.ts +61 -12
- package/scripts/release-loop/docs-node.ts +140 -0
- 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 +161 -25
- package/scripts/release-loop/gate-partial.ts +82 -3
- package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
- package/scripts/release-loop/gate-radius-live.ts +4 -2
- package/scripts/release-loop/known-issues-node.ts +6 -4
- 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 +2 -1
- package/scripts/release-loop/resume-release.ts +406 -7
- package/scripts/release-loop/resume-test-traffic.ts +10 -0
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/traffic-node.ts +12 -4
- package/scripts/release-loop/traffic-transition.ts +53 -13
- package/scripts/release-loop/version-node.ts +109 -15
- package/scripts/train/green-leg.ts +176 -0
- package/scripts/tui-continue-real-evidence.ts +47 -0
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/client.ts +31 -5
- package/src/acp/core-turn-bridge.ts +12 -1
- package/src/acp/stderr-summary.ts +49 -0
- package/src/agent/monad-agent-turn.ts +1 -0
- package/src/agent/run-context.ts +1 -1
- package/src/agent/task-notification.ts +3 -1
- package/src/agent/terminal-surface.ts +217 -0
- package/src/agent-substrate/pr-reviewer.ts +11 -3
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +537 -57
- package/src/auto-research/question-ladder-contract.ts +137 -0
- package/src/auto-research/research-turn.ts +134 -0
- package/src/autopilot/discovery/doc-lint.ts +1 -1
- package/src/autopilot/lineage/sources.ts +1 -1
- package/src/autopilot/pr-manager.ts +64 -13
- package/src/boot/daemon-runtime.ts +35 -3
- package/src/boot/daemon-tools/pty-shell.ts +2 -1
- package/src/bots/screen-probe.ts +1 -1
- package/src/budget/run-usage-rollup.ts +12 -7
- package/src/budget/unified-usage.ts +20 -0
- package/src/capture/tui-self-report.ts +42 -5
- package/src/chat/index.ts +1 -0
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/autopilot-cli.ts +24 -9
- package/src/cli/decisions-cli.ts +7 -4
- package/src/cli/doctor-cli.ts +116 -7
- package/src/cli/guardian-cli.ts +3 -1
- package/src/cli/intake-cli.ts +48 -12
- package/src/cli/lesson-cli.ts +69 -9
- package/src/cli/logs-cli.ts +357 -2
- package/src/cli/memory-cli.ts +30 -1
- package/src/cli/msg-cli.ts +15 -11
- package/src/cli/pr-granularity.ts +5 -3
- package/src/cli/pr-land-overlap-evidence.ts +38 -5
- package/src/cli/pr-land-refusal.ts +1 -1
- package/src/cli/pty-takeover-cli.ts +58 -5
- package/src/cli/release-checklist-read-cli.ts +112 -4
- package/src/cli/release-cli.ts +89 -18
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +24 -6
- package/src/cli/self-utterances-cli.ts +13 -16
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +370 -33
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/cli/usage-cli.ts +12 -10
- package/src/context-bus/claude-memory-import.ts +99 -0
- package/src/context-bus/context-now.ts +86 -2
- package/src/context-bus/long-term-memory.ts +125 -0
- package/src/core-turn/run-core-turn.ts +9 -2
- package/src/core-turn/run-goal-loop.ts +5 -2
- package/src/core-turn/types.ts +5 -0
- package/src/dashboard/chat/acp-chat.ts +9 -0
- package/src/dashboard/index.ts +115 -30
- package/src/dashboard/input/agent-wake.ts +43 -0
- package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/replay-preview.ts +25 -0
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +19 -8
- package/src/dashboard/synchronized-frame-output.ts +74 -0
- package/src/dashboard/term-slash-runtime.ts +2 -0
- package/src/dashboard/turn-preamble.ts +28 -4
- 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/guardian-tick.ts +9 -0
- package/src/domains/surface-events.ts +80 -1
- 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/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-cli.ts +26 -2
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/graph-run-api.ts +3 -2
- package/src/graph-runner/runner.ts +34 -7
- package/src/graph-wizard/generate.ts +29 -6
- package/src/grok/credential.ts +107 -36
- package/src/harness/harness-cli-command.ts +179 -33
- package/src/harness/review-adapter.ts +26 -6
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +151 -18
- package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
- package/src/intake-plane/collect-telegram-saved.ts +54 -5
- package/src/interactive-terminal-modal.ts +3 -0
- package/src/keybindings.ts +17 -22
- package/src/llm/provider-credentials.ts +1 -1
- package/src/llm/route-decision.ts +13 -0
- package/src/llm-tool-name.ts +37 -0
- package/src/llm-tool-schema.ts +55 -0
- package/src/llm.ts +203 -21
- 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/orchestrator/anomaly-cluster.ts +243 -0
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +55 -7
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/model-tier/llm-tier-map.ts +12 -17
- package/src/msg/msg-store.ts +17 -0
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/graph-wizard-api.ts +27 -2
- 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/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/nexus/state/state.ts +7 -1
- package/src/oauth/codex-account-store.ts +34 -1
- package/src/ops/loops-map.ts +46 -0
- package/src/ops/overview-cache.ts +22 -4
- package/src/ops/overview.ts +41 -5
- package/src/patents/ledger.ts +18 -1
- package/src/policy/llm-policy.ts +3 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +9 -4
- package/src/pty-shell/availability.ts +7 -0
- package/src/pty-shell/herdr-agent-report.ts +40 -31
- 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 +187 -18
- package/src/pty-shell/pty-manifest.ts +16 -2
- package/src/pty-shell/registry.ts +25 -15
- package/src/pty-shell/tui-run-state.ts +235 -1
- package/src/release-loop/checklist.ts +50 -5
- package/src/release-loop/feature-store.ts +9 -9
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/landed-but-yellow.ts +93 -12
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/repl/index.ts +18 -0
- package/src/research/axis-fanout.ts +133 -0
- package/src/research/edge-decision.ts +88 -0
- package/src/research/output-router.ts +127 -0
- package/src/research-bridge/format.ts +16 -1
- package/src/research-bridge/index.ts +1 -0
- package/src/research-bridge/invoke.ts +41 -5
- package/src/seat-loop/seat-report.ts +1 -0
- package/src/self-dev/ask-launch-flow.ts +86 -10
- package/src/self-dev/decompose-proposal.ts +29 -18
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/dev-pipeline.ts +29 -7
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +254 -16
- package/src/self-dev/draft-triage-rules.ts +19 -5
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/review-provider-fallback.ts +45 -7
- package/src/self-dev/run-supervisor.ts +22 -7
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-run.ts +310 -6
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/doctor-visit.ts +108 -0
- package/src/self-implement/gate-artifacts.ts +6 -2
- package/src/self-implement/gate-baseline.ts +99 -1
- package/src/self-implement/gate-cli.ts +231 -82
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-remote.ts +30 -4
- package/src/self-implement/gate-scope.ts +13 -1
- package/src/self-implement/goal-author.ts +407 -21
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +110 -27
- package/src/self-implement/importer-test-index.ts +215 -2
- package/src/self-implement/knowhow-pack.ts +125 -12
- package/src/self-implement/l8-merge-queue.ts +198 -32
- package/src/self-implement/off-diff-evidence.ts +23 -0
- package/src/self-implement/orchestrator.ts +369 -33
- package/src/self-implement/pod-inplace-worktree.ts +82 -0
- package/src/self-implement/pod-warm-pool-profile.ts +2 -2
- package/src/self-implement/premise-review.ts +7 -5
- package/src/self-implement/review-round-brief.ts +300 -0
- package/src/self-implement/rework-policy.ts +14 -0
- package/src/self-implement/run-ledger.ts +428 -6
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/running-runs.ts +17 -3
- package/src/self-implement/seams.ts +45 -16
- package/src/self-implement/self-implement-cli.ts +26 -2
- 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/session/channel-ask-op-envelope.ts +36 -0
- package/src/session/channel-op-reply-route.ts +200 -0
- package/src/session/chat.ts +10 -1
- package/src/session/id-prefix.ts +60 -0
- package/src/session/index.ts +6 -0
- package/src/session-runtime/index.ts +18 -23
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/pty.ts +5 -0
- package/src/skills/tools/schedule-wakeup.ts +1 -6
- package/src/status/bar.ts +3 -3
- package/src/status/metrics.ts +12 -1
- package/src/steward/rejudge-tick.ts +12 -5
- package/src/steward/resync-tick.ts +31 -4
- package/src/storage/file-lock.ts +17 -4
- package/src/task-agent/actions.ts +199 -4
- package/src/task-agent/adopt-pr.ts +63 -2
- 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/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/green-close-recipe.ts +239 -0
- package/src/task-agent/green-sweep.ts +64 -10
- package/src/task-agent/live-moves.ts +48 -3
- 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/parent-host.ts +74 -17
- package/src/task-agent/rejudge-on-head.ts +72 -5
- package/src/task-agent/repair-cycle.ts +108 -8
- package/src/task-agent/repair-next-move.ts +12 -2
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/review-prior-fix.ts +12 -2
- package/src/task-agent/shadow.ts +188 -5
- package/src/task-agent/task-hand.ts +253 -20
- package/src/task-agent/task-parent-role-llm.ts +9 -0
- package/src/task-agent/tier-split.ts +40 -5
- 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-artifact-return.ts +16 -6
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
- 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-pool.ts +77 -8
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +338 -79
- package/src/task-orchestrator/surfaces/self-implement.ts +37 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -0
- package/src/testing/linux-env.ts +177 -0
- package/src/tool-hints/gate.ts +6 -4
- package/src/tool-hints/signals.ts +33 -1
- package/src/tui/chat/background-job-status.ts +8 -2
- package/src/tui/chat/goal-interim.ts +5 -1
- package/src/tui/entry.ts +722 -30
- package/src/tui/input/at-picker.ts +55 -0
- package/src/tui/sidetab/attach.ts +304 -0
- package/src/tui/sidetab/list.ts +176 -0
- package/src/tui/sidetab/nl-tool.ts +136 -0
- package/src/tui/slash/resume-command.ts +23 -0
- package/src/tui/slash/resume.ts +38 -35
- package/src/tui/slash/signals.ts +114 -0
- package/src/tui/slash/term-next.ts +72 -0
- package/src/tui-client/local-chat-turn.ts +31 -9
- package/src/user-config.ts +30 -3
- package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
- package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
- package/src/ux-sim/fake-gh.ts +174 -0
- package/src/ux-sim/fake-kubectl.ts +142 -0
- package/src/ux-sim/fake-llm.ts +17 -6
- package/src/ux-sim/next-tui-seat-scenarios.ts +176 -6
- 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/task-agent-parent-host-device.ts +264 -0
- package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +0 -64
- package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
- package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
- package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
- package/apps/pwa/out/_next/static/chunks/2986.45d7652e4f13557e.js +0 -2
- package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
- package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
- package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
- package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
- package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
- package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +0 -1
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
- package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
- package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7481.39f7a4654907bf6e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
- package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
- package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ccae1c4b-0cf414f5eff1b10d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
- package/scripts/migrate-monad-to-elanous.ts +0 -195
- package/scripts/rebrand-elanous.ts +0 -242
- /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
|
@@ -6,6 +6,7 @@ import { readNexusRuntime } from '../nexus/runtime.js';
|
|
|
6
6
|
import { TASK_CARD_PREFIX } from '../task-agent/task-card-prefix.js';
|
|
7
7
|
import type { Task } from '../task-orchestrator/types.js';
|
|
8
8
|
import type { TasksCliDeps } from './tasks-cli.js';
|
|
9
|
+
import { writeStdoutFully } from './stdout-flush.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* CLI-ENTRY-LAZY — `tasks list`·`tasks show` 의 등록과 넥서스 조회 보조.
|
|
@@ -100,6 +101,7 @@ export function handleError(error: unknown, out: (line: string) => void): void {
|
|
|
100
101
|
export interface TasksCliContext {
|
|
101
102
|
deps: TasksCliDeps;
|
|
102
103
|
out: (line: string) => void;
|
|
104
|
+
outFully: (line: string) => Promise<void>;
|
|
103
105
|
authenticate: () => { baseUrl: string; token?: string };
|
|
104
106
|
clearToken: () => void;
|
|
105
107
|
}
|
|
@@ -107,9 +109,15 @@ export interface TasksCliContext {
|
|
|
107
109
|
export function createTasksCliContext(deps: TasksCliDeps): TasksCliContext {
|
|
108
110
|
let activeToken: string | undefined;
|
|
109
111
|
const output = deps.output ?? console.log;
|
|
112
|
+
const maskToken = (line: string) => activeToken ? line.replaceAll(activeToken, '[redacted]') : line;
|
|
110
113
|
return {
|
|
111
114
|
deps,
|
|
112
|
-
out: (line: string) => output(
|
|
115
|
+
out: (line: string) => output(maskToken(line)),
|
|
116
|
+
outFully: async (line: string) => {
|
|
117
|
+
const safeLine = maskToken(line);
|
|
118
|
+
if (deps.output) output(safeLine);
|
|
119
|
+
else await writeStdoutFully(safeLine);
|
|
120
|
+
},
|
|
113
121
|
authenticate: () => {
|
|
114
122
|
const auth = credentials(deps);
|
|
115
123
|
activeToken = auth?.token;
|
|
@@ -126,7 +134,7 @@ export function registerTasksRoot(program: Command): Command {
|
|
|
126
134
|
}
|
|
127
135
|
|
|
128
136
|
export function registerTaskListCommand(tasks: Command, ctx: TasksCliContext): void {
|
|
129
|
-
const { deps, out, authenticate } = ctx;
|
|
137
|
+
const { deps, out, outFully, authenticate } = ctx;
|
|
130
138
|
tasks.command('list')
|
|
131
139
|
.description('우선순위와 생성 시각 순으로 태스크 보기')
|
|
132
140
|
.option('--status <s>', '상태로 필터')
|
|
@@ -152,7 +160,7 @@ export function registerTaskListCommand(tasks: Command, ctx: TasksCliContext): v
|
|
|
152
160
|
if (!opts.provider || (data.task.generatedBy?.kind === 'external' && data.task.generatedBy.provider === opts.provider)) rows.push(data.task);
|
|
153
161
|
}
|
|
154
162
|
rows.sort(taskOrder);
|
|
155
|
-
if (opts.json)
|
|
163
|
+
if (opts.json) await outFully(JSON.stringify(rows));
|
|
156
164
|
else {
|
|
157
165
|
out('id\t우선순위\t상태\t승인\t출처\t제목');
|
|
158
166
|
for (const row of rows) out(taskLine(row));
|
|
@@ -162,7 +170,7 @@ export function registerTaskListCommand(tasks: Command, ctx: TasksCliContext): v
|
|
|
162
170
|
}
|
|
163
171
|
|
|
164
172
|
export function registerTaskShowCommand(tasks: Command, ctx: TasksCliContext): void {
|
|
165
|
-
const { deps, out, authenticate } = ctx;
|
|
173
|
+
const { deps, out, outFully, authenticate } = ctx;
|
|
166
174
|
tasks.command('show <id>')
|
|
167
175
|
.description(`태스크 상세 보기 (id 가 \`${TASK_CARD_PREFIX}\` 로 시작하면 TASK-AGENT 과제 카드 ⊕ 다음 수)`)
|
|
168
176
|
.option('--json', 'JSON 출력')
|
|
@@ -179,7 +187,7 @@ export function registerTaskShowCommand(tasks: Command, ctx: TasksCliContext): v
|
|
|
179
187
|
if (!response.ok) throw httpError(response);
|
|
180
188
|
const data = await responseJson(response) as { task?: TaskRow };
|
|
181
189
|
if (!data?.task) throw new Error('넥서스 태스크 상세 형식이 유효하지 않다');
|
|
182
|
-
if (opts.json)
|
|
190
|
+
if (opts.json) await outFully(JSON.stringify(data));
|
|
183
191
|
else {
|
|
184
192
|
out(taskLine(data.task));
|
|
185
193
|
out(JSON.stringify(data, null, 2));
|
package/src/cli/usage-cli.ts
CHANGED
|
@@ -75,13 +75,14 @@ function configuredUsageHosts(): { local: string; remote: string[] } {
|
|
|
75
75
|
return { local, remote: [...new Set(entries.map((entry) => entry.host?.trim()).filter((host): host is string => !!host && host !== local))] };
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
type UsageAxis = 'stage' | 'phase' | 'model' | 'account';
|
|
78
|
+
type UsageAxis = 'stage' | 'phase' | 'model' | 'account' | 'job';
|
|
79
79
|
type ExtendedRunUsageInput = RunUsageInput & { stage?: string | null; account?: string | null; origin?: string; podJob?: string; job?: string; measured?: boolean };
|
|
80
80
|
type AxisUsageRow = {
|
|
81
81
|
stage?: string;
|
|
82
82
|
phase?: string;
|
|
83
83
|
model?: string;
|
|
84
84
|
account?: string;
|
|
85
|
+
job?: string;
|
|
85
86
|
hostIds: string[];
|
|
86
87
|
calls: number;
|
|
87
88
|
inputTokens: number;
|
|
@@ -98,7 +99,7 @@ type AxisUsageRow = {
|
|
|
98
99
|
};
|
|
99
100
|
|
|
100
101
|
type FederatedUsageRow = {
|
|
101
|
-
runId?: string; role?: string; site?: string; stage?: string; phase?: string; model?: string; account?: string;
|
|
102
|
+
runId?: string; role?: string; site?: string; stage?: string; phase?: string; model?: string; account?: string; job?: string;
|
|
102
103
|
billingProvider?: string; billing?: string; hostIds: string[]; rankUsd?: number;
|
|
103
104
|
calls: number; inputTokens: number; outputTokens: number; cacheReadInputTokens: number;
|
|
104
105
|
cacheCreationInputTokens: number; reasoningOutputTokens: number; usdKnown: number;
|
|
@@ -123,7 +124,7 @@ function validUsageRows(value: unknown, axis: 'run' | 'role' | UsageAxis): value
|
|
|
123
124
|
const number = row[field];
|
|
124
125
|
return typeof number === 'number' && Number.isFinite(number) && number >= 0;
|
|
125
126
|
})
|
|
126
|
-
&& (axis !== 'stage' && axis !== 'phase' && axis !== 'model' && axis !== 'account'
|
|
127
|
+
&& (axis !== 'stage' && axis !== 'phase' && axis !== 'model' && axis !== 'account' && axis !== 'job'
|
|
127
128
|
|| typeof row.rankUsd === 'number' && Number.isFinite(row.rankUsd));
|
|
128
129
|
});
|
|
129
130
|
}
|
|
@@ -138,7 +139,7 @@ function mergeUsageRows(groups: readonly FederatedUsageRow[][], axis: 'run' | 'r
|
|
|
138
139
|
if (!previous) { merged.set(key, { ...row, hostIds: [...row.hostIds] }); continue; }
|
|
139
140
|
for (const field of SUM_FIELDS) previous[field] += row[field];
|
|
140
141
|
previous.hostIds = [...new Set([...previous.hostIds, ...row.hostIds])];
|
|
141
|
-
if (axis === 'stage' || axis === 'phase' || axis === 'model' || axis === 'account') previous.rankUsd = previous.usdKnown + previous.apiEquivalentUsd;
|
|
142
|
+
if (axis === 'stage' || axis === 'phase' || axis === 'model' || axis === 'account' || axis === 'job') previous.rankUsd = previous.usdKnown + previous.apiEquivalentUsd;
|
|
142
143
|
}
|
|
143
144
|
return [...merged.values()];
|
|
144
145
|
}
|
|
@@ -188,6 +189,7 @@ function rollupByAxis(inputs: readonly ExtendedRunUsageInput[], axis: UsageAxis)
|
|
|
188
189
|
for (const data of inputs) {
|
|
189
190
|
const value = axis === 'stage' ? stageForUsage(data)
|
|
190
191
|
: axis === 'phase' ? (typeof data.phase === 'string' && data.phase.length > 0 ? data.phase : '(none)')
|
|
192
|
+
: axis === 'job' ? (typeof data.jobKind === 'string' && data.jobKind.length > 0 ? data.jobKind : '(none)')
|
|
191
193
|
: axis === 'model' ? (data.model || '(none)')
|
|
192
194
|
: (data.account || '(none)');
|
|
193
195
|
const group = groups.get(value) ?? [];
|
|
@@ -218,7 +220,7 @@ function rollupByAxis(inputs: readonly ExtendedRunUsageInput[], axis: UsageAxis)
|
|
|
218
220
|
}
|
|
219
221
|
|
|
220
222
|
function isUsageAxis(value: string): value is 'run' | 'role' | UsageAxis {
|
|
221
|
-
return value === 'run' || value === 'role' || value === 'stage' || value === 'phase' || value === 'model' || value === 'account';
|
|
223
|
+
return value === 'run' || value === 'role' || value === 'stage' || value === 'phase' || value === 'model' || value === 'account' || value === 'job';
|
|
222
224
|
}
|
|
223
225
|
|
|
224
226
|
function formatAxisUsage(row: AxisUsageRow, axis: UsageAxis): string {
|
|
@@ -260,7 +262,7 @@ export function registerUsageCommand(program: Command, deps: UsageCliDeps = {}):
|
|
|
260
262
|
.action((opts: { run?: string; by: string; since?: string; hosts?: string; json?: boolean }, command: Command) => {
|
|
261
263
|
const json = opts.json || command.optsWithGlobals<{ json?: boolean }>().json;
|
|
262
264
|
if (!isUsageAxis(opts.by)) {
|
|
263
|
-
out.log('⛔ --by 는 run | role | stage | model | account');
|
|
265
|
+
out.log('⛔ --by 는 run | role | stage | phase | model | account | job');
|
|
264
266
|
exit(2);
|
|
265
267
|
return;
|
|
266
268
|
}
|
|
@@ -300,14 +302,14 @@ export function registerUsageCommand(program: Command, deps: UsageCliDeps = {}):
|
|
|
300
302
|
const complete = !rosterReason && hosts.every((host) => host.status === 'ok');
|
|
301
303
|
const rows = mergeUsageRows(parts, opts.by as 'run' | 'role' | UsageAxis);
|
|
302
304
|
if (opts.by === 'role') rows.sort((a, b) => b.calls - a.calls);
|
|
303
|
-
if (opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account') rows.sort((a, b) => (b.rankUsd ?? 0) - (a.rankUsd ?? 0) || b.calls - a.calls);
|
|
305
|
+
if (opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account' || opts.by === 'job') rows.sort((a, b) => (b.rankUsd ?? 0) - (a.rankUsd ?? 0) || b.calls - a.calls);
|
|
304
306
|
if (json) { out.log(JSON.stringify({ rows, hosts, complete, ...(rosterReason ? { reason: rosterReason } : {}) }, null, 2)); return; }
|
|
305
307
|
out.log(`호스트 ${hosts.filter((host) => host.status === 'ok').length}/${hosts.length} 측정 · ${complete ? '완결' : '부분 합계'}`);
|
|
306
308
|
if (rosterReason) out.log(`호스트 목록: 못 잼 (${rosterReason})`);
|
|
307
309
|
for (const host of hosts) if (host.status === 'unmeasured') out.log(`${host.host}: 못 잼 (${host.reason})`);
|
|
308
310
|
if (rows.length === 0) { out.log('(일치하는 런 사용량 없음)'); return; }
|
|
309
311
|
for (const row of rows) {
|
|
310
|
-
if (opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account') out.log(formatAxisUsage(row as AxisUsageRow, opts.by));
|
|
312
|
+
if (opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account' || opts.by === 'job') out.log(formatAxisUsage(row as AxisUsageRow, opts.by));
|
|
311
313
|
else if (opts.by === 'role') out.log(`${row.role} ${row.site} ${row.model} ${row.billingProvider}/${row.billing} calls=${row.calls} input=${row.inputTokens} output=${row.outputTokens} usdKnown=${row.usdKnown} unknownCostCalls=${row.unknownCostCalls} includedCalls=${row.includedCalls} apiEquivalentUsd=${row.apiEquivalentUsd}`);
|
|
312
314
|
else out.log(`${row.runId} ${row.model} ${row.billingProvider}/${row.billing} hosts=${row.hostIds.join(',') || '(none)'} calls=${row.calls} input=${row.inputTokens} output=${row.outputTokens} cacheRead=${row.cacheReadInputTokens} cacheCreation=${row.cacheCreationInputTokens} reasoning=${row.reasoningOutputTokens} usdKnown=${row.usdKnown} unknownCostCalls=${row.unknownCostCalls} includedCalls=${row.includedCalls} apiEquivalentUsd=${row.apiEquivalentUsd}`);
|
|
313
315
|
}
|
|
@@ -325,14 +327,14 @@ export function registerUsageCommand(program: Command, deps: UsageCliDeps = {}):
|
|
|
325
327
|
localFailure = '로컬 logs.db 조회 실패';
|
|
326
328
|
}
|
|
327
329
|
}
|
|
328
|
-
const unwrapPod = opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account';
|
|
330
|
+
const unwrapPod = opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account' || opts.by === 'job';
|
|
329
331
|
// ⭐ METER-POD-ROLLUP-GAP-2 — Pod 사용량 재방출 행(podRollupKey)은 «더 완전한 한 행»만 센다(키 없는 행은 그대로).
|
|
330
332
|
const selected = rows.map((row) => usageData(row, unwrapPod))
|
|
331
333
|
.filter((data): data is ExtendedRunUsageInput => data !== null)
|
|
332
334
|
.filter((data) => opts.run === undefined || data.runId === opts.run);
|
|
333
335
|
// A returned Pod raw row and its host rollup describe the same usage. Keep raw rows when no measured rollup exists.
|
|
334
336
|
const inputs = dedupePodRollupRows(unwrapPod ? excludeCoveredPodRawRows(selected) : selected);
|
|
335
|
-
if (opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account') {
|
|
337
|
+
if (opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account' || opts.by === 'job') {
|
|
336
338
|
const report = rollupByAxis(inputs, opts.by);
|
|
337
339
|
if (opts.hosts === 'all') { emitFederated(report, localFailure); return; }
|
|
338
340
|
if (json) {
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude 자동 기억(`~/.claude/projects/<project>/memory/*.md`) → 엘라누스 장기 기억 저장소
|
|
3
|
+
* (MEMORY-IMPORT-CLAUDE · 대표 10-12). 변환은 `long-term-memory.ts` 의 순수 함수가 맡고, 여기는
|
|
4
|
+
* «파일 읽기 ⊕ 저장(name 중복이면 덮어쓰기)» 만 둔다 — 생산 호출자는 `elanous memory import-claude`
|
|
5
|
+
* (`src/cli/memory-cli.ts`) 다.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
import { basename, join } from 'node:path';
|
|
10
|
+
import {
|
|
11
|
+
importClaudeMemories,
|
|
12
|
+
type ClaudeMemoryFile, type ClaudeMemoryImport, type ClaudeMemoryItem, type ClaudeMemoryType,
|
|
13
|
+
} from './long-term-memory.js';
|
|
14
|
+
|
|
15
|
+
/** 저장소에 쓸 레코드 — 큐레이션 기억 파일 하나로 떨어진다. */
|
|
16
|
+
export interface ClaudeMemorySaveRecord {
|
|
17
|
+
/** 같은 name 이 이미 있으면 그 id 로 덮어쓴다. */
|
|
18
|
+
id?: string;
|
|
19
|
+
type: ClaudeMemoryType;
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
/** 낡음 표시 ⊕ 본문 ⊕ 출처 링크. */
|
|
23
|
+
body: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface ClaudeMemoryStoreDeps {
|
|
27
|
+
/** 저장소의 현재 기억 목록 — name 중복 판정용. */
|
|
28
|
+
list: () => Array<{ id: string; name: string }>;
|
|
29
|
+
/** 장기 기억 쓰기(생산 구현 = `saveMemory`). */
|
|
30
|
+
save: (record: ClaudeMemorySaveRecord) => void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ClaudeMemoryApplyResult extends ClaudeMemoryImport {
|
|
34
|
+
/** 새로 만든 수 */
|
|
35
|
+
saved: number;
|
|
36
|
+
/** 같은 name 을 덮어쓴 수 */
|
|
37
|
+
updated: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** 기본 뿌리 — `~/.claude/projects`(프로젝트별 `memory/` 를 훑는다). */
|
|
41
|
+
export function claudeMemoryRoot(): string {
|
|
42
|
+
return join(homedir(), '.claude', 'projects');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** 가져온 레코드 → 저장소 레코드. 낡음 표시가 본문에 남아 화면·주입에서 바로 보인다. */
|
|
46
|
+
export function claudeMemoryStoreRecord(item: ClaudeMemoryItem, id?: string): ClaudeMemorySaveRecord {
|
|
47
|
+
return {
|
|
48
|
+
id,
|
|
49
|
+
type: item.type,
|
|
50
|
+
name: item.name,
|
|
51
|
+
description: item.description,
|
|
52
|
+
body: [item.summary, item.body, `source: ${item.source}`, `updated: ${item.updatedAt}`]
|
|
53
|
+
.filter(Boolean).join('\n\n'),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* `root` 아래 Claude 기억 파일을 모두 읽는다. `root` 가 `~/.claude/projects` 여도 되고
|
|
59
|
+
* `.../memory` 디렉터리 자체여도 된다. 색인 파일(`MEMORY.md`)은 기억이 아니므로 뺀다.
|
|
60
|
+
*/
|
|
61
|
+
export function collectClaudeMemoryFiles(root: string = claudeMemoryRoot()): ClaudeMemoryFile[] {
|
|
62
|
+
if (!existsSync(root)) return [];
|
|
63
|
+
const dirs = new Set<string>();
|
|
64
|
+
for (const entry of readdirSync(root, { withFileTypes: true })) {
|
|
65
|
+
if (entry.isDirectory()) {
|
|
66
|
+
const memoryDir = join(root, entry.name, 'memory');
|
|
67
|
+
if (existsSync(memoryDir)) dirs.add(memoryDir);
|
|
68
|
+
} else if (basename(root) === 'memory' && entry.isFile() && entry.name.endsWith('.md')) {
|
|
69
|
+
dirs.add(root);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const files: ClaudeMemoryFile[] = [];
|
|
73
|
+
for (const dir of [...dirs].sort()) {
|
|
74
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
75
|
+
if (!entry.isFile() || !entry.name.endsWith('.md') || entry.name === 'MEMORY.md') continue;
|
|
76
|
+
const path = join(dir, entry.name);
|
|
77
|
+
files.push({ path, text: readFileSync(path, 'utf8') });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return files.sort((a, b) => a.path.localeCompare(b.path));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** 파일들 → 장기 기억. 같은 name 이 저장소에 이미 있으면 그 id 로 덮어쓴다(새 파일을 만들지 않는다). */
|
|
84
|
+
export function applyClaudeMemoryImport(
|
|
85
|
+
files: readonly ClaudeMemoryFile[],
|
|
86
|
+
options: { asOf: string },
|
|
87
|
+
deps: ClaudeMemoryStoreDeps,
|
|
88
|
+
): ClaudeMemoryApplyResult {
|
|
89
|
+
const imported = importClaudeMemories(files, options);
|
|
90
|
+
const existing = new Map(deps.list().map(entry => [entry.name, entry.id]));
|
|
91
|
+
let saved = 0;
|
|
92
|
+
let updated = 0;
|
|
93
|
+
for (const item of imported.items) {
|
|
94
|
+
const id = existing.get(item.name);
|
|
95
|
+
deps.save(claudeMemoryStoreRecord(item, id));
|
|
96
|
+
if (id) updated += 1; else saved += 1;
|
|
97
|
+
}
|
|
98
|
+
return { ...imported, saved, updated };
|
|
99
|
+
}
|
|
@@ -16,7 +16,7 @@ import { filterPublicDemoContext } from './context-now-public.js';
|
|
|
16
16
|
|
|
17
17
|
export type ContextFact =
|
|
18
18
|
| { kind: 'version'; version: string; source: string }
|
|
19
|
-
| { kind: 'cell'; version: string; id: string; title: string; status: string; owner: string | null; source: string }
|
|
19
|
+
| { kind: 'cell'; version: string; id: string; title: string; status: string; owner: string | null; source: string; priority?: string | null }
|
|
20
20
|
| { kind: 'decision'; id: string; title: string; status: string; dueAt: string | null; source: string }
|
|
21
21
|
| { kind: 'seat'; seat: string; at: string; status: string; id: string | null; title: string | null; source: string }
|
|
22
22
|
| { kind: 'run'; goal: string; phase: string; elapsed: string; source: string; unreadable?: string }
|
|
@@ -157,7 +157,8 @@ export function contextNow(options: { topic?: string; limit?: number; audience?:
|
|
|
157
157
|
for (const item of checklist.items) {
|
|
158
158
|
if (item.status === 'done') continue;
|
|
159
159
|
facts.push({ kind: 'cell', version: v, id: item.id, title: redactSecretText(item.title.split(/\r?\n/, 1)[0] ?? '').slice(0, 120),
|
|
160
|
-
status: item.status, owner: item.owner ?? null,
|
|
160
|
+
status: item.status, owner: item.owner ?? null, priority: item.priority ?? null,
|
|
161
|
+
source: `elanous://release/${v}/checklist#${encodeURIComponent(item.id)}` });
|
|
161
162
|
}
|
|
162
163
|
}
|
|
163
164
|
for (const item of (deps.decisions ?? (() => new DecisionLedger().list({ status: 'open' })))()) {
|
|
@@ -218,6 +219,89 @@ export function contextNow(options: { topic?: string; limit?: number; audience?:
|
|
|
218
219
|
return options.audience === 'public-demo' ? filterPublicDemoContext(answer, deps.brandCheck) : answer;
|
|
219
220
|
}
|
|
220
221
|
|
|
222
|
+
export type AskOpContextTopic = 'release' | 'required' | 'train' | 'incident' | 'decision' | 'general';
|
|
223
|
+
export type AskOpContextBundle = {
|
|
224
|
+
queriedAt: string;
|
|
225
|
+
topic: AskOpContextTopic;
|
|
226
|
+
facts: Array<{ kind: string; summary: string; source: string; observedAt: string }>;
|
|
227
|
+
gaps: Array<{ kind: string; reason: string }>;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
function askOpTopic(question: string): AskOpContextTopic {
|
|
231
|
+
const text = question.toLocaleLowerCase();
|
|
232
|
+
if (/열차|착지|병합|merge|train|pull request|\bpr\b/.test(text)) return 'train';
|
|
233
|
+
if (/사고|장애|incident|failure|실패|에러|오류/.test(text)) return 'incident';
|
|
234
|
+
if (/결정|승인|decision|approval/.test(text)) return 'decision';
|
|
235
|
+
if (/필수|p0|must|required|우선순위/.test(text)) return 'required';
|
|
236
|
+
if (/발행|출시|릴리스|release|컷|cut|게이트|gate|이번 판|다음 판|판 진도|\b\d+\.\d+\.\d+\b/.test(text)) return 'release';
|
|
237
|
+
return 'general';
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** A small evidence packet for an OP answer. A missing source stays a gap, never an inferred fact. */
|
|
241
|
+
export function buildAskOpContextBundle(
|
|
242
|
+
question: string,
|
|
243
|
+
snapshot: ContextNowAnswer,
|
|
244
|
+
options: { audience?: 'operator' | 'public-demo'; limit?: number } = {},
|
|
245
|
+
): AskOpContextBundle {
|
|
246
|
+
const answer = options.audience === 'public-demo' ? filterPublicDemoContext(snapshot) : snapshot;
|
|
247
|
+
const topic = askOpTopic(question);
|
|
248
|
+
const limit = typeof options.limit === 'number' && Number.isFinite(options.limit)
|
|
249
|
+
? Math.max(1, Math.min(20, Math.floor(options.limit))) : 8;
|
|
250
|
+
const facts: AskOpContextBundle['facts'] = [];
|
|
251
|
+
const gaps: AskOpContextBundle['gaps'] = [];
|
|
252
|
+
const pushFact = (kind: string, summary: string, source: string, observedAt: string) => {
|
|
253
|
+
if (facts.length < limit) facts.push({ kind, summary: oneLine(summary), source, observedAt });
|
|
254
|
+
};
|
|
255
|
+
const relevant = (kind: ContextFact['kind']) => topic === 'general'
|
|
256
|
+
|| (topic === 'release' && (kind === 'release' || kind === 'version'))
|
|
257
|
+
|| (topic === 'required' && kind === 'cell')
|
|
258
|
+
|| (topic === 'decision' && kind === 'decision')
|
|
259
|
+
|| (topic === 'incident' && kind === 'run');
|
|
260
|
+
for (const fact of answer.facts) {
|
|
261
|
+
if (!relevant(fact.kind)) continue;
|
|
262
|
+
if ('unreadable' in fact && fact.unreadable) {
|
|
263
|
+
gaps.push({ kind: fact.kind, reason: fact.unreadable });
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
if (topic === 'required' && fact.kind === 'cell' && fact.priority !== 'P0') continue;
|
|
267
|
+
if (topic === 'incident' && fact.kind === 'run' && !/fail|error|timeout|실패|오류|정지|중단/i.test(`${fact.phase} ${fact.goal}`)) continue;
|
|
268
|
+
if (topic === 'train') continue;
|
|
269
|
+
const summary = fact.kind === 'version' ? `판 ${fact.version}`
|
|
270
|
+
: fact.kind === 'cell' ? `${fact.id} ${fact.status} ${fact.title}`
|
|
271
|
+
: fact.kind === 'decision' ? `${fact.id} ${fact.status} ${fact.title}`
|
|
272
|
+
: fact.kind === 'seat' ? `${fact.seat} ${fact.status} ${fact.id ?? ''}`
|
|
273
|
+
: fact.kind === 'run' ? `${fact.goal} ${fact.phase} ${fact.elapsed}`
|
|
274
|
+
: fact.kind === 'release' ? `${fact.version} ${fact.node} ${fact.status}`
|
|
275
|
+
: `${fact.count ?? '미관측'}건 ${fact.names.join(', ')}`;
|
|
276
|
+
pushFact(fact.kind, summary, fact.source, fact.kind === 'seat' ? fact.at : answer.at);
|
|
277
|
+
}
|
|
278
|
+
const eventMatches = (kind: string, summary: string) => topic === 'general'
|
|
279
|
+
|| (topic === 'train' && /train|열차|착지|병합|merge|\bpr\b/i.test(`${kind} ${summary}`))
|
|
280
|
+
|| (topic === 'incident' && /incident|사고|장애|failure|실패|에러|오류|timeout/i.test(`${kind} ${summary}`));
|
|
281
|
+
for (const event of answer.events) {
|
|
282
|
+
if (eventMatches(event.kind, event.summary)) pushFact(event.kind, event.summary, event.source, event.at);
|
|
283
|
+
}
|
|
284
|
+
if (topic === 'required' && !facts.length) {
|
|
285
|
+
const cells = answer.facts.filter(fact => fact.kind === 'cell');
|
|
286
|
+
if (cells.some(fact => fact.priority == null)) gaps.push({ kind: 'cell', reason: '우선순위 미관측' });
|
|
287
|
+
else if (cells.length) gaps.push({ kind: 'cell', reason: '조회 범위에서 일치하는 P0 없음' });
|
|
288
|
+
}
|
|
289
|
+
if (!facts.length && !gaps.length) gaps.push({ kind: topic, reason: '미관측' });
|
|
290
|
+
if (topic === 'release' && !answer.facts.some(fact => fact.kind === 'release' && !('unreadable' in fact && fact.unreadable))
|
|
291
|
+
&& !gaps.some(gap => gap.kind === 'release')) gaps.push({ kind: 'release', reason: '미관측' });
|
|
292
|
+
return { queriedAt: answer.at, topic, facts, gaps: gaps.slice(0, 3) };
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/** Worker scan keeps ledger IO away from the OP inbox turn; the packet itself is bounded. */
|
|
296
|
+
export async function askOpContextBundle(
|
|
297
|
+
question: string,
|
|
298
|
+
options: { audience?: 'operator' | 'public-demo'; limit?: number } = {},
|
|
299
|
+
readSnapshot: () => Promise<ContextNowAnswer> = () => contextNowInWorker({ audience: 'operator', limit: 100 }),
|
|
300
|
+
): Promise<AskOpContextBundle> {
|
|
301
|
+
try { return buildAskOpContextBundle(question, await readSnapshot(), { ...options, audience: options.audience ?? 'public-demo' }); }
|
|
302
|
+
catch { return { queriedAt: new Date().toISOString(), topic: askOpTopic(question), facts: [], gaps: [{ kind: 'context', reason: '조회 실패' }] }; }
|
|
303
|
+
}
|
|
304
|
+
|
|
221
305
|
const workerAnswers = new Map<string, { promise: Promise<ContextNowAnswer>; expiresAt: number }>();
|
|
222
306
|
const WORKER_ANSWER_TTL_MS = 5_000;
|
|
223
307
|
const WORKER_SCAN_TIMEOUT_MS = 60_000;
|
|
@@ -302,3 +302,128 @@ export async function condenseContextWindowWithReport(
|
|
|
302
302
|
catch { /* Observation must not stop condensation. */ }
|
|
303
303
|
return { cards, skipped, folded, droppedHarnessChild, funnel };
|
|
304
304
|
}
|
|
305
|
+
|
|
306
|
+
// ─── Claude 자동 기억 가져오기 (MEMORY-IMPORT-CLAUDE · 대표 10-12) ──────────────────────────────
|
|
307
|
+
// `~/.claude/projects/<project>/memory/*.md` 의 frontmatter(name·description·type)를 엘라누스
|
|
308
|
+
// 장기 기억 레코드로 옮긴다. 파일 읽기·저장은 호출자 몫 — 여기는 순수 변환만 둔다(에이전트 무관).
|
|
309
|
+
|
|
310
|
+
/** Claude 기억 파일 frontmatter 의 type 값 — 큐레이션 기억 type 어휘와 같다. */
|
|
311
|
+
export type ClaudeMemoryType = 'user' | 'feedback' | 'project' | 'reference';
|
|
312
|
+
|
|
313
|
+
/** 가져온 기억이 앉는 신뢰 사다리 맨 아래 칸 — 승격된 카드·결정을 덮지 않는다. */
|
|
314
|
+
export const CLAUDE_MEMORY_TRUST = 'memory';
|
|
315
|
+
|
|
316
|
+
/** 가져온 기억의 seat 표식 — 어떤 에이전트(codex·elanous TUI)든 같은 자리에서 읽는다. */
|
|
317
|
+
export const CLAUDE_MEMORY_SEAT = 'claude-memory';
|
|
318
|
+
|
|
319
|
+
/** 디스크에서 읽은 Claude 기억 파일 하나(경로 ⊕ 원문). */
|
|
320
|
+
export interface ClaudeMemoryFile { path: string; text: string }
|
|
321
|
+
|
|
322
|
+
/** MemoryItem 계약에 파일 자신의 이름 3종(name·description·type)을 그대로 얹은 레코드. */
|
|
323
|
+
export interface ClaudeMemoryItem extends MemoryItem {
|
|
324
|
+
name: string;
|
|
325
|
+
description: string;
|
|
326
|
+
type: ClaudeMemoryType;
|
|
327
|
+
body: string;
|
|
328
|
+
trust: typeof CLAUDE_MEMORY_TRUST;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export type ClaudeMemorySkipReason = 'no-frontmatter' | 'no-name' | 'no-description' | 'unknown-type';
|
|
332
|
+
|
|
333
|
+
export interface ClaudeMemoryImport {
|
|
334
|
+
items: ClaudeMemoryItem[];
|
|
335
|
+
/** 같은 name 이 두 번 나오면 뒤 파일이 이긴다(덮어쓰기). */
|
|
336
|
+
overwritten: number;
|
|
337
|
+
skipped: Partial<Record<ClaudeMemorySkipReason, number>>;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const CLAUDE_MEMORY_TYPES: readonly ClaudeMemoryType[] = ['user', 'feedback', 'project', 'reference'];
|
|
341
|
+
|
|
342
|
+
/** 출처 표시 — 원장의 `^(https?://|elanous://)` 링크 계약을 넓히지 않고 그대로 만족한다. */
|
|
343
|
+
export function claudeMemorySource(name: string): string {
|
|
344
|
+
return `elanous://claude-memory/${encodeURIComponent(name.trim())}`;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/** 낡음 표시 — «10-14 기준» 처럼 기준일의 월-일을 남긴다. */
|
|
348
|
+
export function claudeMemoryStalenessNote(asOf: string): string {
|
|
349
|
+
return `«${claudeMemoryInstant(asOf).slice(5, 10)} 기준»`;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function claudeMemoryInstant(asOf: string): string {
|
|
353
|
+
const ms = Date.parse(asOf);
|
|
354
|
+
if (!Number.isFinite(ms)) throw new Error(`claude memory asOf is not a date: ${asOf}`);
|
|
355
|
+
return new Date(ms).toISOString();
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function claudeFrontmatter(text: string): { fields: Record<string, string>; body: string } | undefined {
|
|
359
|
+
const normalized = text.replace(/^\uFEFF/, '').replace(/\r\n?/g, '\n');
|
|
360
|
+
if (!normalized.startsWith('---\n')) return undefined;
|
|
361
|
+
const close = normalized.indexOf('\n---', 3);
|
|
362
|
+
if (close < 0) return undefined;
|
|
363
|
+
const fields: Record<string, string> = {};
|
|
364
|
+
for (const line of normalized.slice(4, close).split('\n')) {
|
|
365
|
+
const match = /^([A-Za-z][\w-]*)\s*:\s*(.*)$/.exec(line);
|
|
366
|
+
if (match) fields[match[1]] = match[2].replace(/^(['"])([\s\S]*)\1$/, '$2').trim();
|
|
367
|
+
}
|
|
368
|
+
return { fields, body: normalized.slice(close + 4).replace(/^\n+/, '').trim() };
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function claudeMemoryProject(path: string): string {
|
|
372
|
+
const parts = path.split(/[\\/]/).filter(Boolean);
|
|
373
|
+
const projectsAt = parts.indexOf('projects');
|
|
374
|
+
if (projectsAt >= 0 && parts[projectsAt + 2] === 'memory') return parts[projectsAt + 1];
|
|
375
|
+
const memoryAt = parts.lastIndexOf('memory');
|
|
376
|
+
return memoryAt > 0 ? parts[memoryAt - 1] : '(unknown)';
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Claude 기억 파일 하나 → 장기 기억 레코드. 형식이 안 맞으면 이유와 함께 건너뛴다.
|
|
381
|
+
* claim 이 없는 레코드지만 source 가 `elanous://claude-memory/<name>` 링크라 원장 계약을 지킨다.
|
|
382
|
+
*/
|
|
383
|
+
export function importClaudeMemory(
|
|
384
|
+
file: ClaudeMemoryFile,
|
|
385
|
+
options: { asOf: string },
|
|
386
|
+
): { ok: true; item: ClaudeMemoryItem } | { ok: false; reason: ClaudeMemorySkipReason } {
|
|
387
|
+
const parsed = claudeFrontmatter(file.text);
|
|
388
|
+
if (!parsed) return { ok: false, reason: 'no-frontmatter' };
|
|
389
|
+
const name = (parsed.fields.name ?? '').trim();
|
|
390
|
+
if (!name) return { ok: false, reason: 'no-name' };
|
|
391
|
+
const description = (parsed.fields.description ?? '').trim();
|
|
392
|
+
if (!description) return { ok: false, reason: 'no-description' };
|
|
393
|
+
const type = (parsed.fields.type ?? '').trim().toLowerCase();
|
|
394
|
+
if (!CLAUDE_MEMORY_TYPES.includes(type as ClaudeMemoryType)) return { ok: false, reason: 'unknown-type' };
|
|
395
|
+
return { ok: true, item: {
|
|
396
|
+
project: claudeMemoryProject(file.path),
|
|
397
|
+
seat: CLAUDE_MEMORY_SEAT,
|
|
398
|
+
topic: name,
|
|
399
|
+
summary: `${claudeMemoryStalenessNote(options.asOf)} ${description}`,
|
|
400
|
+
source: claudeMemorySource(name),
|
|
401
|
+
updatedAt: claudeMemoryInstant(options.asOf),
|
|
402
|
+
status: 'active',
|
|
403
|
+
name,
|
|
404
|
+
description,
|
|
405
|
+
type: type as ClaudeMemoryType,
|
|
406
|
+
body: parsed.body,
|
|
407
|
+
trust: CLAUDE_MEMORY_TRUST,
|
|
408
|
+
} };
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/** 여러 파일을 한 번에 — name 이 겹치면 뒤 파일이 이긴다(덮어쓰기). */
|
|
412
|
+
export function importClaudeMemories(
|
|
413
|
+
files: readonly ClaudeMemoryFile[],
|
|
414
|
+
options: { asOf: string },
|
|
415
|
+
): ClaudeMemoryImport {
|
|
416
|
+
const byName = new Map<string, ClaudeMemoryItem>();
|
|
417
|
+
const skipped: Partial<Record<ClaudeMemorySkipReason, number>> = {};
|
|
418
|
+
let overwritten = 0;
|
|
419
|
+
for (const file of files) {
|
|
420
|
+
const outcome = importClaudeMemory(file, options);
|
|
421
|
+
if (!outcome.ok) {
|
|
422
|
+
skipped[outcome.reason] = (skipped[outcome.reason] ?? 0) + 1;
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
if (byName.has(outcome.item.name)) overwritten += 1;
|
|
426
|
+
byName.set(outcome.item.name, outcome.item);
|
|
427
|
+
}
|
|
428
|
+
return { items: [...byName.values()], overwritten, skipped };
|
|
429
|
+
}
|
|
@@ -25,7 +25,7 @@ import { drainPendingUserInput } from '../session/pending-input.js';
|
|
|
25
25
|
import type { StreamWithToolsHandlers } from '../llm.js';
|
|
26
26
|
import { debug, redactSecretText, withAmbientSessionScope } from '../debug/log.js';
|
|
27
27
|
import { applyDeferredTools } from '../session-runtime/tier-flip.js';
|
|
28
|
-
import { resolveSessionSurfaceProfile } from '../session-runtime/index.js';
|
|
28
|
+
import { buildResearchDateSystemMessage, resolveSessionSurfaceProfile } from '../session-runtime/index.js';
|
|
29
29
|
import type {
|
|
30
30
|
CoreTurnContext,
|
|
31
31
|
CoreTurnResult,
|
|
@@ -239,12 +239,18 @@ export async function runCoreTurn(
|
|
|
239
239
|
// 있으면 그 스코프의 deferred 툴을 active 로 선주입(ToolSearch 왕복 0).
|
|
240
240
|
const recentUserText = extractRecentUserText(ctx.messages);
|
|
241
241
|
const surfaceUserText = selectSurfaceUserText(ctx);
|
|
242
|
-
const surface = resolveSessionSurfaceProfile({ userText: surfaceUserText });
|
|
242
|
+
const surface = ctx.surfaceProfile ?? resolveSessionSurfaceProfile({ userText: surfaceUserText });
|
|
243
243
|
const { messages, tools, stats } = applyDeferredTools(
|
|
244
244
|
ctx.messages,
|
|
245
245
|
ctx.tools,
|
|
246
246
|
{ enabled: deferredEnabled, ...(recentUserText ? { userText: recentUserText } : {}) },
|
|
247
247
|
);
|
|
248
|
+
if (surface.id === 'research/agent' && !messages.some((message) =>
|
|
249
|
+
message.role === 'system' && typeof message.content === 'string'
|
|
250
|
+
&& message.content.startsWith('Current local date:'))
|
|
251
|
+
) {
|
|
252
|
+
messages.unshift(buildResearchDateSystemMessage());
|
|
253
|
+
}
|
|
248
254
|
if (debug.enabled) {
|
|
249
255
|
debug.log('llm.request', 'tools-tier', {
|
|
250
256
|
sessionId: ctx.sessionId,
|
|
@@ -282,6 +288,7 @@ export async function runCoreTurn(
|
|
|
282
288
|
handlers,
|
|
283
289
|
{
|
|
284
290
|
tools,
|
|
291
|
+
researchTurn: surface.id === 'research/agent',
|
|
285
292
|
signal: ctx.signal,
|
|
286
293
|
...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}),
|
|
287
294
|
...(ctx.maxToolTurns !== undefined ? { maxTurns: ctx.maxToolTurns } : {}),
|
|
@@ -185,7 +185,7 @@ export const GOAL_FINAL_ITERATION_NOTE =
|
|
|
185
185
|
'[last iteration] 이번이 이 목표의 마지막 반복이다. 이번에 끝내지 못하면 답 끝에 최종 보고를 한 번 써라: 한 것 · 남은 것 · 확인한 증거.';
|
|
186
186
|
|
|
187
187
|
/** 중간 답이 «최종 보고형»(미완 목록)인가 — 관측 전용(행동을 바꾸지 않는다). */
|
|
188
|
-
const INTERIM_REPORT_SHAPED = /(?:보고할 수
|
|
188
|
+
const INTERIM_REPORT_SHAPED = /(?:보고할 수 없|하지\s?못했습니다|못\s?했습니다|완료되지 않았|검증되지 않았|확인하지 못했|not (?:yet )?(?:verified|completed)|cannot report)/i;
|
|
189
189
|
export function isInterimReportShaped(text: string): boolean {
|
|
190
190
|
return INTERIM_REPORT_SHAPED.test(text);
|
|
191
191
|
}
|
|
@@ -631,12 +631,15 @@ export async function runGoalLoop(
|
|
|
631
631
|
const reinject = (content: string): void => {
|
|
632
632
|
if (iterations >= maxIterations) return;
|
|
633
633
|
const lastIteration = iterations === maxIterations - 1;
|
|
634
|
+
const reportShaped = isInterimReportShaped(lastResult.finalText);
|
|
634
635
|
try {
|
|
635
636
|
debug.log('goal.loop', 'interim-reply', {
|
|
636
637
|
sessionId: ctx.sessionId, ...runAttribution, iteration: iterations, lastIteration,
|
|
637
|
-
reportShaped
|
|
638
|
+
reportShaped, finalChars: lastResult.finalText.length,
|
|
638
639
|
}, { level: 'debug' });
|
|
639
640
|
} catch { /* 관측 실패가 루프를 막지 않는다 */ }
|
|
641
|
+
// Only a real continuation is interim; terminal and last-iteration answers stay visible.
|
|
642
|
+
if (lastResult.finalText.trim()) ctx.callbacks?.onGoalInterim?.(lastResult.finalText, iterations);
|
|
640
643
|
const nextIteration = iterations + 1;
|
|
641
644
|
const toolBudget = ctx.maxToolTurns ?? TOOL_LOOP_MAX_TURNS_DEFAULT;
|
|
642
645
|
const shouldAttachDelegateHint = shouldHintDelegate({
|
package/src/core-turn/types.ts
CHANGED
|
@@ -103,6 +103,8 @@ export interface CoreTurnCallbacks {
|
|
|
103
103
|
* persist this into their history store so the next user turn
|
|
104
104
|
* sees real tool evidence rather than a string summary. */
|
|
105
105
|
onTurnComplete?(newMessages: LLMMessage[]): void;
|
|
106
|
+
/** A goal iteration has finished but the goal remains open. Display-only signal; never replaces the turn history. */
|
|
107
|
+
onGoalInterim?(text: string, iteration: number): void;
|
|
106
108
|
/** Codex Responses API reasoning summary stream (gpt-5 family).
|
|
107
109
|
* `summary_part_added` marks a paragraph break between successive
|
|
108
110
|
* parts; `summary_delta` carries the streamed text. Only fires when
|
|
@@ -135,6 +137,9 @@ export interface CoreTurnContext {
|
|
|
135
137
|
originSessionId?: string;
|
|
136
138
|
/** Original human prompt for this turn, forwarded to tool dispatch. */
|
|
137
139
|
userText?: string;
|
|
140
|
+
/** Caller-selected surface. ACP passes its one per-turn verdict through;
|
|
141
|
+
* direct callers can omit it and let core-turn resolve from userText. */
|
|
142
|
+
surfaceProfile?: import('../session-runtime/index.js').SessionSurfaceProfile;
|
|
138
143
|
/** Full prompt (system + history + current user blocks). */
|
|
139
144
|
messages: LLMMessage[];
|
|
140
145
|
/** Tool catalog the model may call this turn. Empty array means
|
|
@@ -89,6 +89,8 @@ export interface AcpChatHandlers {
|
|
|
89
89
|
/** Append streamed assistant text. Caller accumulates + redraws.
|
|
90
90
|
* Receives each chunk exactly as the ACP agent emits it. */
|
|
91
91
|
appendChunk: (delta: string) => void;
|
|
92
|
+
/** A goal iteration ended; fold only that interim reply in the visible pane. */
|
|
93
|
+
foldGoalInterim?: (text: string) => void;
|
|
92
94
|
/** Called once per tool_call event with a rendered label like
|
|
93
95
|
* "→ tool: read_file(/tmp/foo)". Dashboard writes these into the
|
|
94
96
|
* log pane with a subdued style. */
|
|
@@ -430,6 +432,13 @@ export class DashboardAcpChat {
|
|
|
430
432
|
private dispatchUpdate(update: SessionUpdate, handlers: AcpChatHandlers, sess: AcpChatSession): void {
|
|
431
433
|
switch (update.sessionUpdate) {
|
|
432
434
|
case 'agent_message_chunk': {
|
|
435
|
+
const interim = (update as typeof update & { _meta?: { goalInterim?: unknown } })._meta?.goalInterim;
|
|
436
|
+
if (typeof interim === 'string') {
|
|
437
|
+
this.closeStreamBuffer(sess, 'flush');
|
|
438
|
+
handlers.foldGoalInterim?.(interim);
|
|
439
|
+
handlers.redraw?.();
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
433
442
|
const c = update.content;
|
|
434
443
|
if (c.type === 'text') {
|
|
435
444
|
this.routeText(sess, c.text, handlers);
|