elanous 0.2.17 → 0.2.19
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/J5H7BvqgSI8DUjtRRcA_S/_buildManifest.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1157-cba0e8553d35a980.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{726.83532d69452ee24b.js → 1470.98a6ab61ccb4131c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/171-23a877ed11720de9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2336-e830c777eb6bce04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9247-269e4464cc4b491c.js → 2375-e061bb24cd2b5cde.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2415.ed6428ff334c7ce2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{211-9c9090c59e2c5907.js → 2977-e38442e86289f1d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{f6b7c9ba.64a895b8b2fedbdc.js → 2ea96958.e8c7e112de50b067.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3094.67339318c7f72a3a.js +2 -0
- package/apps/pwa/out/_next/static/chunks/338-ceb956612dcfaa86.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3395-835e4ceaa6335ba4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +5 -0
- package/apps/pwa/out/_next/static/chunks/3441-be82e3595aef3a20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3689-89905039bf3e7257.js +1 -0
- package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3822-6f268bc26c6a84ac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1268.0840ff91e083fcbd.js → 4323.c5dfb6f503304775.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4457-d7df81c90f9d0268.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4551-77dadae76f6cbace.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6110.1297d4093fdfbb0d.js → 4847.56f5bc454fbcc827.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4978.6fd93b974441e87f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5012-f746f6549b869f91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7327-2d69fb321ba73389.js → 6062-73e68343a9814f6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/62-5bfed1e23790b745.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6320-9bc8561fde416e07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/649-ca96d1c5d09e02b8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6726-85a7db59b288c53f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6735-33267c4630d0d963.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7633-141682015873beb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{935.4ddaa99fc1d1126c.js → 7647.2fcd30d894d5ee30.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{f6231284-45726550aba08fca.js → 8046cadf-211ca3c0e00f2b72.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8067-143791231c99bd02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8430-a10cfba8ef282d4e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8870-9614a213b990b10b.js +25 -0
- package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9454-12c2f30dea62291c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/976-4a9b4ebdca7c739a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9989-15cdf568bafa9fc8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ae787e4c-e5b1ef00b2dbceca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-deef5ee191830f14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-b193da485f9a14b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b6e1a79df0e214f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-e84df4d907f703c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a5fb9a5db89ae4ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-1499f481d7fc52d6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-c7cf753aeb648790.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-4118469e514e10fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-e968f7630654332a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-505915052f947022.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c2f962fb4a3b06c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-7b5ed0bd8a589ec4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-cf8193250dd42dd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-cf3f5dfa35dea8e9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-5b29d9b06ceadade.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a15e7fcc283e9ca7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-d2915e7b70ff3d0e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-b70cd005d9169e25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2595f0eba29f57e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-c776322454156e36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-77bbd17f4435aa10.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-049689e611ecc936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-85954a4fb09c44eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-e773e552e1068ee6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5633c4bfa7684b4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d829b92bd01b4994.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-061c317fc771becf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a45ece8865ed4b6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-0be990618c0d56bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-bfea4865dc244b73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d6ba8e337741484.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-76a88b55d816482e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-bba1542df59f61ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-4185c95689bb372e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-b699e1a8d5d34b8b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-c225e338c31bf274.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-449353f70507ca1f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-90b889714102476d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f1ee7fbeb7f96ddc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-d59a95e1434dfaa0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-71491a23414d1a47.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-de7112bdb65fa4fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-feb4d0d88079660d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-f17d887b40dd6b1d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-8da77be2192bcd5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-72c3b9a5e9582b29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c3afe4c8d0c48c39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-b9308f2d8a931531.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-6f35f9d892fa630b.js +1 -0
- package/apps/pwa/out/_next/static/css/{e99e3cff94ced78a.css → 599369d853c61df7.css} +1 -1
- package/apps/pwa/out/_next/static/css/85f53c6f35d11382.css +1 -0
- package/apps/pwa/out/_next/static/css/d3427996da11e480.css +1 -0
- 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 -0
- package/apps/pwa/out/decisions/index.txt +30 -0
- 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 +25 -24
- 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 +24 -23
- 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/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +28 -27
- 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/ops/guardian.yaml +26 -0
- package/graphs/ops/recipes.yaml +3 -0
- package/package.json +2 -1
- package/samples/workflows/templates/approval-gated-deploy.yaml +30 -0
- package/samples/workflows/templates/chat-driven-research.yaml +35 -0
- package/samples/workflows/templates/discord-listen-and-respond.yaml +29 -0
- package/samples/workflows/templates/http-poll-then-alert.yaml +30 -0
- package/samples/workflows/templates/manual-quickstart.yaml +21 -0
- package/samples/workflows/templates/scheduled-daily-digest.yaml +30 -0
- package/samples/workflows/templates/webhook-deploy-hook.yaml +27 -0
- package/scripts/ci-public-export-import-gate.ts +7 -2
- package/scripts/ci-typecheck-changed.ts +21 -6
- package/scripts/coord-channel-watch.sh +2 -2
- package/scripts/discord-seat-probe.ts +6 -3
- package/scripts/docs/generate-cli-anatomy.ts +162 -0
- package/scripts/goals/authoring-metrics.ts +73 -0
- package/scripts/landing-heal/must-fix-match.ts +7 -7
- package/scripts/landing-heal/run-mission.ts +3 -2
- package/scripts/lib/pch-regress-map.ts +23 -0
- package/scripts/morning-report.ts +18 -4
- package/scripts/pch-regress.ts +88 -0
- package/scripts/public-export-test-run.ts +37 -2
- package/scripts/release-loop/checklist-gate-node.ts +13 -11
- package/scripts/release-loop/cut-branch.ts +2 -1
- package/scripts/release-loop/cutoff.ts +4 -2
- package/scripts/release-loop/docs-land-node.ts +8 -1
- package/scripts/release-loop/docs-node.ts +1 -1
- package/scripts/release-loop/gate-diff.ts +18 -0
- package/scripts/release-loop/gate-node.ts +436 -59
- package/scripts/release-loop/gate-partial.ts +106 -0
- package/scripts/release-loop/gate-timing.ts +120 -0
- package/scripts/release-loop/node-verdict.ts +2 -1
- package/scripts/release-loop/npm-publish-node.ts +11 -7
- package/scripts/release-loop/ops-upgrade-node.ts +8 -1
- package/scripts/release-loop/preflight.ts +246 -0
- package/scripts/release-loop/publish-node.ts +8 -1
- package/scripts/release-loop/release-readiness.ts +11 -6
- package/scripts/release-loop/release-version.ts +48 -0
- package/scripts/release-loop/resume-release.ts +174 -0
- package/scripts/release-loop/shard-plan.ts +65 -0
- package/scripts/release-loop/unattended-release.ts +45 -7
- package/scripts/release-loop/version-node.ts +145 -40
- package/scripts/rhythm/daily.ts +25 -4
- package/scripts/skills/public-check.ts +62 -12
- package/scripts/test-deterministic.ts +51 -33
- package/scripts/test-diet/effectiveness.ts +62 -1
- package/scripts/test-diet/lib.ts +1 -1
- package/scripts/test-diet/node.ts +8 -1
- package/scripts/video/scene-table.ts +159 -0
- package/src/acp/core-turn-bridge.ts +39 -2
- package/src/agent-mission/review-loop.ts +4 -3
- package/src/agent-substrate/pr-comment-meta.ts +20 -0
- package/src/autopilot/build/llm-conflict-merge.ts +28 -8
- package/src/away/presence.ts +40 -0
- package/src/away/release-watch.ts +255 -0
- package/src/briefing/brief-items.ts +86 -17
- package/src/chat/index.ts +2 -1
- package/src/chat/short-question.ts +3 -40
- package/src/cli/autopilot-cli.ts +30 -11
- package/src/cli/away-cli.ts +68 -0
- package/src/cli/brief-cli.ts +36 -2
- package/src/cli/freeze-cli.ts +3 -2
- package/src/cli/guardian-cli.ts +49 -0
- package/src/cli/intake-cli.ts +85 -7
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/notify-cli.ts +75 -0
- package/src/cli/pod-cli.ts +5 -1
- package/src/cli/provider-cli.ts +12 -2
- package/src/cli/pty-drive-cli.ts +14 -3
- package/src/cli/release-cli.ts +128 -19
- package/src/cli/setup-cli.ts +31 -1
- package/src/cli/tasks-cli.ts +403 -4
- package/src/context-bus/condense.ts +19 -3
- package/src/context-bus/context-day.ts +77 -24
- package/src/context-bus/context-first.ts +33 -0
- package/src/context-bus/context-now-public.ts +1 -1
- package/src/context-bus/context-now-surfaces.ts +16 -6
- package/src/context-bus/context-now.ts +97 -3
- package/src/core-turn/short-question.ts +100 -0
- package/src/dashboard/dashboard-status-lines.ts +24 -4
- package/src/dashboard/index.ts +50 -5
- package/src/dashboard/input/slash-executor.ts +6 -2
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +63 -36
- package/src/dashboard/slash-runtime/decide-slash.ts +60 -0
- package/src/dashboard/slash-runtime/help-from-registry.ts +21 -8
- package/src/dashboard/slash-runtime/help-groups.ts +44 -0
- package/src/dashboard/slash-runtime/model-choices.ts +125 -0
- package/src/discord-self-message.ts +20 -2
- package/src/discord-slash-wire.ts +1 -0
- package/src/domains/guardian-tick.ts +138 -0
- package/src/domains/outbound-alert.ts +244 -40
- package/src/domains/outbound-log-probe.ts +16 -1
- package/src/domains/release-tool.ts +2 -2
- package/src/domains/schedule-registry.ts +23 -0
- package/src/domains/telegram-kind-route.ts +39 -0
- package/src/domains/watch-default-scheduler.ts +95 -0
- package/src/esc-abort-gate.ts +44 -0
- package/src/execution-loop/gates.ts +11 -2
- package/src/flow-loop/split.ts +8 -4
- package/src/git-fs/worktree.ts +23 -3
- package/src/graph-runner/runner.ts +25 -5
- package/src/harness/harness-cli-command.ts +12 -2
- package/src/harness/harness-queue.ts +388 -33
- package/src/harness/harness-salvage-cli.ts +78 -0
- package/src/harness/harness-worktree-add.ts +68 -0
- package/src/harness/helper-scan.ts +10 -3
- package/src/harness/ledger-write-guard.ts +6 -16
- package/src/hq/hq.ts +6 -1
- package/src/hq/seats.ts +369 -0
- package/src/index.ts +185 -18
- package/src/instance/test-write-guard-spy-first.fixture.ts +13 -0
- package/src/instance/test-write-guard.ts +200 -0
- package/src/intake-plane/adopt-gate.ts +49 -0
- package/src/intake-plane/check.ts +3 -0
- package/src/intake-plane/collect-github.ts +57 -25
- package/src/intake-plane/digest.ts +39 -15
- package/src/intake-plane/discord-seat-work.ts +8 -2
- package/src/intake-plane/harness-target.ts +4 -3
- package/src/intake-plane/intake-sources.ts +1 -0
- package/src/intake-plane/items.ts +1 -0
- package/src/intake-plane/requirement-funnel.ts +316 -0
- package/src/knowledge/know-find.ts +10 -1
- package/src/loops/budget.ts +36 -0
- package/src/loops/orchestrator/degradation.ts +57 -0
- package/src/loops/orchestrator/finish-rate.ts +106 -4
- package/src/loops/orchestrator/grid-place.ts +11 -0
- package/src/loops/orchestrator/tick.ts +450 -54
- package/src/maturity/feature-maturity.ts +8 -5
- package/src/maturity/tui-slash-maturity.ts +1 -0
- package/src/mss/logging/log-store.ts +3 -0
- package/src/nexus/api/decisions-route.ts +11 -1
- package/src/nexus/api/http-server.ts +16 -5
- package/src/nexus/api/loop-edges.ts +352 -23
- package/src/nexus/api/ops-api.ts +96 -28
- package/src/nexus/api/ops-seats-sources.ts +2 -2
- package/src/nexus/api/workflow-templates.ts +3 -0
- package/src/nexus/index.ts +7 -0
- package/src/oauth/codex.ts +38 -0
- package/src/onboarding/first-chat-gate.ts +29 -0
- package/src/release-loop/checklist.ts +106 -6
- package/src/release-loop/feature-store.ts +64 -16
- package/src/release-loop/landing-freeze.ts +6 -4
- package/src/release-loop/light-rc.ts +173 -0
- package/src/release-loop/placement.ts +64 -20
- package/src/release-loop/rubric.ts +136 -0
- package/src/seat-dispatch/seat-ask.ts +79 -16
- package/src/seat-loop/seat-loop.ts +12 -6
- package/src/self-dev/ask-launch-flow.ts +24 -3
- package/src/self-dev/ask-path-candidates.ts +68 -0
- package/src/self-dev/dev-cli.ts +36 -0
- package/src/self-dev/dev-pipeline.ts +4 -0
- package/src/self-dev/draft-triage-rules.ts +1 -1
- package/src/self-dev/orchestrate-cli.ts +22 -0
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/pr-preview.ts +179 -0
- package/src/self-dev/round-pr-supersede.ts +244 -0
- package/src/self-dev/run-supervisor.ts +14 -0
- package/src/self-dev/shard-run.ts +23 -7
- package/src/self-implement/follow-up-goals.ts +2 -2
- package/src/self-implement/gate-cli.ts +29 -8
- package/src/self-implement/gate-remote.ts +427 -0
- package/src/self-implement/goal-author-clarification.ts +88 -13
- package/src/self-implement/goal-author.ts +8 -3
- package/src/self-implement/goal-clarification-escalation.ts +2 -0
- package/src/self-implement/l8-merge-queue.ts +29 -5
- package/src/self-implement/orchestrator.ts +61 -13
- package/src/self-implement/prior-draft-findings.ts +4 -3
- package/src/self-implement/salvage-branches.ts +254 -0
- package/src/skills/skill-feedback.ts +76 -0
- package/src/task-agent/actions.ts +101 -7
- package/src/task-agent/board.ts +132 -0
- package/src/task-agent/card-evidence.ts +203 -0
- package/src/task-agent/completion-evidence.ts +126 -0
- package/src/task-agent/judge.ts +49 -5
- package/src/task-agent/live-moves.ts +176 -0
- package/src/task-agent/mission.ts +449 -0
- package/src/task-agent/shadow.ts +258 -0
- package/src/task-agent/task-hand.ts +337 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +64 -4
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +10 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +142 -13
- package/src/task-orchestrator/surfaces/pod-pool.ts +13 -5
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +88 -20
- package/src/telegram-away-command.ts +38 -0
- package/src/telegram-commands.ts +11 -0
- package/src/telegram-loops-command.ts +1 -1
- package/src/telegram-report-log-probe.ts +21 -0
- package/src/telegram-report.ts +27 -3
- package/src/telegram.ts +5 -20
- package/src/tui-client/dashboard-session.ts +1 -0
- package/src/user-config.ts +196 -4
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1307-aac7332576c4d6fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1826-5d279da64bbbc2de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1844-9ec4b1d12f6e80eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1866-e7a6999f25548b30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1948.15f356b15a625597.js +0 -5
- package/apps/pwa/out/_next/static/chunks/2196-4700653d12a44b40.js +0 -1
- package/apps/pwa/out/_next/static/chunks/224-798346143007ff65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2699-63b73fa4d3bcf6ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2957-96ffab3d521fb08f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/311.e685738f92e6e2ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3194-807b212fb8eae065.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3324-d1d2979821dfa845.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3558-bbb5ab553a0471d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3916-3d02dd1fc257dd3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4144-a0041c8dc3be57ac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4554-3565eea1f1495ba7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4614-21403aac730d4586.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4795-f372490b178583fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5135-44008fe8b1f2aa41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5233-bf28bd6bd7a32099.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5360-be1f1d8f9fcc9755.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5977-c952712c87a1f757.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5994-ae92c0de046ab9ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6158.9c0449a9a8d0064b.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6877-fe94e76a5841ee9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290-f09c928a06c52e2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7395-164e238f471b5d7b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7787-02a1c0b04e25e811.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8060-cc008cc6fedfa818.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-d065d0393c1760f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8401-4ce1c42c8d89903f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8682-7061dd4fa7bd62ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8868-10a3a4440fb0ccd8.js +0 -25
- package/apps/pwa/out/_next/static/chunks/8949-ecb4128a0858b911.js +0 -1
- package/apps/pwa/out/_next/static/chunks/899-f41be85e8a680651.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9070.067c106528ec1ae6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9103-60fbef33e66f0a46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/a9f2b54d-7865aba0f4d2ee49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-3143b07a817d1da9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-17ba086ef82d339b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-7eb661ff23af7da2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-6b8444914da74ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-6e5c3a867557298b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-7110f732f45bf944.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-9a41d65355fc25b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-5e77cd1802567c89.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-41afec0b255ed2bb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-4187666132fc98c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-09328d499162bae4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-29ff3a8f84f03b6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-80ec7401bc83f511.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ab93b240f687d69a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-fc7d86467291ae38.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-de43a186e5ba5683.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-8b08cafad27759c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-0e2d6985fb42cd2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-13e4108999f58d13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e8296ee284aa1293.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-043a9111e74f6b24.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-23a4601ceb7f452e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-1ed1324b1dc36754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-10d958605a77b3bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-166745e51ac0c7b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-a04260b8ccc968d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-7a1d85e121065cc8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-1f50e3d4e13435f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-12916918988ac97e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d8a3347a9d0c3f4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-a9117d2cd3093d36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-5a64cb5208c6a8fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-1407ec83ea64c1f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-1d824510df025d18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-6e878ebbe1737d00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-7f49fe645d5132f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-81a4e7f8dbfe74cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-27d71f131acd9320.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-3ab59d19913b200e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-bf85b2f5bf077925.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-424659bacfb8cdd7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-ab32a8f522a60371.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-fc2df261f8a2c7df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-09461366af82ef13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-5d4fef9ccd7d406b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ea90a8ac73ce2749.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-5c169757551134ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-59fe95fed40c7a01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-4ca74dbbee7057c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-13a0a886df4d97a1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-6af8591cd3a3f038.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-539cde99554be20f.js +0 -1
- package/apps/pwa/out/_next/static/css/001d5fbaee388a25.css +0 -1
- package/apps/pwa/out/_next/static/yRA5ur6DcPl0YHSRheH2O/_buildManifest.js +0 -1
- /package/apps/pwa/out/_next/static/{yRA5ur6DcPl0YHSRheH2O → J5H7BvqgSI8DUjtRRcA_S}/_ssgManifest.js +0 -0
package/src/user-config.ts
CHANGED
|
@@ -981,6 +981,8 @@ export interface DiscordConfig {
|
|
|
981
981
|
/** Standalone `elanous discord-test` scope — same token, dedicated
|
|
982
982
|
* channel, isolated state. See DiscordTestChannel. */
|
|
983
983
|
testChannel?: DiscordTestChannel;
|
|
984
|
+
/** 첫 말·6시간 쉼 뒤 일반 답 앞에 맥락 요약을 보낸다. 기본 켬, false 만 끈다. */
|
|
985
|
+
contextFirst?: boolean;
|
|
984
986
|
}
|
|
985
987
|
|
|
986
988
|
const DISCORD_DEFAULTS: DiscordConfig = { enabled: false, allowedUsers: [] };
|
|
@@ -3489,12 +3491,22 @@ export interface OrchestratorLoopConfig {
|
|
|
3489
3491
|
mode: 'off' | 'shadow' | 'live';
|
|
3490
3492
|
seatTrees: Partial<Record<OrchestratorSeat, string[]>>;
|
|
3491
3493
|
seatCaps: Record<OrchestratorSeat, number>;
|
|
3494
|
+
/** Max new delegations per tick; absent means no limit. */
|
|
3495
|
+
maxDelegatePerTick?: number;
|
|
3492
3496
|
/** Per-seat release gate; absent seats retain the spawn-budget default. */
|
|
3493
3497
|
releaseGate?: Partial<Record<OrchestratorSeat, number>>;
|
|
3494
3498
|
trafficMode: 'shadow' | 'live';
|
|
3495
3499
|
idleRequest?: 'off' | 'shadow' | 'live';
|
|
3496
3500
|
/** FINISH-RATE — the queue tick reads finish metrics before launching; shadow logs the hold only, on holds (default shadow). */
|
|
3497
3501
|
finishGate?: 'off' | 'shadow' | 'on';
|
|
3502
|
+
/** ORCH-TA-HAND — the delegate node hands its picked cell to TASK-AGENT (`handTask`). Absent = off · shadow = card only ·
|
|
3503
|
+
* live = launch (only when the tick mode is live too; a live hand skips the seat journal so the cell launches once). */
|
|
3504
|
+
handToTaskAgent?: 'off' | 'shadow' | 'live';
|
|
3505
|
+
/** Demo: hand only this cell id (others keep the seat path). Absent = every delegatable cell. */
|
|
3506
|
+
handToTaskAgentCell?: string;
|
|
3507
|
+
/** COORD-HA — the tick CLI probes LLM ⊕ task board for the degradation ladder. Absent = shadow (probe and log only) ·
|
|
3508
|
+
* live = the tick acts on it (L1 rules only · L2 no new assignment) · off = no probe. */
|
|
3509
|
+
degradationSignal?: 'off' | 'shadow' | 'live';
|
|
3498
3510
|
}
|
|
3499
3511
|
|
|
3500
3512
|
export const ORCHESTRATOR_DEFAULTS: OrchestratorLoopConfig = {
|
|
@@ -3520,10 +3532,16 @@ export function parseOrchestratorLoopConfig(raw: unknown): OrchestratorLoopConfi
|
|
|
3520
3532
|
if (typeof gate === 'number' && Number.isSafeInteger(gate) && gate >= 0) releaseGate[seat] = gate;
|
|
3521
3533
|
}
|
|
3522
3534
|
const mode = value.mode === 'off' || value.mode === 'live' ? value.mode : 'shadow';
|
|
3523
|
-
|
|
3535
|
+
const maxDelegatePerTick = value.maxDelegatePerTick;
|
|
3536
|
+
return { mode, seatTrees, seatCaps,
|
|
3537
|
+
...(typeof maxDelegatePerTick === 'number' && Number.isSafeInteger(maxDelegatePerTick) && maxDelegatePerTick >= 0 ? { maxDelegatePerTick } : {}),
|
|
3538
|
+
...(Object.keys(releaseGate).length ? { releaseGate } : {}),
|
|
3524
3539
|
trafficMode: value.trafficMode === 'live' ? 'live' : 'shadow',
|
|
3525
3540
|
idleRequest: value.idleRequest === 'off' || value.idleRequest === 'live' ? value.idleRequest : 'shadow',
|
|
3526
|
-
finishGate: value.finishGate === 'off' || value.finishGate === 'on' ? value.finishGate : 'shadow'
|
|
3541
|
+
finishGate: value.finishGate === 'off' || value.finishGate === 'on' ? value.finishGate : 'shadow',
|
|
3542
|
+
...(value.handToTaskAgent === 'shadow' || value.handToTaskAgent === 'live' ? { handToTaskAgent: value.handToTaskAgent } : {}),
|
|
3543
|
+
...(typeof value.handToTaskAgentCell === 'string' && value.handToTaskAgentCell.trim() ? { handToTaskAgentCell: value.handToTaskAgentCell.trim() } : {}),
|
|
3544
|
+
...(value.degradationSignal === 'off' || value.degradationSignal === 'shadow' || value.degradationSignal === 'live' ? { degradationSignal: value.degradationSignal } : {}) };
|
|
3527
3545
|
}
|
|
3528
3546
|
|
|
3529
3547
|
export type StewardLoopMode = 'off' | 'shadow' | 'live' | 'rescue';
|
|
@@ -3593,12 +3611,103 @@ export interface HqConfig {
|
|
|
3593
3611
|
tailscaleBin?: string;
|
|
3594
3612
|
/** Highest lease generation this host ever saw (default ~/.elanous-hq/seen-generation · 600). */
|
|
3595
3613
|
seenGenerationFile?: string;
|
|
3614
|
+
/** Board writes only reject stale generations when explicitly enforced (default shadow). */
|
|
3615
|
+
boardFencing?: 'shadow' | 'enforce';
|
|
3596
3616
|
/** Per-probe timeout in seconds (default 5). */
|
|
3597
3617
|
probeTimeoutSeconds?: number;
|
|
3598
3618
|
}
|
|
3599
3619
|
|
|
3620
|
+
/** GATE-REMOTE (10-06): heavy pre-landing checks (self gate · changed-file tsc · public-export test run) on a remote host at the same commit. */
|
|
3621
|
+
export interface GateRemoteConfig {
|
|
3622
|
+
/** Auto-dispatch when the local 1-min load exceeds the threshold (default true). `--remote`/`--local` flags always win. */
|
|
3623
|
+
enabled?: boolean;
|
|
3624
|
+
/** ssh host (default node-b). */
|
|
3625
|
+
host?: string;
|
|
3626
|
+
/** Local 1-min load average above which checks go remote (default 20). */
|
|
3627
|
+
loadThreshold?: number;
|
|
3628
|
+
/** Concurrent heavy checks per remote host (default and ceiling 2 — config may only lower it). */
|
|
3629
|
+
hostCap?: number;
|
|
3630
|
+
/** Bare mirror on the host (default ~/mirror/elanous-agent.git — shared with the release gate). */
|
|
3631
|
+
mirror?: string;
|
|
3632
|
+
/** Seconds to wait for a free host slot before running locally (default 600). */
|
|
3633
|
+
slotWaitSeconds?: number;
|
|
3634
|
+
}
|
|
3635
|
+
|
|
3636
|
+
export function parseGateRemoteConfig(raw: unknown): GateRemoteConfig | undefined {
|
|
3637
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
3638
|
+
const r = raw as Record<string, unknown>;
|
|
3639
|
+
const out: GateRemoteConfig = {};
|
|
3640
|
+
if (typeof r.enabled === 'boolean') out.enabled = r.enabled;
|
|
3641
|
+
for (const key of ['host', 'mirror'] as const) if (typeof r[key] === 'string' && (r[key] as string).trim()) out[key] = (r[key] as string).trim();
|
|
3642
|
+
for (const key of ['loadThreshold', 'slotWaitSeconds'] as const) {
|
|
3643
|
+
const v = r[key];
|
|
3644
|
+
if (typeof v === 'number' && Number.isFinite(v) && v >= 0) out[key] = v;
|
|
3645
|
+
}
|
|
3646
|
+
if (typeof r.hostCap === 'number' && Number.isSafeInteger(r.hostCap) && r.hostCap > 0 && r.hostCap <= 2) out.hostCap = r.hostCap;
|
|
3647
|
+
return Object.keys(out).length ? out : undefined;
|
|
3648
|
+
}
|
|
3649
|
+
|
|
3650
|
+
export interface ProjectConfig {
|
|
3651
|
+
/** `axes` is absent when the configured axes are invalid; `error` then carries the config error text. */
|
|
3652
|
+
rubric?: { axes?: import('./release-loop/rubric.js').RubricAxis[]; error?: string };
|
|
3653
|
+
}
|
|
3654
|
+
|
|
3655
|
+
/** Validate one project's `rubric.axes` — throws the config error text (key duplicate · non-numeric weight). */
|
|
3656
|
+
export function parseProjectRubricAxes(id: string, axes: unknown): Array<{ key: string; weight: number }> {
|
|
3657
|
+
if (!Array.isArray(axes)) throw new Error(`[user-config] projects.${id}.rubric.axes 는 배열이어야 합니다`);
|
|
3658
|
+
const seen = new Set<string>();
|
|
3659
|
+
const parsed: Array<{ key: string; weight: number }> = [];
|
|
3660
|
+
for (const [index, axis] of axes.entries()) {
|
|
3661
|
+
const field = `projects.${id}.rubric.axes[${index}]`;
|
|
3662
|
+
if (!axis || typeof axis !== 'object' || Array.isArray(axis)) throw new Error(`[user-config] ${field} 는 {key,weight} 객체여야 합니다`);
|
|
3663
|
+
const { key, weight } = axis as Record<string, unknown>;
|
|
3664
|
+
if (typeof key !== 'string' || !key.trim()) throw new Error(`[user-config] ${field}.key 는 빈 문자열일 수 없습니다`);
|
|
3665
|
+
if (seen.has(key)) throw new Error(`[user-config] projects.${id}.rubric.axes 키 중복: ${key}`);
|
|
3666
|
+
if (typeof weight !== 'number' || !Number.isFinite(weight)) throw new Error(`[user-config] ${field}.weight 는 유한한 숫자여야 합니다: ${String(weight)}`);
|
|
3667
|
+
seen.add(key);
|
|
3668
|
+
parsed.push({ key, weight });
|
|
3669
|
+
}
|
|
3670
|
+
return parsed;
|
|
3671
|
+
}
|
|
3672
|
+
|
|
3673
|
+
/**
|
|
3674
|
+
* Project rubric axes (P3b CORE-GENERIC). Loading never throws — one bad project entry must not
|
|
3675
|
+
* stop every command — so an invalid entry keeps its error text and `resolveRubricAxes` raises it.
|
|
3676
|
+
*/
|
|
3677
|
+
function parseProjectsConfig(raw: unknown): Record<string, ProjectConfig> | undefined {
|
|
3678
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
3679
|
+
const projects: Record<string, ProjectConfig> = {};
|
|
3680
|
+
for (const [id, entry] of Object.entries(raw)) {
|
|
3681
|
+
if (id === '__proto__' || !entry || typeof entry !== 'object' || Array.isArray(entry)) continue;
|
|
3682
|
+
const rubric = (entry as Record<string, unknown>).rubric;
|
|
3683
|
+
if (!rubric || typeof rubric !== 'object' || Array.isArray(rubric)) continue;
|
|
3684
|
+
const axes = (rubric as Record<string, unknown>).axes;
|
|
3685
|
+
if (axes === undefined) continue;
|
|
3686
|
+
try {
|
|
3687
|
+
projects[id] = { rubric: { axes: parseProjectRubricAxes(id, axes) } };
|
|
3688
|
+
} catch (err) {
|
|
3689
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
3690
|
+
console.warn(`${error} — 이 프로젝트의 루브릭 축 해석은 오류로 멈춘다`);
|
|
3691
|
+
projects[id] = { rubric: { error } };
|
|
3692
|
+
}
|
|
3693
|
+
}
|
|
3694
|
+
return Object.keys(projects).length ? projects : undefined;
|
|
3695
|
+
}
|
|
3696
|
+
|
|
3600
3697
|
export interface UserConfig {
|
|
3698
|
+
projects?: Record<string, ProjectConfig>;
|
|
3699
|
+
/** Default personal topic watch; absent = enabled when user sources exist. */
|
|
3700
|
+
watch?: { enabled?: boolean };
|
|
3701
|
+
starter?: { topics?: string[] };
|
|
3702
|
+
/** GUARD-ONE-a: omitted means shadow. `live` is parsed for the later cutover, but `elanous guardian tick`
|
|
3703
|
+
* refuses it until a human-confirmed operational change (GUARD-ONE-a ships shadow only). */
|
|
3704
|
+
guardian?: { mode?: 'shadow' | 'live' };
|
|
3705
|
+
/** TA-JUDGE-LIVE-SAFE: task-agent judge moves executed for real. Only `review` · `propose-green` are honoured
|
|
3706
|
+
* (`src/task-agent/live-moves.ts` drops anything else with a warning). Absent = env ELANOUS_TASK_AGENT_LIVE_MOVES, else none (pure shadow). */
|
|
3707
|
+
taskAgent?: { liveMoves?: string[] };
|
|
3601
3708
|
events?: EventsConfig;
|
|
3709
|
+
/** GATE-REMOTE — see GateRemoteConfig. Absent = defaults (auto on · node-b · load 20 · cap 2). */
|
|
3710
|
+
gateRemote?: GateRemoteConfig;
|
|
3602
3711
|
/** Explicit HTTPS destination for doctor diagnostics; absent means no upload. */
|
|
3603
3712
|
diagnostics?: { uploadUrl?: string };
|
|
3604
3713
|
/** HQ lease (본부 임대 · 10-04 HQ-HB/HQ-FENCE): arbiter host over ssh, this host's name, per-role fail-open when the arbiter is unreachable (default: fail closed). */
|
|
@@ -3609,6 +3718,8 @@ export interface UserConfig {
|
|
|
3609
3718
|
nexus?: { demoMode?: boolean };
|
|
3610
3719
|
/** Execution-phase HITL answer deadline; absent means 30 minutes. */
|
|
3611
3720
|
hitl?: { executionDeadlineMinutes?: number };
|
|
3721
|
+
/** Deferred (quiet-hours) outbound queue. `deferredMaxAttempts`: failed flushes before an item is quarantined; absent = env ELANOUS_OUTBOUND_DEFERRED_MAX_ATTEMPTS, else 5. */
|
|
3722
|
+
outbound?: { deferredMaxAttempts?: number };
|
|
3612
3723
|
coo?: { linearProject?: string };
|
|
3613
3724
|
decisions?: { linearProjection: { enabled: boolean }; requireCrossCheck: boolean;
|
|
3614
3725
|
crossCheckNeighbor: Record<EventSeat, EventSeat>; crossCheckWaitMinutes: number };
|
|
@@ -3618,7 +3729,7 @@ export interface UserConfig {
|
|
|
3618
3729
|
loops?: { owners?: Record<string, EventSeat>; defaultOwner?: EventSeat; orchestrator?: OrchestratorLoopConfig; steward?: { mode?: StewardLoopMode; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number; launch?: 'off' | 'shadow' | 'live'; maxParallel?: number; podPool?: string }; seat?: SeatLoopConfig; persona?: PersonaLoopConfig };
|
|
3619
3730
|
/** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
|
|
3620
3731
|
* budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
|
|
3621
|
-
harness?: { edgeRail?: { canaryOkRuns?: number; failureMultiplier?: number; minSamples?: number }; /** Goal authoring grade; absent or invalid config resolves to full. */ authorGrade?: 'full' | 'lite'; revertGuard?: { depth: number }; pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; exposeGate?: 'warn' | 'strict'; difficultyPlacement?: boolean; defaultRepo?: string; /** Optional GitHub repository name (owner/repo), distinct from the local defaultRepo path. */ repo?: string; substrate?: 'local' | 'pod'; podPool?: string; worktreeAddTimeoutSec?: number; queue?: { seatCap?: Partial<Record<'OP' | 'TC' | 'MK' | 'UX', number>>; /** Direct `harness say|ask` goes through the seat queue first (ONEDOOR-2). Absent = env ELANOUS_HARNESS_QUEUE_DIRECT_SAY, else off. */ directSay?: boolean }; /** `harness say` 문장을 Pod 안에서 저작부터 돌릴지. 생략·false = 끔(호스트가 저작). */ authorOnPod?: boolean; /** Stopped-PR repair goals: shadow records only (default); live enqueues them. */ helper?: { repair?: 'shadow' | 'live'; /** Live launches allowed per UTC day. Absent or invalid means 3. */ repairPerDay?: number };
|
|
3732
|
+
harness?: { edgeRail?: { canaryOkRuns?: number; failureMultiplier?: number; minSamples?: number }; /** Goal authoring grade; absent or invalid config resolves to full. */ authorGrade?: 'full' | 'lite'; revertGuard?: { depth: number }; pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; exposeGate?: 'warn' | 'strict'; difficultyPlacement?: boolean; defaultRepo?: string; /** Optional GitHub repository name (owner/repo), distinct from the local defaultRepo path. */ repo?: string; substrate?: 'local' | 'pod'; podPool?: string; worktreeAddTimeoutSec?: number; queue?: { seatCap?: Partial<Record<'OP' | 'TC' | 'MK' | 'UX', number>>; /** Direct `harness say|ask` goes through the seat queue first (ONEDOOR-2). Absent = env ELANOUS_HARNESS_QUEUE_DIRECT_SAY, else off. */ directSay?: boolean; /** SEAT-CAP-STALE: a run whose last ledger progress is older than this stops holding its seat. Absent = env ELANOUS_HARNESS_QUEUE_STALE_RUN_MINUTES, else 30. */ staleRunMinutes?: number; /** Seat-less runs count in one bucket with this cap instead of every seat. Absent = env ELANOUS_HARNESS_QUEUE_UNKNOWN_SEAT_CAP, else 2. */ unknownSeatCap?: number }; /** `harness say` 문장을 Pod 안에서 저작부터 돌릴지. 생략·false = 끔(호스트가 저작). */ authorOnPod?: boolean; /** Stopped-PR repair goals: shadow records only (default); live enqueues them. */ helper?: { repair?: 'shadow' | 'live'; /** Live launches allowed per UTC day. Absent or invalid means 3. */ repairPerDay?: number };
|
|
3622
3733
|
/** Nested elanous launches. Only depth 0 may set `allow`. Absent or any other value refuses. A depth >= 1 `--nested-elanous allow` is ignored. */
|
|
3623
3734
|
nestedElanous?: 'allow' | 'refuse';
|
|
3624
3735
|
/** Maximum nested elanous depth; safe positive integer, default 2. */
|
|
@@ -3871,6 +3982,36 @@ function parseAutoReviewConfig(raw: unknown): AutoReviewConfig | undefined {
|
|
|
3871
3982
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
3872
3983
|
}
|
|
3873
3984
|
|
|
3985
|
+
/** Keeps `taskAgent.liveMoves` as raw strings — the allow-list (and the unknown-entry warning) lives in the task agent. */
|
|
3986
|
+
function parseTaskAgentConfig(raw: unknown): UserConfig['taskAgent'] {
|
|
3987
|
+
if (raw === undefined) return undefined;
|
|
3988
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
3989
|
+
warnUserConfigDrop('taskAgent', '섹션이 객체가 아니다 — 버림');
|
|
3990
|
+
return undefined;
|
|
3991
|
+
}
|
|
3992
|
+
const liveMoves = (raw as Record<string, unknown>).liveMoves;
|
|
3993
|
+
if (liveMoves === undefined) return undefined;
|
|
3994
|
+
// 설정이 «있으면» 환경 변수로 내려가지 않는다 — 배열이 아니면 빈 목록(fail-closed), 문자열 밖 항목은 글자로 바꿔 넘겨
|
|
3995
|
+
// 실행부가 «모르는 항목»으로 경고하고 버리게 한다(유효한 항목은 산다).
|
|
3996
|
+
if (!Array.isArray(liveMoves)) {
|
|
3997
|
+
warnUserConfigDrop('taskAgent.liveMoves', '배열이 아니다 — 빈 목록(실행 0)');
|
|
3998
|
+
return { liveMoves: [] };
|
|
3999
|
+
}
|
|
4000
|
+
return { liveMoves: liveMoves.map((entry) => typeof entry === 'string' ? entry : JSON.stringify(entry) ?? String(entry)) };
|
|
4001
|
+
}
|
|
4002
|
+
|
|
4003
|
+
function parseGuardianConfig(raw: unknown): UserConfig['guardian'] {
|
|
4004
|
+
if (raw === undefined) return undefined;
|
|
4005
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
4006
|
+
warnUserConfigDrop('guardian', '섹션이 객체가 아니다 — 버림');
|
|
4007
|
+
return undefined;
|
|
4008
|
+
}
|
|
4009
|
+
const mode = (raw as Record<string, unknown>).mode;
|
|
4010
|
+
if (mode === 'shadow' || mode === 'live') return { mode };
|
|
4011
|
+
if (mode !== undefined) warnUserConfigDrop('guardian.mode', 'shadow 또는 live 가 아니다 — 버림');
|
|
4012
|
+
return undefined;
|
|
4013
|
+
}
|
|
4014
|
+
|
|
3874
4015
|
/** Parse optional ops fields independently; invalid settings cannot silently select a cron cwd. */
|
|
3875
4016
|
function parseOpsConfig(raw: unknown): UserConfig['ops'] | undefined {
|
|
3876
4017
|
if (raw === undefined) return undefined;
|
|
@@ -4592,6 +4733,7 @@ export function parseHqConfig(raw: unknown): HqConfig | undefined {
|
|
|
4592
4733
|
}
|
|
4593
4734
|
if (typeof r.ttlSeconds === 'number' && Number.isFinite(r.ttlSeconds) && r.ttlSeconds > 0) out.ttlSeconds = r.ttlSeconds;
|
|
4594
4735
|
if (typeof r.probeTimeoutSeconds === 'number' && Number.isFinite(r.probeTimeoutSeconds) && r.probeTimeoutSeconds > 0) out.probeTimeoutSeconds = r.probeTimeoutSeconds;
|
|
4736
|
+
if (r.boardFencing === 'shadow' || r.boardFencing === 'enforce') out.boardFencing = r.boardFencing;
|
|
4595
4737
|
if (r.autoPromote && typeof r.autoPromote === 'object' && !Array.isArray(r.autoPromote)) {
|
|
4596
4738
|
const auto = r.autoPromote as Record<string, unknown>;
|
|
4597
4739
|
const setting: NonNullable<HqConfig['autoPromote']> = {};
|
|
@@ -4727,7 +4869,16 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4727
4869
|
|
|
4728
4870
|
const nexus = rawObj.nexus && typeof rawObj.nexus === 'object' && !Array.isArray(rawObj.nexus)
|
|
4729
4871
|
? rawObj.nexus as Record<string, unknown> : {};
|
|
4872
|
+
const gateRemoteConfig = parseGateRemoteConfig(rawObj.gateRemote);
|
|
4873
|
+
const projects = parseProjectsConfig(rawObj.projects);
|
|
4730
4874
|
return {
|
|
4875
|
+
...(projects ? { projects } : {}),
|
|
4876
|
+
...(rawObj.starter && typeof rawObj.starter === 'object' && !Array.isArray(rawObj.starter)
|
|
4877
|
+
&& Array.isArray((rawObj.starter as Record<string, unknown>).topics)
|
|
4878
|
+
? { starter: { topics: ((rawObj.starter as { topics: unknown[] }).topics).filter((topic): topic is string => typeof topic === 'string' && !!topic.trim()) } } : {}),
|
|
4879
|
+
...(rawObj.watch && typeof rawObj.watch === 'object' && !Array.isArray(rawObj.watch)
|
|
4880
|
+
&& typeof (rawObj.watch as Record<string, unknown>).enabled === 'boolean'
|
|
4881
|
+
? { watch: { enabled: (rawObj.watch as { enabled: boolean }).enabled } } : {}),
|
|
4731
4882
|
nexus: { demoMode: nexus.demoMode === true },
|
|
4732
4883
|
...(Object.keys(seatBudgets).length ? { org: { budget: seatBudgets } } : {}),
|
|
4733
4884
|
pod: {
|
|
@@ -4770,7 +4921,16 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4770
4921
|
).filter(([seat, cap]) => /^(OP|TC|MK|UX)$/.test(seat) && typeof cap === 'number' && Number.isSafeInteger(cap) && cap > 0)),
|
|
4771
4922
|
...(harness.queue && typeof harness.queue === 'object' && !Array.isArray(harness.queue)
|
|
4772
4923
|
&& typeof (harness.queue as Record<string, unknown>).directSay === 'boolean'
|
|
4773
|
-
? { directSay: (harness.queue as { directSay: boolean }).directSay } : {})
|
|
4924
|
+
? { directSay: (harness.queue as { directSay: boolean }).directSay } : {}),
|
|
4925
|
+
...(() => {
|
|
4926
|
+
const queue = harness.queue && typeof harness.queue === 'object' && !Array.isArray(harness.queue)
|
|
4927
|
+
? harness.queue as Record<string, unknown> : {};
|
|
4928
|
+
const stale = queue.staleRunMinutes, unknownCap = queue.unknownSeatCap;
|
|
4929
|
+
return {
|
|
4930
|
+
...(typeof stale === 'number' && Number.isSafeInteger(stale) && stale > 0 ? { staleRunMinutes: stale } : {}),
|
|
4931
|
+
...(typeof unknownCap === 'number' && Number.isSafeInteger(unknownCap) && unknownCap >= 0 ? { unknownSeatCap: unknownCap } : {}),
|
|
4932
|
+
};
|
|
4933
|
+
})() },
|
|
4774
4934
|
...(harness.substrate === 'local' || harness.substrate === 'pod' ? { substrate: harness.substrate } : {}),
|
|
4775
4935
|
...(typeof harness.podPool === 'string' && harness.podPool.trim() ? { podPool: harness.podPool.trim() } : {}),
|
|
4776
4936
|
...(typeof harness.worktreeAddTimeoutSec === 'number' && Number.isSafeInteger(harness.worktreeAddTimeoutSec)
|
|
@@ -4951,6 +5111,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4951
5111
|
homeChannel: typeof dc.homeChannel === 'string' ? dc.homeChannel
|
|
4952
5112
|
: typeof dc.homeChannel === 'number' ? String(dc.homeChannel) : undefined,
|
|
4953
5113
|
testChannel: normalizeDiscordTestChannel((dc as Record<string, unknown>).testChannel),
|
|
5114
|
+
...(dc.contextFirst === false ? { contextFirst: false } : {}),
|
|
4954
5115
|
...(Array.isArray(dc.chatChannels)
|
|
4955
5116
|
? { chatChannels: (dc.chatChannels as unknown[]).map(v => String(v).trim()).filter(Boolean) }
|
|
4956
5117
|
: {}),
|
|
@@ -5439,7 +5600,13 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5439
5600
|
&& typeof (rawObj.hitl as Record<string, unknown>).executionDeadlineMinutes === 'number'
|
|
5440
5601
|
? { hitl: { executionDeadlineMinutes: (rawObj.hitl as { executionDeadlineMinutes: number }).executionDeadlineMinutes } }
|
|
5441
5602
|
: {}),
|
|
5603
|
+
...(rawObj.outbound && typeof rawObj.outbound === 'object' && !Array.isArray(rawObj.outbound)
|
|
5604
|
+
&& Number.isSafeInteger((rawObj.outbound as Record<string, unknown>).deferredMaxAttempts)
|
|
5605
|
+
&& ((rawObj.outbound as { deferredMaxAttempts: number }).deferredMaxAttempts) > 0
|
|
5606
|
+
? { outbound: { deferredMaxAttempts: (rawObj.outbound as { deferredMaxAttempts: number }).deferredMaxAttempts } }
|
|
5607
|
+
: {}),
|
|
5442
5608
|
...(parseHqConfig(rawObj.hq) ? { hq: parseHqConfig(rawObj.hq)! } : {}),
|
|
5609
|
+
...(gateRemoteConfig ? { gateRemote: gateRemoteConfig } : {}),
|
|
5443
5610
|
cli: { helpRole: parseCliHelpRole(rawObj.cli) },
|
|
5444
5611
|
coo: { linearProject: typeof (rawObj.coo as { linearProject?: unknown } | undefined)?.linearProject === 'string' && (rawObj.coo as { linearProject: string }).linearProject.trim()
|
|
5445
5612
|
? (rawObj.coo as { linearProject: string }).linearProject.trim() : '외부 행정·큰 일 (COO)' },
|
|
@@ -5447,6 +5614,8 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5447
5614
|
loops: { ...(stewardLoops ?? {}), ...parseLoopOwners(rawObj.loops), orchestrator: parseOrchestratorLoopConfig((rawObj.loops as { orchestrator?: unknown } | undefined)?.orchestrator), seat: parseSeatLoopsConfig(rawObj.loops),
|
|
5448
5615
|
persona: { enabled: (rawObj.loops as { persona?: { enabled?: unknown } } | undefined)?.persona?.enabled === true } },
|
|
5449
5616
|
events: parseEventsConfig(rawObj.events),
|
|
5617
|
+
guardian: parseGuardianConfig(rawObj.guardian),
|
|
5618
|
+
taskAgent: parseTaskAgentConfig(rawObj.taskAgent),
|
|
5450
5619
|
// M1-1: sparse — undefined when the user hasn't set anything, so
|
|
5451
5620
|
// resolvers fall through to zero-config defaults.
|
|
5452
5621
|
...spreadIfDefined('modelTier', parseModelTierConfig(rawObj.modelTier)),
|
|
@@ -5985,6 +6154,21 @@ export function saveUserConfig(
|
|
|
5985
6154
|
},
|
|
5986
6155
|
};
|
|
5987
6156
|
const rawRest = { ...(cfg.raw ?? {}) };
|
|
6157
|
+
// projects: raw entries are kept verbatim — an invalid entry loaded from disk is preserved, not blocked (its error
|
|
6158
|
+
// surfaces in resolveRubricAxes) — and typed axes handed to save are validated (invalid ones refuse the save).
|
|
6159
|
+
const rawProjectsValue = rawRest.projects;
|
|
6160
|
+
const rawProjects = rawRest.projects && typeof rawRest.projects === 'object' && !Array.isArray(rawRest.projects)
|
|
6161
|
+
? rawRest.projects as Record<string, unknown> : undefined;
|
|
6162
|
+
const savedProjects: Record<string, unknown> | undefined = rawProjects || cfg.projects ? { ...(rawProjects ?? {}) } : undefined;
|
|
6163
|
+
for (const [id, project] of Object.entries(cfg.projects ?? {})) {
|
|
6164
|
+
if (project?.rubric?.axes === undefined) continue;
|
|
6165
|
+
const axes = parseProjectRubricAxes(id, project.rubric.axes);
|
|
6166
|
+
const rawProject = rawProjects?.[id] && typeof rawProjects[id] === 'object' && !Array.isArray(rawProjects[id])
|
|
6167
|
+
? rawProjects[id] as Record<string, unknown> : {};
|
|
6168
|
+
const rawRubric = rawProject.rubric && typeof rawProject.rubric === 'object' && !Array.isArray(rawProject.rubric)
|
|
6169
|
+
? rawProject.rubric as Record<string, unknown> : {};
|
|
6170
|
+
savedProjects![id] = { ...rawProject, rubric: { ...rawRubric, axes } };
|
|
6171
|
+
}
|
|
5988
6172
|
// Strip typed sections from raw so we don't double-write stale copies.
|
|
5989
6173
|
delete rawRest.skillRouter;
|
|
5990
6174
|
delete rawRest.llm;
|
|
@@ -6019,6 +6203,10 @@ export function saveUserConfig(
|
|
|
6019
6203
|
delete rawRest.smartDefaults;
|
|
6020
6204
|
delete rawRest.grounding;
|
|
6021
6205
|
delete rawRest.diagnostics;
|
|
6206
|
+
delete rawRest.projects;
|
|
6207
|
+
delete rawRest.starter;
|
|
6208
|
+
delete rawRest.watch;
|
|
6209
|
+
delete rawRest.guardian;
|
|
6022
6210
|
const rawHarness = rawRest.harness && typeof rawRest.harness === 'object' && !Array.isArray(rawRest.harness)
|
|
6023
6211
|
? rawRest.harness as Record<string, unknown> : {};
|
|
6024
6212
|
delete rawRest.harness;
|
|
@@ -6053,6 +6241,10 @@ export function saveUserConfig(
|
|
|
6053
6241
|
helper: cfg.harness?.helper ?? rawHarness.helper,
|
|
6054
6242
|
}),
|
|
6055
6243
|
...rawRest,
|
|
6244
|
+
...(savedProjects ? { projects: savedProjects } : rawProjectsValue !== undefined ? { projects: rawProjectsValue } : {}),
|
|
6245
|
+
...(cfg.starter ? { starter: cfg.starter } : {}),
|
|
6246
|
+
...(cfg.watch ? { watch: cfg.watch } : {}),
|
|
6247
|
+
...(cfg.guardian ? { guardian: cfg.guardian } : {}),
|
|
6056
6248
|
...(cfg.loops ? { loops: {
|
|
6057
6249
|
...rawLoops,
|
|
6058
6250
|
owners: cfg.loops.owners ?? {}, defaultOwner: cfg.loops.defaultOwner ?? 'OP',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"commit":"
|
|
1
|
+
{"commit":"5212802660563d16cc7268069d1e756574077ac8"}
|