elanous 0.2.6 → 0.2.7
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/.env.example +10 -7
- package/README.md +4 -0
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3995-bee512a7063036ce.js → 2375-cb6debea56cce4fb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2415.ed6428ff334c7ce2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +25 -0
- package/apps/pwa/out/_next/static/chunks/{8d0d9faf-97887ff99713b84e.js → 2ea96958-e8c7e112de50b067.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5329.8b7e4bca684b6eec.js → 3403.4bc97b4066945a94.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +1 -0
- package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7633.0654fe6ea259c1ee.js → 4323.c5dfb6f503304775.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4836-2eba6079f31b88d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2984-977cfa339fcd65a5.js → 5080-1613752891fcadb4.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{763-7d0e1913b5074e98.js → 5791-bb82743fa6299562.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4240-7153881b0b377306.js → 6062-73e68343a9814f6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{91ff6dda-3b33d42d20657429.js → 8046cadf-211ca3c0e00f2b72.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8067-f74bf14d67ad98f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8519-f6b5d8a5833a7603.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8894-e92491a164192cc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9454-a3e0953307216c58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9740-67051141115ce775.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9804-64c02c3c127d5014.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d5ebde04844689e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-10ed24f413ed66e9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-211810b6c93ab66a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-624f7a2f89b60c8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-5a5fb385a4df0ffe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-80497e93a878ddc5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-7457f52683562161.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-cee86394de407aa6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-4ff8edab44196b8c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-92e4f44428d5e290.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-b7dcf5d48a854b76.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-51480757e7d68b92.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-2a05dfe80c8bdf16.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-d9979633aa82f8e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-30533117beb53625.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-f7857826c2f97ad7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-07267f1391b96aba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-55d50e9b0006a91d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-9699b1786be6171d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-43dd772aee8af75f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-a7e37af7d0399cb8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-973ab7af59c718b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-a9f8d3865b91e436.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-15e5a15db84c56aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a2e572e4511f2a16.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-dd107bf1c7d52a90.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-d42b99cdfb9f27c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-2764ff40dad5a995.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-c5f1152db116ff96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-f933bca81ea38a6f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-c1c95739c0bff3b8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-a7aaffcf771662d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-71d18eec33b9c667.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-56adbe1a1f1379bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-2c4e59079ee357ac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-a81f113f3ef89d72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-5d422f38c052967e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fc27b00e20733146.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{webpack-37b8bf78a3c6eec5.js → webpack-e5bea36f183b25e6.js} +1 -1
- package/apps/pwa/out/_next/static/css/f537bdb19c69306a.css +1 -0
- package/apps/pwa/out/_next/static/keajW7DDyghEs1y8oJe6T/_buildManifest.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -0
- package/apps/pwa/out/consult/index.txt +32 -0
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -0
- package/apps/pwa/out/exec/index.txt +32 -0
- package/apps/pwa/out/field/index.html +1 -0
- package/apps/pwa/out/field/index.txt +32 -0
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/bin/elanous.cjs +107 -0
- package/graphs/field/field-feed.yaml +24 -0
- package/graphs/field/recipes.yaml +12 -0
- package/graphs/landing/landing-heal.yaml +3 -1
- package/graphs/landing/recipes.yaml +3 -0
- package/graphs/release/recipes.yaml +10 -0
- package/graphs/release/release-loop.yaml +10 -3
- package/package.json +5 -5
- package/plugins/card-followup/README.md +13 -4
- package/plugins/card-followup/graphs/card-followup.yaml +3 -1
- package/plugins/card-followup/graphs/recipes.yaml +5 -1
- package/plugins/card-followup/graphs/run-step.ts +122 -18
- package/plugins/card-followup/graphs/sales-strategy.ts +173 -0
- package/plugins/card-followup/plugin.json +1 -1
- package/plugins/doc-draft/README.md +13 -0
- package/plugins/doc-draft/examples/brief-sample.json +8 -0
- package/plugins/doc-draft/graphs/doc-draft.yaml +14 -0
- package/plugins/doc-draft/graphs/recipes.yaml +9 -0
- package/plugins/doc-draft/graphs/run-step.ts +113 -0
- package/plugins/doc-draft/plugin.json +24 -0
- package/plugins/geo-check/README.md +3 -1
- package/plugins/geo-check/graphs/run-step.ts +24 -3
- package/plugins/geo-check/plugin.json +1 -1
- package/plugins/job-coach/.codex-plugin/plugin.json +1 -1
- package/plugins/job-coach/README.md +1 -1
- package/plugins/job-coach/graphs/run-step.ts +2 -2
- package/plugins/job-coach/plugin.json +1 -1
- package/plugins/job-coach/plugin.ts +1 -1
- package/scripts/affinity/endcard.sh +3 -2
- package/scripts/affinity/reframe.sh +3 -1
- package/scripts/ci-public-export-leak-gate.ts +48 -0
- package/scripts/codex-quota-alert.ts +122 -258
- package/scripts/coord-tracks.json +4 -4
- package/scripts/field-feed/deliver-node.ts +52 -0
- package/scripts/field-feed/feed-node.ts +67 -0
- package/scripts/field-feed/lib.ts +162 -0
- package/scripts/field-feed/reel-node.ts +24 -0
- package/scripts/field-feed/start.ts +62 -0
- package/scripts/fixtures/vflow-sample.ndjson +6 -0
- package/scripts/install.sh +92 -13
- package/scripts/landing-heal/clean-checkout.ts +114 -0
- package/scripts/landing-heal/run-mission.ts +38 -3
- package/scripts/lib/pwa-scenarios/scenarios.ts +2 -1
- package/scripts/public-export.ts +8 -4
- package/scripts/release-loop/baseline-from-logs.ts +92 -0
- package/scripts/release-loop/env-known-failures.ts +31 -0
- package/scripts/release-loop/gate-node.ts +81 -19
- package/scripts/release-loop/known-issues-node.ts +159 -0
- package/scripts/release-loop/npm-publish-node.ts +118 -0
- package/scripts/release-loop/ops-upgrade-node.ts +87 -0
- package/scripts/release-loop/release-readiness.ts +58 -0
- package/scripts/release-loop/unattended-release.ts +93 -0
- package/scripts/ux/measure-first-text.ts +102 -0
- package/scripts/vflow-collect.ts +20 -7
- package/scripts/vflow-search.ts +73 -0
- package/scripts/video-free-line-test-walker.ts +36 -0
- package/scripts/video-pipeline.ts +2 -2
- package/skills/explainer-video/SKILL.md +12 -9
- package/skills/explainer-video/engine/build.mjs +1 -1
- package/skills/explainer-video/engine/reel.mjs +138 -31
- package/skills/explainer-video/engine/reel.sh +2 -1
- package/skills/explainer-video/examples/elanous-0.2.5/script.json +1 -1
- package/skills/grill-me/SKILL.md +1 -1
- package/skills/omni-digest/docs/diagrams/noncode-terminal-promotion-path-2026-08-13.mmd +1 -1
- package/src/a2a/server.ts +2 -0
- package/src/acp/elanous-aware-peers.ts +30 -0
- package/src/acp/server.ts +91 -15
- package/src/agent/monad-agent-turn.ts +25 -6
- package/src/agent/shared-app-tools.ts +5 -3
- package/src/agent-substrate/review-intent.ts +6 -2
- package/src/agent-substrate/shard-boundary-intent.ts +70 -0
- package/src/auth/github-app-token.ts +4 -1
- package/src/autopilot/track-agent-shadow.ts +151 -0
- package/src/autopilot/track-agent.ts +23 -3
- package/src/boot/acp-server-help.ts +16 -0
- package/src/boot/daemon-prompt-turn.ts +31 -10
- package/src/boot/daemon-tools/index.ts +7 -1
- package/src/budget/codex-credit-pace.ts +84 -0
- package/src/budget/codex-credit-plan.ts +154 -0
- package/src/budget/codex-reset-credit-state.ts +2 -0
- package/src/chat/chat-cli.ts +4 -1
- package/src/chat/short-question.ts +40 -0
- package/src/cli/agent-cli.ts +24 -15
- package/src/cli/ask-bare.ts +42 -0
- package/src/cli/cli-user-error.ts +25 -0
- package/src/cli/codex-credit-plan-view.ts +25 -0
- package/src/cli/dependence-gauge.ts +237 -0
- package/src/cli/doctor-cli.ts +5 -0
- package/src/cli/doctor-modes.ts +48 -0
- package/src/cli/intake-cli.ts +12 -2
- package/src/cli/intake-source-cli.ts +58 -0
- package/src/cli/machine-cli.ts +23 -0
- package/src/cli/msg-cli.ts +137 -0
- package/src/cli/plugin-cli.ts +25 -0
- package/src/cli/pr-cli.ts +36 -0
- package/src/cli/provider-cli.ts +5 -0
- package/src/cli/release-cli.ts +42 -1
- package/src/cli/release-run-if-ready.ts +48 -0
- package/src/cli/setup-cli.ts +27 -6
- package/src/cli/setup-recommend.ts +8 -0
- package/src/cli/usage-cli.ts +11 -1
- package/src/codex/setup.ts +27 -8
- package/src/dashboard/index.ts +1 -1
- package/src/discord.ts +56 -6
- package/src/domains/core-tools.ts +37 -14
- package/src/domains/outbound-alert.ts +50 -11
- package/src/exec-requests/planner.ts +140 -0
- package/src/exec-requests/runner.ts +338 -0
- package/src/exec-requests/store.ts +76 -0
- package/src/field/field-media.ts +8 -3
- package/src/field/field-reel.ts +196 -0
- package/src/grok/credential.ts +7 -5
- package/src/harness/aside-run-status.ts +33 -0
- package/src/harness/browser-verify.ts +48 -17
- package/src/harness/harness-cli-command.ts +25 -3
- package/src/harness/image-load-state.ts +21 -0
- package/src/harness/process-garbage.ts +45 -0
- package/src/index.ts +86 -14
- package/src/instance/leader.ts +13 -1
- package/src/intake-plane/collect-github.ts +5 -3
- package/src/intake-plane/collect-telegram-saved.ts +15 -3
- package/src/intake-plane/discord-seat-work.ts +56 -0
- package/src/intake-plane/intake-sources.ts +202 -0
- package/src/intake-plane/items.ts +28 -12
- package/src/intake-plane/seat-doc-route.ts +207 -0
- package/src/intake-plane/submit-intake-work.ts +9 -1
- package/src/intake-plane/telegram-seat-work.ts +72 -0
- package/src/llm/model-defaults.ts +24 -1
- package/src/llm.ts +5 -4
- package/src/machines/machine-ledger.ts +127 -0
- package/src/market/pack-internal-refs.ts +28 -0
- package/src/market/publish.ts +31 -4
- package/src/maturity/feature-maturity.ts +65 -0
- package/src/model-tier/turn-tier.ts +24 -0
- package/src/msg/msg-store.ts +149 -0
- package/src/native-tool-catalog.ts +2 -1
- package/src/nexus/api/chat-fast-path-config.ts +28 -0
- package/src/nexus/api/consult-requests.ts +117 -0
- package/src/nexus/api/discord-trigger-bot.ts +3 -0
- package/src/nexus/api/exec-requests.ts +51 -0
- package/src/nexus/api/field-uploads.ts +40 -3
- package/src/nexus/api/graph-approvals-feed.ts +140 -0
- package/src/nexus/api/graph-approvals.ts +71 -4
- package/src/nexus/api/http-server.ts +61 -7
- package/src/nexus/api/seat-requests.ts +254 -0
- package/src/nexus/api/trace-run-scan.ts +37 -0
- package/src/nexus/api/trace.ts +19 -3
- package/src/nexus/index.ts +3 -0
- package/src/nexus/setup-status.ts +4 -5
- package/src/notify/llm-budget-alert.ts +16 -10
- package/src/oauth/codex-account-rotation.ts +26 -4
- package/src/oauth/codex-account-store.ts +20 -2
- package/src/oauth/codex-browser-login.ts +173 -0
- package/src/oauth/codex.ts +4 -1
- package/src/oauth/fallback-chain.ts +5 -5
- package/src/oauth/store.ts +42 -5
- package/src/onboarding/continue-here.ts +29 -0
- package/src/onboarding/entry-hints.ts +8 -0
- package/src/onboarding/full-screen-io.ts +35 -3
- package/src/onboarding/help/skills.md +1 -1
- package/src/onboarding/non-interactive.ts +1 -0
- package/src/onboarding/subscription-hint.ts +27 -0
- package/src/onboarding/web-first.ts +83 -0
- package/src/onboarding.ts +230 -23
- package/src/plugins/maker/node-install.ts +92 -0
- package/src/plugins/maker/node-maker.ts +139 -0
- package/src/plugins/maker/plugin-maker.ts +19 -7
- package/src/policy/llm-policy.ts +268 -0
- package/src/prompt-library/session-guidance.ts +7 -1
- package/src/prompt-library/universal-preamble.ts +2 -2
- package/src/relay/relay-cli.ts +20 -0
- package/src/relay/relay-server.ts +220 -0
- package/src/release-loop/checklist.ts +9 -8
- package/src/self-dev/decompose.ts +1 -0
- package/src/self-dev/dev-pipeline.ts +6 -3
- package/src/self-dev/run-record-mirror.ts +44 -0
- package/src/self-dev/run-store.ts +12 -3
- package/src/self-implement/harness-policy-gates.ts +4 -1
- package/src/self-implement/report-origin.ts +12 -1
- package/src/session/chat.ts +17 -5
- package/src/skills/shared-agent-skill-roots.ts +25 -0
- package/src/steward/failure-streak.ts +78 -0
- package/src/steward/steward-cards.ts +24 -0
- package/src/steward/triage-budget.ts +127 -0
- package/src/steward/triage-plan.ts +75 -0
- package/src/steward/triage.ts +244 -42
- package/src/task-cards/card-store.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +11 -5
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +68 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +78 -4
- package/src/telegram.ts +38 -2
- package/src/tool-runtime/elanous-skills-list-runtime.ts +3 -3
- package/src/tool-runtime/self-cognition-runtimes.ts +160 -2
- package/src/user-config.ts +80 -4
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/character.ts +42 -5
- package/src/video-pipeline/recipes/ffmpeg.ts +1 -1
- package/src/video-pipeline/recipes/free-line.ts +16 -3
- package/src/video-pipeline/recipes/remote.ts +7 -1
- package/src/video-pipeline/vflow-reference.ts +109 -0
- package/apps/pwa/out/_next/static/chunks/1169-696263ac7af8c4d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1883.c91a2648af4842fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1947-9d64872eeb9cfdec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2808-dc06482994b40f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3165-95515ca5f299a120.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3190-e9282753e7ebde85.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4259-99614149577e77cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4283-329eabeaf233e6cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4328-cb5058b1acc2de5e.js +0 -25
- package/apps/pwa/out/_next/static/chunks/4801-ecee6ef62b349b18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5110-8058791dd25a2e14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5330-c41e9670f594c38f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5423-e95fd125d1794349.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5478-b5eae07dc79ea619.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5787-96ee6642b9a661e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6448-79d72368589f98bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6522-9866c002b5531836.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6729-b4a558b7aa891e0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6969-cb03f9410b7d2e03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7007-3b9861091bb8dd21.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7930-8dc7e20fc6fc19ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8071-187edbc22a86741f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8198-d4101ad70cb9a579.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8250.4a2c5553a07cdf47.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8293-123b91e7b0330dc0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8296-d6d5d87dfa911d41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8305-603963c33ee8eec3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8612-4a0066f20951b8fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9181-cf4e1b61c4783f92.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9262-26c2ecbd5a67e4a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9328-45abdebce4fbecb7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9355-dbc67205adf8745f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9763.255b90dd69875689.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9933-66d31ec25c0231af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-bd06fb55f4da0381.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4e586142da455a25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-889ad5cddcf45b0d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-47ba401d56572c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-0b54f9c83458e038.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-4fcc296ef6c8ed90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-fe9fda494a87f4e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-f9642e25ce129590.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e1063e8ba5f3e2e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-9d0df30027d8aa9d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-bd06fb55f4da0381.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-d97adf2c9455b8d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-236b80d202110362.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-21a30f35f1a276ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-b1a5be357c4fa25d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1705a60303f7f573.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-76b337c11ad0e237.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-7c0f85fbb56f64c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-65ca16b20617b44d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-e7f9b8fc29411c1d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-92ea6213d1aeec04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-a913a005aacb5476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2d78804a40dfdef6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-08a99148e780ac00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-deb674e7ed36f815.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-49f8de0534d192d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-bd06fb55f4da0381.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-ba162a28d2176e18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-1ff1a37b550ab41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-ccaa698f56c0fbdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-53b944082de1d7db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-9b70adf1552789bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-30d482aa63241fe8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aecf786f54651d8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6ab9b62c7b6e08f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-08949735455e0c9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-a1479005234a46c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c3890e90bd232732.js +0 -1
- package/apps/pwa/out/_next/static/chunks/beb5cf10-9adcc10b83930090.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-d68d41c88e05c801.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-11c63971b7a9593b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-d09452353bd0d9cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-184d727cebeca767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-21bbbbac99b720b1.js +0 -1
- package/apps/pwa/out/_next/static/css/eaa74e8bb2f62269.css +0 -1
- package/apps/pwa/out/_next/static/qMI0jnlZaBjjm4aIDYNGM/_buildManifest.js +0 -1
- /package/apps/pwa/out/_next/static/{qMI0jnlZaBjjm4aIDYNGM → keajW7DDyghEs1y8oJe6T}/_ssgManifest.js +0 -0
package/src/user-config.ts
CHANGED
|
@@ -47,6 +47,7 @@ import {
|
|
|
47
47
|
GLM_MODEL,
|
|
48
48
|
} from './config.js';
|
|
49
49
|
import type { SkillTier } from './skills/runner.js';
|
|
50
|
+
import { sharedAgentSkillRoots } from './skills/shared-agent-skill-roots.js';
|
|
50
51
|
import {
|
|
51
52
|
isModelTier,
|
|
52
53
|
isModelTierPersona,
|
|
@@ -439,6 +440,8 @@ export type SkillSetName =
|
|
|
439
440
|
export interface SkillsConfig {
|
|
440
441
|
activeSet: SkillSetName;
|
|
441
442
|
dirs: string[];
|
|
443
|
+
/** Include the existing shared ~/.agents/skills directory. Default true; false opts out. */
|
|
444
|
+
includeSharedAgentSkills?: boolean;
|
|
442
445
|
/** Explicit skill-name allowlist. When set and non-empty, the skill
|
|
443
446
|
* index filters to this list — all other skills are hidden from
|
|
444
447
|
* routing, autocompletion, and `/run-skill`. Use when a project
|
|
@@ -505,6 +508,8 @@ export interface DefaultSkillDirsOptions {
|
|
|
505
508
|
pluginsRoot?: string;
|
|
506
509
|
/** Override the installed package root. Tests pass a temp root; production omits this. */
|
|
507
510
|
bundledSkillsRoot?: string;
|
|
511
|
+
/** Override the shared-agent home for isolated discovery tests. */
|
|
512
|
+
sharedAgentHome?: string;
|
|
508
513
|
}
|
|
509
514
|
|
|
510
515
|
/** Resolve the `skills/` directory shipped with this installed package. */
|
|
@@ -527,6 +532,15 @@ export function defaultSkillDirs(
|
|
|
527
532
|
} else if (sk.dirs.length > 0) {
|
|
528
533
|
base = [...sk.dirs];
|
|
529
534
|
}
|
|
535
|
+
const shared = sharedAgentSkillRoots({
|
|
536
|
+
home: opts?.sharedAgentHome ?? REMOTE_HOME,
|
|
537
|
+
includeSharedAgentSkills: sk.includeSharedAgentSkills !== false,
|
|
538
|
+
});
|
|
539
|
+
try { debug.log('skills.roots', 'shared-agent', { found: shared.length }); }
|
|
540
|
+
catch { /* discovery remains fail-soft when observation is unavailable */ }
|
|
541
|
+
for (const dir of shared) {
|
|
542
|
+
if (!base.includes(dir)) base.push(dir);
|
|
543
|
+
}
|
|
530
544
|
base = sk.includeClaudePackageSkills === true
|
|
531
545
|
? appendClaudePackageSkillDirs(base, opts?.pluginsRoot)
|
|
532
546
|
: base;
|
|
@@ -685,6 +699,7 @@ function skillsDefaults(): SkillsConfig {
|
|
|
685
699
|
return {
|
|
686
700
|
activeSet: 'claudecode',
|
|
687
701
|
dirs: d ? [d] : [],
|
|
702
|
+
includeSharedAgentSkills: true,
|
|
688
703
|
allow: [],
|
|
689
704
|
deny: [],
|
|
690
705
|
urlRouting: urlRoutingDefaults(),
|
|
@@ -886,6 +901,9 @@ export interface DiscordConfig {
|
|
|
886
901
|
allowedUsers: string[];
|
|
887
902
|
/** Channel snowflake for cron / push output (optional). */
|
|
888
903
|
homeChannel?: string;
|
|
904
|
+
/** EV12c — guild text channels where the production bot chats like a DM (allowlist still applies).
|
|
905
|
+
* Empty / absent = DM-only, as before. */
|
|
906
|
+
chatChannels?: string[];
|
|
889
907
|
/** Standalone `elanous discord-test` scope — same token, dedicated
|
|
890
908
|
* channel, isolated state. See DiscordTestChannel. */
|
|
891
909
|
testChannel?: DiscordTestChannel;
|
|
@@ -896,6 +914,7 @@ const DISCORD_DEFAULTS: DiscordConfig = { enabled: false, allowedUsers: [] };
|
|
|
896
914
|
// ── Onboarding ───────────────────────────────────────────────────────
|
|
897
915
|
|
|
898
916
|
export interface OnboardingConfig {
|
|
917
|
+
webFirst?: boolean;
|
|
899
918
|
completed: boolean;
|
|
900
919
|
completedAt?: string;
|
|
901
920
|
version: number;
|
|
@@ -1366,6 +1385,8 @@ export interface ChatCompactConfig {
|
|
|
1366
1385
|
}
|
|
1367
1386
|
|
|
1368
1387
|
export interface ChatConfig {
|
|
1388
|
+
/** Short questions may receive a tool-free first reply. Default true. */
|
|
1389
|
+
fastPath: boolean;
|
|
1369
1390
|
conciseness: ChatConcisenessConfig;
|
|
1370
1391
|
toolOutput: ChatToolOutputConfig;
|
|
1371
1392
|
autoCompact: ChatAutoCompactConfig;
|
|
@@ -1392,6 +1413,7 @@ const CHAT_CONCISENESS_DEFAULTS: ChatConcisenessConfig = {
|
|
|
1392
1413
|
};
|
|
1393
1414
|
|
|
1394
1415
|
export const CHAT_DEFAULTS: ChatConfig = {
|
|
1416
|
+
fastPath: true,
|
|
1395
1417
|
conciseness: { ...CHAT_CONCISENESS_DEFAULTS },
|
|
1396
1418
|
toolOutput: {
|
|
1397
1419
|
persistOnOverflow: true,
|
|
@@ -3324,9 +3346,16 @@ export function resolveRoleModel(role: ModelRole, config: UserConfig = getUserCo
|
|
|
3324
3346
|
}
|
|
3325
3347
|
|
|
3326
3348
|
|
|
3349
|
+
export type SeatLoopMode = 'off' | 'shadow' | 'on';
|
|
3350
|
+
|
|
3351
|
+
export interface SeatLoopConfig {
|
|
3352
|
+
/** No seat actions by default; shadow observes without execution, on permits the seat loop to act. */
|
|
3353
|
+
mode: SeatLoopMode;
|
|
3354
|
+
}
|
|
3355
|
+
|
|
3327
3356
|
export interface UserConfig {
|
|
3328
|
-
/** Steward
|
|
3329
|
-
loops?: { steward?: { mode?: 'observe' | 'act'; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string
|
|
3357
|
+
/** Steward and seat loops are parsed independently. An absent seat remains off. */
|
|
3358
|
+
loops?: { steward?: { mode?: 'observe' | 'act'; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number }; seat?: SeatLoopConfig };
|
|
3330
3359
|
/** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
|
|
3331
3360
|
* budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
|
|
3332
3361
|
harness?: { pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; defaultRepo?: string; substrate?: 'local' | 'pod'; podPool?: string };
|
|
@@ -3430,7 +3459,7 @@ export interface UserConfig {
|
|
|
3430
3459
|
/** 승인 뒤 조율 채널 페이즈 배달(기본 OFF) 및 트랙 에이전트(기본 OFF, 최대 동시 2개). */
|
|
3431
3460
|
autopilot?: {
|
|
3432
3461
|
trackCourier?: { enabled?: boolean; channelPr?: number; handoffMinutes?: number };
|
|
3433
|
-
trackAgent?: { enabled: boolean; maxConcurrent: number };
|
|
3462
|
+
trackAgent?: { enabled: boolean; maxConcurrent: number; shadow: boolean; shadowMaxDecisionsPerDay: number };
|
|
3434
3463
|
};
|
|
3435
3464
|
/** 하니스 예산 게이트 설정. 판정은 P15 — 여기선 칸만 싣는다. 파서는 항상 기본을 채운다.
|
|
3436
3465
|
* 선택이다 — 기존 UserConfig 리터럴이 이 칸 없이 컴파일되게 한다. 해석기는 없으면 기본을 쓴다.
|
|
@@ -3618,6 +3647,10 @@ function parseAutopilotConfig(raw: unknown): UserConfig['autopilot'] | undefined
|
|
|
3618
3647
|
enabled: v.enabled === true,
|
|
3619
3648
|
maxConcurrent: typeof v.maxConcurrent === 'number' && Number.isSafeInteger(v.maxConcurrent) && v.maxConcurrent > 0
|
|
3620
3649
|
? Math.min(v.maxConcurrent, 2) : 2,
|
|
3650
|
+
shadow: v.shadow === true,
|
|
3651
|
+
shadowMaxDecisionsPerDay: typeof v.shadowMaxDecisionsPerDay === 'number'
|
|
3652
|
+
&& Number.isSafeInteger(v.shadowMaxDecisionsPerDay) && v.shadowMaxDecisionsPerDay >= 0
|
|
3653
|
+
? v.shadowMaxDecisionsPerDay : 20,
|
|
3621
3654
|
};
|
|
3622
3655
|
}
|
|
3623
3656
|
return Object.keys(parsed).length > 0 ? parsed : undefined;
|
|
@@ -3649,6 +3682,7 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
|
|
|
3649
3682
|
|
|
3650
3683
|
function defaultConfig(): UserConfig {
|
|
3651
3684
|
return {
|
|
3685
|
+
loops: { seat: { mode: 'off' } },
|
|
3652
3686
|
skillRouter: { ...SR_DEFAULTS },
|
|
3653
3687
|
llm: { ...LLM_DEFAULTS },
|
|
3654
3688
|
skills: skillsDefaults(),
|
|
@@ -3661,6 +3695,7 @@ function defaultConfig(): UserConfig {
|
|
|
3661
3695
|
logs: { retention: { ...LOGS_DEFAULTS.retention } },
|
|
3662
3696
|
shell: { ...SHELL_DEFAULTS },
|
|
3663
3697
|
chat: {
|
|
3698
|
+
fastPath: CHAT_DEFAULTS.fastPath,
|
|
3664
3699
|
conciseness: { ...CHAT_CONCISENESS_DEFAULTS },
|
|
3665
3700
|
toolOutput: { ...CHAT_DEFAULTS.toolOutput },
|
|
3666
3701
|
autoCompact: { ...CHAT_DEFAULTS.autoCompact },
|
|
@@ -4126,6 +4161,14 @@ function parseStewardTracks(input: unknown): Record<string, string> | undefined
|
|
|
4126
4161
|
return Object.keys(out).length ? out : undefined;
|
|
4127
4162
|
}
|
|
4128
4163
|
|
|
4164
|
+
function parseSeatLoopsConfig(input: unknown): SeatLoopConfig {
|
|
4165
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) return { mode: 'off' };
|
|
4166
|
+
const seat = (input as Record<string, unknown>).seat;
|
|
4167
|
+
if (!seat || typeof seat !== 'object' || Array.isArray(seat)) return { mode: 'off' };
|
|
4168
|
+
const mode = (seat as Record<string, unknown>).mode;
|
|
4169
|
+
return { mode: mode === 'on' || mode === 'shadow' ? mode : 'off' };
|
|
4170
|
+
}
|
|
4171
|
+
|
|
4129
4172
|
function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
|
|
4130
4173
|
if (!input || typeof input !== 'object' || Array.isArray(input)) return undefined;
|
|
4131
4174
|
const value = (input as Record<string, unknown>).steward;
|
|
@@ -4144,6 +4187,7 @@ function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
|
|
|
4144
4187
|
...(typeof s.linearTeam === 'string' && s.linearTeam.trim() ? { linearTeam: s.linearTeam.trim() } : {}),
|
|
4145
4188
|
...(Object.keys(roles).length ? { roles } : {}),
|
|
4146
4189
|
...(typeof s.budget === 'number' && Number.isFinite(s.budget) && s.budget >= 0 ? { budget: s.budget } : {}),
|
|
4190
|
+
...(typeof s.alertAfterFailures === 'number' && Number.isSafeInteger(s.alertAfterFailures) && s.alertAfterFailures > 0 ? { alertAfterFailures: s.alertAfterFailures } : {}),
|
|
4147
4191
|
...(parseStewardTracks(s.tracks) ? { tracks: parseStewardTracks(s.tracks)! } : {}),
|
|
4148
4192
|
} };
|
|
4149
4193
|
}
|
|
@@ -4374,6 +4418,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4374
4418
|
skills: {
|
|
4375
4419
|
activeSet: normalizeSkillSet(sk.activeSet),
|
|
4376
4420
|
dirs: strArray(sk.dirs, skillsDefaults().dirs),
|
|
4421
|
+
includeSharedAgentSkills: sk.includeSharedAgentSkills !== false,
|
|
4377
4422
|
allow: strArray(sk.allow, []),
|
|
4378
4423
|
deny: strArray(sk.deny, []),
|
|
4379
4424
|
urlRouting: parseUrlRouting(sk.urlRouting),
|
|
@@ -4409,6 +4454,9 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4409
4454
|
homeChannel: typeof dc.homeChannel === 'string' ? dc.homeChannel
|
|
4410
4455
|
: typeof dc.homeChannel === 'number' ? String(dc.homeChannel) : undefined,
|
|
4411
4456
|
testChannel: normalizeDiscordTestChannel((dc as Record<string, unknown>).testChannel),
|
|
4457
|
+
...(Array.isArray(dc.chatChannels)
|
|
4458
|
+
? { chatChannels: (dc.chatChannels as unknown[]).map(v => String(v).trim()).filter(Boolean) }
|
|
4459
|
+
: {}),
|
|
4412
4460
|
// Sprint 21 wiring sub-block (2026-05-01)
|
|
4413
4461
|
},
|
|
4414
4462
|
finance: {
|
|
@@ -4452,6 +4500,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4452
4500
|
relaxedGates: fin.relaxedGates === true,
|
|
4453
4501
|
},
|
|
4454
4502
|
onboarding: {
|
|
4503
|
+
...(typeof ob2.webFirst === 'boolean' ? { webFirst: ob2.webFirst } : {}),
|
|
4455
4504
|
completed: ob2.completed === true,
|
|
4456
4505
|
completedAt: str(ob2.completedAt),
|
|
4457
4506
|
version: typeof ob2.version === 'number' ? ob2.version : 0,
|
|
@@ -4498,6 +4547,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4498
4547
|
allowDashboardOptionalTools: sh.allowDashboardOptionalTools !== false,
|
|
4499
4548
|
},
|
|
4500
4549
|
chat: {
|
|
4550
|
+
fastPath: chat.fastPath === false || chat.fastPath === 'false' ? false : CHAT_DEFAULTS.fastPath,
|
|
4501
4551
|
conciseness: {
|
|
4502
4552
|
enabled: chatConciseness.enabled === false ? false : CHAT_CONCISENESS_DEFAULTS.enabled,
|
|
4503
4553
|
finalMessageMaxLines: clampNum(
|
|
@@ -4876,7 +4926,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4876
4926
|
goals: parseGoalsConfig(rawObj.goals),
|
|
4877
4927
|
registry: parseRegistryConfig(rawObj.registry),
|
|
4878
4928
|
tools: parseToolsConfig(rawObj.tools),
|
|
4879
|
-
...(stewardLoops
|
|
4929
|
+
loops: { ...(stewardLoops ?? {}), seat: parseSeatLoopsConfig(rawObj.loops) },
|
|
4880
4930
|
// M1-1: sparse — undefined when the user hasn't set anything, so
|
|
4881
4931
|
// resolvers fall through to zero-config defaults.
|
|
4882
4932
|
...spreadIfDefined('modelTier', parseModelTierConfig(rawObj.modelTier)),
|
|
@@ -5450,6 +5500,11 @@ export function saveUserConfig(
|
|
|
5450
5500
|
const rawHarness = rawRest.harness && typeof rawRest.harness === 'object' && !Array.isArray(rawRest.harness)
|
|
5451
5501
|
? rawRest.harness as Record<string, unknown> : {};
|
|
5452
5502
|
delete rawRest.harness;
|
|
5503
|
+
const rawAutopilot = rawRest.autopilot && typeof rawRest.autopilot === 'object' && !Array.isArray(rawRest.autopilot)
|
|
5504
|
+
? rawRest.autopilot as Record<string, unknown> : {};
|
|
5505
|
+
const rawLoops = rawRest.loops && typeof rawRest.loops === 'object' && !Array.isArray(rawRest.loops)
|
|
5506
|
+
? rawRest.loops as Record<string, unknown> : {};
|
|
5507
|
+
if (cfg.loops) delete rawRest.loops;
|
|
5453
5508
|
if (cfg.pod?.hostMirror) {
|
|
5454
5509
|
const rawPod = rawRest.pod && typeof rawRest.pod === 'object' && !Array.isArray(rawRest.pod)
|
|
5455
5510
|
? rawRest.pod as Record<string, unknown> : {};
|
|
@@ -5466,6 +5521,24 @@ export function saveUserConfig(
|
|
|
5466
5521
|
podPool: cfg.harness?.podPool,
|
|
5467
5522
|
}),
|
|
5468
5523
|
...rawRest,
|
|
5524
|
+
...(cfg.loops ? { loops: {
|
|
5525
|
+
...rawLoops,
|
|
5526
|
+
...(cfg.loops.seat ? { seat: { mode: cfg.loops.seat.mode } } : {}),
|
|
5527
|
+
} } : {}),
|
|
5528
|
+
...(cfg.autopilot ? { autopilot: {
|
|
5529
|
+
...rawAutopilot,
|
|
5530
|
+
...cfg.autopilot,
|
|
5531
|
+
...(cfg.autopilot.trackAgent ? { trackAgent: {
|
|
5532
|
+
...(rawAutopilot.trackAgent && typeof rawAutopilot.trackAgent === 'object' && !Array.isArray(rawAutopilot.trackAgent)
|
|
5533
|
+
? rawAutopilot.trackAgent as Record<string, unknown> : {}),
|
|
5534
|
+
...cfg.autopilot.trackAgent,
|
|
5535
|
+
} } : {}),
|
|
5536
|
+
...(cfg.autopilot.trackCourier ? { trackCourier: {
|
|
5537
|
+
...(rawAutopilot.trackCourier && typeof rawAutopilot.trackCourier === 'object' && !Array.isArray(rawAutopilot.trackCourier)
|
|
5538
|
+
? rawAutopilot.trackCourier as Record<string, unknown> : {}),
|
|
5539
|
+
...cfg.autopilot.trackCourier,
|
|
5540
|
+
} } : {}),
|
|
5541
|
+
} } : {}),
|
|
5469
5542
|
skillRouter: cfg.skillRouter,
|
|
5470
5543
|
llm: stripUndef({
|
|
5471
5544
|
provider: cfg.llm.provider,
|
|
@@ -5575,6 +5648,7 @@ export function saveUserConfig(
|
|
|
5575
5648
|
botToken: cfg.discord.botToken,
|
|
5576
5649
|
allowedUsers: [...cfg.discord.allowedUsers],
|
|
5577
5650
|
homeChannel: cfg.discord.homeChannel,
|
|
5651
|
+
chatChannels: cfg.discord.chatChannels ? [...cfg.discord.chatChannels] : undefined,
|
|
5578
5652
|
testChannel: cfg.discord.testChannel
|
|
5579
5653
|
? stripUndef({
|
|
5580
5654
|
channelId: cfg.discord.testChannel.channelId,
|
|
@@ -5601,6 +5675,7 @@ export function saveUserConfig(
|
|
|
5601
5675
|
relaxedGates: cfg.finance.relaxedGates,
|
|
5602
5676
|
}),
|
|
5603
5677
|
onboarding: stripUndef({
|
|
5678
|
+
webFirst: cfg.onboarding.webFirst,
|
|
5604
5679
|
completed: cfg.onboarding.completed,
|
|
5605
5680
|
completedAt: cfg.onboarding.completedAt,
|
|
5606
5681
|
version: cfg.onboarding.version,
|
|
@@ -5609,6 +5684,7 @@ export function saveUserConfig(
|
|
|
5609
5684
|
logs: cfg.logs,
|
|
5610
5685
|
shell: cfg.shell,
|
|
5611
5686
|
chat: stripUndef({
|
|
5687
|
+
fastPath: cfg.chat.fastPath,
|
|
5612
5688
|
conciseness: stripUndef({
|
|
5613
5689
|
enabled: cfg.chat.conciseness.enabled,
|
|
5614
5690
|
finalMessageMaxLines: cfg.chat.conciseness.finalMessageMaxLines,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"commit":"
|
|
1
|
+
{"commit":"eadd7c31e07d4414ce452d943984a2e58a01ede4"}
|
|
@@ -14,8 +14,10 @@
|
|
|
14
14
|
* (📏 2026-09-23: 연출 있는 shot2 = 0.708 < 연출 없는 대조군 0.851).
|
|
15
15
|
*/
|
|
16
16
|
import { spawnSync } from 'node:child_process';
|
|
17
|
-
import { existsSync, readdirSync } from 'node:fs';
|
|
17
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
18
|
+
import { homedir } from 'node:os';
|
|
18
19
|
import { join } from 'node:path';
|
|
20
|
+
import { searchVflowReferences } from '../vflow-reference.js';
|
|
19
21
|
import { run } from './ffmpeg.js';
|
|
20
22
|
import { resolvePython } from '../../python/resolve-python.js';
|
|
21
23
|
import { UNOBSERVED, type Recipe } from './types.js';
|
|
@@ -111,14 +113,49 @@ export const identityHoldsGate: Recipe = async (ctx) => {
|
|
|
111
113
|
export const directedShots: Recipe = async (ctx) => {
|
|
112
114
|
const src = ctx.state.shot_sources as Record<string, string> | undefined;
|
|
113
115
|
if (!src) return need('shot_sources');
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
+
const prompts = ctx.state.shot_prompts as Record<string, string> | undefined;
|
|
117
|
+
const existingShots = Object.entries(src).filter(([, path]) => existsSync(path));
|
|
118
|
+
const shot_paths = existingShots.map(([, path]) => path);
|
|
119
|
+
const promptedShots = existingShots.filter(([shot]) => prompts?.[shot] !== undefined);
|
|
120
|
+
const shot_references: Record<string, { url: string; videoUrl: string | null; model: string; name: string; author: string | null; authorUrl: string | null; camera: string[] }[]> = {};
|
|
121
|
+
let referenceNote = '';
|
|
122
|
+
if (prompts && Object.keys(prompts).length && shot_paths.length) {
|
|
123
|
+
const file = (ctx.state.vflow_file as string | undefined) ?? join(homedir(), 'docs', 'ref', 'vflow', 'prompts.ndjson');
|
|
124
|
+
const taxonomy = readFileSync(join(import.meta.dir, '../../../graphs/video/reference/vflow-taxonomy.yaml'), 'utf8');
|
|
125
|
+
const cameraAxis = taxonomy.match(/^ camera_movement:.*\n((?:^ .*\n)*)/m)?.[1] ?? '';
|
|
126
|
+
const cameraTerms = [...cameraAxis.matchAll(/term:\s*([^,}]+)/g)].map((match) => match[1]!.trim());
|
|
127
|
+
// These shot-prompt camera terms supplement the site's taxonomy axis.
|
|
128
|
+
cameraTerms.push('crash zoom', 'dolly', 'static');
|
|
129
|
+
const cameraPatterns = cameraTerms.map((term) => {
|
|
130
|
+
const escaped = term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
131
|
+
return { term, pattern: new RegExp(`(?<![\\p{L}\\p{N}])${escaped}(?![\\p{L}\\p{N}])`, 'iu') };
|
|
132
|
+
});
|
|
133
|
+
let found = 0;
|
|
134
|
+
for (const [shot] of promptedShots) {
|
|
135
|
+
const prompt = prompts[shot]!;
|
|
136
|
+
const camera = cameraPatterns.filter(({ pattern }) => pattern.test(prompt)).map(({ term }) => term);
|
|
137
|
+
const result = searchVflowReferences(file, { camera, model: ctx.state.shot_model as string | undefined, limit: camera.length ? 3 : 0 });
|
|
138
|
+
if (!result.available) {
|
|
139
|
+
referenceNote = `vflow DB 없음(${result.reason})`;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
shot_references[shot] = result.rows.map((row) => ({
|
|
143
|
+
url: row.url, videoUrl: row.video?.url ?? null, model: row.model, name: row.name,
|
|
144
|
+
author: row.author, authorUrl: row.authorUrl, camera: row.spec?.camera ?? [],
|
|
145
|
+
}));
|
|
146
|
+
if (shot_references[shot]!.length) found++;
|
|
147
|
+
}
|
|
148
|
+
if (!referenceNote) referenceNote = `vflow 참고 ${found}샷/${shot_paths.length}샷`;
|
|
149
|
+
}
|
|
150
|
+
const note = (text: string) => referenceNote ? `${text}\n${referenceNote}` : text;
|
|
151
|
+
if (shot_paths.length === 0) return { outcome: 'error', produced: prompts ? { shot_references } : undefined, note: note('샷 0 — ⛔ 이 러너는 크레딧을 안 쓴다(Seedance·Kling 생성은 스킬 세션의 몫)') };
|
|
152
|
+
const produced = { shot_paths, shot_count: shot_paths.length, ...(prompts ? { shot_references } : {}) };
|
|
116
153
|
// ⛔⭐ 되돌이 수렴(🩸 2026-09-23 실물: fullbleed → shots → «같은» 샷 → fullbleed … 예산 소진).
|
|
117
154
|
// 리프레임 자가 「그 비율로 다시 렌더하라」고 돌려보냈는데 이 러너는 다시 그릴 수 없다(크레딧 무사용)
|
|
118
155
|
// ⇒ 같은 샷을 또 내면 같은 판정이 난다. 「못 다시 그린다」를 error 로 말해 `rendered-unedited` 로 끝낸다.
|
|
119
156
|
const pending = (ctx.state.fullbleed_cuts as string[] | undefined) ?? [];
|
|
120
|
-
if (pending.length) return { outcome: 'error', produced
|
|
121
|
-
return { outcome: 'ok', produced
|
|
157
|
+
if (pending.length) return { outcome: 'error', produced, note: note(`전용 비율 재렌더가 필요한 샷 ${pending.join(', ')} — ⛔ 이 러너는 다시 그리지 않는다(크레딧 무사용) · 그 비율 렌더를 스킬 세션에서 만든 뒤 native 로 넘겨라`) };
|
|
158
|
+
return { outcome: 'ok', produced, note: note(`샷 ${shot_paths.length}개 · ⚠️ 이미 생성된 것을 받았다`) };
|
|
122
159
|
};
|
|
123
160
|
|
|
124
161
|
/** `08_shot_ruler.py` 의 `shot_variation` 한 칸만 읽는다(그 자가 «살아남은 유일한 칸»이라 스스로 적었다). */
|
|
@@ -17,7 +17,7 @@ export function run(bin: string, args: readonly string[], timeoutMs = 180_000):
|
|
|
17
17
|
ok: r.status === 0,
|
|
18
18
|
code: r.status,
|
|
19
19
|
signal: r.signal ?? null,
|
|
20
|
-
err:
|
|
20
|
+
err: r.stderr?.trim() || r.error?.message || '',
|
|
21
21
|
out: (r.stdout ?? '').trim(),
|
|
22
22
|
};
|
|
23
23
|
}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
|
+
import { spawnSync } from 'node:child_process';
|
|
14
15
|
import { ffmpeg, probeDuration, run } from './ffmpeg.js';
|
|
15
16
|
import { inspectDeliverables } from './shipcheck.js';
|
|
16
17
|
import type { Recipe, RecipeCtx, RecipeResult } from './types.js';
|
|
@@ -110,6 +111,19 @@ export const placeClips: Recipe = async (ctx) => {
|
|
|
110
111
|
};
|
|
111
112
|
|
|
112
113
|
// ══ ⑨ overlay — 그 «위» 자막 층 (free: ffmpeg-ass) ═══════════════════════
|
|
114
|
+
/** 설치된 한글 폰트를 실제 언어 지원으로 확인한다. fontconfig 의 기본 폰트 폴백만 믿지 않는다. */
|
|
115
|
+
export function koreanCaptionFont(): { path: string; family: string } | null {
|
|
116
|
+
const apple = ['/System/Library/Fonts/AppleSDGothicNeo.ttc',
|
|
117
|
+
'/System/Library/Fonts/Supplemental/AppleGothic.ttf'].find(existsSync);
|
|
118
|
+
if (apple) return { path: apple, family: 'AppleSDGothicNeo' };
|
|
119
|
+
const match = spawnSync('fc-match', ['-f', '%{family}\t%{file}\t%{lang}\n', ':lang=ko'],
|
|
120
|
+
{ encoding: 'utf8', timeout: 10_000 });
|
|
121
|
+
if (match.status !== 0) return null;
|
|
122
|
+
const [families, path, langs] = (match.stdout ?? '').trim().split('\t');
|
|
123
|
+
if (!families || !path || !langs?.split('|').includes('ko') || !existsSync(path)) return null;
|
|
124
|
+
return { path, family: families.split(',')[0]!.trim() };
|
|
125
|
+
}
|
|
126
|
+
|
|
113
127
|
export const drawCaptions: Recipe = async (ctx) => {
|
|
114
128
|
const edlJson = need<string>(ctx, 'edl_json');
|
|
115
129
|
if (!edlJson) return missing('edl_json');
|
|
@@ -119,8 +133,7 @@ export const drawCaptions: Recipe = async (ctx) => {
|
|
|
119
133
|
cuts = j.cuts; W = j.w ?? W; H = j.h ?? H; // ⛔ 자막 틀은 «조립이 쓴 캔버스»를 따라간다
|
|
120
134
|
} catch (e) { return { outcome: 'error', note: `edl 을 못 읽었다: ${(e as Error).message}` }; }
|
|
121
135
|
|
|
122
|
-
const font =
|
|
123
|
-
'/System/Library/Fonts/Supplemental/AppleGothic.ttf'].find((f) => existsSync(f));
|
|
136
|
+
const font = koreanCaptionFont();
|
|
124
137
|
if (!font) {
|
|
125
138
|
// ⛔ 폰트가 없으면 drawtext/ass 가 «조용히» 빈 층을 만든다 — 그것을 성공으로 내지 않는다.
|
|
126
139
|
return { outcome: 'unmeasurable', note: '한글 폰트를 못 찾았다 — 자막을 «그릴 수 없다»(실패가 아니라 못 함)' };
|
|
@@ -146,7 +159,7 @@ export const drawCaptions: Recipe = async (ctx) => {
|
|
|
146
159
|
'[V4+ Styles]',
|
|
147
160
|
'Format: Name,Fontname,Fontsize,PrimaryColour,OutlineColour,BackColour,Bold,BorderStyle,Outline,Shadow,Alignment,MarginL,MarginR,MarginV,Encoding',
|
|
148
161
|
// ⛔ 크기·여백을 «캔버스에 비례»로 — 고정값이면 세로 영상에서 글자가 작아지고 여백이 어긋난다.
|
|
149
|
-
`Style: Default
|
|
162
|
+
`Style: Default,${font.family},${Math.round(H * 0.045)},&H00FFFFFF,&H00000000,&H80000000,1,1,3,1,2,`
|
|
150
163
|
+ `${Math.round(W * 0.07)},${Math.round(W * 0.07)},${Math.round(H * 0.08)},1`, '',
|
|
151
164
|
'[Events]',
|
|
152
165
|
'Format: Layer,Start,End,Style,Name,MarginL,MarginR,MarginV,Effect,Text',
|
|
@@ -49,6 +49,9 @@ export function sshRun(host: string, cmd: string, timeoutMs = 1_800_000): Remote
|
|
|
49
49
|
`bash -lc ${shq(cmd)}`], timeoutMs);
|
|
50
50
|
const seconds = Math.round((Date.now() - t0) / 1000);
|
|
51
51
|
if (r.ok) return { kind: 'ok', seconds };
|
|
52
|
+
if (r.code == null && r.signal == null) {
|
|
53
|
+
return { kind: 'unmeasurable', why: `${host} 에 «못 붙었다» — ssh 를 실행할 수 없다(${r.err || '종료 코드 없음'})`, seconds };
|
|
54
|
+
}
|
|
52
55
|
// ⛔ ssh 자신이 못 붙은 것(255)과 «원격 명령이 실패한 것»을 섞지 않는다.
|
|
53
56
|
if (r.code === 255 || r.signal !== null) {
|
|
54
57
|
return { kind: 'unmeasurable', why: `${host} 에 «못 붙었다» — ${r.err.split('\n')[0] || `code=${r.code} signal=${r.signal}`}`, seconds };
|
|
@@ -61,7 +64,10 @@ export function scpFrom(host: string, remotePath: string, localPath: string): Re
|
|
|
61
64
|
mkdirSync(join(localPath, '..'), { recursive: true });
|
|
62
65
|
const r = run('scp', ['-o', 'BatchMode=yes', '-o', 'ConnectTimeout=10', `${host}:${remotePath}`, localPath], 600_000);
|
|
63
66
|
if (r.ok) return { kind: 'ok', out: localPath };
|
|
64
|
-
if (r.code
|
|
67
|
+
if (r.code == null && r.signal == null) {
|
|
68
|
+
return { kind: 'unmeasurable', why: `${host} 에 «못 붙었다» — scp 를 실행할 수 없다(${r.err || '종료 코드 없음'})` };
|
|
69
|
+
}
|
|
70
|
+
if (r.code === 255 || r.signal !== null) return { kind: 'unmeasurable', why: `${host} 에 «못 붙었다»` };
|
|
65
71
|
return { kind: 'error', why: `가져오기 실패: ${r.err.split('\n')[0]}` };
|
|
66
72
|
}
|
|
67
73
|
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
|
|
3
|
+
export interface VflowPromptRow {
|
|
4
|
+
url: string;
|
|
5
|
+
model: string;
|
|
6
|
+
category: string;
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
prompt: string;
|
|
10
|
+
keywords: string[];
|
|
11
|
+
author: string | null;
|
|
12
|
+
authorUrl: string | null;
|
|
13
|
+
spec?: {
|
|
14
|
+
duration?: string;
|
|
15
|
+
camera?: string[];
|
|
16
|
+
lighting?: string[];
|
|
17
|
+
mood?: string[];
|
|
18
|
+
difficulty?: string;
|
|
19
|
+
promptLanguage?: string;
|
|
20
|
+
includes?: string[];
|
|
21
|
+
} | null;
|
|
22
|
+
video?: {
|
|
23
|
+
url?: string;
|
|
24
|
+
isoDuration?: string;
|
|
25
|
+
resolution?: string;
|
|
26
|
+
aspect?: string;
|
|
27
|
+
} | null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface VflowQuery {
|
|
31
|
+
model?: string;
|
|
32
|
+
category?: string;
|
|
33
|
+
terms?: readonly string[];
|
|
34
|
+
techniques?: readonly string[];
|
|
35
|
+
camera?: string | readonly string[];
|
|
36
|
+
lighting?: string;
|
|
37
|
+
mood?: string;
|
|
38
|
+
maxSeconds?: number;
|
|
39
|
+
limit?: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export type VflowSearchResult =
|
|
43
|
+
| { available: true; rows: VflowPromptRow[]; read: number; skipped: number; matches: number }
|
|
44
|
+
| { available: false; reason: string };
|
|
45
|
+
|
|
46
|
+
const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
47
|
+
typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
48
|
+
// ⚠️ 원천은 «모르는 칸»을 null 로 낸다(10-01 전수: spec.duration·video.isoDuration 이 53% null) — null 을 거부하면 줄째로 버려진다.
|
|
49
|
+
const optionalString = (value: unknown): boolean => value == null || typeof value === 'string';
|
|
50
|
+
const optionalStrings = (value: unknown): boolean =>
|
|
51
|
+
value == null || (Array.isArray(value) && value.every((item) => typeof item === 'string'));
|
|
52
|
+
|
|
53
|
+
function isPromptRow(value: unknown): value is VflowPromptRow {
|
|
54
|
+
if (!isRecord(value)) return false;
|
|
55
|
+
if (!['url', 'model', 'category', 'name', 'description', 'prompt'].every((field) => typeof value[field] === 'string')
|
|
56
|
+
|| !Array.isArray(value.keywords) || !value.keywords.every((item: unknown) => typeof item === 'string')
|
|
57
|
+
|| !(typeof value.author === 'string' || value.author === null)
|
|
58
|
+
|| !(typeof value.authorUrl === 'string' || value.authorUrl === null)) return false;
|
|
59
|
+
const spec = value.spec;
|
|
60
|
+
if (spec != null && (!isRecord(spec)
|
|
61
|
+
|| !['duration', 'difficulty', 'promptLanguage'].every((field) => optionalString(spec[field]))
|
|
62
|
+
|| !['camera', 'lighting', 'mood', 'includes'].every((field) => optionalStrings(spec[field])))) return false;
|
|
63
|
+
const video = value.video;
|
|
64
|
+
if (video != null && (!isRecord(video)
|
|
65
|
+
|| !['url', 'isoDuration', 'resolution', 'aspect'].every((field) => optionalString(video[field])))) return false;
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Local-only search. Missing/unreadable data is distinct from a readable DB with zero matches. */
|
|
70
|
+
export function searchVflowReferences(file: string, query: VflowQuery): VflowSearchResult {
|
|
71
|
+
let content: string;
|
|
72
|
+
try {
|
|
73
|
+
content = readFileSync(file, 'utf8');
|
|
74
|
+
} catch (error) {
|
|
75
|
+
return { available: false, reason: (error as Error).message };
|
|
76
|
+
}
|
|
77
|
+
let read = 0;
|
|
78
|
+
let skipped = 0;
|
|
79
|
+
const matches: VflowPromptRow[] = [];
|
|
80
|
+
const contains = (values: readonly string[] | undefined, needle: string | undefined) =>
|
|
81
|
+
!needle || !!values?.some((value) => value.toLowerCase().includes(needle.toLowerCase()));
|
|
82
|
+
for (const line of content.split(/\r?\n/)) {
|
|
83
|
+
if (!line.trim()) continue;
|
|
84
|
+
read++;
|
|
85
|
+
let value: unknown;
|
|
86
|
+
try { value = JSON.parse(line); } catch { skipped++; continue; }
|
|
87
|
+
if (!isPromptRow(value)) { skipped++; continue; }
|
|
88
|
+
const row = value;
|
|
89
|
+
const prompt = row.prompt.toLowerCase();
|
|
90
|
+
const keywords = row.keywords.map((word) => word.toLowerCase());
|
|
91
|
+
const fields = [prompt, row.name.toLowerCase(), row.description.toLowerCase(), ...keywords];
|
|
92
|
+
const techniqueFields = [prompt, ...keywords];
|
|
93
|
+
if (query.model && !row.model.toLowerCase().startsWith(query.model.toLowerCase())) continue;
|
|
94
|
+
if (query.category && row.category.toLowerCase() !== query.category.toLowerCase()) continue;
|
|
95
|
+
if (query.terms && !query.terms.every((term) => fields.some((field) => field.includes(term.toLowerCase())))) continue;
|
|
96
|
+
if (query.techniques && !query.techniques.every((term) => techniqueFields.some((field) => field.includes(term.toLowerCase())))) continue;
|
|
97
|
+
const cameras = typeof query.camera === 'string' ? [query.camera] : query.camera;
|
|
98
|
+
if (cameras?.length && !cameras.some((camera) => contains(row.spec?.camera, camera))) continue;
|
|
99
|
+
if (!contains(row.spec?.lighting, query.lighting)
|
|
100
|
+
|| !contains(row.spec?.mood, query.mood)) continue;
|
|
101
|
+
if (query.maxSeconds !== undefined) {
|
|
102
|
+
const seconds = row.spec?.duration?.match(/^\s*(\d+(?:\.\d+)?)s\s*$/i);
|
|
103
|
+
if (!seconds || Number(seconds[1]) > query.maxSeconds) continue;
|
|
104
|
+
}
|
|
105
|
+
matches.push(row);
|
|
106
|
+
}
|
|
107
|
+
matches.sort((a, b) => a.prompt.length - b.prompt.length);
|
|
108
|
+
return { available: true, rows: matches.slice(0, query.limit ?? 5), matches: matches.length, read, skipped };
|
|
109
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1169],{2874:(t,n,e)=>{function r(t,n,e,r){if(isNaN(n)||isNaN(e))return t;var i,u,o,a,s,l,h,c,f,y=t._root,v={data:r},d=t._x0,x=t._y0,p=t._x1,g=t._y1;if(!y)return t._root=v,t;for(;y.length;)if((l=n>=(u=(d+p)/2))?d=u:p=u,(h=e>=(o=(x+g)/2))?x=o:g=o,i=y,!(y=y[c=h<<1|l]))return i[c]=v,t;if(a=+t._x.call(null,y.data),s=+t._y.call(null,y.data),n===a&&e===s)return v.next=y,i?i[c]=v:t._root=v,t;do i=i?i[c]=[,,,,]:t._root=[,,,,],(l=n>=(u=(d+p)/2))?d=u:p=u,(h=e>=(o=(x+g)/2))?x=o:g=o;while((c=h<<1|l)==(f=(s>=o)<<1|a>=u));return i[f]=y,i[c]=v,t}function i(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i}function u(t){return t[0]}function o(t){return t[1]}function a(t,n,e){var r=new s(null==n?u:n,null==e?o:e,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function s(t,n,e,r,i,u){this._x=t,this._y=n,this._x0=e,this._y0=r,this._x1=i,this._y1=u,this._root=void 0}function l(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.data};return n}e.d(n,{A:()=>a});var h=a.prototype=s.prototype;h.copy=function(){var t,n,e=new s(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return e;if(!r.length)return e._root=l(r),e;for(t=[{source:r,target:e._root=[,,,,]}];r=t.pop();)for(var i=0;i<4;++i)(n=r.source[i])&&(n.length?t.push({source:n,target:r.target[i]=[,,,,]}):r.target[i]=l(n));return e},h.add=function(t){let n=+this._x.call(null,t),e=+this._y.call(null,t);return r(this.cover(n,e),n,e,t)},h.addAll=function(t){var n,e,i,u,o=t.length,a=Array(o),s=Array(o),l=1/0,h=1/0,c=-1/0,f=-1/0;for(e=0;e<o;++e)!(isNaN(i=+this._x.call(null,n=t[e]))||isNaN(u=+this._y.call(null,n)))&&(a[e]=i,s[e]=u,i<l&&(l=i),i>c&&(c=i),u<h&&(h=u),u>f&&(f=u));if(l>c||h>f)return this;for(this.cover(l,h).cover(c,f),e=0;e<o;++e)r(this,a[e],s[e],t[e]);return this},h.cover=function(t,n){if(isNaN(t*=1)||isNaN(n*=1))return this;var e=this._x0,r=this._y0,i=this._x1,u=this._y1;if(isNaN(e))i=(e=Math.floor(t))+1,u=(r=Math.floor(n))+1;else{for(var o,a,s=i-e||1,l=this._root;e>t||t>=i||r>n||n>=u;)switch(a=(n<r)<<1|t<e,(o=[,,,,])[a]=l,l=o,s*=2,a){case 0:i=e+s,u=r+s;break;case 1:e=i-s,u=r+s;break;case 2:i=e+s,r=u-s;break;case 3:e=i-s,r=u-s}this._root&&this._root.length&&(this._root=l)}return this._x0=e,this._y0=r,this._x1=i,this._y1=u,this},h.data=function(){var t=[];return this.visit(function(n){if(!n.length)do t.push(n.data);while(n=n.next)}),t},h.extent=function(t){return arguments.length?this.cover(+t[0][0],+t[0][1]).cover(+t[1][0],+t[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]},h.find=function(t,n,e){var r,u,o,a,s,l,h,c=this._x0,f=this._y0,y=this._x1,v=this._y1,d=[],x=this._root;for(x&&d.push(new i(x,c,f,y,v)),null==e?e=1/0:(c=t-e,f=n-e,y=t+e,v=n+e,e*=e);l=d.pop();)if((x=l.node)&&!((u=l.x0)>y)&&!((o=l.y0)>v)&&!((a=l.x1)<c)&&!((s=l.y1)<f))if(x.length){var p=(u+a)/2,g=(o+s)/2;d.push(new i(x[3],p,g,a,s),new i(x[2],u,g,p,s),new i(x[1],p,o,a,g),new i(x[0],u,o,p,g)),(h=(n>=g)<<1|t>=p)&&(l=d[d.length-1],d[d.length-1]=d[d.length-1-h],d[d.length-1-h]=l)}else{var _=t-this._x.call(null,x.data),w=n-this._y.call(null,x.data),b=_*_+w*w;if(b<e){var A=Math.sqrt(e=b);c=t-A,f=n-A,y=t+A,v=n+A,r=x.data}}return r},h.remove=function(t){if(isNaN(u=+this._x.call(null,t))||isNaN(o=+this._y.call(null,t)))return this;var n,e,r,i,u,o,a,s,l,h,c,f,y=this._root,v=this._x0,d=this._y0,x=this._x1,p=this._y1;if(!y)return this;if(y.length)for(;;){if((l=u>=(a=(v+x)/2))?v=a:x=a,(h=o>=(s=(d+p)/2))?d=s:p=s,n=y,!(y=y[c=h<<1|l]))return this;if(!y.length)break;(n[c+1&3]||n[c+2&3]||n[c+3&3])&&(e=n,f=c)}for(;y.data!==t;)if(r=y,!(y=y.next))return this;return((i=y.next)&&delete y.next,r)?i?r.next=i:delete r.next:n?(i?n[c]=i:delete n[c],(y=n[0]||n[1]||n[2]||n[3])&&y===(n[3]||n[2]||n[1]||n[0])&&!y.length&&(e?e[f]=y:this._root=y)):this._root=i,this},h.removeAll=function(t){for(var n=0,e=t.length;n<e;++n)this.remove(t[n]);return this},h.root=function(){return this._root},h.size=function(){var t=0;return this.visit(function(n){if(!n.length)do++t;while(n=n.next)}),t},h.visit=function(t){var n,e,r,u,o,a,s=[],l=this._root;for(l&&s.push(new i(l,this._x0,this._y0,this._x1,this._y1));n=s.pop();)if(!t(l=n.node,r=n.x0,u=n.y0,o=n.x1,a=n.y1)&&l.length){var h=(r+o)/2,c=(u+a)/2;(e=l[3])&&s.push(new i(e,h,c,o,a)),(e=l[2])&&s.push(new i(e,r,c,h,a)),(e=l[1])&&s.push(new i(e,h,u,o,c)),(e=l[0])&&s.push(new i(e,r,u,h,c))}return this},h.visitAfter=function(t){var n,e=[],r=[];for(this._root&&e.push(new i(this._root,this._x0,this._y0,this._x1,this._y1));n=e.pop();){var u=n.node;if(u.length){var o,a=n.x0,s=n.y0,l=n.x1,h=n.y1,c=(a+l)/2,f=(s+h)/2;(o=u[0])&&e.push(new i(o,a,s,c,f)),(o=u[1])&&e.push(new i(o,c,s,l,f)),(o=u[2])&&e.push(new i(o,a,f,c,h)),(o=u[3])&&e.push(new i(o,c,f,l,h))}r.push(n)}for(;n=r.pop();)t(n.node,n.x0,n.y0,n.x1,n.y1);return this},h.x=function(t){return arguments.length?(this._x=t,this):this._x},h.y=function(t){return arguments.length?(this._y=t,this):this._y}},29274:(t,n,e)=>{e.d(n,{A:()=>a});var r=e(2874),i=e(98929),u=e(32353),o=e(94917);function a(){var t,n,e,a,s,l=(0,i.A)(-30),h=1,c=1/0,f=.81;function y(e){var i,u=t.length,s=(0,r.A)(t,o.x,o.y).visitAfter(d);for(a=e,i=0;i<u;++i)n=t[i],s.visit(x)}function v(){if(t){var n,e,r=t.length;for(n=0,s=Array(r);n<r;++n)s[(e=t[n]).index]=+l(e,n,t)}}function d(t){var n,e,r,i,u,o=0,a=0;if(t.length){for(r=i=u=0;u<4;++u)(n=t[u])&&(e=Math.abs(n.value))&&(o+=n.value,a+=e,r+=e*n.x,i+=e*n.y);t.x=r/a,t.y=i/a}else{(n=t).x=n.data.x,n.y=n.data.y;do o+=s[n.data.index];while(n=n.next)}t.value=o}function x(t,r,i,o){if(!t.value)return!0;var l=t.x-n.x,y=t.y-n.y,v=o-r,d=l*l+y*y;if(v*v/f<d)return d<c&&(0===l&&(d+=(l=(0,u.A)(e))*l),0===y&&(d+=(y=(0,u.A)(e))*y),d<h&&(d=Math.sqrt(h*d)),n.vx+=l*t.value*a/d,n.vy+=y*t.value*a/d),!0;if(!t.length&&!(d>=c)){(t.data!==n||t.next)&&(0===l&&(d+=(l=(0,u.A)(e))*l),0===y&&(d+=(y=(0,u.A)(e))*y),d<h&&(d=Math.sqrt(h*d)));do t.data!==n&&(v=s[t.data.index]*a/d,n.vx+=l*v,n.vy+=y*v);while(t=t.next)}}return y.initialize=function(n,r){t=n,e=r,v()},y.strength=function(t){return arguments.length?(l="function"==typeof t?t:(0,i.A)(+t),v(),y):l},y.distanceMin=function(t){return arguments.length?(h=t*t,y):Math.sqrt(h)},y.distanceMax=function(t){return arguments.length?(c=t*t,y):Math.sqrt(c)},y.theta=function(t){return arguments.length?(f=t*t,y):Math.sqrt(f)},y}},32353:(t,n,e)=>{e.d(n,{A:()=>r});function r(t){return(t()-.5)*1e-6}},44824:(t,n,e)=>{e.d(n,{A:()=>r});let r=(0,e(42735).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"}]])},72356:(t,n,e)=>{e.d(n,{A:()=>r});function r(t,n){var e,r=1;function i(){var i,u,o=e.length,a=0,s=0;for(i=0;i<o;++i)a+=(u=e[i]).x,s+=u.y;for(a=(a/o-t)*r,s=(s/o-n)*r,i=0;i<o;++i)u=e[i],u.x-=a,u.y-=s}return null==t&&(t=0),null==n&&(n=0),i.initialize=function(t){e=t},i.x=function(n){return arguments.length?(t=+n,i):t},i.y=function(t){return arguments.length?(n=+t,i):n},i.strength=function(t){return arguments.length?(r=+t,i):r},i}},78217:(t,n,e)=>{e.d(n,{A:()=>s});var r=e(2874),i=e(98929),u=e(32353);function o(t){return t.x+t.vx}function a(t){return t.y+t.vy}function s(t){var n,e,s,l=1,h=1;function c(){for(var t,i,c,y,v,d,x,p=n.length,g=0;g<h;++g)for(t=0,i=(0,r.A)(n,o,a).visitAfter(f);t<p;++t)x=(d=e[(c=n[t]).index])*d,y=c.x+c.vx,v=c.y+c.vy,i.visit(_);function _(t,n,e,r,i){var o=t.data,a=t.r,h=d+a;if(o){if(o.index>c.index){var f=y-o.x-o.vx,p=v-o.y-o.vy,g=f*f+p*p;g<h*h&&(0===f&&(g+=(f=(0,u.A)(s))*f),0===p&&(g+=(p=(0,u.A)(s))*p),g=(h-(g=Math.sqrt(g)))/g*l,c.vx+=(f*=g)*(h=(a*=a)/(x+a)),c.vy+=(p*=g)*h,o.vx-=f*(h=1-h),o.vy-=p*h)}return}return n>y+h||r<y-h||e>v+h||i<v-h}}function f(t){if(t.data)return t.r=e[t.data.index];for(var n=t.r=0;n<4;++n)t[n]&&t[n].r>t.r&&(t.r=t[n].r)}function y(){if(n){var r,i,u=n.length;for(r=0,e=Array(u);r<u;++r)e[(i=n[r]).index]=+t(i,r,n)}}return"function"!=typeof t&&(t=(0,i.A)(null==t?1:+t)),c.initialize=function(t,e){n=t,s=e,y()},c.iterations=function(t){return arguments.length?(h=+t,c):h},c.strength=function(t){return arguments.length?(l=+t,c):l},c.radius=function(n){return arguments.length?(t="function"==typeof n?n:(0,i.A)(+n),y(),c):t},c}},94917:(t,n,e)=>{e.d(n,{A:()=>s,x:()=>u,y:()=>o});var r=e(43872),i=e(16412);function u(t){return t.x}function o(t){return t.y}var a=Math.PI*(3-Math.sqrt(5));function s(t){let n;var e,u=1,o=.001,s=1-Math.pow(.001,1/300),l=0,h=.6,c=new Map,f=(0,i.O1)(d),y=(0,r.A)("tick","end"),v=(n=1,()=>(n=(1664525*n+0x3c6ef35f)%0x100000000)/0x100000000);function d(){x(),y.call("tick",e),u<o&&(f.stop(),y.call("end",e))}function x(n){var r,i,o=t.length;void 0===n&&(n=1);for(var a=0;a<n;++a)for(u+=(l-u)*s,c.forEach(function(t){t(u)}),r=0;r<o;++r)null==(i=t[r]).fx?i.x+=i.vx*=h:(i.x=i.fx,i.vx=0),null==i.fy?i.y+=i.vy*=h:(i.y=i.fy,i.vy=0);return e}function p(){for(var n,e=0,r=t.length;e<r;++e){if((n=t[e]).index=e,null!=n.fx&&(n.x=n.fx),null!=n.fy&&(n.y=n.fy),isNaN(n.x)||isNaN(n.y)){var i=10*Math.sqrt(.5+e),u=e*a;n.x=i*Math.cos(u),n.y=i*Math.sin(u)}(isNaN(n.vx)||isNaN(n.vy))&&(n.vx=n.vy=0)}}function g(n){return n.initialize&&n.initialize(t,v),n}return null==t&&(t=[]),p(),e={tick:x,restart:function(){return f.restart(d),e},stop:function(){return f.stop(),e},nodes:function(n){return arguments.length?(t=n,p(),c.forEach(g),e):t},alpha:function(t){return arguments.length?(u=+t,e):u},alphaMin:function(t){return arguments.length?(o=+t,e):o},alphaDecay:function(t){return arguments.length?(s=+t,e):+s},alphaTarget:function(t){return arguments.length?(l=+t,e):l},velocityDecay:function(t){return arguments.length?(h=1-t,e):1-h},randomSource:function(t){return arguments.length?(v=t,c.forEach(g),e):v},force:function(t,n){return arguments.length>1?(null==n?c.delete(t):c.set(t,g(n)),e):c.get(t)},find:function(n,e,r){var i,u,o,a,s,l=0,h=t.length;for(null==r?r=1/0:r*=r,l=0;l<h;++l)(o=(i=n-(a=t[l]).x)*i+(u=e-a.y)*u)<r&&(s=a,r=o);return s},on:function(t,n){return arguments.length>1?(y.on(t,n),e):y.on(t)}}}},95680:(t,n,e)=>{e.d(n,{n5:()=>C});var r=e(43872),i=e(42683),u=e(41489),o=e(91022),a=e(83499),s=e(95705);let l=t=>()=>t;function h(t,{sourceEvent:n,target:e,selection:r,mode:i,dispatch:u}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},selection:{value:r,enumerable:!0,configurable:!0},mode:{value:i,enumerable:!0,configurable:!0},_:{value:u}})}function c(t){t.preventDefault(),t.stopImmediatePropagation()}var f={name:"drag"},y={name:"space"},v={name:"handle"},d={name:"center"};let{abs:x,max:p,min:g}=Math;function _(t){return[+t[0],+t[1]]}function w(t){return[_(t[0]),_(t[1])]}var b={name:"x",handles:["w","e"].map(q),input:function(t,n){return null==t?null:[[+t[0],n[0][1]],[+t[1],n[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},A={name:"y",handles:["n","s"].map(q),input:function(t,n){return null==t?null:[[n[0][0],+t[0]],[n[1][0],+t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}};["n","w","e","s","nw","ne","sw","se"].map(q);var m={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},N={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},k={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},M={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},z={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function q(t){return{type:t}}function E(t){return!t.ctrlKey&&!t.button}function K(){var t=this.ownerSVGElement||this;return t.hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function P(){return navigator.maxTouchPoints||"ontouchstart"in this}function T(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__brush}function C(){return function(t){var n,e=K,_=E,C=P,V=!0,j=(0,r.A)("start","brush","end"),D=6;function G(n){var e=n.property("__brush",J).selectAll(".overlay").data([q("overlay")]);e.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",m.overlay).merge(e).each(function(){var t=T(this).extent;(0,o.A)(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])}),n.selectAll(".selection").data([q("selection")]).enter().append("rect").attr("class","selection").attr("cursor",m.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var r=n.selectAll(".handle").data(t.handles,function(t){return t.type});r.exit().remove(),r.enter().append("rect").attr("class",function(t){return"handle handle--"+t.type}).attr("cursor",function(t){return m[t.type]}),n.each(I).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",O).filter(C).on("touchstart.brush",O).on("touchmove.brush",F).on("touchend.brush touchcancel.brush",H).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function I(){var t=(0,o.A)(this),n=T(this).selection;n?(t.selectAll(".selection").style("display",null).attr("x",n[0][0]).attr("y",n[0][1]).attr("width",n[1][0]-n[0][0]).attr("height",n[1][1]-n[0][1]),t.selectAll(".handle").style("display",null).attr("x",function(t){return"e"===t.type[t.type.length-1]?n[1][0]-D/2:n[0][0]-D/2}).attr("y",function(t){return"s"===t.type[0]?n[1][1]-D/2:n[0][1]-D/2}).attr("width",function(t){return"n"===t.type||"s"===t.type?n[1][0]-n[0][0]+D:D}).attr("height",function(t){return"e"===t.type||"w"===t.type?n[1][1]-n[0][1]+D:D})):t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function S(t,n,e){var r=t.__brush.emitter;return!r||e&&r.clean?new B(t,n,e):r}function B(t,n,e){this.that=t,this.args=n,this.state=t.__brush,this.active=0,this.clean=e}function O(e){if((!n||e.touches)&&_.apply(this,arguments)){var r,u,l,h,w,q,E,K,P,C,j,D=this,G=e.target.__data__.type,B=(V&&e.metaKey?G="overlay":G)==="selection"?f:V&&e.altKey?d:v,O=t===A?null:M[G],F=t===b?null:z[G],H=T(D),J=H.extent,L=H.selection,Q=J[0][0],R=J[0][1],U=J[1][0],W=J[1][1],X=0,Y=0,Z=O&&F&&V&&e.shiftKey,$=Array.from(e.touches||[e],t=>{let n=t.identifier;return(t=(0,a.A)(t,D)).point0=t.slice(),t.identifier=n,t});(0,s.G)(D);var tt=S(D,arguments,!0).beforestart();if("overlay"===G){L&&(P=!0);let n=[$[0],$[1]||$[0]];H.selection=L=[[r=t===A?Q:g(n[0][0],n[1][0]),l=t===b?R:g(n[0][1],n[1][1])],[w=t===A?U:p(n[0][0],n[1][0]),E=t===b?W:p(n[0][1],n[1][1])]],$.length>1&&tu(e)}else r=L[0][0],l=L[0][1],w=L[1][0],E=L[1][1];u=r,h=l,q=w,K=E;var tn=(0,o.A)(D).attr("pointer-events","none"),te=tn.selectAll(".overlay").attr("cursor",m[G]);if(e.touches)tt.moved=ti,tt.ended=to;else{var tr=(0,o.A)(e.view).on("mousemove.brush",ti,!0).on("mouseup.brush",to,!0);V&&tr.on("keydown.brush",function(t){switch(t.keyCode){case 16:Z=O&&F;break;case 18:B===v&&(O&&(w=q-X*O,r=u+X*O),F&&(E=K-Y*F,l=h+Y*F),B=d,tu(t));break;case 32:(B===v||B===d)&&(O<0?w=q-X:O>0&&(r=u-X),F<0?E=K-Y:F>0&&(l=h-Y),B=y,te.attr("cursor",m.selection),tu(t));break;default:return}c(t)},!0).on("keyup.brush",function(t){switch(t.keyCode){case 16:Z&&(C=j=Z=!1,tu(t));break;case 18:B===d&&(O<0?w=q:O>0&&(r=u),F<0?E=K:F>0&&(l=h),B=v,tu(t));break;case 32:B===y&&(t.altKey?(O&&(w=q-X*O,r=u+X*O),F&&(E=K-Y*F,l=h+Y*F),B=d):(O<0?w=q:O>0&&(r=u),F<0?E=K:F>0&&(l=h),B=v),te.attr("cursor",m[G]),tu(t));break;default:return}c(t)},!0),(0,i.A)(e.view)}I.call(D),tt.start(e,B.name)}function ti(t){for(let n of t.changedTouches||[t])for(let t of $)t.identifier===n.identifier&&(t.cur=(0,a.A)(n,D));if(Z&&!C&&!j&&1===$.length){let t=$[0];x(t.cur[0]-t[0])>x(t.cur[1]-t[1])?j=!0:C=!0}for(let t of $)t.cur&&(t[0]=t.cur[0],t[1]=t.cur[1]);P=!0,c(t),tu(t)}function tu(t){var n;let e=$[0],i=e.point0;switch(X=e[0]-i[0],Y=e[1]-i[1],B){case y:case f:O&&(X=p(Q-r,g(U-w,X)),u=r+X,q=w+X),F&&(Y=p(R-l,g(W-E,Y)),h=l+Y,K=E+Y);break;case v:$[1]?(O&&(u=p(Q,g(U,$[0][0])),q=p(Q,g(U,$[1][0])),O=1),F&&(h=p(R,g(W,$[0][1])),K=p(R,g(W,$[1][1])),F=1)):(O<0?(X=p(Q-r,g(U-r,X)),u=r+X,q=w):O>0&&(X=p(Q-w,g(U-w,X)),u=r,q=w+X),F<0?(Y=p(R-l,g(W-l,Y)),h=l+Y,K=E):F>0&&(Y=p(R-E,g(W-E,Y)),h=l,K=E+Y));break;case d:O&&(u=p(Q,g(U,r-X*O)),q=p(Q,g(U,w+X*O))),F&&(h=p(R,g(W,l-Y*F)),K=p(R,g(W,E+Y*F)))}q<u&&(O*=-1,n=r,r=w,w=n,n=u,u=q,q=n,G in N&&te.attr("cursor",m[G=N[G]])),K<h&&(F*=-1,n=l,l=E,E=n,n=h,h=K,K=n,G in k&&te.attr("cursor",m[G=k[G]])),H.selection&&(L=H.selection),C&&(u=L[0][0],q=L[1][0]),j&&(h=L[0][1],K=L[1][1]),(L[0][0]!==u||L[0][1]!==h||L[1][0]!==q||L[1][1]!==K)&&(H.selection=[[u,h],[q,K]],I.call(D),tt.brush(t,B.name))}function to(t){var e;if(t.stopImmediatePropagation(),t.touches){if(t.touches.length)return;n&&clearTimeout(n),n=setTimeout(function(){n=null},500)}else(0,i.y)(t.view,P),tr.on("keydown.brush keyup.brush mousemove.brush mouseup.brush",null);tn.attr("pointer-events","all"),te.attr("cursor",m.overlay),H.selection&&(L=H.selection),((e=L)[0][0]===e[1][0]||e[0][1]===e[1][1])&&(H.selection=null,I.call(D)),tt.end(t,B.name)}}function F(t){S(this,arguments).moved(t)}function H(t){S(this,arguments).ended(t)}function J(){var n=this.__brush||{selection:null};return n.extent=w(e.apply(this,arguments)),n.dim=t,n}return G.move=function(n,e,r){n.tween?n.on("start.brush",function(t){S(this,arguments).beforestart().start(t)}).on("interrupt.brush end.brush",function(t){S(this,arguments).end(t)}).tween("brush",function(){var n=this,r=n.__brush,i=S(n,arguments),o=r.selection,a=t.input("function"==typeof e?e.apply(this,arguments):e,r.extent),s=(0,u.A)(o,a);function l(t){r.selection=1===t&&null===a?null:s(t),I.call(n),i.brush()}return null!==o&&null!==a?l:l(1)}):n.each(function(){var n=arguments,i=this.__brush,u=t.input("function"==typeof e?e.apply(this,n):e,i.extent),o=S(this,n).beforestart();(0,s.G)(this),i.selection=null===u?null:u,I.call(this),o.start(r).brush(r).end(r)})},G.clear=function(t,n){G.move(t,null,n)},B.prototype={beforestart:function(){return 1==++this.active&&(this.state.emitter=this,this.starting=!0),this},start:function(t,n){return this.starting?(this.starting=!1,this.emit("start",t,n)):this.emit("brush",t),this},brush:function(t,n){return this.emit("brush",t,n),this},end:function(t,n){return 0==--this.active&&(delete this.state.emitter,this.emit("end",t,n)),this},emit:function(n,e,r){var i=(0,o.A)(this.that).datum();j.call(n,this.that,new h(n,{sourceEvent:e,target:G,selection:t.output(this.state.selection),mode:r,dispatch:j}),i)}},G.extent=function(t){return arguments.length?(e="function"==typeof t?t:l(w(t)),G):e},G.filter=function(t){return arguments.length?(_="function"==typeof t?t:l(!!t),G):_},G.touchable=function(t){return arguments.length?(C="function"==typeof t?t:l(!!t),G):C},G.handleSize=function(t){return arguments.length?(D=+t,G):D},G.keyModifiers=function(t){return arguments.length?(V=!!t,G):V},G.on=function(){var t=j.on.apply(j,arguments);return t===j?G:t},G}(b)}},98649:(t,n,e)=>{e.d(n,{A:()=>a});var r=e(98929),i=e(32353);function u(t){return t.index}function o(t,n){var e=t.get(n);if(!e)throw Error("node not found: "+n);return e}function a(t){var n,e,a,s,l,h,c=u,f=function(t){return 1/Math.min(s[t.source.index],s[t.target.index])},y=(0,r.A)(30),v=1;function d(r){for(var u=0,o=t.length;u<v;++u)for(var a,s,c,f,y,d,x,p=0;p<o;++p)s=(a=t[p]).source,d=((d=Math.sqrt((f=(c=a.target).x+c.vx-s.x-s.vx||(0,i.A)(h))*f+(y=c.y+c.vy-s.y-s.vy||(0,i.A)(h))*y))-e[p])/d*r*n[p],f*=d,y*=d,c.vx-=f*(x=l[p]),c.vy-=y*x,s.vx+=f*(x=1-x),s.vy+=y*x}function x(){if(a){var r,i,u=a.length,h=t.length,f=new Map(a.map((t,n)=>[c(t,n,a),t]));for(r=0,s=Array(u);r<h;++r)(i=t[r]).index=r,"object"!=typeof i.source&&(i.source=o(f,i.source)),"object"!=typeof i.target&&(i.target=o(f,i.target)),s[i.source.index]=(s[i.source.index]||0)+1,s[i.target.index]=(s[i.target.index]||0)+1;for(r=0,l=Array(h);r<h;++r)i=t[r],l[r]=s[i.source.index]/(s[i.source.index]+s[i.target.index]);n=Array(h),p(),e=Array(h),g()}}function p(){if(a)for(var e=0,r=t.length;e<r;++e)n[e]=+f(t[e],e,t)}function g(){if(a)for(var n=0,r=t.length;n<r;++n)e[n]=+y(t[n],n,t)}return null==t&&(t=[]),d.initialize=function(t,n){a=t,h=n,x()},d.links=function(n){return arguments.length?(t=n,x(),d):t},d.id=function(t){return arguments.length?(c=t,d):c},d.iterations=function(t){return arguments.length?(v=+t,d):v},d.strength=function(t){return arguments.length?(f="function"==typeof t?t:(0,r.A)(+t),p(),d):f},d.distance=function(t){return arguments.length?(y="function"==typeof t?t:(0,r.A)(+t),g(),d):y},d}},98929:(t,n,e)=>{e.d(n,{A:()=>r});function r(t){return function(){return t}}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1883],{31883:(e,t,r)=>{function a(e,t){let r=Error(t);return r.code=e,r}async function n(e){if(!e.type.startsWith("video/"))throw a("unsupported","not a video file: ".concat(e.type||"(unknown)"));let t=URL.createObjectURL(e),r=document.createElement("video");r.src=t,r.muted=!0,r.preload="auto",r.playsInline=!0;try{var n;await new Promise((e,t)=>{r.addEventListener("error",()=>t(a("decode","video decode error")),{once:!0}),r.addEventListener("loadedmetadata",()=>e(),{once:!0})});let t=(n=r.duration,!Number.isFinite(n)||n<=0?0:n<2?Math.max(.05,.1*n):1);await new Promise((e,n)=>{r.addEventListener("error",()=>n(a("seek","video seek error")),{once:!0}),r.addEventListener("seeked",()=>e(),{once:!0});try{r.currentTime=t}catch(e){n(a("seek",e instanceof Error?e.message:String(e)))}});let o=r.videoWidth,i=r.videoHeight;if(0===o||0===i)throw a("no-frame","video has zero dimensions");let d=document.createElement("canvas");d.width=o,d.height=i;let c=d.getContext("2d");if(!c)throw a("decode","canvas 2d context unavailable");return c.drawImage(r,0,0,o,i),{frameDataUrl:d.toDataURL("image/png"),durationSec:Number.isFinite(r.duration)?r.duration:0,widthPx:o,heightPx:i,mimeType:e.type}}finally{URL.revokeObjectURL(t),r.removeAttribute("src");try{r.load()}catch(e){}}}r.d(t,{extractKeyFrame:()=>n})}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1947],{13179:(e,t,r)=>{r.d(t,{MJ:()=>d,Tx:()=>i,an:()=>a,ax:()=>s,ub:()=>l});var n=r(82003);let i={tabs:[],activeId:null,order:[],frozenIds:[]};function a(e,t){switch(t.type){case"addTab":{var r;let i=t.tab,a=null==(r=t.activate)||r;if((0,n.k)(i.kind)){let t=e.tabs.find(e=>e.kind===i.kind);if(t)return a?{...e,activeId:t.id}:e}if(e.tabs.some(e=>e.id===i.id))return a?{...e,activeId:i.id}:e;let d=[...e.tabs,i],s=[...e.order,i.id];return{...e,tabs:d,order:s,activeId:a?i.id:e.activeId}}case"closeTab":{if(0>e.tabs.findIndex(e=>e.id===t.id))return e;let r=e.tabs.filter(e=>e.id!==t.id),n=e.order.filter(e=>e!==t.id),i=e.frozenIds.filter(e=>e!==t.id),a=e.activeId;if(e.activeId===t.id)if(0===n.length)a=null;else{let r=Math.min(Math.max(e.order.indexOf(t.id)-1,0),n.length-1);a=n[r]}return{...e,tabs:r,order:n,frozenIds:i,activeId:a}}case"activateTab":{if(!e.tabs.some(e=>e.id===t.id)||e.activeId===t.id)return e;let r=e.frozenIds.filter(e=>e!==t.id);return{...e,activeId:t.id,frozenIds:r}}case"reorderTab":{if(!e.tabs.some(e=>e.id===t.id))return e;let r=e.order.indexOf(t.id);if(r<0)return e;let n=Math.max(0,Math.min(t.toIndex,e.order.length-1));if(n===r)return e;let i=[...e.order];return i.splice(r,1),i.splice(n,0,t.id),{...e,order:i}}case"updateTab":{let r=e.tabs.findIndex(e=>e.id===t.id);if(r<0)return e;let n=e.tabs[r],i={};if("chat"===n.kind&&("sessionId"in t.patch&&"string"==typeof t.patch.sessionId&&(i.sessionId=t.patch.sessionId),"title"in t.patch&&(i.title=t.patch.title)),0===Object.keys(i).length)return e;let a={...n,...i},d=[...e.tabs];return d[r]=a,{...e,tabs:d}}case"freezeTab":if(!e.tabs.some(e=>e.id===t.id)||e.activeId===t.id||e.frozenIds.includes(t.id))return e;return{...e,frozenIds:[...e.frozenIds,t.id]};case"unfreezeTab":if(!e.frozenIds.includes(t.id))return e;return{...e,frozenIds:e.frozenIds.filter(e=>e!==t.id)};case"replace":return t.state}}function d(e){var t;return{id:e.id,kind:"chat",sessionId:e.sessionId,...void 0!==e.title?{title:e.title}:{},createdAt:null!=(t=e.createdAt)?t:Date.now()}}function s(e){var t;return{id:e.id,kind:e.kind,createdAt:null!=(t=e.createdAt)?t:Date.now()}}function l(e){let t=new Map(e.tabs.map(e=>[e.id,e])),r=[];for(let n of e.order){let e=t.get(n);e&&r.push(e)}return r}},21947:(e,t,r)=>{r.d(t,{$M:()=>p,hA:()=>h,tg:()=>v});var n=r(35563),i=r(19707),a=r(13179);let d="elanous.pwa.workspace",s=new Set(["chat","term","intake","tasks","workflows","control","settings"]);function l(e){return!!e&&"object"==typeof e&&"string"==typeof e.id&&0!==e.id.length&&"string"==typeof e.kind&&!!s.has(e.kind)&&"number"==typeof e.createdAt&&("chat"!==e.kind||"string"==typeof e.sessionId&&0!==e.sessionId.length&&(void 0===e.title||"string"==typeof e.title))&&!0}var u=r(82003),c=r(87329);let o={maxAlive:8},f={maxAlive:5},b=(0,i.createContext)(null);function p(e){let{children:t}=e,[r,s]=(0,i.useReducer)(a.an,a.Tx,e=>e),[p,h]=(0,i.useState)(null),v=(0,i.useRef)(!1);(0,i.useEffect)(()=>{if(v.current)return;v.current=!0;let e=function(){var e;let t,r=null;try{r=window.localStorage.getItem(d)}catch(e){return a.Tx}if(!r)return a.Tx;try{t=JSON.parse(r)}catch(e){return a.Tx}if(!t||"object"!=typeof t)return a.Tx;let n=t;return 1!==n.version?a.Tx:(e=n.state)&&"object"==typeof e&&Array.isArray(e.tabs)&&e.tabs.every(l)&&Array.isArray(e.order)&&e.order.every(e=>"string"==typeof e)&&Array.isArray(e.frozenIds)&&e.frozenIds.every(e=>"string"==typeof e)&&(null===e.activeId||"string"==typeof e.activeId)&&1?function(e){let t=new Set(e.tabs.map(e=>e.id)),r=e.order.filter(e=>t.has(e));for(let t of e.tabs)r.includes(t.id)||r.push(t.id);let n=e.frozenIds.filter(e=>t.has(e)),i=e.activeId;if(null!==i&&!t.has(i)){var a;i=null!=(a=r[0])?a:null}return null===i&&r.length>0&&(i=r[0]),{tabs:e.tabs,order:r,frozenIds:n,activeId:i}}(n.state):a.Tx}();(e.tabs.length>0||null!==e.activeId)&&s({type:"replace",state:e})},[]),(0,i.useEffect)(()=>{if(v.current)try{window.localStorage.setItem(d,JSON.stringify({version:1,state:r}))}catch(e){}},[r]);let I=(0,i.useRef)(new Map);(0,i.useEffect)(()=>{r.activeId&&I.current.set(r.activeId,Date.now())},[r.activeId]);let[y,k]=(0,i.useState)(o);(0,i.useEffect)(()=>{let e=window.matchMedia("(min-width: 768px)"),t=()=>k(e.matches?o:f);return t(),e.addEventListener("change",t),()=>e.removeEventListener("change",t)},[]),(0,i.useEffect)(()=>{if(!v.current)return;let e=function(e,t,r){let n=new Set(e.frozenIds),i=e.tabs.map(e=>e.id).filter(e=>!n.has(e));if(i.length<=t.maxAlive)return{freezeCandidates:[]};let a=new Map(e.tabs.map(e=>[e.id,e])),d=i.map(e=>{var t,n;let i=a.get(e),d=null!=(n=null!=(t=r.get(e))?t:null==i?void 0:i.createdAt)?n:0;return{id:e,ts:d}});d.sort((e,t)=>e.ts-t.ts);let s=i.length-t.maxAlive,l=[];for(let{id:t}of d){if(l.length>=s)break;t!==e.activeId&&l.push(t)}return{freezeCandidates:l}}(r,y,I.current);if(0!==e.freezeCandidates.length)for(let t of e.freezeCandidates)s({type:"freezeTab",id:t})},[r,y]);let g=(0,i.useCallback)(e=>{let t,r="undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"t-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10));if("chat"===e.kind){var n;let i=null!=(n=e.sessionId)?n:(0,c.f6)();t=(0,a.MJ)({id:r,sessionId:i,...void 0!==e.title?{title:e.title}:{}})}else t=(0,a.ax)({id:r,kind:e.kind});return s({type:"addTab",tab:t}),r},[]),m=(0,i.useCallback)(e=>{s({type:"closeTab",id:e}),I.current.delete(e)},[]),x=(0,i.useCallback)(e=>{s({type:"activateTab",id:e})},[]),w=(0,i.useCallback)((e,t)=>{s({type:"reorderTab",id:e,toIndex:t})},[]),T=(0,i.useCallback)((e,t)=>{s({type:"updateTab",id:e,patch:t})},[]),z=(0,i.useCallback)(e=>{if("chat"===e)return null;if((0,u.k)(e)){let t=r.tabs.find(t=>t.kind===e);if(t)return s({type:"activateTab",id:t.id}),t.id}return g({kind:e})},[r.tabs,g]),A=(0,i.useCallback)(e=>{h(e)},[]),C=(0,i.useCallback)(()=>{h(null)},[]),M=(0,i.useMemo)(()=>({state:r,addTab:g,closeTab:m,activateTab:x,reorderTab:w,updateChatTab:T,activateOrAdd:z,pickerMode:p,openPicker:A,closePicker:C}),[r,g,m,x,w,T,z,p,A,C]);return(0,n.jsx)(b.Provider,{value:M,children:t})}function h(){let e=(0,i.useContext)(b);if(!e)throw Error("useWorkspace must be used inside <WorkspaceProvider>");return e}function v(){return(0,i.useContext)(b)}},82003:(e,t,r)=>{r.d(t,{k:()=>n});function n(e){return"chat"!==e}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2808],{2219:(e,t,n)=>{n.d(t,{PT:()=>v,VN:()=>p,lZ:()=>u,v6:()=>o});var r=n(59011);let l={};function o(e,t,n,r,l){if(!n&&!r&&!l&&!e)return a(t);let o=a(e);return t&&(o=i(o,t)),n&&(o=i(o,n)),r&&(o=i(o,r)),l&&(o=i(o,l)),o}function u(e){if(0===e.length)return l;if(1===e.length)return a(e[0]);let t=a(e[0]);for(let n=1;n<e.length;n+=1)t=i(t,e[n]);return t}function a(e){return f(e)?{...s(e,l)}:function(e){let t={...e};for(let e in t){let n=t[e];c(e,n)&&(t[e]=d(n))}return t}(e)}function i(e,t){return f(t)?s(t,e):function(e,t){if(!t)return e;for(let n in t){let l=t[n];switch(n){case"style":e[n]=(0,r.r)(e.style,l);break;case"className":e[n]=p(e.className,l);break;default:c(n,l)?e[n]=function(e,t){return t?e?(...n)=>{let r=n[0];if(y(r)){v(r);let l=t(...n);return r.baseUIHandlerPrevented||e?.(...n),l}let l=t(...n);return e?.(...n),l}:d(t):e}(e[n],l):e[n]=l}}return e}(e,t)}function c(e,t){let n=e.charCodeAt(0),r=e.charCodeAt(1),l=e.charCodeAt(2);return 111===n&&110===r&&l>=65&&l<=90&&("function"==typeof t||void 0===t)}function f(e){return"function"==typeof e}function s(e,t){return f(e)?e(t):e??l}function d(e){return e?(...t)=>{let n=t[0];return y(n)&&v(n),e(...t)}:e}function v(e){return e.preventBaseUIHandler=()=>{e.baseUIHandlerPrevented=!0},e}function p(e,t){return t?e?t+" "+e:t:e}function y(e){return null!=e&&"object"==typeof e&&"nativeEvent"in e}},12020:(e,t,n)=>{n.d(t,{g:()=>l});var r=n(19707);let l="undefined"!=typeof document?r.useLayoutEffect:()=>{}},13773:(e,t,n)=>{n.d(t,{F:()=>u});var r=n(36757);let l=e=>"boolean"==typeof e?`${e}`:0===e?"0":e,o=r.$,u=(e,t)=>n=>{var r;if((null==t?void 0:t.variants)==null)return o(e,null==n?void 0:n.class,null==n?void 0:n.className);let{variants:u,defaultVariants:a}=t,i=Object.keys(u).map(e=>{let t=null==n?void 0:n[e],r=null==a?void 0:a[e];if(null===t)return null;let o=l(t)||l(r);return u[e][o]}),c=n&&Object.entries(n).reduce((e,t)=>{let[n,r]=t;return void 0===r||(e[n]=r),e},{});return o(e,i,null==t||null==(r=t.compoundVariants)?void 0:r.reduce((e,t)=>{let{class:n,className:r,...l}=t;return Object.entries(l).every(e=>{let[t,n]=e;return Array.isArray(n)?n.includes({...a,...c}[t]):({...a,...c})[t]===n})?[...e,n,r]:e},[]),null==n?void 0:n.class,null==n?void 0:n.className)}},17269:(e,t,n)=>{n.d(t,{j:()=>o});var r=n(19707);let l={};function o(e,t){let n=r.useRef(l);return n.current===l&&(n.current=e(t)),n}},34799:(e,t,n)=>{n.d(t,{o:()=>s});var r=n(52845),l=n(19707),o=n(83055),u=n(59858);function a(e){if(!l.isValidElement(e))return null;let t=e.props;return((0,u._)(19)?t?.ref:e.ref)??null}var i=n(59011),c=n(59644),f=n(2219);function s(e,t,n={}){let u=t.render,v=function(e,t={}){var n;let{className:r,style:l,render:u}=e,{state:s=c.t0,ref:d,props:v,stateAttributesMapping:p,enabled:y=!0}=t,b=y?"function"==typeof r?r(s):r:void 0,m=y?"function"==typeof l?l(s):l:void 0,h=y?function(e,t){let n={};for(let r in e){let l=e[r];if(t?.hasOwnProperty(r)){let e=t[r](l);null!=e&&Object.assign(n,e);continue}!0===l?n[`data-${r.toLowerCase()}`]="":l&&(n[`data-${r.toLowerCase()}`]=l.toString())}return n}(s,p):c.t0,g=y&&v?Array.isArray(n=v)?(0,f.lZ)(n):(0,f.v6)(void 0,n):void 0,k=y?(0,i.r)(h,g)??{}:c.t0;return("undefined"!=typeof document&&(y?Array.isArray(d)?k.ref=(0,o.U)([k.ref,a(u),...d]):k.ref=(0,o.a)(k.ref,a(u),d):(0,o.a)(null,null)),y)?(void 0!==b&&(k.className=(0,f.VN)(k.className,b)),void 0!==m&&(k.style=(0,i.r)(k.style,m)),k):c.t0}(t,n);return!1===n.enabled?null:function(e,t,n,o){if(t){if("function"==typeof t)return t(n,o);let e=(0,f.v6)(n,t.props);e.ref=n.ref;let r=t;return r?.$$typeof===d&&(r=l.Children.toArray(t)[0]),l.cloneElement(r,e)}if(e&&"string"==typeof e){var u,a;return u=e,a=n,"button"===u?(0,l.createElement)("button",{type:"button",...a,key:a.key}):"img"===u?(0,l.createElement)("img",{alt:"",...a,key:a.key}):l.createElement(u,a)}throw Error((0,r.A)(8))}(e,u,v,n.state??c.t0)}let d=Symbol.for("react.lazy")},52845:(e,t,n)=>{n.d(t,{A:()=>r});let r=function(e,...t){let n=new URL("https://base-ui.com/production-error");return n.searchParams.set("code",e.toString()),t.forEach(e=>n.searchParams.append("args[]",e)),`Base UI error #${e}; visit ${n} for the full message.`}},59011:(e,t,n)=>{n.d(t,{r:()=>r});function r(e,t){return e&&!t?e:!e&&t?t:e||t?{...e,...t}:void 0}},59644:(e,t,n)=>{function r(){}n.d(t,{t0:()=>l,tE:()=>r}),Object.freeze([]);let l=Object.freeze({})},59858:(e,t,n)=>{n.d(t,{_:()=>l});let r=parseInt(n(19707).version,10);function l(e){return r>=e}},82198:(e,t,n)=>{n.d(t,{$:()=>u});var r=n(19707),l=n(84111),o=n(34799);let u=r.forwardRef(function(e,t){let{render:n,className:r,disabled:u=!1,focusableWhenDisabled:a=!1,nativeButton:i=!0,style:c,...f}=e,{getButtonProps:s,buttonRef:d}=(0,l.s)({disabled:u,focusableWhenDisabled:a,native:i});return(0,o.o)("button",e,{state:{disabled:u},ref:[t,d],props:[f,s]})})},83055:(e,t,n)=>{n.d(t,{U:()=>o,a:()=>l});var r=n(17269);function l(e,t,n,l){var o,i,c,f,s;let d=(0,r.j)(u).current;return o=d,i=e,c=t,f=n,s=l,(o.refs[0]!==i||o.refs[1]!==c||o.refs[2]!==f||o.refs[3]!==s)&&a(d,[e,t,n,l]),d.callback}function o(e){var t,n;let l=(0,r.j)(u).current;return t=l,n=e,(t.refs.length!==n.length||t.refs.some((e,t)=>e!==n[t]))&&a(l,e),l.callback}function u(){return{callback:null,cleanup:null,refs:[]}}function a(e,t){if(e.refs=t,t.every(e=>null==e)){e.callback=null;return}e.callback=n=>{if(e.cleanup&&(e.cleanup(),e.cleanup=null),null!=n){let r=Array(t.length).fill(null);for(let e=0;e<t.length;e+=1){let l=t[e];if(null!=l)switch(typeof l){case"function":{let t=l(n);"function"==typeof t&&(r[e]=t);break}case"object":l.current=n}}e.cleanup=()=>{for(let e=0;e<t.length;e+=1){let n=t[e];if(null!=n)switch(typeof n){case"function":{let t=r[e];"function"==typeof t?t():n(null);break}case"object":n.current=null}}}}}}},84111:(e,t,n)=>{n.d(t,{s:()=>f});var r=n(19707),l=n(89794),o=n(97066),u=n(12020),a=n(2219),i=n(52845);let c=r.createContext(void 0);function f(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{disabled:t=!1,focusableWhenDisabled:n,tabIndex:l=0,native:f=!0,composite:d}=e,v=r.useRef(null),p=function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=r.useContext(c);if(void 0===t&&!e)throw Error((0,i.A)(16));return t}(!0),y=null!=d?d:void 0!==p,{props:b}=function(e){let{focusableWhenDisabled:t,disabled:n,composite:l=!1,tabIndex:o=0,isNativeButton:u}=e,a=l&&!1!==t,i=l&&!1===t;return{props:r.useMemo(()=>{let e={onKeyDown(e){n&&t&&"Tab"!==e.key&&e.preventDefault()}};return l||(e.tabIndex=o,!u&&n&&(e.tabIndex=t?o:-1)),(u&&(t||a)||!u&&n)&&(e["aria-disabled"]=n),u&&(!t||i)&&(e.disabled=n),e},[l,n,t,a,i,u,o])}}({focusableWhenDisabled:n,disabled:t,composite:y,tabIndex:l,isNativeButton:f}),m=r.useCallback(()=>{let e=v.current;s(e)&&y&&t&&void 0===b.disabled&&e.disabled&&(e.disabled=!1)},[t,b.disabled,y]);return(0,u.g)(m,[m]),{getButtonProps:r.useCallback(function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{onClick:n,onMouseDown:r,onKeyUp:l,onKeyDown:o,onPointerDown:u,...i}=e,c=f?"button":void 0;return(0,a.v6)({type:c,onClick(e){if(t)return void e.preventDefault();null==n||n(e)},onMouseDown(e){t||null==r||r(e)},onKeyDown(e){var r;if(t||((0,a.PT)(e),null==o||o(e),e.baseUIHandlerPrevented))return;let l=e.target===e.currentTarget,u=e.currentTarget,i=s(u),c=!f&&!!((null==(r=u)?void 0:r.tagName)==="A"&&(null==r?void 0:r.href)),d=l&&(f?i:!c),v="Enter"===e.key,p=" "===e.key,b=u.getAttribute("role"),m=(null==b?void 0:b.startsWith("menuitem"))||"option"===b||"gridcell"===b;if(l&&y&&p){if(e.defaultPrevented&&m)return;e.preventDefault(),c||f&&i?(u.click(),e.preventBaseUIHandler()):d&&(null==n||n(e),e.preventBaseUIHandler());return}d&&(!f&&(p||v)&&e.preventDefault(),!f&&v&&(null==n||n(e)))},onKeyUp(e){if(!t){if((0,a.PT)(e),null==l||l(e),e.target===e.currentTarget&&f&&y&&s(e.currentTarget)&&" "===e.key)return void e.preventDefault();!e.baseUIHandlerPrevented&&(e.target!==e.currentTarget||f||y||" "!==e.key||null==n||n(e))}},onPointerDown(e){if(t)return void e.preventDefault();null==u||u(e)}},f?void 0:{role:"button"},b,i)},[t,b,y,f]),buttonRef:(0,o.K)(e=>{v.current=e,m()})}}function s(e){return(0,l.sb)(e)&&"BUTTON"===e.tagName}},89794:(e,t,n)=>{let r;function l(){return"undefined"!=typeof window}function o(e){return a(e)?(e.nodeName||"").toLowerCase():"#document"}function u(e){var t;return(null==e||null==(t=e.ownerDocument)?void 0:t.defaultView)||window}function a(e){return!!l()&&(e instanceof Node||e instanceof u(e).Node)}function i(e){return!!l()&&(e instanceof Element||e instanceof u(e).Element)}function c(e){return!!l()&&(e instanceof HTMLElement||e instanceof u(e).HTMLElement)}function f(e){return!!l()&&"undefined"!=typeof ShadowRoot&&(e instanceof ShadowRoot||e instanceof u(e).ShadowRoot)}function s(e){let{overflow:t,overflowX:n,overflowY:r,display:l}=p(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&"inline"!==l&&"contents"!==l}function d(){return null==r&&(r="undefined"!=typeof CSS&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),r}function v(e){return/^(html|body|#document)$/.test(o(e))}function p(e){return u(e).getComputedStyle(e)}function y(e){var t;if("html"===o(e))return e;let n=e.assignedSlot||e.parentNode||f(e)&&e.host||(null==(t=(a(e)?e.ownerDocument:e.document)||window.document)?void 0:t.documentElement);return f(n)?n.host:n}n.d(t,{$4:()=>y,L9:()=>p,Ll:()=>a,Ng:()=>f,Tc:()=>d,ZU:()=>s,eu:()=>v,mq:()=>o,sb:()=>c,vq:()=>i,zk:()=>u})},97066:(e,t,n)=>{n.d(t,{K:()=>i});var r,l=n(19707),o=n(17269);let u=(r||(r=n.t(l,2)))["useInsertionEffect".concat(Math.random().toFixed(1)).slice(0,-3)],a=u&&u!==l.useLayoutEffect?u:e=>e();function i(e){let t=(0,o.j)(c).current;return t.next=e,a(t.effect),t.trampoline}function c(){let e={next:void 0,callback:f,trampoline:function(){for(var t,n=arguments.length,r=Array(n),l=0;l<n;l++)r[l]=arguments[l];return null==(t=e.callback)?void 0:t.call(e,...r)},effect:()=>{e.callback=e.next}};return e}function f(){}}}]);
|