elanous 0.2.17 → 0.2.18
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/P6YTVgzuZz5oTZhY4Din_/_buildManifest.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1307-aac7332576c4d6fc.js → 1307-30dff22c9e1f3073.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/195-fb1d7690bf30bab4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1986-33e13d648a9df765.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2537-6c289376caa88ca1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2699-325cc923ba7b8631.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3857-4f936cdb30322aa6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4554-5761612531d0146b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4565-3d7e3fdeb43686a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5977-a11f37254196b659.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6158.9c0449a9a8d0064b.js → 6158.af2e93b7adff709b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6877-74399f69c7da1433.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7797-df5aa0381fdc078f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8401-8615a660c84cdb03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8695-846034ce44852c70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/{page-3143b07a817d1da9.js → page-d92f7ee3994e84c7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/{page-17ba086ef82d339b.js → page-4733c967b56a4277.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/board/{page-7eb661ff23af7da2.js → page-d22fd849cc22f104.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-bb742f995c6769e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/{page-6e5c3a867557298b.js → page-02b073a2ac793b83.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-60c3da708f9a0ccc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-8a9b3594bc23289b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/{page-5e77cd1802567c89.js → page-a0eb02638b1e6f31.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-308111abadf35670.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-6eaf7bac37830c21.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/{page-4187666132fc98c4.js → page-5d97b2901e0d1ea6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/{page-09328d499162bae4.js → page-c39554c321576982.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/{page-29ff3a8f84f03b6a.js → page-8c3d8e63ae2e1c98.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/field/{page-80ec7401bc83f511.js → page-9b72a07d424701c6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-bd5d586429167fea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/{page-fc7d86467291ae38.js → page-a572f58cd3ca5864.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-59b7834d497c2255.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-be5ea965a07fbc41.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/{page-0e2d6985fb42cd2f.js → page-c130b63862437814.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/market/{page-13e4108999f58d13.js → page-fa244bd146a00ae8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-e8296ee284aa1293.js → page-44d56d6391965a6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-043a9111e74f6b24.js → page-83a700d4c754d802.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/{not-found-23a4601ceb7f452e.js → not-found-7b3170f374f77b9d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-5f23d0c66a3b4793.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/{page-10d958605a77b3bd.js → page-a3c58f5c72a5f3f9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a2c4625596f8d69c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-0e9099531d239f11.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-7a1d85e121065cc8.js → page-e8e1ecaea7cd71d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-a1b7ffed710a93e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/{page-12916918988ac97e.js → page-1467047104141297.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/{page-d8a3347a9d0c3f4a.js → page-2da6f9b8a38c6978.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-102310930791197a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-f331e38fefc00393.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-6ed0b73bae8351d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/{page-1d824510df025d18.js → page-44d5f767491692bf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-43336055451f6e37.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/{page-7f49fe645d5132f7.js → page-3cc47dca0922ab9a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-a77ee355a2304ff0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/{page-27d71f131acd9320.js → page-b17cd46cf0e9b8cf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-61553851aa606146.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-a1f585e154e61c59.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/{page-424659bacfb8cdd7.js → page-7bf54c9bb9274af8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-5150ef17b5383a57.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b9d8ce70792c1672.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-a5a3de231f2cc7d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/{page-5d4fef9ccd7d406b.js → page-134da468538baf48.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31ac4afa2dcd915c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{webpack-539cde99554be20f.js → webpack-c2782b330447ffb6.js} +1 -1
- package/apps/pwa/out/_next/static/css/7fa358fec7da7c47.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +14 -14
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +14 -14
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +14 -14
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +14 -14
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +14 -14
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +14 -14
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +14 -14
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +14 -14
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +14 -14
- 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 +14 -14
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +14 -14
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +14 -14
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +14 -14
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +14 -14
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +14 -14
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +14 -14
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +14 -14
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +14 -14
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +14 -14
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +14 -14
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +14 -14
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +14 -14
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +14 -14
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +14 -14
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +14 -14
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +14 -14
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +15 -15
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +14 -14
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +14 -14
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +14 -14
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +14 -14
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +14 -14
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +14 -14
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +14 -14
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +14 -14
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +14 -14
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +14 -14
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +14 -14
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +14 -14
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +14 -14
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +14 -14
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +14 -14
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +14 -14
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +14 -14
- 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/discord-seat-probe.ts +3 -2
- 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/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-node.ts +99 -14
- 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 +115 -0
- package/scripts/release-loop/unattended-release.ts +43 -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/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/briefing/brief-items.ts +86 -17
- package/src/cli/autopilot-cli.ts +30 -11
- package/src/cli/brief-cli.ts +36 -2
- package/src/cli/freeze-cli.ts +3 -2
- package/src/cli/intake-cli.ts +73 -1
- package/src/cli/notify-cli.ts +75 -0
- package/src/cli/provider-cli.ts +12 -2
- package/src/cli/release-cli.ts +101 -17
- package/src/cli/tasks-cli.ts +309 -3
- 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/discord-self-message.ts +20 -2
- package/src/discord-slash-wire.ts +1 -0
- package/src/domains/outbound-alert.ts +200 -27
- package/src/domains/outbound-log-probe.ts +16 -1
- package/src/domains/release-tool.ts +2 -2
- 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/harness/harness-cli-command.ts +10 -2
- package/src/harness/harness-queue.ts +388 -33
- package/src/harness/helper-scan.ts +10 -3
- package/src/hq/seats.ts +369 -0
- package/src/index.ts +133 -15
- 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/discord-seat-work.ts +8 -2
- 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/finish-rate.ts +73 -1
- package/src/loops/orchestrator/grid-place.ts +11 -0
- package/src/loops/orchestrator/tick.ts +295 -20
- package/src/maturity/feature-maturity.ts +3 -2
- package/src/nexus/api/decisions-route.ts +11 -1
- package/src/nexus/api/loop-edges.ts +69 -13
- package/src/nexus/api/ops-seats-sources.ts +2 -2
- package/src/nexus/api/workflow-templates.ts +3 -0
- package/src/oauth/codex.ts +38 -0
- package/src/onboarding/first-chat-gate.ts +29 -0
- package/src/release-loop/checklist.ts +104 -6
- package/src/release-loop/feature-store.ts +10 -9
- package/src/release-loop/landing-freeze.ts +6 -4
- package/src/release-loop/placement.ts +13 -3
- package/src/release-loop/rubric.ts +80 -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-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/round-pr-supersede.ts +244 -0
- package/src/self-dev/run-supervisor.ts +14 -0
- package/src/self-implement/follow-up-goals.ts +2 -2
- package/src/self-implement/gate-remote.ts +427 -0
- package/src/self-implement/goal-author.ts +8 -3
- package/src/self-implement/l8-merge-queue.ts +29 -5
- package/src/self-implement/orchestrator.ts +59 -12
- package/src/self-implement/prior-draft-findings.ts +4 -3
- package/src/skills/skill-feedback.ts +76 -0
- package/src/task-agent/actions.ts +39 -6
- package/src/task-agent/judge.ts +31 -5
- package/src/task-agent/mission.ts +423 -0
- package/src/task-agent/shadow.ts +90 -0
- package/src/task-agent/task-hand.ts +235 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +10 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +86 -18
- package/src/telegram-loops-command.ts +1 -1
- package/src/telegram.ts +5 -20
- package/src/user-config.ts +63 -3
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/2699-63b73fa4d3bcf6ff.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/5135-44008fe8b1f2aa41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5233-bf28bd6bd7a32099.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5977-c952712c87a1f757.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6877-fe94e76a5841ee9b.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/8401-4ce1c42c8d89903f.js +0 -1
- 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/app/botlab/page-6b8444914da74ca6.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/control/page-41afec0b255ed2bb.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/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/observatory/page-1ed1324b1dc36754.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/page-1f50e3d4e13435f4.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/page-6e878ebbe1737d00.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/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/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/worktrees/page-ea90a8ac73ce2749.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 → P6YTVgzuZz5oTZhY4Din_}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// DRAFT-TRIAGE (TC 10-07) — a supervisor rework round of the same run and goal opens a new PR
|
|
2
|
+
// (new task id → new goal hash → new branch). Continuing the branch would mean pinning the shard
|
|
3
|
+
// identity and the Pod child's run suffix, so this closes the previous round's draft instead:
|
|
4
|
+
// label `elanous:superseded`, comment with the newer PR link, close. Same run = one tracker per
|
|
5
|
+
// supervised invocation; same goal = `resumeKey(feature)`, the key the resume path already uses.
|
|
6
|
+
|
|
7
|
+
import { spawnSync } from 'node:child_process';
|
|
8
|
+
import { debug } from '../debug/log.js';
|
|
9
|
+
import { PR_LABELS } from '../github/pr-labels.js';
|
|
10
|
+
import { PROTECTED_LABELS } from './draft-triage-rules.js';
|
|
11
|
+
import { resumeKey, type SelfDevJobResult } from './orchestrate.js';
|
|
12
|
+
|
|
13
|
+
const SUPERSEDED_LABEL = PR_LABELS.find((label) => label.name.endsWith(':superseded'))!.name;
|
|
14
|
+
|
|
15
|
+
export interface RoundPrRef {
|
|
16
|
+
readonly repository: string;
|
|
17
|
+
readonly number: number;
|
|
18
|
+
readonly url: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface RoundPrView {
|
|
22
|
+
readonly state: string;
|
|
23
|
+
readonly isDraft: boolean;
|
|
24
|
+
readonly labels: readonly string[];
|
|
25
|
+
readonly mergedAt?: string | null;
|
|
26
|
+
/** Comment bodies — a link already posted (even by a write that reported failure) is not posted again.
|
|
27
|
+
* An adapter that cannot read them returns a null view, so nothing is written. */
|
|
28
|
+
readonly comments: readonly string[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** gh seams. A null view or a false write means «not observed / not applied» — never a reason to close. */
|
|
32
|
+
export interface RoundPrAdapters {
|
|
33
|
+
view(pr: RoundPrRef): RoundPrView | null;
|
|
34
|
+
addLabel(pr: RoundPrRef, label: string): boolean;
|
|
35
|
+
comment(pr: RoundPrRef, body: string): boolean;
|
|
36
|
+
close(pr: RoundPrRef): boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type SupersedeOutcome =
|
|
40
|
+
| { kind: 'superseded'; round: number; prevPr: number; pr: number }
|
|
41
|
+
| { kind: 'kept'; round: number; prevPr: number; pr: number; reason: string };
|
|
42
|
+
|
|
43
|
+
type RoundPrOutcome = SupersedeOutcome | { kind: 'continued'; round: number; prevPr: number; pr: number };
|
|
44
|
+
|
|
45
|
+
export function roundPrRef(prUrl: string | undefined): RoundPrRef | null {
|
|
46
|
+
if (!prUrl) return null;
|
|
47
|
+
try {
|
|
48
|
+
const url = new URL(prUrl.trim());
|
|
49
|
+
const match = /^\/([^/]+)\/([^/]+)\/pull\/(\d+)\/?$/.exec(url.pathname);
|
|
50
|
+
return url.protocol === 'https:' && url.hostname === 'github.com' && match
|
|
51
|
+
// GitHub owner/repo names are case-insensitive: one PR has one identity.
|
|
52
|
+
? { repository: `${match[1]}/${match[2]}`.toLowerCase(), number: Number(match[3]), url: `https://github.com/${match[1]}/${match[2]}/pull/${match[3]}` }
|
|
53
|
+
: null;
|
|
54
|
+
} catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const prId = (pr: RoundPrRef): string => `${pr.repository}#${pr.number}`;
|
|
60
|
+
|
|
61
|
+
const commentMarker = (prev: RoundPrRef, next: RoundPrRef): string => `<!-- elanous:round-pr-superseded ${prId(prev)} -> ${prId(next)} -->`;
|
|
62
|
+
|
|
63
|
+
function roundPrSupersedeComment(input: { runId: string | null; round: number; prev?: RoundPrRef; next: RoundPrRef }): string {
|
|
64
|
+
return `${input.prev ? `${commentMarker(input.prev, input.next)}\n` : ''}Supervisor round ${input.round}${input.runId ? ` of ${input.runId}` : ''}: superseded by #${input.next.number} (${input.next.url}) — same run and goal, the rework round opened a new PR. Branch preserved.`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* One tracker per supervised run. `record(results, round)` after each round: for every goal whose newest PR
|
|
69
|
+
* differs from a PR an earlier round of this run opened, the earlier one is superseded exactly once —
|
|
70
|
+
* only while it is an open draft, unmerged, without a protected label, in the same repository.
|
|
71
|
+
*/
|
|
72
|
+
export function createRoundPrTracker(input: {
|
|
73
|
+
runId: string | null;
|
|
74
|
+
adapters: RoundPrAdapters;
|
|
75
|
+
observe?: (event: string, data: Record<string, unknown>) => void;
|
|
76
|
+
}) {
|
|
77
|
+
const byGoal = new Map<string, Array<{ ref: RoundPrRef; merged: boolean; round: number }>>();
|
|
78
|
+
const handled = new Set<string>();
|
|
79
|
+
// The link comment is written once per PR even when the close after it fails and is retried next round.
|
|
80
|
+
const commented = new Set<string>();
|
|
81
|
+
const emit = (event: string, data: Record<string, unknown>): void => {
|
|
82
|
+
try { (input.observe ?? ((e, d) => debug.log('self-dev.supervisor', e, d)))(event, data); } catch { /* observation must not interrupt supervision */ }
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const supersede = (prev: RoundPrRef, next: RoundPrRef, round: number): SupersedeOutcome => {
|
|
86
|
+
const base = { round, prevPr: prev.number, pr: next.number };
|
|
87
|
+
if (prev.repository !== next.repository) return { kind: 'kept', ...base, reason: 'other-repository' };
|
|
88
|
+
if (prId(prev) === prId(next)) return { kind: 'kept', ...base, reason: 'same-pr' };
|
|
89
|
+
let view: RoundPrView | null = null;
|
|
90
|
+
try { view = input.adapters.view(prev); } catch { view = null; }
|
|
91
|
+
if (!view) return { kind: 'kept', ...base, reason: 'view-unobserved' };
|
|
92
|
+
if (view.state !== 'OPEN' || view.mergedAt) return { kind: 'kept', ...base, reason: `state:${view.mergedAt ? 'MERGED' : view.state}` };
|
|
93
|
+
if (!view.isDraft) return { kind: 'kept', ...base, reason: 'not-draft' };
|
|
94
|
+
const held = view.labels.find((label) => PROTECTED_LABELS.has(label));
|
|
95
|
+
if (held) return { kind: 'kept', ...base, reason: `label:${held}` };
|
|
96
|
+
// Label first: a closed but unlabelled PR would fall outside every later sweep (draft-sweep rule).
|
|
97
|
+
let labelled = view.labels.includes(SUPERSEDED_LABEL);
|
|
98
|
+
if (!labelled) {
|
|
99
|
+
try { labelled = input.adapters.addLabel(prev, SUPERSEDED_LABEL); } catch { labelled = false; }
|
|
100
|
+
}
|
|
101
|
+
if (!labelled) return { kind: 'kept', ...base, reason: 'label-failed' };
|
|
102
|
+
const id = prId(prev);
|
|
103
|
+
if (view.comments.some((body) => body.includes(commentMarker(prev, next)))) commented.add(id);
|
|
104
|
+
if (!commented.has(id)) {
|
|
105
|
+
let ok = false;
|
|
106
|
+
try { ok = input.adapters.comment(prev, roundPrSupersedeComment({ runId: input.runId, round, prev, next })); } catch { ok = false; }
|
|
107
|
+
if (!ok) return { kind: 'kept', ...base, reason: 'comment-failed' };
|
|
108
|
+
commented.add(id);
|
|
109
|
+
}
|
|
110
|
+
let closed = false;
|
|
111
|
+
try { closed = input.adapters.close(prev); } catch { closed = false; }
|
|
112
|
+
return closed ? { kind: 'superseded', ...base } : { kind: 'kept', ...base, reason: 'close-failed' };
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/** Unfinished supersedes, keyed by the earlier PR; `next` stays the first successor so retries link the same PR. */
|
|
116
|
+
const pending = new Map<string, { prev: { ref: RoundPrRef; merged: boolean }; next: RoundPrRef }>();
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
/** Record one round's results, then (re)try every unfinished supersede — even when this round has no PR. */
|
|
120
|
+
record(results: readonly SelfDevJobResult[], round: number): RoundPrOutcome[] {
|
|
121
|
+
const outcomes: RoundPrOutcome[] = [];
|
|
122
|
+
for (const result of results) {
|
|
123
|
+
const ref = roundPrRef(result.prUrl);
|
|
124
|
+
if (!ref) continue;
|
|
125
|
+
const key = resumeKey(result.feature);
|
|
126
|
+
const seen = byGoal.get(key) ?? [];
|
|
127
|
+
// A PR already seen in this run is never a new successor — only a new PR is.
|
|
128
|
+
const known = seen.find((entry) => prId(entry.ref) === prId(ref));
|
|
129
|
+
if (known) {
|
|
130
|
+
known.merged ||= result.merged === true;
|
|
131
|
+
// A carried (skipped) shard is not a new round's work.
|
|
132
|
+
if (result.resumeDisposition !== 'skip' && known.round < round) {
|
|
133
|
+
outcomes.push({ kind: 'continued', round, prevPr: known.ref.number, pr: ref.number });
|
|
134
|
+
emit('round-pr-continued', { runId: input.runId, round, prevPr: known.ref.number, pr: ref.number });
|
|
135
|
+
}
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// A carried result this run has not seen before was opened by an earlier process — not this run's PR,
|
|
139
|
+
// so it is neither recorded nor allowed to supersede anything.
|
|
140
|
+
if (result.resumeDisposition === 'skip') continue;
|
|
141
|
+
// Only PRs opened in an earlier round are superseded — never a sibling of the same round.
|
|
142
|
+
for (const prev of seen) {
|
|
143
|
+
const id = prId(prev.ref);
|
|
144
|
+
if (prev.round >= round || handled.has(id) || pending.has(id)) continue;
|
|
145
|
+
if (prev.merged) {
|
|
146
|
+
handled.add(id);
|
|
147
|
+
outcomes.push({ kind: 'kept', round, prevPr: prev.ref.number, pr: ref.number, reason: 'merged' });
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
pending.set(id, { prev, next: ref });
|
|
151
|
+
}
|
|
152
|
+
seen.push({ ref, merged: result.merged === true, round });
|
|
153
|
+
byGoal.set(key, seen);
|
|
154
|
+
}
|
|
155
|
+
for (const [id, { prev: entry, next }] of [...pending]) {
|
|
156
|
+
const prev = entry.ref;
|
|
157
|
+
// A result may have reported the earlier PR merged after it was queued — re-checked right before any write.
|
|
158
|
+
const outcome: SupersedeOutcome = entry.merged
|
|
159
|
+
? { kind: 'kept', round, prevPr: prev.number, pr: next.number, reason: 'merged' }
|
|
160
|
+
: supersede(prev, next, round);
|
|
161
|
+
outcomes.push(outcome);
|
|
162
|
+
// Retry only what was not observed or not applied; a decided keep/supersede is final for this run.
|
|
163
|
+
if (outcome.kind === 'superseded' || !/^(?:view-unobserved|label-failed|comment-failed|close-failed)$/.test(outcome.reason)) {
|
|
164
|
+
handled.add(id);
|
|
165
|
+
pending.delete(id);
|
|
166
|
+
}
|
|
167
|
+
if (outcome.kind === 'superseded') {
|
|
168
|
+
emit('round-pr-superseded', { runId: input.runId, round, prevPr: prev.number, pr: next.number });
|
|
169
|
+
} else {
|
|
170
|
+
emit('round-pr-supersede-kept', { runId: input.runId, round, prevPr: prev.number, pr: next.number, reason: outcome.reason });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return outcomes;
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function ghEnv(): Record<string, string> {
|
|
179
|
+
const env: Record<string, string> = {};
|
|
180
|
+
for (const [k, v] of Object.entries(process.env)) if (v !== undefined && !/^(https?|all|no)_proxy$/i.test(k)) env[k] = v;
|
|
181
|
+
return env;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Real gh adapters: proxy variables removed, App identity when available (never the personal login by choice). */
|
|
185
|
+
export async function defaultRoundPrAdapters(deps: {
|
|
186
|
+
appToken?: () => string | null;
|
|
187
|
+
run?: (args: string[], env: Record<string, string>) => { status: number | null; stdout: string };
|
|
188
|
+
inTest?: () => boolean;
|
|
189
|
+
} = {}): Promise<RoundPrAdapters> {
|
|
190
|
+
const env = ghEnv();
|
|
191
|
+
let tokenSource: () => string | null = () => null;
|
|
192
|
+
try {
|
|
193
|
+
tokenSource = deps.appToken ?? (await import('../auth/github-app-token.js')).githubAutomationToken;
|
|
194
|
+
} catch { /* no App credential module — every write refuses */ }
|
|
195
|
+
const freshToken = (): string | null => { try { return tokenSource(); } catch { return null; } };
|
|
196
|
+
const gh = (args: string[], token?: string | null) => {
|
|
197
|
+
const callEnv = { ...env };
|
|
198
|
+
if (token) callEnv.GH_TOKEN = token;
|
|
199
|
+
return deps.run
|
|
200
|
+
? deps.run(args, callEnv)
|
|
201
|
+
: spawnSync('gh', args, { encoding: 'utf8', env: callEnv as NodeJS.ProcessEnv, timeout: 30_000 });
|
|
202
|
+
};
|
|
203
|
+
// Writes (label · comment · close) run only as the automation App — the token is fetched per write, so a
|
|
204
|
+
// token that was missing or expired earlier in the run recovers; without it the write refuses and is retried.
|
|
205
|
+
// Reads may use the machine login.
|
|
206
|
+
const write = (op: string, pr: RoundPrRef, args: string[]): boolean => {
|
|
207
|
+
const token = freshToken();
|
|
208
|
+
if (!token) {
|
|
209
|
+
try { debug.log('self-dev.supervisor', 'round-pr-write-refused', { op, pr: pr.number, reason: 'no-app-token' }); } catch { /* fail-open */ }
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
return gh(args, token).status === 0;
|
|
213
|
+
};
|
|
214
|
+
const inTest = deps.inTest ?? ((): boolean => process.env.NODE_ENV === 'test');
|
|
215
|
+
return {
|
|
216
|
+
view(pr) {
|
|
217
|
+
if (inTest()) return null;
|
|
218
|
+
const out = gh(['pr', 'view', String(pr.number), '--repo', pr.repository, '--json', 'state,isDraft,labels,mergedAt,comments'], freshToken());
|
|
219
|
+
if (out.status !== 0) return null;
|
|
220
|
+
try {
|
|
221
|
+
const parsed = JSON.parse(out.stdout) as { state?: unknown; isDraft?: unknown; labels?: unknown; mergedAt?: unknown; comments?: unknown };
|
|
222
|
+
if (typeof parsed.state !== 'string' || typeof parsed.isDraft !== 'boolean' || !Array.isArray(parsed.labels)) return null;
|
|
223
|
+
const labels = parsed.labels.map((label) => (label as { name?: unknown })?.name);
|
|
224
|
+
if (labels.some((name) => typeof name !== 'string')) return null;
|
|
225
|
+
// Unverifiable comments make the whole view unobserved — no write may follow it.
|
|
226
|
+
if (!Array.isArray(parsed.comments)) return null;
|
|
227
|
+
const comments = parsed.comments.map((comment) => (comment as { body?: unknown })?.body);
|
|
228
|
+
if (comments.some((body) => typeof body !== 'string')) return null;
|
|
229
|
+
return { state: parsed.state, isDraft: parsed.isDraft, labels: labels as string[], mergedAt: typeof parsed.mergedAt === 'string' && parsed.mergedAt ? parsed.mergedAt : null, comments: comments as string[] };
|
|
230
|
+
} catch {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
addLabel(pr, label) {
|
|
235
|
+
return !inTest() && write('label', pr, ['pr', 'edit', String(pr.number), '--repo', pr.repository, '--add-label', label]);
|
|
236
|
+
},
|
|
237
|
+
comment(pr, body) {
|
|
238
|
+
return !inTest() && write('comment', pr, ['pr', 'comment', String(pr.number), '--repo', pr.repository, '--body', body]);
|
|
239
|
+
},
|
|
240
|
+
close(pr) {
|
|
241
|
+
return !inTest() && write('close', pr, ['pr', 'close', String(pr.number), '--repo', pr.repository]);
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
@@ -7,6 +7,7 @@ import { recordSelfDevRunSupervisorStop, selfDevRunsDir } from './run-store.js';
|
|
|
7
7
|
import { debug } from '../debug/log.js';
|
|
8
8
|
import { sweepFrozenMerges } from '../self-implement/frozen-merges.js';
|
|
9
9
|
import { routeSupervisorVerdict, type SupervisorNext } from './supervisor-verdict-edges.js';
|
|
10
|
+
import { recordTaskAgentShadowMove, type TaskAgentShadowInput } from '../task-agent/shadow.js';
|
|
10
11
|
|
|
11
12
|
export interface SupervisorRound {
|
|
12
13
|
round: number;
|
|
@@ -461,6 +462,11 @@ export interface SuperviseRunOptions {
|
|
|
461
462
|
runStore?: { runId?: string; operatorDir?: string; dir?: string; isolatedDir?: string };
|
|
462
463
|
observe?: (event: string, data: Record<string, unknown>) => void;
|
|
463
464
|
sweepPendingMerges?: typeof sweepFrozenMerges;
|
|
465
|
+
/**
|
|
466
|
+
* TASK-AGENT-SHADOW — 멈춤이 확정되면 판단부를 그림자로 부른다(기본 `recordTaskAgentShadowMove`).
|
|
467
|
+
* `false` 면 끈다. 던져도 런의 결말은 바뀌지 않는다(fail-soft).
|
|
468
|
+
*/
|
|
469
|
+
taskAgentShadow?: ((input: TaskAgentShadowInput) => unknown) | false;
|
|
464
470
|
observeDeliverables?: () => Promise<{
|
|
465
471
|
readonly deployFindings: ReadonlyMap<string, { target: string; findings?: readonly DeployVerifyFinding[] | readonly unknown[] }>;
|
|
466
472
|
readonly unmeasured: readonly unknown[];
|
|
@@ -614,6 +620,14 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
614
620
|
});
|
|
615
621
|
} catch { /* fail-open */ }
|
|
616
622
|
}
|
|
623
|
+
if (decision.stopReason && opts.taskAgentShadow !== false) {
|
|
624
|
+
// TASK-AGENT-SHADOW — 판단부를 그림자로 부른다(실행 0). 어떤 오류도 런의 결말을 바꾸지 않는다.
|
|
625
|
+
try {
|
|
626
|
+
await (opts.taskAgentShadow ?? recordTaskAgentShadowMove)({ runId, stopReason: decision.stopReason, results });
|
|
627
|
+
} catch (error) {
|
|
628
|
+
try { debug.log('task-agent', 'shadow-move-failed', { runId, stopReason: decision.stopReason, error: String(error) }); } catch { /* fail-open */ }
|
|
629
|
+
}
|
|
630
|
+
}
|
|
617
631
|
return results;
|
|
618
632
|
}
|
|
619
633
|
|
|
@@ -12,7 +12,7 @@ import { addHarnessQueue, type QueueSeat } from '../harness/harness-queue.js';
|
|
|
12
12
|
import { debug } from '../debug/log.js';
|
|
13
13
|
import { withFileLockSync } from '../storage/file-lock.js';
|
|
14
14
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
15
|
-
import {
|
|
15
|
+
import { checklistDevVersion, listChecklist, parseOwner } from '../release-loop/checklist.js';
|
|
16
16
|
import { getUserConfig } from '../user-config.js';
|
|
17
17
|
|
|
18
18
|
export const FOLLOW_UP_DEPTH_LIMIT = 3;
|
|
@@ -193,7 +193,7 @@ function defaultAppendDraft(stateRoot: string, record: FollowUpDraftRecord): voi
|
|
|
193
193
|
|
|
194
194
|
function defaultCellOwner(cellId: string): string | undefined {
|
|
195
195
|
try {
|
|
196
|
-
return listChecklist(
|
|
196
|
+
return listChecklist(checklistDevVersion()).items.find((item) => item.id === cellId)?.owner;
|
|
197
197
|
} catch {
|
|
198
198
|
return undefined;
|
|
199
199
|
}
|