elanous 0.2.9 → 0.2.10
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/2DsiDfDCks44g1cPUMhiW/_buildManifest.js +1 -0
- package/apps/pwa/out/_next/static/chunks/24-e6d28380efab7faf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3615-740dd270764ffa24.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3734-1015fe991eb9b7e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5012-a7fe6f3c8b6fe45a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5783-ef40ebfc91d55230.js +1 -0
- package/apps/pwa/out/_next/static/chunks/62-ff227c3edb8b248b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7633-1b3709b0854c9412.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7951-8b03dbb10b24cd06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8067-87ce253ec2f23697.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5080-1613752891fcadb4.js → 8195-6fde3d7a39859206.js} +5 -5
- package/apps/pwa/out/_next/static/chunks/8894-b5fb36bab837cd29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9454-84d0d5d77446bd92.js +1 -0
- package/apps/pwa/out/_next/static/chunks/988-5f92e7ab7ccea3dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9989-5582582f06429840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d2253d7e58ef1890.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5441d4a9ab35e518.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-d9b12d680922d980.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-f972fc1c00a62e88.js → page-54b32bd27726588d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e268d6d145827a22.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-f8116559c7424da7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-1085399fd0f32112.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-1df686a14f65895a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-54e1f966ab60a4dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/{page-973996d584f008c1.js → page-7ed95f296f5ee8e9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-11edac668d77e5c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-59e2b9a22cd5a6d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-2976df21ad74ab48.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-34d211a67f16d510.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-8ff652d5d950639b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/{page-8b0402a46a749a3d.js → page-b31610deda76337b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-037f83e2a1edc8e2.js → page-6cb0e1bbefe5fb3d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-a286a152cf584576.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-d9237581e7003bcb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-83274e761643fdd2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ceee6cfb1d4e6d68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-9c9f8bb3e4a64091.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-c17217603ea3426a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-efb6177cbf1e8a51.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-d307523703bc4df3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-462f4e4bab45ce7d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-8990e96f33af3837.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-0df30e0c7e50148a.js → page-e168fa1030af0548.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-1233e05a4068bc9c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-13a1840b1fac337a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-64a29fc80b11ab55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-68e787339a16b3dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-4fddc90b23feb215.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-886ba8260dc79c79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-0f26507a1722e40b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-109d4ccd42259c9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-f5c2a4e510726774.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b2e0039416f42522.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/{page-90670589b87abea8.js → page-26102fd7350f171e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-708948bc8a802794.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-5e5611620f78fb0b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/{page-35bedde6d885f08f.js → page-139ba5c367bbf60a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/main-app-202b4e81f33895ea.js +1 -0
- package/apps/pwa/out/_next/static/css/43feca5fd387dcbd.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/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/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/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/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 -0
- package/apps/pwa/out/ops/seats/index.txt +30 -0
- 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 -0
- package/apps/pwa/out/today/index.txt +33 -0
- 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/graphs/field/field-feed.yaml +2 -0
- package/graphs/implement-loop.yaml +1 -1
- package/package.json +1 -1
- package/plugins/card-followup/graphs/run-step.ts +48 -13
- package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
- package/plugins/doc-draft/graphs/run-step.ts +13 -6
- package/scripts/ci-pwa-build-gate.ts +160 -0
- package/scripts/coord-channel-watch.sh +42 -8
- package/scripts/coord-digest.ts +199 -0
- package/scripts/coord-post.sh +60 -3
- package/scripts/install.ps1 +68 -9
- package/scripts/install.sh +39 -12
- package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
- package/scripts/lib/tui-regress-checks.ts +146 -0
- package/scripts/memory-lifecycle-cycle.ts +2 -2
- package/scripts/ops-now-probe.ts +327 -0
- package/scripts/publish-internal-dist.ts +11 -1
- package/scripts/release-loop/cutoff.ts +19 -8
- package/scripts/release-loop/ops-upgrade-node.ts +72 -16
- package/scripts/release-loop/release-readiness.ts +9 -0
- package/scripts/release-loop/version-node.ts +58 -10
- package/scripts/repo-watch-cycle.ts +1 -1
- package/scripts/retro-cycle.ts +2 -2
- package/scripts/schedule-health-report.ts +1 -1
- package/scripts/storyboard/storyboard.ts +5 -161
- package/scripts/test-diet/lib.ts +30 -1
- package/scripts/test-diet/node.ts +82 -7
- package/scripts/test-timeout-audit.ts +114 -0
- package/scripts/tree-sync-alert.ts +1 -1
- package/scripts/tui-regress.ts +71 -0
- package/scripts/waitlist-daily-digest.ts +1 -1
- package/skills/explainer-video/SKILL.md +4 -0
- package/skills/explainer-video/engine/reel.mjs +18 -13
- package/skills/explainer-video/engine/reel.sh +24 -5
- package/skills/explainer-video/engine/stitch.mjs +145 -0
- package/skills/pitch-deck/SKILL.md +36 -0
- package/skills/pitch-deck/template.html +80 -0
- package/src/acp/codex-approval-adapter.ts +9 -3
- package/src/acp/core-turn-bridge.ts +117 -18
- package/src/acp/fact-question.ts +11 -0
- package/src/acp/server.ts +48 -7
- package/src/acp/tool-approval.ts +126 -0
- package/src/acp/turn-runner.ts +36 -0
- package/src/agent/monad-agent-turn.ts +8 -0
- package/src/ask-user-question/pending-questions.ts +25 -10
- package/src/ask-user-question/types.ts +9 -0
- package/src/auth/setup-link-tokens.ts +16 -5
- package/src/autopilot/build/integrity-gate.ts +12 -0
- package/src/boot/daemon-prompt-turn.ts +3 -0
- package/src/boot/daemon-tools/index.ts +8 -0
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/boot/daemon-tools/web-search.ts +1 -0
- package/src/chat/ctrl-c-in-input.ts +14 -0
- package/src/chat/index.ts +52 -0
- package/src/chat/pickers/state.ts +6 -2
- package/src/cli/agent-cli.ts +7 -0
- package/src/cli/decisions-cli.ts +25 -3
- package/src/cli/doctor-bundle-upload.ts +68 -0
- package/src/cli/doctor-cli.ts +38 -4
- package/src/cli/ops-cli.ts +20 -0
- package/src/cli/pod-cli.ts +49 -0
- package/src/cli/pr-cli.ts +31 -2
- package/src/cli/pwa-stop.ts +163 -13
- package/src/cli/pwa-test.ts +3 -0
- package/src/cli/release-cli.ts +63 -20
- package/src/cli/self-update.ts +14 -0
- package/src/cli/storyboard-cli.ts +37 -0
- package/src/cli/test-state-dir-flag.ts +11 -4
- package/src/connectors/linear.ts +146 -0
- package/src/context-bus/coord-events.ts +115 -0
- package/src/dashboard/dashboard-boot-fixture.ts +23 -0
- package/src/dashboard/index.ts +58 -21
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +7 -0
- package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
- package/src/decisions/decision-cards.ts +49 -1
- package/src/decisions/decision-ledger.ts +75 -4
- package/src/decisions/decision-linear-projection.ts +157 -0
- package/src/decisions/web-push-decision-cards.ts +50 -0
- package/src/directive/interpretation-card.ts +36 -0
- package/src/discord.ts +2 -1
- package/src/domains/coo-admin-tool.ts +62 -0
- package/src/domains/core-tools.ts +11 -3
- package/src/domains/elanous-card.ts +29 -0
- package/src/domains/ops-facts-tool.ts +76 -0
- package/src/domains/outbound-alert.ts +41 -13
- package/src/domains/release-tool.ts +168 -0
- package/src/domains/telegram-kind-route.ts +19 -1
- package/src/exec-requests/planner.ts +98 -28
- package/src/exec-requests/runner.ts +107 -10
- package/src/exec-requests/store.ts +8 -2
- package/src/field/field-media.ts +10 -7
- package/src/field/field-reel.ts +14 -4
- package/src/git-fs/worktree.ts +45 -6
- package/src/graph-runner/graph-approval-card.ts +113 -0
- package/src/graph-runner/graph-cli.ts +129 -4
- package/src/graph-runner/graph-notify.ts +25 -3
- package/src/graph-runner/runner.ts +142 -16
- package/src/harness/browser-verify.ts +25 -2
- package/src/harness/harness-cli-command.ts +231 -35
- package/src/harness/harness-incidents-writer.fixture.ts +24 -0
- package/src/harness/harness-incidents.ts +129 -0
- package/src/harness/harness-stop.ts +53 -3
- package/src/hitl/clarification-policy.ts +3 -1
- package/src/index.ts +156 -37
- package/src/intake-plane/author-goals.ts +37 -4
- package/src/intake-plane/check.ts +3 -0
- package/src/intake-plane/discord-seat-work.ts +47 -2
- package/src/intake-plane/seat-doc-route.ts +170 -6
- package/src/intake-plane/telegram-seat-work.ts +44 -2
- package/src/intake-plane/telegram-work.ts +1 -0
- package/src/maturity/cli-maturity.ts +34 -0
- package/src/maturity/feature-maturity.ts +98 -1
- package/src/maturity/tui-slash-maturity.ts +31 -0
- package/src/memory.ts +32 -4
- package/src/nexus/api/exec-requests.ts +33 -3
- package/src/nexus/api/http-server.ts +53 -1
- package/src/nexus/api/meta-api.ts +11 -0
- package/src/nexus/api/ops-api.ts +10 -1
- package/src/nexus/api/ops-seats-sources.ts +37 -7
- package/src/nexus/api/ops-seats.ts +16 -6
- package/src/nexus/api/seat-requests.ts +88 -8
- package/src/nexus/api/sessions-store.ts +63 -0
- package/src/nexus/api/setup-codex-login.ts +160 -0
- package/src/nexus/api/usage-api.ts +102 -0
- package/src/nexus/index.ts +45 -4
- package/src/onboarding/first-run.ts +89 -0
- package/src/onboarding/lan-address.ts +45 -0
- package/src/onboarding/web-first.ts +119 -24
- package/src/onboarding.ts +4 -0
- package/src/ops-now/ops-now-refresh.ts +100 -0
- package/src/project/project-store.ts +115 -0
- package/src/release-loop/checklist.ts +78 -4
- package/src/release-loop/feature-store.ts +154 -21
- package/src/release-loop/release-schedule.ts +53 -0
- package/src/repl/index.ts +7 -0
- package/src/seat-dispatch/ceo-commands.ts +41 -8
- package/src/seat-dispatch/ceo-intent.ts +38 -0
- package/src/seat-loop/seat-loop.ts +231 -0
- package/src/seat-loop/seat-report.ts +64 -0
- package/src/self-dev/decompose.ts +66 -11
- package/src/self-dev/run-store.ts +10 -1
- package/src/self-implement/execution-clarification.ts +115 -0
- package/src/self-implement/gate-cli.ts +6 -3
- package/src/self-implement/orchestrator.ts +37 -3
- package/src/self-implement/pipeline-shape.ts +1 -1
- package/src/self-implement/run-status-mapping.ts +5 -3
- package/src/session/chat.ts +2 -0
- package/src/session/index.ts +9 -0
- package/src/shell-env-bootstrap.ts +17 -0
- package/src/steward/directive.ts +51 -2
- package/src/steward/launch.ts +250 -0
- package/src/steward/outcome-notify.ts +115 -0
- package/src/steward/steward-cards.ts +8 -2
- package/src/steward/triage-plan.ts +32 -4
- package/src/steward/triage.ts +93 -9
- package/src/steward/working-backwards.ts +64 -0
- package/src/storyboard/storyboard.ts +141 -0
- package/src/task-cards/card-store.ts +2 -2
- package/src/task-orchestrator/surfaces/pod-lease.ts +260 -0
- package/src/telegram-card-followup.ts +233 -0
- package/src/telegram-report.ts +15 -9
- package/src/telegram-run.ts +7 -0
- package/src/telegram.ts +29 -8
- package/src/tool-runtime/types.ts +4 -0
- package/src/tui-client/dashboard-session.ts +2 -0
- package/src/user-config.ts +118 -11
- package/src/version/packed-revision.json +1 -1
- package/src/web-push/notify-exec-request.ts +32 -0
- package/apps/pwa/out/_next/static/bFI5EEwg7T6aG88ibX4Zq/_buildManifest.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8630-cdfc61e82c653ffc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8894-e263b332208e3957.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9454-139040d37c79dbc9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fb7c2d458f32fcad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-35e2713597dd24d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-918b656f064577ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-5f30e00693527ebd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-7fbae173b3c103a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3b4edcce364062ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-c5794f484c251f44.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1130d8eefcd87e76.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-016e2bda04eecb1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-b4d6d9a3b56f2940.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-ec49a466121233ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-f72db356744ceade.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-a6fd9b50d1b85378.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-adfbd2ba9598e59a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-46fedff57d4bec67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-0cf318e9dcee2bbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-899b327cb8b6845c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6c1e6ba743a29dfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-1a8e4807292f6b17.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-28deba6bcb834916.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-de68e2205794037d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-c71c33a573230672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-4fc56790fe0d2682.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-59df2aebb38a7c1e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-4647be5dbcbd0795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-e025892bda74b743.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-a0955de73b89f078.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-369846d2921af584.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-72cbc1c8cdd0f65d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-77b28bfb0996d5ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-3220c4934f49c6c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-7df9243ed021a4cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-4498c3853f4f688d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
- package/apps/pwa/out/_next/static/css/f92f63a5df0ba229.css +0 -1
- package/src/dashboard/turn-typeahead-echo.ts +0 -23
- /package/apps/pwa/out/_next/static/{bFI5EEwg7T6aG88ibX4Zq → 2DsiDfDCks44g1cPUMhiW}/_ssgManifest.js +0 -0
package/src/telegram.ts
CHANGED
|
@@ -71,6 +71,7 @@ import { effectiveInstanceRoot } from './instance/resolve.js';
|
|
|
71
71
|
import { getElanousConfigDir } from './elanous-config-dir.js';
|
|
72
72
|
import { defaultFieldEvent, FieldUploadError, parseFieldCaption, resolveFieldMime, saveFieldMedia } from './field/field-media.js';
|
|
73
73
|
import { scheduleFieldReel, type FieldReelOptions } from './field/field-reel.js';
|
|
74
|
+
import { maybeHandleCardPhoto, type CardPhotoDeps } from './telegram-card-followup.js';
|
|
74
75
|
|
|
75
76
|
export type TgAttachmentKind = 'photo' | 'voice' | 'audio' | 'document';
|
|
76
77
|
|
|
@@ -216,6 +217,8 @@ export interface TelegramBotOpts {
|
|
|
216
217
|
fieldRootDir?: () => string;
|
|
217
218
|
/** 시험에서는 실제 렌더 대신 가짜 실행기를 주입한다. */
|
|
218
219
|
fieldReel?: FieldReelOptions;
|
|
220
|
+
/** Test seam for the business-card graph and its private run root. */
|
|
221
|
+
cardFollowupDeps?: Pick<CardPhotoDeps, 'runGraph' | 'rootDir' | 'ocrText'>;
|
|
219
222
|
}
|
|
220
223
|
|
|
221
224
|
/** Surface-unification v2 (FU-2) — Telegram trigger event passed to
|
|
@@ -333,10 +336,11 @@ export class TelegramBot {
|
|
|
333
336
|
private readonly fieldDefaultEventOpt?: string;
|
|
334
337
|
private readonly fieldRootDir: () => string;
|
|
335
338
|
private readonly fieldReel?: FieldReelOptions;
|
|
339
|
+
private readonly cardFollowupDeps: Pick<CardPhotoDeps, 'runGraph' | 'rootDir' | 'ocrText'>;
|
|
336
340
|
private readonly seatWorkDeps: TelegramSeatWorkDeps;
|
|
337
341
|
/** 앨범 id → `#현장` 행사 · 답장 디바운스. 태그된 앨범만 들어온다. */
|
|
338
342
|
private readonly fieldGroups = new Map<string, {
|
|
339
|
-
event: string; at: number; chatId: number; threadId?: number; replyTo: number; count: number;
|
|
343
|
+
event: string; mode?: 'instant'; at: number; chatId: number; threadId?: number; replyTo: number; count: number;
|
|
340
344
|
timer?: ReturnType<typeof setTimeout>;
|
|
341
345
|
}>();
|
|
342
346
|
|
|
@@ -368,6 +372,7 @@ export class TelegramBot {
|
|
|
368
372
|
this.fieldDefaultEventOpt = opts.fieldDefaultEvent;
|
|
369
373
|
this.fieldRootDir = opts.fieldRootDir ?? getElanousConfigDir;
|
|
370
374
|
this.fieldReel = opts.fieldReel;
|
|
375
|
+
this.cardFollowupDeps = opts.cardFollowupDeps ?? {};
|
|
371
376
|
this.seatWorkDeps = opts.seatWorkDeps ?? {};
|
|
372
377
|
if (opts.onTriggerTap) {
|
|
373
378
|
// Assign through `as unknown` to bypass `readonly` + private —
|
|
@@ -376,7 +381,7 @@ export class TelegramBot {
|
|
|
376
381
|
}
|
|
377
382
|
}
|
|
378
383
|
|
|
379
|
-
|
|
384
|
+
isOwnerAllowed(userId: number): boolean {
|
|
380
385
|
return this.allowedUsers.size > 0 && this.allowedUsers.has(userId);
|
|
381
386
|
}
|
|
382
387
|
|
|
@@ -1415,6 +1420,10 @@ export class TelegramBot {
|
|
|
1415
1420
|
? tag.event ?? defaultFieldEvent(
|
|
1416
1421
|
this.fieldDefaultEventOpt ?? this.slashContext?.userConfig?.telegram?.fieldDefaultEvent, new Date(now))
|
|
1417
1422
|
: group!.event;
|
|
1423
|
+
const captionMode = tag?.mode ?? group?.mode;
|
|
1424
|
+
const configMode = this.slashContext?.userConfig?.telegram?.fieldReelMode;
|
|
1425
|
+
const mode = captionMode ?? configMode ?? 'standard';
|
|
1426
|
+
const source = captionMode ? 'caption' : configMode ? 'config' : 'default';
|
|
1418
1427
|
|
|
1419
1428
|
let count: number | null = null;
|
|
1420
1429
|
let failure: string | null = null;
|
|
@@ -1435,14 +1444,16 @@ export class TelegramBot {
|
|
|
1435
1444
|
// 글(자막)은 캡션이 달린 항목에만 있다 — 앨범이면 첫 장에만 붙는다(MK 2026-09-30).
|
|
1436
1445
|
const saved = saveFieldMedia(inputs, { rootDir: this.fieldRootDir(), event, device: 'telegram', ...(tag?.text ? { caption: tag.text } : {}) });
|
|
1437
1446
|
count = saved.count;
|
|
1447
|
+
debug.log('telegram.field', 'reel-mode', { event, mode, source });
|
|
1438
1448
|
scheduleFieldReel(saved.dir, {
|
|
1439
1449
|
...this.fieldReel,
|
|
1450
|
+
mode,
|
|
1440
1451
|
notificationKey: `telegram:${this.botId}:${ctx.chatId}:${ctx.threadId ?? ''}:${ctx.mediaGroupId ?? ctx.messageId}`,
|
|
1441
1452
|
onDone: async (result) => {
|
|
1442
1453
|
const reply = { replyTo: ctx.messageId, threadId: ctx.threadId };
|
|
1443
1454
|
if (result.ok && result.file) {
|
|
1444
1455
|
const sent = await this.sendDocument(ctx.chatId, readFileSync(result.file), 'reel-9x16.mp4', {
|
|
1445
|
-
...reply, mimeType: 'video/mp4', caption: `현장 영상 · ${event} · ${result.seconds}
|
|
1456
|
+
...reply, mimeType: 'video/mp4', caption: `현장 영상 · ${event} · ${result.seconds}초${mode === 'instant' ? ' (즉석판)' : ''}`,
|
|
1446
1457
|
});
|
|
1447
1458
|
if (!sent) throw new Error('sendDocument failed');
|
|
1448
1459
|
if (result.feed?.started) {
|
|
@@ -1469,7 +1480,8 @@ export class TelegramBot {
|
|
|
1469
1480
|
return true;
|
|
1470
1481
|
}
|
|
1471
1482
|
// 앨범은 항목마다 답하지 않는다 — 마지막 항목 뒤 한 번(디바운스)만 최신 수로 답한다.
|
|
1472
|
-
const entry = group ?? { event, at: now, chatId: ctx.chatId, threadId: ctx.threadId, replyTo: ctx.messageId, count: 0 };
|
|
1483
|
+
const entry = group ?? { event, mode: tag?.mode, at: now, chatId: ctx.chatId, threadId: ctx.threadId, replyTo: ctx.messageId, count: 0 };
|
|
1484
|
+
if (group && tag?.mode) group.mode = tag.mode;
|
|
1473
1485
|
entry.at = now;
|
|
1474
1486
|
entry.count = count!;
|
|
1475
1487
|
if (entry.timer) clearTimeout(entry.timer);
|
|
@@ -1490,10 +1502,18 @@ export class TelegramBot {
|
|
|
1490
1502
|
}
|
|
1491
1503
|
// 현장 업로드 — `#현장` 캡션(또는 태그된 앨범의 나머지)의 사진·영상은 LLM 대신 현장 폴더로.
|
|
1492
1504
|
if (await this.tryHandleFieldUpload(ctx)) return;
|
|
1493
|
-
if (ctx
|
|
1505
|
+
if (await maybeHandleCardPhoto(ctx, {
|
|
1506
|
+
isOwner: (userId) => this.isOwnerAllowed(userId),
|
|
1507
|
+
isFieldAlbum: (id) => this.fieldGroups.has(id),
|
|
1508
|
+
downloadFile: (fileId, dir) => this.downloadFile(fileId, dir),
|
|
1509
|
+
sendMessage: (chatId, text, opts) => this.sendMessage(chatId, text, opts),
|
|
1510
|
+
sendDocument: (chatId, body, filename, opts) => this.sendDocument(chatId, body, filename, opts),
|
|
1511
|
+
...this.cardFollowupDeps,
|
|
1512
|
+
})) return;
|
|
1513
|
+
if (ctx.text.startsWith('@') || (ctx.isDm && ctx.text && !ctx.text.startsWith('/'))) {
|
|
1494
1514
|
const reply = await handleTelegramSeatWork(ctx.text, {
|
|
1495
|
-
chatId: ctx.chatId, messageId: ctx.messageId, threadId: ctx.threadId, botId: ctx.botId,
|
|
1496
|
-
}, this.seatWorkDeps);
|
|
1515
|
+
chatId: ctx.chatId, userId: ctx.userId, messageId: ctx.messageId, threadId: ctx.threadId, botId: ctx.botId,
|
|
1516
|
+
}, { ...this.seatWorkDeps, config: this.seatWorkDeps.config ?? this.slashContext?.userConfig });
|
|
1497
1517
|
if (reply !== null) {
|
|
1498
1518
|
await this.sendMessage(ctx.chatId, reply, { replyTo: ctx.messageId, threadId: ctx.threadId });
|
|
1499
1519
|
return;
|
|
@@ -1529,7 +1549,7 @@ export class TelegramBot {
|
|
|
1529
1549
|
try {
|
|
1530
1550
|
const { addDirective } = await import('./steward/directive.js');
|
|
1531
1551
|
const text = ctx.text.startsWith('지시:') ? ctx.text.slice('지시:'.length) : ctx.text.slice('/directive '.length);
|
|
1532
|
-
const result = await addDirective(text, { source: 'telegram' });
|
|
1552
|
+
const result = await addDirective(text, { source: 'telegram', origin: { chatId: ctx.chatId, botId: ctx.botId, threadId: ctx.threadId } });
|
|
1533
1553
|
await this.sendMessage(ctx.chatId, `${result.issue}: ${result.status}`, { replyTo: ctx.messageId, threadId: ctx.threadId });
|
|
1534
1554
|
} catch {
|
|
1535
1555
|
await this.sendMessage(ctx.chatId, '지시 등록 실패 — Linear 연결과 자격을 확인하세요.', { replyTo: ctx.messageId, threadId: ctx.threadId });
|
|
@@ -2746,6 +2766,7 @@ export function botFromConfig(opts: BotFromConfigOpts): TelegramBot {
|
|
|
2746
2766
|
// (makeTelegramAgentRunTurn) threads it into `delegate_code_agent`
|
|
2747
2767
|
// so a delegated sub-agent's approval prompt lands back here.
|
|
2748
2768
|
hitlConfirmChannel: botRef.hitlConfirmChannelForChat(ctx.chatId, ctx.threadId),
|
|
2769
|
+
...(botRef.isOwnerAllowed(ctx.userId) ? { verifiedOwner: { id: `telegram:${ctx.userId}` } } : {}),
|
|
2749
2770
|
hitlQuestionChannel: botRef.hitlQuestionChannelForChat(ctx.chatId, ctx.threadId),
|
|
2750
2771
|
// P1.4 — surface file spill bound to THIS chat so the NL
|
|
2751
2772
|
// `delegate_code_agent` path spills big diffs/stdout back here.
|
|
@@ -91,8 +91,12 @@ export interface ToolRuntimeContext {
|
|
|
91
91
|
sessionId?: string;
|
|
92
92
|
/** Session that originated this execution when it was delegated through another runtime session. */
|
|
93
93
|
originSessionId?: string;
|
|
94
|
+
/** Server-verified owner principal. Never derive this from session source, tool args, or a client-declared origin. */
|
|
95
|
+
verifiedOwner?: { id: string };
|
|
94
96
|
/** Server-assigned provenance; omitted on existing owner tool paths. */
|
|
95
97
|
requestOrigin?: RequestOrigin;
|
|
98
|
+
/** Confirm through the originating chat's channels, not another user's global channel. */
|
|
99
|
+
confirmChannels?: import('../hitl/confirm.js').ConfirmChannel[];
|
|
96
100
|
}
|
|
97
101
|
|
|
98
102
|
/** Output shape the LLM layer expects back. Most tools produce
|
|
@@ -210,6 +210,8 @@ export class DashboardSession {
|
|
|
210
210
|
transportFactory: pair.transportFactory,
|
|
211
211
|
shutdownSignal: shutdownCtrl.signal,
|
|
212
212
|
runTurn,
|
|
213
|
+
// PCH-2b — the in-process TUI dispatcher carries its own approval modals.
|
|
214
|
+
toolApproval: 'off',
|
|
213
215
|
...(opts.agentName ? { agentName: opts.agentName } : {}),
|
|
214
216
|
...(opts.agentVersion ? { agentVersion: opts.agentVersion } : {}),
|
|
215
217
|
...(opts.serverOptions ?? {}),
|
package/src/user-config.ts
CHANGED
|
@@ -917,6 +917,8 @@ export interface TelegramConfig {
|
|
|
917
917
|
kindRoles?: Record<string, string>;
|
|
918
918
|
/** `#현장` 캡션에 행사 슬러그가 없을 때 쓸 기본 행사(예: `marketers-night-2026-10`). 없으면 `field-<로컬 날짜>`. */
|
|
919
919
|
fieldDefaultEvent?: string;
|
|
920
|
+
/** `#현장` 영상의 기본 렌더 모드. 미지정 시 standard, 캡션의 `즉석`/`instant` 가 우선. */
|
|
921
|
+
fieldReelMode?: 'standard' | 'instant';
|
|
920
922
|
}
|
|
921
923
|
|
|
922
924
|
const TELEGRAM_DEFAULTS: TelegramConfig = { enabled: false, allowedUsers: [] };
|
|
@@ -982,6 +984,7 @@ const DISCORD_DEFAULTS: DiscordConfig = { enabled: false, allowedUsers: [] };
|
|
|
982
984
|
|
|
983
985
|
export interface OnboardingConfig {
|
|
984
986
|
webFirst?: boolean;
|
|
987
|
+
ready?: boolean;
|
|
985
988
|
completed: boolean;
|
|
986
989
|
completedAt?: string;
|
|
987
990
|
version: number;
|
|
@@ -1474,6 +1477,7 @@ export function parseErrorReportsConfig(raw: unknown): ErrorReportsConfig | unde
|
|
|
1474
1477
|
}
|
|
1475
1478
|
|
|
1476
1479
|
export interface ChatConfig {
|
|
1480
|
+
factQuestion: { maxToolTurns: number };
|
|
1477
1481
|
/** Short questions may receive a tool-free first reply. Default true. */
|
|
1478
1482
|
fastPath: boolean;
|
|
1479
1483
|
conciseness: ChatConcisenessConfig;
|
|
@@ -1502,6 +1506,7 @@ const CHAT_CONCISENESS_DEFAULTS: ChatConcisenessConfig = {
|
|
|
1502
1506
|
};
|
|
1503
1507
|
|
|
1504
1508
|
export const CHAT_DEFAULTS: ChatConfig = {
|
|
1509
|
+
factQuestion: { maxToolTurns: 6 },
|
|
1505
1510
|
fastPath: true,
|
|
1506
1511
|
conciseness: { ...CHAT_CONCISENESS_DEFAULTS },
|
|
1507
1512
|
toolOutput: {
|
|
@@ -1682,6 +1687,8 @@ export interface AcpHopCapConfig {
|
|
|
1682
1687
|
|
|
1683
1688
|
export interface AcpConfig {
|
|
1684
1689
|
hopCap: AcpHopCapConfig;
|
|
1690
|
+
/** ACP client permission response deadline (positive integer milliseconds). */
|
|
1691
|
+
toolApproval: { timeoutMs: number };
|
|
1685
1692
|
/** ACP PR reviewer and final judge backend. Absent defers to DEFAULT_REVIEW_BACKEND. */
|
|
1686
1693
|
reviewBackend?: string;
|
|
1687
1694
|
/** Rework agent backend. Absent defers to the driver default (codex). */
|
|
@@ -1707,7 +1714,17 @@ export interface AcpConfig {
|
|
|
1707
1714
|
scrubBillingEnv: boolean;
|
|
1708
1715
|
}
|
|
1709
1716
|
|
|
1710
|
-
const ACP_DEFAULTS: AcpConfig = { hopCap: {}, scrubBillingEnv: true };
|
|
1717
|
+
const ACP_DEFAULTS: AcpConfig = { hopCap: {}, toolApproval: { timeoutMs: 60_000 }, scrubBillingEnv: true };
|
|
1718
|
+
|
|
1719
|
+
function acpApprovalTimeoutMs(value: unknown): number | undefined {
|
|
1720
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value > 0 && value <= 2_147_483_647
|
|
1721
|
+
? value : undefined;
|
|
1722
|
+
}
|
|
1723
|
+
|
|
1724
|
+
function acpApprovalTimeoutEnv(): number | undefined {
|
|
1725
|
+
const raw = process.env.ELANOUS_ACP_TOOL_APPROVAL_TIMEOUT_MS;
|
|
1726
|
+
return raw !== undefined && /^\d+$/.test(raw) ? acpApprovalTimeoutMs(Number(raw)) : undefined;
|
|
1727
|
+
}
|
|
1711
1728
|
|
|
1712
1729
|
// ── Plan mode config (Coding Pipeline P4 followup) ───────────────────
|
|
1713
1730
|
//
|
|
@@ -1912,6 +1929,17 @@ function parseOpenDesignConfig(raw: unknown): OpenDesignConfig | undefined {
|
|
|
1912
1929
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
1913
1930
|
}
|
|
1914
1931
|
|
|
1932
|
+
export function parseDiagnosticsConfig(raw: unknown): UserConfig['diagnostics'] {
|
|
1933
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
1934
|
+
const value = (raw as Record<string, unknown>).uploadUrl;
|
|
1935
|
+
if (typeof value !== 'string' || !value.trim()) return undefined;
|
|
1936
|
+
try {
|
|
1937
|
+
const url = new URL(value.trim());
|
|
1938
|
+
if (url.protocol !== 'https:' || !url.hostname || url.username || url.password) return undefined;
|
|
1939
|
+
return { uploadUrl: url.href };
|
|
1940
|
+
} catch { return undefined; }
|
|
1941
|
+
}
|
|
1942
|
+
|
|
1915
1943
|
function parseDesignConfig(raw: unknown): DesignConfig | undefined {
|
|
1916
1944
|
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
1917
1945
|
const r = raw as Record<string, unknown>;
|
|
@@ -3440,16 +3468,27 @@ export type SeatLoopMode = 'off' | 'shadow' | 'on';
|
|
|
3440
3468
|
export interface SeatLoopConfig {
|
|
3441
3469
|
/** No seat actions by default; shadow observes without execution, on permits the seat loop to act. */
|
|
3442
3470
|
mode: SeatLoopMode;
|
|
3471
|
+
seats?: string[];
|
|
3472
|
+
podPool?: string;
|
|
3473
|
+
reportPr?: number;
|
|
3443
3474
|
}
|
|
3444
3475
|
|
|
3445
3476
|
export interface UserConfig {
|
|
3477
|
+
/** Explicit HTTPS destination for doctor diagnostics; absent means no upload. */
|
|
3478
|
+
diagnostics?: { uploadUrl?: string };
|
|
3479
|
+
/** Root CLI help audience; absent or invalid means owner. */
|
|
3480
|
+
cli?: { helpRole?: 'owner' | 'contributor' | 'general' };
|
|
3481
|
+
/** Execution-phase HITL answer deadline; absent means 30 minutes. */
|
|
3482
|
+
hitl?: { executionDeadlineMinutes?: number };
|
|
3483
|
+
coo?: { linearProject?: string };
|
|
3484
|
+
decisions?: { linearProjection: { enabled: boolean } };
|
|
3446
3485
|
/** Steward and seat loops are parsed independently. An absent seat remains off. */
|
|
3447
|
-
loops?: { steward?: { mode?: 'observe' | 'act'; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number }; seat?: SeatLoopConfig };
|
|
3486
|
+
loops?: { steward?: { mode?: 'observe' | 'act'; 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 };
|
|
3448
3487
|
/** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
|
|
3449
3488
|
* budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
|
|
3450
|
-
harness?: { pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; defaultRepo?: string; substrate?: 'local' | 'pod'; podPool?: string };
|
|
3489
|
+
harness?: { pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; defaultRepo?: string; substrate?: 'local' | 'pod'; podPool?: string; worktreeAddTimeoutSec?: number };
|
|
3451
3490
|
/** ☸️ Pod 실행 칸 — `pool` = 기존 기본 풀(`컨텍스트[@ssh호스트][:상한]` 쉼표 · 앞이 우선). harness 실행은 인자·ELANOUS_POD_POOL·harness.podPool 다음으로 읽는다. */
|
|
3452
|
-
pod?: { pool?: string; /** 호스트 Git 미러 디렉터리 — Pod Job 에 읽기 전용으로 마운트한다. */ hostMirror?: string; /** 원격 그라운딩 엔드포인트(호스트 nexus · tailnet 주소) — Pod 가 토큰으로 «질의→인용»만 묻는다(P13). */ groundingUrl?: string };
|
|
3491
|
+
pod?: { pool?: string; /** 호스트 Git 미러 디렉터리 — Pod Job 에 읽기 전용으로 마운트한다. */ hostMirror?: string; /** 원격 그라운딩 엔드포인트(호스트 nexus · tailnet 주소) — Pod 가 토큰으로 «질의→인용»만 묻는다(P13). */ groundingUrl?: string; /** 읽기 전용 Pod lease 권장에 쓰는 계정별 동시 수. */ lease?: { perAccount?: number } };
|
|
3453
3492
|
skillRouter: SkillRouterConfig;
|
|
3454
3493
|
llm: LLMConfig;
|
|
3455
3494
|
skills: SkillsConfig;
|
|
@@ -3773,7 +3812,10 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
|
|
|
3773
3812
|
|
|
3774
3813
|
function defaultConfig(): UserConfig {
|
|
3775
3814
|
return {
|
|
3776
|
-
|
|
3815
|
+
cli: { helpRole: 'owner' },
|
|
3816
|
+
coo: { linearProject: '외부 행정·큰 일 (COO)' },
|
|
3817
|
+
decisions: { linearProjection: { enabled: false } },
|
|
3818
|
+
loops: { seat: { mode: 'off', seats: ['MK'], podPool: 'pool-node-b@node-b:8' } },
|
|
3777
3819
|
skillRouter: { ...SR_DEFAULTS },
|
|
3778
3820
|
llm: { ...LLM_DEFAULTS },
|
|
3779
3821
|
skills: skillsDefaults(),
|
|
@@ -3786,6 +3828,7 @@ function defaultConfig(): UserConfig {
|
|
|
3786
3828
|
logs: { retention: { ...LOGS_DEFAULTS.retention } },
|
|
3787
3829
|
shell: { ...SHELL_DEFAULTS },
|
|
3788
3830
|
chat: {
|
|
3831
|
+
factQuestion: { ...CHAT_DEFAULTS.factQuestion },
|
|
3789
3832
|
fastPath: CHAT_DEFAULTS.fastPath,
|
|
3790
3833
|
conciseness: { ...CHAT_CONCISENESS_DEFAULTS },
|
|
3791
3834
|
toolOutput: { ...CHAT_DEFAULTS.toolOutput },
|
|
@@ -3823,7 +3866,7 @@ function defaultConfig(): UserConfig {
|
|
|
3823
3866
|
iulForegroundOnStartup: false,
|
|
3824
3867
|
order: [...VW_ORDER_DEFAULT],
|
|
3825
3868
|
},
|
|
3826
|
-
acp: { hopCap: { ...ACP_DEFAULTS.hopCap }, scrubBillingEnv: ACP_DEFAULTS.scrubBillingEnv },
|
|
3869
|
+
acp: { hopCap: { ...ACP_DEFAULTS.hopCap }, toolApproval: { timeoutMs: acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs }, scrubBillingEnv: ACP_DEFAULTS.scrubBillingEnv },
|
|
3827
3870
|
lsp: cloneLspDefaults(),
|
|
3828
3871
|
plan: { ...PLAN_DEFAULTS },
|
|
3829
3872
|
goals: { ...GOALS_DEFAULTS },
|
|
@@ -4253,11 +4296,21 @@ function parseStewardTracks(input: unknown): Record<string, string> | undefined
|
|
|
4253
4296
|
}
|
|
4254
4297
|
|
|
4255
4298
|
function parseSeatLoopsConfig(input: unknown): SeatLoopConfig {
|
|
4256
|
-
|
|
4299
|
+
const defaults: SeatLoopConfig = { mode: 'off', seats: ['MK'], podPool: 'pool-node-b@node-b:8' };
|
|
4300
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) return defaults;
|
|
4257
4301
|
const seat = (input as Record<string, unknown>).seat;
|
|
4258
|
-
if (!seat || typeof seat !== 'object' || Array.isArray(seat)) return
|
|
4259
|
-
const
|
|
4260
|
-
|
|
4302
|
+
if (!seat || typeof seat !== 'object' || Array.isArray(seat)) return defaults;
|
|
4303
|
+
const values = seat as Record<string, unknown>;
|
|
4304
|
+
const mode = values.mode;
|
|
4305
|
+
return {
|
|
4306
|
+
mode: mode === 'on' || mode === 'shadow' ? mode : 'off',
|
|
4307
|
+
seats: Array.isArray(values.seats) && values.seats.length > 0
|
|
4308
|
+
&& values.seats.every((value) => typeof value === 'string' && /^(?:MK|OP|TC|UX)$/.test(value))
|
|
4309
|
+
? [...new Set(values.seats as string[])] : ['MK'],
|
|
4310
|
+
podPool: typeof values.podPool === 'string' && values.podPool.trim() ? values.podPool.trim() : defaults.podPool,
|
|
4311
|
+
...(typeof values.reportPr === 'number' && Number.isSafeInteger(values.reportPr) && values.reportPr > 0
|
|
4312
|
+
? { reportPr: values.reportPr } : {}),
|
|
4313
|
+
};
|
|
4261
4314
|
}
|
|
4262
4315
|
|
|
4263
4316
|
function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
|
|
@@ -4275,6 +4328,10 @@ function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
|
|
|
4275
4328
|
}
|
|
4276
4329
|
return { steward: {
|
|
4277
4330
|
mode: s.mode === 'act' ? 'act' : 'observe',
|
|
4331
|
+
// Absent or invalid launch keys stay absent: launch.ts applies the defaults (shadow · 3 · pool-node-b@node-b:8).
|
|
4332
|
+
...(s.launch === 'off' || s.launch === 'shadow' || s.launch === 'live' ? { launch: s.launch } : {}),
|
|
4333
|
+
...(typeof s.maxParallel === 'number' && Number.isSafeInteger(s.maxParallel) && s.maxParallel > 0 ? { maxParallel: s.maxParallel } : {}),
|
|
4334
|
+
...(typeof s.podPool === 'string' && s.podPool.trim() ? { podPool: s.podPool.trim() } : {}),
|
|
4278
4335
|
...(typeof s.linearTeam === 'string' && s.linearTeam.trim() ? { linearTeam: s.linearTeam.trim() } : {}),
|
|
4279
4336
|
...(Object.keys(roles).length ? { roles } : {}),
|
|
4280
4337
|
...(typeof s.budget === 'number' && Number.isFinite(s.budget) && s.budget >= 0 ? { budget: s.budget } : {}),
|
|
@@ -4283,6 +4340,11 @@ function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
|
|
|
4283
4340
|
} };
|
|
4284
4341
|
}
|
|
4285
4342
|
|
|
4343
|
+
export function parseCliHelpRole(raw: unknown): NonNullable<UserConfig['cli']>['helpRole'] {
|
|
4344
|
+
const cli = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw as Record<string, unknown> : {};
|
|
4345
|
+
return cli.helpRole === 'general' || cli.helpRole === 'contributor' ? cli.helpRole : 'owner';
|
|
4346
|
+
}
|
|
4347
|
+
|
|
4286
4348
|
export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
4287
4349
|
if (!existsSync(path)) return defaultConfigWithRuntimeProvider();
|
|
4288
4350
|
let raw: unknown;
|
|
@@ -4338,6 +4400,8 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4338
4400
|
const logsRaw = (rawObj.logs ?? {}) as Record<string, unknown>;
|
|
4339
4401
|
const sh = (rawObj.shell ?? {}) as Record<string, unknown>;
|
|
4340
4402
|
const chat = (rawObj.chat ?? {}) as Record<string, unknown>;
|
|
4403
|
+
const chatFactQuestion = (chat.factQuestion && typeof chat.factQuestion === 'object' && !Array.isArray(chat.factQuestion))
|
|
4404
|
+
? chat.factQuestion as Record<string, unknown> : {};
|
|
4341
4405
|
const chatConciseness = (chat.conciseness ?? {}) as Record<string, unknown>;
|
|
4342
4406
|
const chatToolOutput = (chat.toolOutput ?? {}) as Record<string, unknown>;
|
|
4343
4407
|
const chatAutoCompact = (chat.autoCompact ?? {}) as Record<string, unknown>;
|
|
@@ -4370,6 +4434,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4370
4434
|
const vw = (rawObj.vw ?? {}) as Record<string, unknown>;
|
|
4371
4435
|
const acp = (rawObj.acp ?? {}) as Record<string, unknown>;
|
|
4372
4436
|
const acpHopCap = (acp.hopCap ?? {}) as Record<string, unknown>;
|
|
4437
|
+
const acpToolApproval = (acp.toolApproval ?? {}) as Record<string, unknown>;
|
|
4373
4438
|
const lspRaw = (rawObj.lsp ?? {}) as Record<string, unknown>;
|
|
4374
4439
|
|
|
4375
4440
|
// RFC #2161 (PLAN-config-unification-elanous-root) — `elanous nexus config
|
|
@@ -4391,11 +4456,20 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4391
4456
|
...(typeof legacyPod.pool === 'string' && legacyPod.pool.trim() ? { pool: legacyPod.pool.trim() } : {}),
|
|
4392
4457
|
...(typeof legacyPod.hostMirror === 'string' && legacyPod.hostMirror.trim() ? { hostMirror: legacyPod.hostMirror.trim() } : {}),
|
|
4393
4458
|
...(typeof legacyPod.groundingUrl === 'string' ? { groundingUrl: legacyPod.groundingUrl } : {}),
|
|
4459
|
+
lease: { perAccount: (() => {
|
|
4460
|
+
const lease = legacyPod.lease && typeof legacyPod.lease === 'object' && !Array.isArray(legacyPod.lease)
|
|
4461
|
+
? (legacyPod.lease as Record<string, unknown>) : {};
|
|
4462
|
+
return typeof lease.perAccount === 'number' && Number.isSafeInteger(lease.perAccount) && lease.perAccount > 0
|
|
4463
|
+
? lease.perAccount : 4;
|
|
4464
|
+
})() },
|
|
4394
4465
|
},
|
|
4395
4466
|
harness: {
|
|
4396
4467
|
pod: { grokApiKeyOptIn: harnessPod.grokApiKeyOptIn === true },
|
|
4397
4468
|
...(harness.substrate === 'local' || harness.substrate === 'pod' ? { substrate: harness.substrate } : {}),
|
|
4398
4469
|
...(typeof harness.podPool === 'string' && harness.podPool.trim() ? { podPool: harness.podPool.trim() } : {}),
|
|
4470
|
+
...(typeof harness.worktreeAddTimeoutSec === 'number' && Number.isSafeInteger(harness.worktreeAddTimeoutSec)
|
|
4471
|
+
&& harness.worktreeAddTimeoutSec > 0 && harness.worktreeAddTimeoutSec <= 2_147_483
|
|
4472
|
+
? { worktreeAddTimeoutSec: harness.worktreeAddTimeoutSec } : {}),
|
|
4399
4473
|
...(typeof harness.defaultRepo === 'string' && isAbsolute(harness.defaultRepo)
|
|
4400
4474
|
? { defaultRepo: harness.defaultRepo } : {}),
|
|
4401
4475
|
budgetGate: parseHarnessBudgetGate(
|
|
@@ -4533,6 +4607,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4533
4607
|
...(tg.poller === 'standalone' || tg.poller === 'nexus' ? { poller: tg.poller } : {}),
|
|
4534
4608
|
...(normalizeKindRoles(tg.kindRoles) ? { kindRoles: normalizeKindRoles(tg.kindRoles)! } : {}),
|
|
4535
4609
|
...(str(tg.fieldDefaultEvent) ? { fieldDefaultEvent: str(tg.fieldDefaultEvent)! } : {}),
|
|
4610
|
+
...(tg.fieldReelMode === 'instant' || tg.fieldReelMode === 'standard' ? { fieldReelMode: tg.fieldReelMode } : {}),
|
|
4536
4611
|
},
|
|
4537
4612
|
discord: {
|
|
4538
4613
|
enabled: dc.enabled === true,
|
|
@@ -4593,6 +4668,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4593
4668
|
},
|
|
4594
4669
|
onboarding: {
|
|
4595
4670
|
...(typeof ob2.webFirst === 'boolean' ? { webFirst: ob2.webFirst } : {}),
|
|
4671
|
+
...(typeof ob2.ready === 'boolean' ? { ready: ob2.ready } : {}),
|
|
4596
4672
|
completed: ob2.completed === true,
|
|
4597
4673
|
completedAt: str(ob2.completedAt),
|
|
4598
4674
|
version: typeof ob2.version === 'number' ? ob2.version : 0,
|
|
@@ -4640,6 +4716,11 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4640
4716
|
},
|
|
4641
4717
|
...((): { errorReports?: ErrorReportsConfig } => { const er = parseErrorReportsConfig(rawObj.errorReports); return er ? { errorReports: er } : {}; })(),
|
|
4642
4718
|
chat: {
|
|
4719
|
+
factQuestion: {
|
|
4720
|
+
maxToolTurns: typeof chatFactQuestion.maxToolTurns === 'number'
|
|
4721
|
+
&& Number.isSafeInteger(chatFactQuestion.maxToolTurns) && chatFactQuestion.maxToolTurns > 0
|
|
4722
|
+
? chatFactQuestion.maxToolTurns : CHAT_DEFAULTS.factQuestion.maxToolTurns,
|
|
4723
|
+
},
|
|
4643
4724
|
fastPath: chat.fastPath === false || chat.fastPath === 'false' ? false : CHAT_DEFAULTS.fastPath,
|
|
4644
4725
|
conciseness: {
|
|
4645
4726
|
enabled: chatConciseness.enabled === false ? false : CHAT_CONCISENESS_DEFAULTS.enabled,
|
|
@@ -4999,6 +5080,10 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4999
5080
|
})(),
|
|
5000
5081
|
acp: {
|
|
5001
5082
|
hopCap: parseHopCap(acpHopCap),
|
|
5083
|
+
toolApproval: {
|
|
5084
|
+
timeoutMs: acpApprovalTimeoutMs(acpToolApproval.timeoutMs)
|
|
5085
|
+
?? acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs,
|
|
5086
|
+
},
|
|
5002
5087
|
...(typeof acp.reviewBackend === 'string' && acp.reviewBackend.trim()
|
|
5003
5088
|
? { reviewBackend: acp.reviewBackend.trim() }
|
|
5004
5089
|
: {}),
|
|
@@ -5019,6 +5104,14 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5019
5104
|
goals: parseGoalsConfig(rawObj.goals),
|
|
5020
5105
|
registry: parseRegistryConfig(rawObj.registry),
|
|
5021
5106
|
tools: parseToolsConfig(rawObj.tools),
|
|
5107
|
+
...(rawObj.hitl && typeof rawObj.hitl === 'object' && !Array.isArray(rawObj.hitl)
|
|
5108
|
+
&& typeof (rawObj.hitl as Record<string, unknown>).executionDeadlineMinutes === 'number'
|
|
5109
|
+
? { hitl: { executionDeadlineMinutes: (rawObj.hitl as { executionDeadlineMinutes: number }).executionDeadlineMinutes } }
|
|
5110
|
+
: {}),
|
|
5111
|
+
cli: { helpRole: parseCliHelpRole(rawObj.cli) },
|
|
5112
|
+
coo: { linearProject: typeof (rawObj.coo as { linearProject?: unknown } | undefined)?.linearProject === 'string' && (rawObj.coo as { linearProject: string }).linearProject.trim()
|
|
5113
|
+
? (rawObj.coo as { linearProject: string }).linearProject.trim() : '외부 행정·큰 일 (COO)' },
|
|
5114
|
+
decisions: { linearProjection: { enabled: ((rawObj.decisions as { linearProjection?: { enabled?: unknown } } | undefined)?.linearProjection?.enabled === true) } },
|
|
5022
5115
|
loops: { ...(stewardLoops ?? {}), seat: parseSeatLoopsConfig(rawObj.loops) },
|
|
5023
5116
|
// M1-1: sparse — undefined when the user hasn't set anything, so
|
|
5024
5117
|
// resolvers fall through to zero-config defaults.
|
|
@@ -5028,6 +5121,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5028
5121
|
...spreadIfDefined('taste', parseTasteConfig(rawObj.taste)),
|
|
5029
5122
|
...spreadIfDefined('webSearch', parseWebSearchConfig(rawObj.webSearch)),
|
|
5030
5123
|
...spreadIfDefined('design', parseDesignConfig(rawObj.design)),
|
|
5124
|
+
diagnostics: parseDiagnosticsConfig(rawObj.diagnostics),
|
|
5031
5125
|
...spreadIfDefined('budget', parseBudgetConfig(rawObj.budget)),
|
|
5032
5126
|
...spreadIfDefined('smartDefaults', parseSmartDefaultsConfig(rawObj.smartDefaults)),
|
|
5033
5127
|
...spreadIfDefined('roleModels', parseRoleModelConfig(rawObj.roleModels)),
|
|
@@ -5590,6 +5684,7 @@ export function saveUserConfig(
|
|
|
5590
5684
|
delete rawRest.budget;
|
|
5591
5685
|
delete rawRest.smartDefaults;
|
|
5592
5686
|
delete rawRest.grounding;
|
|
5687
|
+
delete rawRest.diagnostics;
|
|
5593
5688
|
const rawHarness = rawRest.harness && typeof rawRest.harness === 'object' && !Array.isArray(rawRest.harness)
|
|
5594
5689
|
? rawRest.harness as Record<string, unknown> : {};
|
|
5595
5690
|
delete rawRest.harness;
|
|
@@ -5616,7 +5711,12 @@ export function saveUserConfig(
|
|
|
5616
5711
|
...rawRest,
|
|
5617
5712
|
...(cfg.loops ? { loops: {
|
|
5618
5713
|
...rawLoops,
|
|
5619
|
-
...(cfg.loops.seat ? { seat: {
|
|
5714
|
+
...(cfg.loops.seat ? { seat: {
|
|
5715
|
+
mode: cfg.loops.seat.mode,
|
|
5716
|
+
seats: cfg.loops.seat.seats ?? ['MK'],
|
|
5717
|
+
podPool: cfg.loops.seat.podPool ?? 'pool-node-b@node-b:8',
|
|
5718
|
+
...(cfg.loops.seat.reportPr === undefined ? {} : { reportPr: cfg.loops.seat.reportPr }),
|
|
5719
|
+
} } : {}),
|
|
5620
5720
|
} } : {}),
|
|
5621
5721
|
...(cfg.autopilot ? { autopilot: {
|
|
5622
5722
|
...rawAutopilot,
|
|
@@ -5739,6 +5839,7 @@ export function saveUserConfig(
|
|
|
5739
5839
|
// 「직렬화 드롭」으로 조용히 사라졌다 — 운영 전환 스위치를 켤 방법이 없었다(07-22 botUsername 과 같은 모양).
|
|
5740
5840
|
poller: cfg.telegram.poller,
|
|
5741
5841
|
fieldDefaultEvent: cfg.telegram.fieldDefaultEvent,
|
|
5842
|
+
fieldReelMode: cfg.telegram.fieldReelMode,
|
|
5742
5843
|
}),
|
|
5743
5844
|
discord: stripUndef({
|
|
5744
5845
|
enabled: cfg.discord.enabled,
|
|
@@ -5773,6 +5874,7 @@ export function saveUserConfig(
|
|
|
5773
5874
|
}),
|
|
5774
5875
|
onboarding: stripUndef({
|
|
5775
5876
|
webFirst: cfg.onboarding.webFirst,
|
|
5877
|
+
ready: cfg.onboarding.ready,
|
|
5776
5878
|
completed: cfg.onboarding.completed,
|
|
5777
5879
|
completedAt: cfg.onboarding.completedAt,
|
|
5778
5880
|
version: cfg.onboarding.version,
|
|
@@ -5855,6 +5957,10 @@ export function saveUserConfig(
|
|
|
5855
5957
|
: undefined,
|
|
5856
5958
|
slashMaxTurns: cfg.acp.slashMaxTurns,
|
|
5857
5959
|
editApproval: cfg.acp.editApproval ? true : undefined,
|
|
5960
|
+
toolApproval: acpApprovalTimeoutMs(
|
|
5961
|
+
(cfg.raw?.acp as { toolApproval?: { timeoutMs?: unknown } } | undefined)?.toolApproval?.timeoutMs,
|
|
5962
|
+
) !== undefined || cfg.acp.toolApproval.timeoutMs !== (acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs)
|
|
5963
|
+
? { timeoutMs: cfg.acp.toolApproval.timeoutMs } : undefined,
|
|
5858
5964
|
scrubBillingEnv: cfg.acp.scrubBillingEnv === false ? false : undefined,
|
|
5859
5965
|
}),
|
|
5860
5966
|
lsp: stripUndef({
|
|
@@ -5939,6 +6045,7 @@ export function saveUserConfig(
|
|
|
5939
6045
|
...(cfg.taste ? { taste: cfg.taste } : {}),
|
|
5940
6046
|
...(cfg.webSearch ? { webSearch: cfg.webSearch } : {}),
|
|
5941
6047
|
...(cfg.design ? { design: cfg.design } : {}),
|
|
6048
|
+
...(cfg.diagnostics?.uploadUrl ? { diagnostics: parseDiagnosticsConfig(cfg.diagnostics) } : {}),
|
|
5942
6049
|
...(cfg.budget ? { budget: cfg.budget } : {}),
|
|
5943
6050
|
...(cfg.smartDefaults ? { smartDefaults: cfg.smartDefaults } : {}),
|
|
5944
6051
|
...(cfg.grounding && cfg.grounding.sources.length > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"commit":"
|
|
1
|
+
{"commit":"2740cab836f9926e0d4e88c7343f3aa5523b069d"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { debug } from '../debug/log.js';
|
|
2
|
+
import type { ExecRequest } from '../exec-requests/store.js';
|
|
3
|
+
import { sendPushToAll } from './sender.js';
|
|
4
|
+
import { listSubscriptions } from './subscriptions.js';
|
|
5
|
+
|
|
6
|
+
export async function notifyExecRequestTransition(opts: {
|
|
7
|
+
id: string;
|
|
8
|
+
text: string;
|
|
9
|
+
from: ExecRequest['status'];
|
|
10
|
+
to: ExecRequest['status'];
|
|
11
|
+
summary?: string;
|
|
12
|
+
pendingApprovals: number;
|
|
13
|
+
}): Promise<void> {
|
|
14
|
+
const { id, text, from, to, summary, pendingApprovals } = opts;
|
|
15
|
+
const kind = from !== to && (to === 'done' || to === 'failed')
|
|
16
|
+
? to : pendingApprovals > 0 && from === to ? 'approval' : null;
|
|
17
|
+
if (!kind) return;
|
|
18
|
+
const subscribers = listSubscriptions().length;
|
|
19
|
+
const details = { id, kind, subscribers, textLength: text.length };
|
|
20
|
+
if (!subscribers) {
|
|
21
|
+
debug.log('webpush.exec', 'skipped', details);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const title = `${kind === 'done' ? '맡긴 일 완료' : kind === 'failed' ? '맡긴 일 실패' : '게시 승인 대기'} · ${text.slice(0, 40)}`;
|
|
25
|
+
const body = kind === 'approval' ? '승인하거나 보류해 주세요' : (summary ?? '').split(/\r?\n/, 1)[0]!.slice(0, 80);
|
|
26
|
+
try {
|
|
27
|
+
await sendPushToAll({ title, body, url: `/exec?id=${encodeURIComponent(id)}`, tag: `exec-${id}` });
|
|
28
|
+
debug.log('webpush.exec', 'sent', details);
|
|
29
|
+
} catch {
|
|
30
|
+
debug.log('webpush.exec', 'skipped', details);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
self.__BUILD_MANIFEST=function(e,r,t,_){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:39,errorRate:1e-4,numBits:748,numHashes:14,bitArray:[1,0,0,1,e,e,r,r,e,r,e,e,r,r,r,r,e,e,r,r,e,e,r,r,r,r,e,r,e,e,e,r,r,e,r,e,e,r,e,e,e,r,e,e,r,r,r,r,e,r,r,r,r,r,r,r,e,e,e,r,e,e,e,r,r,r,e,e,e,e,r,e,e,e,e,r,r,r,r,e,e,r,r,r,e,r,r,e,r,r,e,r,r,e,r,e,e,e,e,r,e,e,e,r,e,e,r,r,e,r,e,e,e,e,r,e,r,r,e,e,r,r,r,r,e,r,e,r,e,e,e,e,e,r,e,e,e,e,e,e,e,e,e,e,e,r,e,r,r,r,e,e,e,e,r,e,e,r,e,r,e,r,e,r,r,r,r,r,e,r,r,e,r,e,e,r,r,e,e,r,e,r,e,r,r,r,r,r,r,e,e,r,e,e,e,e,r,r,e,e,r,e,r,e,r,e,e,r,r,r,r,e,e,e,e,e,r,e,r,r,e,e,r,e,e,r,r,e,e,r,r,r,e,e,r,e,e,r,e,e,e,e,e,e,r,e,e,e,e,e,e,r,e,r,r,r,r,r,e,r,e,r,r,e,e,e,r,r,r,e,e,r,e,e,e,r,r,e,e,e,r,r,r,r,r,e,r,e,e,r,r,r,e,r,r,r,r,e,r,r,r,r,e,e,e,e,e,e,e,r,e,e,r,r,r,r,r,r,e,r,r,e,r,e,e,r,e,e,r,r,r,e,r,e,e,e,e,r,e,r,e,r,e,e,r,r,r,r,e,r,e,r,e,r,e,e,e,r,r,r,r,e,r,r,e,e,e,e,r,r,e,r,r,r,e,r,e,r,e,r,e,r,e,e,e,r,e,e,e,e,r,e,r,e,e,r,e,r,e,e,r,r,e,e,r,r,r,e,e,e,e,e,e,e,r,r,e,e,r,e,e,e,r,r,r,e,r,e,e,e,e,r,r,e,r,r,r,r,e,r,e,e,e,r,e,e,r,e,e,r,e,r,e,r,r,r,e,r,e,e,e,e,e,e,r,e,e,r,r,e,r,r,e,e,e,e,e,e,e,e,e,e,r,e,r,e,e,r,e,e,r,e,e,r,r,e,r,r,r,e,e,r,e,e,e,r,e,e,e,e,e,r,e,r,r,e,e,e,r,e,r,e,e,r,r,e,r,e,e,e,e,r,r,r,r,r,r,r,r,e,e,e,r,r,e,e,r,r,r,e,r,r,e,r,e,r,e,e,e,r,e,e,e,r,e,r,e,e,e,e,r,r,e,e,r,r,r,r,r,e,e,e,e,r,e,r,e,r,r,e,r,e,e,r,e,r,r,r,e,e,r,r,e,e,e,r,r,e,e,e,e,e,e,r,r,r,r,e,e,e,r,e,e,r,r,r,e,r,e,r,e,e,e,e,e,e,e,e,e,r,e,e,e,e,r,e,r,e,e,e,e,r,e,e,r,r,r,e,r,e,e,r,e,r,e,r,e,r,r,r,e,e,r,r,e,e,r,e,e,e,e,r,e,r,r,r,e,r,r,e,r,e,r,e,r,e,r,r,r,r,e,r,e,e,r,e,e,r,e,r,r,e,e,e,r,e,r,r,r,e,e,e,e,e,e,e,r,e,e,e,e,r,r,e,e,r,e,r,e,r,e,r,e,e,r,e,e,r]},__routerFilterDynamic:{numItems:e,errorRate:1e-4,numBits:20,numHashes:14,bitArray:[e,r,r,r,e,e,e,r,r,e,e,r,r,e,e,r,e,r,r,r]},"/_error":["static/chunks/pages/_error-689039227d443fab.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4,14),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1201],{2961:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("sliders-vertical",[["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M12 21v-9",key:"17s77i"}],["path",{d:"M12 8V3",key:"13r4qs"}],["path",{d:"M17 16h4",key:"h1uq16"}],["path",{d:"M19 12V3",key:"o1uvq1"}],["path",{d:"M19 21v-5",key:"qua636"}],["path",{d:"M3 14h4",key:"bcjad9"}],["path",{d:"M5 10V3",key:"cb8scm"}],["path",{d:"M5 21v-7",key:"1w1uti"}]])},4790:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("telescope",[["path",{d:"m10.065 12.493-6.18 1.318a.934.934 0 0 1-1.108-.702l-.537-2.15a1.07 1.07 0 0 1 .691-1.265l13.504-4.44",key:"k4qptu"}],["path",{d:"m13.56 11.747 4.332-.924",key:"19l80z"}],["path",{d:"m16 21-3.105-6.21",key:"7oh9d"}],["path",{d:"M16.485 5.94a2 2 0 0 1 1.455-2.425l1.09-.272a1 1 0 0 1 1.212.727l1.515 6.06a1 1 0 0 1-.727 1.213l-1.09.272a2 2 0 0 1-2.425-1.455z",key:"m7xp4m"}],["path",{d:"m6.158 8.633 1.114 4.456",key:"74o979"}],["path",{d:"m8 21 3.105-6.21",key:"1fvxut"}],["circle",{cx:"12",cy:"13",r:"2",key:"1c1ljs"}]])},6381:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("store",[["path",{d:"M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5",key:"slp6dd"}],["path",{d:"M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244",key:"o0xfot"}],["path",{d:"M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05",key:"wn3emo"}]])},7347:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]])},8542:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("inbox",[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]])},11635:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},26882:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("layers",[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]])},31159:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("settings",[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]])},33011:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("layers-2",[["path",{d:"M13 13.74a2 2 0 0 1-2 0L2.5 8.87a1 1 0 0 1 0-1.74L11 2.26a2 2 0 0 1 2 0l8.5 4.87a1 1 0 0 1 0 1.74z",key:"15q6uc"}],["path",{d:"m20 14.285 1.5.845a1 1 0 0 1 0 1.74L13 21.74a2 2 0 0 1-2 0l-8.5-4.87a1 1 0 0 1 0-1.74l1.5-.845",key:"byia6g"}]])},34881:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("square-kanban",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M8 7v7",key:"1x2jlm"}],["path",{d:"M12 7v4",key:"xawao1"}],["path",{d:"M16 7v9",key:"1hp2iy"}]])},42310:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("book-open",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]])},42859:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("message-square",[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}]])},49454:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("crosshair",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"22",x2:"18",y1:"12",y2:"12",key:"l9bcsi"}],["line",{x1:"6",x2:"2",y1:"12",y2:"12",key:"13hhkx"}],["line",{x1:"12",x2:"12",y1:"6",y2:"2",key:"10w3f3"}],["line",{x1:"12",x2:"12",y1:"22",y2:"18",key:"15g9kq"}]])},49559:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("palette",[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]])},58291:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]])},59573:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]])},62480:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("git-pull-request",[["circle",{cx:"18",cy:"18",r:"3",key:"1xkwt0"}],["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["path",{d:"M13 6h3a2 2 0 0 1 2 2v7",key:"1yeb86"}],["line",{x1:"6",x2:"6",y1:"9",y2:"21",key:"rroup"}]])},67089:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]])},68634:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("compass",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",key:"9ktpf1"}]])},70765:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("layout-grid",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]])},84081:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("git-branch",[["path",{d:"M15 6a9 9 0 0 0-9 9V3",key:"1cii5b"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}]])},87216:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("square-terminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]])},95895:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("calendar-clock",[["path",{d:"M16 14v2.2l1.6 1",key:"fo4ql5"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5",key:"1osxxc"}],["path",{d:"M3 10h5",key:"r794hk"}],["path",{d:"M8 2v4",key:"1cmpym"}],["circle",{cx:"16",cy:"16",r:"6",key:"qoo3c4"}]])}}]);
|