elanous 0.2.9 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/Y4zKzL62sakG5momz3SoQ/_buildManifest.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1159-0c5ef8bc21cb6afb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1394-556de6d71bbdb0fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1452.93700483b9d4fc61.js +9 -0
- package/apps/pwa/out/_next/static/chunks/{6062-73e68343a9814f6a.js → 1829-b453a1b22d3999bb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2176-c379e3ebce874151.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2310-7a59f043f6db207e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2426.8c6ee0c668d53def.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2548-6e316138d347cefe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3170-7ec60a56fa0e4728.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3278-ae6ef084769f6195.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3454-988a53dac60a1763.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3638-aa80b4641ea439db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3735-fe3402553ac1c9c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3869-a39d1d9921e10d43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/390.c373e31b3b9d0c41.js +5 -0
- package/apps/pwa/out/_next/static/chunks/3992-2e522a8ac5f2afde.js +25 -0
- package/apps/pwa/out/_next/static/chunks/4215-c9d91dd644ec1719.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4508-5d0161d1e724d735.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4685-c3c1c625b71accd1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4733-623a79345b171e1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4883.3bd969ea1d3aaaff.js +2 -0
- package/apps/pwa/out/_next/static/chunks/507-5acd98bd6dab2d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5445-745eb795c5963d79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5532.6899a12958a89b72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5845-e6c003ce8d5fd36a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5978-b27004c677119115.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8046cadf-211ca3c0e00f2b72.js → 5cd7e3a9-404fd6b8d0ecd44c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6048-4c5c33579bc4ef78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6303-422dbf0f67c72aac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6751-bb3595948b2e311b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7274-19b7279f18b47ab3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4323.c5dfb6f503304775.js → 7334.a6679d9168f37aa8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7551-a0e0707b79164ddd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7777-79f845045aa1ed86.js +1 -0
- package/apps/pwa/out/_next/static/chunks/79f8be9e-957d68913b590b08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8025-cc24ee5d8f2fb6f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8039-df92e08fede5de8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8206-c6684dcde12be721.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8421-1c4acfb1395a0edf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8605-ea5bee9dfae512c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8725.bf46bb1395dd0fa2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8734-252d511cd276c0dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8834-ca1cb09c1cb1a6bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2415.ed6428ff334c7ce2.js → 9269.d2a4795bc6812717.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9538-2816b90923606459.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9656-c1540088f5859c80.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9906-482c6619b3fdda20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d16993889b125c42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1dcdc58fc2de2454.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-6a061bd97f0b9398.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-cb95a7432c9ee744.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-f972fc1c00a62e88.js → page-b12b6d2f8d2d1aea.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-b9efe868bfd36255.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-7c97dcdfe2e37a60.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-8fd36984f549270a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-5721537ca8a3598c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-b654240a572e4c48.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-b9750abc897508c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-4cd1de371f8ad048.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d99f89657828421c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d16993889b125c42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-50cb2a0eb15e6c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c8b1ccda6ba7ae98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-d6b1d156fb95e74b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-2a9932ddb62d76bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9688f5b4f1ff950f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-6b15dd6456c5df09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-adfbd2ba9598e59a.js → page-35414e0a007b4082.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-e7a529e0507ac86c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-e001823c35c9dd67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-371423d1a573d64b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4b764b125339ac17.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cdf8e4b01067bcf1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a24072b35470157.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-94c82eb0ae5abb32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-0be8d4b2ced75ba0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d37cb0d52f9b6bd5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-686da0df9bf23e5c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-4dc614f3ce043e63.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-53f80edc6b8dc07c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-d02c782fc792e2af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d16993889b125c42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-239c17b911b84e72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-dc6a79fb003f746c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-0fffb84cafdc9da6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-1218753c82d585f6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-4b5935e67531efb5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-3285bc87caf1eaa5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-ad553b0e06505ecd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-fca096e3e860306f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ebfa78f0d9885c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-3dc5f21f7e39622d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-c6da2b468454532d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-93bc70e36f595414.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2ea96958-e8c7e112de50b067.js → f48170cc-d05d28bf87a43bf4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-172630e6aa5e2d7f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f0fe2d7477845181.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-fc98ac70b44eccb0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-5bd7f10271f72413.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d0d85ea05fef9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-9e4d02d567b98240.js +1 -0
- package/apps/pwa/out/_next/static/css/543f56bcb1f79fca.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -0
- package/apps/pwa/out/inside/index.txt +31 -0
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -0
- package/apps/pwa/out/ops/seats/index.txt +30 -0
- package/apps/pwa/out/outputs/index.html +1 -0
- package/apps/pwa/out/outputs/index.txt +30 -0
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -24
- package/apps/pwa/out/today/index.html +1 -0
- package/apps/pwa/out/today/index.txt +33 -0
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -24
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/graphs/drafts/draft-cleanup.yaml +19 -0
- package/graphs/drafts/recipes.yaml +23 -0
- package/graphs/field/field-feed.yaml +2 -0
- package/graphs/implement-loop.yaml +1 -1
- package/graphs/intake/intake-daily.yaml +2 -1
- package/graphs/ops/recipes.yaml +3 -0
- package/graphs/ops/secret-exposure.yaml +24 -0
- package/graphs/release/recipes.yaml +3 -0
- package/graphs/release/release-loop.yaml +4 -1
- package/graphs/video/explainer-line.yaml +2 -2
- package/package.json +2 -1
- package/plugins/card-followup/graphs/run-step.ts +48 -13
- package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
- package/plugins/doc-draft/graphs/run-step.ts +13 -6
- package/plugins/elanous-hwp/README.md +25 -0
- package/plugins/elanous-hwp/cli.ts +22 -0
- package/plugins/elanous-hwp/converter.ts +237 -0
- package/plugins/elanous-hwp/fixtures/fixed-controls.hwpx +0 -0
- package/plugins/elanous-hwp/fixtures/fixed-table-controls.hwpx +0 -0
- package/plugins/elanous-hwp/fixtures/fixed.hwpx +0 -0
- package/plugins/elanous-hwp/plugin.json +16 -0
- package/plugins/elanous-hwp/plugin.ts +40 -0
- package/scripts/ci-public-export-leak-gate.ts +75 -14
- package/scripts/ci-public-leak-gate.ts +44 -9
- package/scripts/ci-pwa-build-gate.ts +160 -0
- package/scripts/context-hooks/claude-stop.sh +4 -0
- package/scripts/context-hooks/emit.ts +24 -0
- package/scripts/context-hooks/post-tool-use.sh +4 -0
- package/scripts/coord-channel-watch.sh +54 -8
- package/scripts/coord-digest.ts +199 -0
- package/scripts/coord-post.sh +60 -3
- package/scripts/coord-requests-bridge.ts +143 -0
- package/scripts/field-feed/lib.ts +4 -0
- package/scripts/fleet/node-setup.sh +20 -3
- package/scripts/homebrew-formula-bump.ts +69 -0
- package/scripts/install.ps1 +68 -9
- package/scripts/install.sh +39 -12
- package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
- package/scripts/lib/tui-regress-checks.ts +146 -0
- package/scripts/marketing/measure-site-numbers.ts +169 -0
- package/scripts/measure-gate-shards.ts +309 -0
- package/scripts/memory-lifecycle-cycle.ts +2 -2
- package/scripts/mission-request-judge.ts +31 -1
- package/scripts/morning-report.ts +2 -2
- package/scripts/opportunity-scan.ts +1 -1
- package/scripts/ops-now-probe.ts +327 -0
- package/scripts/publish-internal-dist.ts +11 -1
- package/scripts/release-loop/auto-approve-node.ts +21 -4
- package/scripts/release-loop/cut-branch.ts +84 -0
- package/scripts/release-loop/cutoff.ts +19 -8
- package/scripts/release-loop/gate-node.ts +14 -13
- package/scripts/release-loop/mac-smoke-node.ts +229 -0
- package/scripts/release-loop/node-verdict.ts +3 -3
- package/scripts/release-loop/ops-upgrade-node.ts +72 -16
- package/scripts/release-loop/release-readiness.ts +9 -0
- package/scripts/release-loop/tui-node-checks.ts +42 -0
- package/scripts/release-loop/tui-sim-node.ts +32 -8
- package/scripts/release-loop/unattended-release.ts +5 -3
- package/scripts/release-loop/version-node.ts +112 -13
- package/scripts/repo-watch-cycle.ts +1 -1
- package/scripts/retro-cycle.ts +2 -2
- package/scripts/schedule-health-report.ts +1 -1
- package/scripts/signal-digest-cycle.ts +2 -7
- package/scripts/signal-digest-photo.ts +11 -0
- package/scripts/storyboard/storyboard.ts +5 -161
- package/scripts/tech1-public-measure.ts +94 -0
- package/scripts/test-diet/lib.ts +30 -1
- package/scripts/test-diet/node.ts +83 -8
- package/scripts/test-timeout-audit.ts +114 -0
- package/scripts/tree-sync-alert.ts +1 -1
- package/scripts/tui-regress.ts +71 -0
- package/scripts/ux/demo-rehearsal.ts +243 -0
- package/scripts/ux/lib/rehearsal-verdict.ts +73 -0
- package/scripts/waitlist-daily-digest.ts +1 -1
- package/skills/diagram-master/SKILL.md +366 -0
- package/skills/diagram-master/references/engines/excalidraw/color-palette.md +67 -0
- package/skills/diagram-master/references/engines/excalidraw/element-templates.md +182 -0
- package/skills/diagram-master/references/engines/excalidraw/json-schema.md +71 -0
- package/skills/diagram-master/references/engines/excalidraw/render_excalidraw.py +189 -0
- package/skills/diagram-master/references/engines/excalidraw/render_template.html +57 -0
- package/skills/diagram-master/references/engines/matplotlib/matplotlib-patterns.md +235 -0
- package/skills/diagram-master/references/engines/matplotlib/render_matplotlib.py +184 -0
- package/skills/diagram-master/references/engines/mermaid/domain-templates.md +435 -0
- package/skills/diagram-master/references/engines/mermaid/render_mermaid.py +116 -0
- package/skills/diagram-master/references/engines/mermaid/syntax-reference.md +2247 -0
- package/skills/diagram-master/references/engines/nanobannana/render_nanobannana2.py +168 -0
- package/skills/diagram-master/references/engines/svg/color-palette.md +188 -0
- package/skills/diagram-master/references/engines/svg/html-base-template.html +332 -0
- package/skills/diagram-master/references/engines/svg/interactivity-patterns.md +435 -0
- package/skills/diagram-master/references/engines/svg/render_interactive_svg.py +212 -0
- package/skills/diagram-master/references/engines/svg/svg-element-templates.md +349 -0
- package/skills/diagram-master/references/examples/README.md +69 -0
- package/skills/diagram-master/references/examples/ref_grid_architecture.png +0 -0
- package/skills/diagram-master/references/examples/ref_layered_flow.png +0 -0
- package/skills/diagram-master/references/pyproject.toml +16 -0
- package/skills/diagram-master/references/quality-checklist.md +33 -0
- package/skills/diagram-master/references/routing-guide.md +164 -0
- package/skills/diagram-master/references/uv.lock +1356 -0
- package/skills/explainer-video/SKILL.md +4 -0
- package/skills/explainer-video/engine/reel.mjs +18 -13
- package/skills/explainer-video/engine/reel.sh +24 -5
- package/skills/explainer-video/engine/stitch.mjs +145 -0
- package/skills/google-workspace/SKILL.md +33 -0
- package/skills/google-workspace/scripts/gws-safe.sh +177 -0
- package/skills/grill-me/SKILL.md +1 -1
- package/skills/lecture-note-digitizer/SKILL.md +926 -0
- package/skills/lecture-note-digitizer/references/convert_to_pdf.py +30 -0
- package/skills/lecture-note-digitizer/references/extract_slide_diagram.py +73 -0
- package/skills/lecture-note-digitizer/references/html-template.md +167 -0
- package/skills/lecture-note-digitizer/references/katex-style-guide.md +165 -0
- package/skills/omni-crawl/SKILL.md +21 -11
- package/skills/omni-crawl/scripts/main.ts +6 -6
- package/skills/omni-crawl/src/router.ts +3 -3
- package/skills/omni-digest/SKILL.md +17 -9
- package/skills/omni-digest/digest.md +2 -2
- package/skills/omni-digest/src/fetch.ts +30 -3
- package/skills/pitch-deck/SKILL.md +36 -0
- package/skills/pitch-deck/template.html +80 -0
- package/skills/youtube-master/SKILL.md +163 -0
- package/skills/youtube-master/package-lock.json +558 -0
- package/skills/youtube-master/package.json +13 -0
- package/skills/youtube-master/references/study-note-template.md +124 -0
- package/skills/youtube-master/scripts/main.ts +435 -0
- package/skills/youtube-master/scripts/transcribe-local.ts +24 -0
- package/skills/youtube-master/src/audio.ts +63 -0
- package/skills/youtube-master/src/domain-staging.ts +50 -0
- package/skills/youtube-master/src/env.ts +36 -0
- package/skills/youtube-master/src/obsidian.ts +155 -0
- package/skills/youtube-master/src/router.ts +110 -0
- package/skills/youtube-master/src/stt.ts +199 -0
- package/skills/youtube-master/src/study-note.ts +175 -0
- package/skills/youtube-master/src/summarize.ts +358 -0
- package/skills/youtube-master/src/transcript.ts +76 -0
- package/skills/youtube-master/src/types.ts +91 -0
- package/skills/youtube-master/src/util.ts +93 -0
- package/skills/youtube-master/src/youtube.ts +70 -0
- package/skills/youtube-master/tsconfig.json +13 -0
- package/src/acp/codex-approval-adapter.ts +9 -3
- package/src/acp/core-turn-bridge.ts +117 -18
- package/src/acp/fact-question.ts +11 -0
- package/src/acp/server.ts +53 -9
- package/src/acp/tool-approval.ts +126 -0
- package/src/acp/turn-runner.ts +36 -0
- package/src/agent/monad-agent-turn.ts +8 -0
- package/src/agent-mission/driver.ts +80 -10
- package/src/agent-mission/pty-decision.ts +71 -0
- package/src/agent-mission/review-loop.ts +30 -0
- package/src/ask-user-question/pending-questions.ts +25 -10
- package/src/ask-user-question/types.ts +9 -0
- package/src/auth/setup-link-tokens.ts +16 -5
- package/src/autopilot/build/integrity-gate.ts +12 -0
- package/src/autopilot/build/llm-conflict-merge.ts +16 -3
- package/src/autopilot/tool-registry.ts +2 -0
- package/src/boot/daemon-prompt-turn.ts +8 -0
- package/src/boot/daemon-runtime.ts +9 -3
- package/src/boot/daemon-tools/index.ts +8 -0
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/boot/daemon-tools/web-search.ts +4 -0
- package/src/card-followup/core.ts +109 -0
- package/src/chat/ctrl-c-in-input.ts +14 -0
- package/src/chat/index.ts +53 -0
- package/src/chat/pickers/state.ts +6 -2
- package/src/cli/agent-cli.ts +7 -0
- package/src/cli/decisions-cli.ts +25 -3
- package/src/cli/doctor-bundle-upload.ts +68 -0
- package/src/cli/doctor-cli.ts +38 -4
- package/src/cli/drive-input-jail.ts +101 -0
- package/src/cli/hooks-cli.ts +17 -3
- package/src/cli/make-cli.ts +43 -0
- package/src/cli/ops-cli.ts +20 -0
- package/src/cli/persona-cli.ts +90 -4
- package/src/cli/plugin-cli.ts +31 -22
- package/src/cli/pod-cli.ts +61 -2
- package/src/cli/pr-cli.ts +82 -17
- package/src/cli/pty-drive-cli.ts +41 -7
- package/src/cli/pty-drive-verdict.ts +40 -0
- package/src/cli/pwa-stop.ts +163 -13
- package/src/cli/pwa-test.ts +3 -0
- package/src/cli/release-cli.ts +80 -24
- package/src/cli/self-update.ts +14 -0
- package/src/cli/setup-cli.ts +43 -1
- package/src/cli/skills-cli.ts +17 -1
- package/src/cli/storyboard-cli.ts +37 -0
- package/src/cli/test-state-dir-flag.ts +11 -4
- package/src/connectors/linear.ts +146 -0
- package/src/context-bus/claude-hooks-install.ts +10 -0
- package/src/context-bus/context-now-surfaces.ts +48 -0
- package/src/context-bus/context-now.ts +104 -0
- package/src/context-bus/coord-events.ts +115 -0
- package/src/context-bus/external-events.ts +52 -0
- package/src/context-bus/long-term-memory.ts +108 -0
- package/src/dashboard/dashboard-boot-fixture.ts +23 -0
- package/src/dashboard/index.ts +63 -21
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +14 -1
- package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
- package/src/decisions/decision-cards.ts +58 -3
- package/src/decisions/decision-ledger.ts +85 -6
- package/src/decisions/decision-linear-projection.ts +157 -0
- package/src/decisions/web-push-decision-cards.ts +50 -0
- package/src/directive/interpretation-card.ts +36 -0
- package/src/discord/sprint21-runtime.ts +5 -1
- package/src/discord-self-message.ts +32 -0
- package/src/discord-slash-wire.ts +5 -1
- package/src/discord.ts +19 -2
- package/src/domains/coo-admin-tool.ts +62 -0
- package/src/domains/core-tools.ts +13 -4
- package/src/domains/elanous-card.ts +29 -0
- package/src/domains/ops-facts-tool.ts +76 -0
- package/src/domains/outbound-alert.ts +46 -13
- package/src/domains/release-tool.ts +168 -0
- package/src/domains/telegram-kind-route.ts +65 -9
- package/src/exec-requests/default-outputs.ts +25 -0
- package/src/exec-requests/planner.ts +106 -28
- package/src/exec-requests/runner.ts +123 -12
- package/src/exec-requests/store.ts +11 -2
- package/src/execution-loop/launch-gate.ts +100 -0
- package/src/field/field-media.ts +10 -7
- package/src/field/field-reel.ts +19 -5
- package/src/field-note/index.ts +201 -0
- package/src/field-note/transcribe.ts +248 -0
- package/src/git-fs/worktree.ts +45 -6
- package/src/graph-kinds/registry.ts +3 -3
- package/src/graph-runner/graph-approval-card.ts +113 -0
- package/src/graph-runner/graph-cli.ts +189 -4
- package/src/graph-runner/graph-grow-llm.ts +37 -0
- package/src/graph-runner/graph-grow.ts +47 -0
- package/src/graph-runner/graph-notify.ts +25 -3
- package/src/graph-runner/runner.ts +453 -35
- package/src/grok/agent-search.ts +8 -2
- package/src/guardian/secret-exposure-scan.ts +101 -0
- package/src/harness/browser-verify.ts +25 -2
- package/src/harness/harness-cli-command.ts +478 -42
- package/src/harness/harness-incidents-writer.fixture.ts +24 -0
- package/src/harness/harness-incidents.ts +129 -0
- package/src/harness/harness-pod-dispatch.ts +43 -23
- package/src/harness/harness-seams.ts +38 -4
- package/src/harness/harness-stop.ts +75 -6
- package/src/harness/launch-registry.ts +91 -0
- package/src/harness/process-garbage.ts +5 -3
- package/src/hitl/clarification-policy.ts +3 -1
- package/src/hooks/dispatch.ts +82 -0
- package/src/hooks/expose.ts +254 -0
- package/src/hooks/github-shadow.ts +108 -0
- package/src/hooks/providers.ts +71 -5
- package/src/hooks/queue.ts +1 -1
- package/src/hooks/receiver.ts +21 -20
- package/src/index.ts +206 -49
- package/src/intake-plane/author-goals.ts +37 -4
- package/src/intake-plane/categorize.ts +18 -46
- package/src/intake-plane/check.ts +3 -0
- package/src/intake-plane/discord-seat-work.ts +57 -2
- package/src/intake-plane/front-route-classifier.ts +33 -39
- package/src/intake-plane/persona-answer.ts +30 -0
- package/src/intake-plane/runtime-callables.ts +8 -1
- package/src/intake-plane/seat-doc-route.ts +170 -6
- package/src/intake-plane/telegram-seat-work.ts +80 -4
- package/src/intake-plane/telegram-work.ts +1 -0
- package/src/intake-plane/wish-folder.ts +67 -0
- package/src/intent-gate/gate.ts +30 -10
- package/src/live/detail-switch.ts +5 -0
- package/src/llm/difficulty.ts +57 -0
- package/src/llm/judge-layer.ts +101 -0
- package/src/llm/mission-router.ts +33 -19
- package/src/loops/contract/examples/cmo-seat.loop.yaml +51 -0
- package/src/loops/contract/examples/orchestrator.loop.yaml +57 -0
- package/src/loops/contract/examples/steward.loop.yaml +50 -0
- package/src/loops/contract/loop-agent.schema.json +138 -0
- package/src/loops/contract/validate.ts +64 -0
- package/src/loops/registry.ts +20 -6
- package/src/market/signed-index.ts +4 -0
- package/src/maturity/bot-command-maturity.ts +45 -0
- package/src/maturity/cli-maturity.ts +34 -0
- package/src/maturity/feature-maturity.ts +120 -1
- package/src/maturity/tui-slash-maturity.ts +31 -0
- package/src/memory.ts +32 -4
- package/src/model-tier/index.ts +2 -2
- package/src/model-tier/tier-resolver.ts +20 -20
- package/src/model-tier/types.ts +6 -6
- package/src/mss/logging/log-store.ts +15 -0
- package/src/nexus/api/config-model-tier.ts +5 -4
- package/src/nexus/api/exec-requests.ts +33 -3
- package/src/nexus/api/fabric-plans.ts +53 -0
- package/src/nexus/api/harness-api.ts +5 -1
- package/src/nexus/api/health.ts +2 -0
- package/src/nexus/api/http-server.ts +89 -1
- package/src/nexus/api/inside-events.ts +226 -0
- package/src/nexus/api/meta-api.ts +32 -8
- package/src/nexus/api/missions.ts +6 -1
- package/src/nexus/api/ops-api.ts +10 -1
- package/src/nexus/api/ops-seats-sources.ts +37 -7
- package/src/nexus/api/ops-seats.ts +49 -6
- package/src/nexus/api/outputs-route.ts +44 -0
- package/src/nexus/api/seat-requests.ts +132 -10
- package/src/nexus/api/sessions-store.ts +42 -0
- package/src/nexus/api/setup-codex-login.ts +160 -0
- package/src/nexus/api/sub-seat-charters.ts +34 -0
- package/src/nexus/api/tabs-mutations.ts +3 -1
- package/src/nexus/api/trace.ts +18 -6
- package/src/nexus/api/usage-api.ts +102 -0
- package/src/nexus/api/workflow-run-event-bridge.ts +1 -0
- package/src/nexus/api/workflows.ts +80 -6
- package/src/nexus/index.ts +47 -4
- package/src/nexus/kinds/webterm.ts +2 -1
- package/src/nexus/webterm/pty.ts +6 -2
- package/src/onboarding/cli-auth-status.ts +80 -0
- package/src/onboarding/first-run.ts +89 -0
- package/src/onboarding/lan-address.ts +45 -0
- package/src/onboarding/voice-ai.ts +3 -3
- package/src/onboarding/web-first.ts +119 -24
- package/src/onboarding.ts +4 -0
- package/src/ops-now/ops-now-refresh.ts +100 -0
- package/src/org/seat-budget.ts +48 -0
- package/src/org/stall-escalation.ts +63 -0
- package/src/outputs/ledger.ts +120 -0
- package/src/persona/persona-todo.ts +79 -0
- package/src/persona/presets.ts +116 -2
- package/src/persona/team-set.ts +155 -0
- package/src/plugins/install/plugin-install.ts +14 -0
- package/src/plugins/maker/market-bundle.ts +109 -0
- package/src/plugins/maker/plugin-maker.ts +254 -11
- package/src/plugins/maker/wizard-generate.ts +103 -0
- package/src/pod-lease/admission.ts +150 -0
- package/src/pod-lease/dependency-state.ts +85 -0
- package/src/pod-lease/host-lease.ts +127 -0
- package/src/project/project-store.ts +115 -0
- package/src/project/project-suggestion.ts +16 -0
- package/src/project/session-context.ts +24 -0
- package/src/release-loop/checklist.ts +79 -5
- package/src/release-loop/feature-store.ts +159 -24
- package/src/release-loop/next-md-merge.ts +58 -0
- package/src/release-loop/release-note.ts +59 -4
- package/src/release-loop/release-schedule.ts +53 -0
- package/src/repl/index.ts +7 -0
- package/src/seat-dispatch/ceo-commands.ts +41 -8
- package/src/seat-dispatch/ceo-intent.ts +38 -0
- package/src/seat-dispatch/seat-ask.ts +130 -0
- package/src/seat-dispatch/seat-questions.ts +100 -0
- package/src/seat-loop/seat-loop.ts +750 -0
- package/src/seat-loop/seat-report.ts +99 -0
- package/src/self-dev/decompose.ts +66 -11
- package/src/self-dev/dev-cli.ts +4 -1
- package/src/self-dev/dev-pipeline.ts +37 -1
- package/src/self-dev/draft-sweep.ts +38 -33
- package/src/self-dev/draft-triage-rules.ts +8 -5
- package/src/self-dev/fabric-plan-core.ts +297 -0
- package/src/self-dev/orchestrate.ts +36 -4
- package/src/self-dev/release-path-guard.ts +62 -0
- package/src/self-dev/run-store.ts +10 -1
- package/src/self-dev/shard-aggregate.ts +230 -0
- package/src/self-dev/shard-placement.ts +60 -0
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-pod-run.ts +77 -0
- package/src/self-dev/shard-run.ts +105 -0
- package/src/self-implement/execution-clarification.ts +115 -0
- package/src/self-implement/gate-baseline.ts +1 -1
- package/src/self-implement/gate-cli.ts +46 -4
- package/src/self-implement/gate-scope.ts +37 -7
- package/src/self-implement/graph-variant.ts +171 -0
- package/src/self-implement/harness-policy-gates.ts +1 -1
- package/src/self-implement/headless-elanous-driver.ts +22 -3
- package/src/self-implement/host-regate.ts +22 -1
- package/src/self-implement/importer-test-index.ts +2 -1
- package/src/self-implement/l8-merge-queue.ts +130 -0
- package/src/self-implement/orchestrator.ts +279 -12
- package/src/self-implement/pipeline-shape.ts +1 -1
- package/src/self-implement/route-consumer-test-index.ts +122 -0
- package/src/self-implement/run-status-mapping.ts +5 -3
- package/src/self-implement/seams.ts +72 -11
- package/src/self-implement/test-seams.ts +1 -0
- package/src/self-implement/uncommitted-work.ts +59 -0
- package/src/session/chat.ts +2 -0
- package/src/session/index.ts +45 -13
- package/src/shell-env-bootstrap.ts +17 -0
- package/src/skills/gift-install.ts +215 -0
- package/src/skills/tools/web-search.ts +4 -1
- package/src/steward/directive.ts +51 -2
- package/src/steward/launch.ts +266 -0
- package/src/steward/outcome-notify.ts +115 -0
- package/src/steward/steward-cards.ts +25 -11
- package/src/steward/triage-plan.ts +32 -4
- package/src/steward/triage.ts +129 -13
- package/src/steward/working-backwards.ts +64 -0
- package/src/storyboard/storyboard.ts +141 -0
- package/src/task-cards/card-cli.ts +25 -1
- package/src/task-cards/card-store.ts +2 -2
- package/src/task-orchestrator/mission.ts +5 -0
- package/src/task-orchestrator/store.ts +12 -3
- package/src/task-orchestrator/surfaces/pod-command-job.ts +29 -7
- package/src/task-orchestrator/surfaces/pod-lease.ts +397 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +127 -26
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +214 -40
- package/src/task-orchestrator/surfaces/self-implement.ts +15 -2
- package/src/task-orchestrator/types.ts +2 -0
- package/src/telegram-card-followup.ts +153 -0
- package/src/telegram-commands.ts +10 -1
- package/src/telegram-project-command.ts +71 -0
- package/src/telegram-report.ts +29 -19
- package/src/telegram-run.ts +7 -0
- package/src/telegram.ts +58 -11
- package/src/tool-runtime/self-cognition-runtimes.ts +13 -3
- package/src/tool-runtime/types.ts +4 -0
- package/src/tui-client/dashboard-session.ts +2 -0
- package/src/user-config.ts +216 -27
- package/src/version/packed-revision.json +1 -1
- package/src/web-push/notify-exec-request.ts +32 -0
- package/src/web-search/grok.ts +7 -1
- package/src/web-search/index.ts +28 -1
- package/src/web-search/provider.ts +4 -0
- package/src/web-search/x-intent.ts +5 -0
- package/src/workflow-runtime/executor.ts +277 -47
- package/src/workflow-runtime/index.ts +1 -0
- package/src/workflow-runtime/nodes/subworkflow.ts +60 -0
- package/src/workflow-runtime/plugin-kind-node.ts +1 -1
- package/src/workflow-runtime/schema.ts +79 -4
- package/src/workflow-runtime/types.ts +35 -4
- package/apps/pwa/out/_next/static/bFI5EEwg7T6aG88ibX4Zq/_buildManifest.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2375-cb6debea56cce4fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +0 -25
- package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +0 -5
- package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
- package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5080-1613752891fcadb4.js +0 -10
- package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8630-cdfc61e82c653ffc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8894-e263b332208e3957.js +0 -1
- package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9454-139040d37c79dbc9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fb7c2d458f32fcad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-35e2713597dd24d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-918b656f064577ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-5f30e00693527ebd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-7fbae173b3c103a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3b4edcce364062ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-c5794f484c251f44.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1130d8eefcd87e76.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-973996d584f008c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-016e2bda04eecb1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-b4d6d9a3b56f2940.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-ec49a466121233ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-f72db356744ceade.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-a6fd9b50d1b85378.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-8b0402a46a749a3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-037f83e2a1edc8e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-46fedff57d4bec67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-0cf318e9dcee2bbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-899b327cb8b6845c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6c1e6ba743a29dfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-1a8e4807292f6b17.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-28deba6bcb834916.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-de68e2205794037d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-c71c33a573230672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0df30e0c7e50148a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-4fc56790fe0d2682.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-59df2aebb38a7c1e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-4647be5dbcbd0795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-e025892bda74b743.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-a0955de73b89f078.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-369846d2921af584.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-72cbc1c8cdd0f65d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-77b28bfb0996d5ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-3220c4934f49c6c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-90670589b87abea8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-7df9243ed021a4cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-4498c3853f4f688d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-35bedde6d885f08f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e5bea36f183b25e6.js +0 -1
- package/apps/pwa/out/_next/static/css/f92f63a5df0ba229.css +0 -1
- package/src/dashboard/turn-typeahead-echo.ts +0 -23
- /package/apps/pwa/out/_next/static/{bFI5EEwg7T6aG88ibX4Zq → Y4zKzL62sakG5momz3SoQ}/_ssgManifest.js +0 -0
package/src/user-config.ts
CHANGED
|
@@ -50,7 +50,7 @@ import type { SkillTier } from './skills/runner.js';
|
|
|
50
50
|
import { sharedAgentSkillRoots } from './skills/shared-agent-skill-roots.js';
|
|
51
51
|
import {
|
|
52
52
|
isModelTier,
|
|
53
|
-
|
|
53
|
+
isModelTierProfile,
|
|
54
54
|
type BudgetUserConfig,
|
|
55
55
|
type ModelTier,
|
|
56
56
|
type ModelTierUserConfig,
|
|
@@ -450,6 +450,8 @@ export interface SkillSource {
|
|
|
450
450
|
export interface SkillsConfig {
|
|
451
451
|
activeSet: SkillSetName;
|
|
452
452
|
dirs: string[];
|
|
453
|
+
/** Gift redemption API origin; defaults to https://elanous.ai. */
|
|
454
|
+
giftEndpoint?: string;
|
|
453
455
|
/** Include the existing shared ~/.agents/skills directory. Default true; false opts out. */
|
|
454
456
|
includeSharedAgentSkills?: boolean;
|
|
455
457
|
/**
|
|
@@ -766,6 +768,7 @@ function skillsDefaults(): SkillsConfig {
|
|
|
766
768
|
return {
|
|
767
769
|
activeSet: 'claudecode',
|
|
768
770
|
dirs: d ? [d] : [],
|
|
771
|
+
giftEndpoint: 'https://elanous.ai',
|
|
769
772
|
includeSharedAgentSkills: true,
|
|
770
773
|
allow: [],
|
|
771
774
|
deny: [],
|
|
@@ -912,11 +915,13 @@ export interface TelegramConfig {
|
|
|
912
915
|
/** 누가 Q&A 폴링을 하나 — 기본(없음·`'nexus'`)은 넥서스 데몬, `'standalone'` 이면
|
|
913
916
|
* 넥서스는 폴링하지 않고 `elanous telegram run` 이 맡는다. */
|
|
914
917
|
poller?: 'nexus' | 'standalone';
|
|
915
|
-
/**
|
|
916
|
-
*
|
|
918
|
+
/** 레거시 kind→역할 설정(읽기 호환). 선택한 채널의 봇이 kind 정책의
|
|
919
|
+
* 운영/매매 경계를 지킬 때만 발송 라우팅에 적용한다. */
|
|
917
920
|
kindRoles?: Record<string, string>;
|
|
918
921
|
/** `#현장` 캡션에 행사 슬러그가 없을 때 쓸 기본 행사(예: `marketers-night-2026-10`). 없으면 `field-<로컬 날짜>`. */
|
|
919
922
|
fieldDefaultEvent?: string;
|
|
923
|
+
/** `#현장` 영상의 기본 렌더 모드. 미지정 시 standard, 캡션의 `즉석`/`instant` 가 우선. */
|
|
924
|
+
fieldReelMode?: 'standard' | 'instant';
|
|
920
925
|
}
|
|
921
926
|
|
|
922
927
|
const TELEGRAM_DEFAULTS: TelegramConfig = { enabled: false, allowedUsers: [] };
|
|
@@ -982,6 +987,7 @@ const DISCORD_DEFAULTS: DiscordConfig = { enabled: false, allowedUsers: [] };
|
|
|
982
987
|
|
|
983
988
|
export interface OnboardingConfig {
|
|
984
989
|
webFirst?: boolean;
|
|
990
|
+
ready?: boolean;
|
|
985
991
|
completed: boolean;
|
|
986
992
|
completedAt?: string;
|
|
987
993
|
version: number;
|
|
@@ -1474,6 +1480,7 @@ export function parseErrorReportsConfig(raw: unknown): ErrorReportsConfig | unde
|
|
|
1474
1480
|
}
|
|
1475
1481
|
|
|
1476
1482
|
export interface ChatConfig {
|
|
1483
|
+
factQuestion: { maxToolTurns: number };
|
|
1477
1484
|
/** Short questions may receive a tool-free first reply. Default true. */
|
|
1478
1485
|
fastPath: boolean;
|
|
1479
1486
|
conciseness: ChatConcisenessConfig;
|
|
@@ -1502,6 +1509,7 @@ const CHAT_CONCISENESS_DEFAULTS: ChatConcisenessConfig = {
|
|
|
1502
1509
|
};
|
|
1503
1510
|
|
|
1504
1511
|
export const CHAT_DEFAULTS: ChatConfig = {
|
|
1512
|
+
factQuestion: { maxToolTurns: 6 },
|
|
1505
1513
|
fastPath: true,
|
|
1506
1514
|
conciseness: { ...CHAT_CONCISENESS_DEFAULTS },
|
|
1507
1515
|
toolOutput: {
|
|
@@ -1682,6 +1690,8 @@ export interface AcpHopCapConfig {
|
|
|
1682
1690
|
|
|
1683
1691
|
export interface AcpConfig {
|
|
1684
1692
|
hopCap: AcpHopCapConfig;
|
|
1693
|
+
/** ACP client permission response deadline (positive integer milliseconds). */
|
|
1694
|
+
toolApproval: { timeoutMs: number };
|
|
1685
1695
|
/** ACP PR reviewer and final judge backend. Absent defers to DEFAULT_REVIEW_BACKEND. */
|
|
1686
1696
|
reviewBackend?: string;
|
|
1687
1697
|
/** Rework agent backend. Absent defers to the driver default (codex). */
|
|
@@ -1707,7 +1717,17 @@ export interface AcpConfig {
|
|
|
1707
1717
|
scrubBillingEnv: boolean;
|
|
1708
1718
|
}
|
|
1709
1719
|
|
|
1710
|
-
const ACP_DEFAULTS: AcpConfig = { hopCap: {}, scrubBillingEnv: true };
|
|
1720
|
+
const ACP_DEFAULTS: AcpConfig = { hopCap: {}, toolApproval: { timeoutMs: 60_000 }, scrubBillingEnv: true };
|
|
1721
|
+
|
|
1722
|
+
function acpApprovalTimeoutMs(value: unknown): number | undefined {
|
|
1723
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value > 0 && value <= 2_147_483_647
|
|
1724
|
+
? value : undefined;
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1727
|
+
function acpApprovalTimeoutEnv(): number | undefined {
|
|
1728
|
+
const raw = process.env.ELANOUS_ACP_TOOL_APPROVAL_TIMEOUT_MS;
|
|
1729
|
+
return raw !== undefined && /^\d+$/.test(raw) ? acpApprovalTimeoutMs(Number(raw)) : undefined;
|
|
1730
|
+
}
|
|
1711
1731
|
|
|
1712
1732
|
// ── Plan mode config (Coding Pipeline P4 followup) ───────────────────
|
|
1713
1733
|
//
|
|
@@ -1912,6 +1932,17 @@ function parseOpenDesignConfig(raw: unknown): OpenDesignConfig | undefined {
|
|
|
1912
1932
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
1913
1933
|
}
|
|
1914
1934
|
|
|
1935
|
+
export function parseDiagnosticsConfig(raw: unknown): UserConfig['diagnostics'] {
|
|
1936
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
1937
|
+
const value = (raw as Record<string, unknown>).uploadUrl;
|
|
1938
|
+
if (typeof value !== 'string' || !value.trim()) return undefined;
|
|
1939
|
+
try {
|
|
1940
|
+
const url = new URL(value.trim());
|
|
1941
|
+
if (url.protocol !== 'https:' || !url.hostname || url.username || url.password) return undefined;
|
|
1942
|
+
return { uploadUrl: url.href };
|
|
1943
|
+
} catch { return undefined; }
|
|
1944
|
+
}
|
|
1945
|
+
|
|
1915
1946
|
function parseDesignConfig(raw: unknown): DesignConfig | undefined {
|
|
1916
1947
|
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
1917
1948
|
const r = raw as Record<string, unknown>;
|
|
@@ -1995,7 +2026,12 @@ function parseModelTierFieldOrUndefined(v: unknown): ModelTier | undefined {
|
|
|
1995
2026
|
function parseModelTierConfig(raw: unknown): ModelTierUserConfig | undefined {
|
|
1996
2027
|
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
1997
2028
|
const r = raw as Record<string, unknown>;
|
|
1998
|
-
|
|
2029
|
+
// Compatibility is read-only: the normalized config and subsequent writes use profile.
|
|
2030
|
+
let profile = isModelTierProfile(r.profile) ? r.profile : undefined;
|
|
2031
|
+
if (r.profile === undefined && r.persona !== undefined) {
|
|
2032
|
+
debug.log('config', 'deprecated-key', { from: 'modelTier.persona', to: 'modelTier.profile' });
|
|
2033
|
+
if (isModelTierProfile(r.persona)) profile = r.persona;
|
|
2034
|
+
}
|
|
1999
2035
|
const preset = typeof r.preset === 'string' && r.preset.trim().length > 0
|
|
2000
2036
|
? r.preset.trim()
|
|
2001
2037
|
: undefined;
|
|
@@ -2029,7 +2065,7 @@ function parseModelTierConfig(raw: unknown): ModelTierUserConfig | undefined {
|
|
|
2029
2065
|
const embedding = parseModelTierFieldOrUndefined(r.embedding);
|
|
2030
2066
|
const vision = parseModelTierFieldOrUndefined(r.vision);
|
|
2031
2067
|
const out: ModelTierUserConfig = {
|
|
2032
|
-
...spreadIfDefined('
|
|
2068
|
+
...spreadIfDefined('profile', profile),
|
|
2033
2069
|
...spreadIfDefined('preset', preset),
|
|
2034
2070
|
...spreadIfDefined('voice', voice),
|
|
2035
2071
|
...spreadIfDefined('llm', llm),
|
|
@@ -3401,7 +3437,9 @@ export interface RoleLlmResolveOptions {
|
|
|
3401
3437
|
* ⛔ 아무 override 도 없으면 ③~⑥ 만 타므로 산출이 종전과 «같다»(§4f 불변식 · NL 진입 무변경). */
|
|
3402
3438
|
export function resolveRoleLlm(role: ModelRole, opts: RoleLlmResolveOptions = {}): RoleLlmResolution {
|
|
3403
3439
|
const config = opts.config ?? getUserConfig();
|
|
3404
|
-
|
|
3440
|
+
// 전역 provider 는 필요할 때만 푼다 — 역할이 provider 를 명시했으면 전역 provider 가 없어도 해석된다.
|
|
3441
|
+
let activeProvider: LLMProviderName | undefined;
|
|
3442
|
+
const globalProvider = (): LLMProviderName => (activeProvider ??= resolveActiveProvider(config));
|
|
3405
3443
|
// 명시 인자가 있으면 그것이 진실 — 없을 때만 발사 시점에 정해진 값을 읽는다(둘 다 source='flag').
|
|
3406
3444
|
const flagSpec = (opts.overrides ?? launchRoleLlmOverrides)?.[role];
|
|
3407
3445
|
const layers: ReadonlyArray<readonly [RoleLlmSpec | undefined, RoleLlmSource]> = [
|
|
@@ -3410,7 +3448,7 @@ export function resolveRoleLlm(role: ModelRole, opts: RoleLlmResolveOptions = {}
|
|
|
3410
3448
|
];
|
|
3411
3449
|
for (const [spec, source] of layers) {
|
|
3412
3450
|
if (!spec) continue;
|
|
3413
|
-
const provider = spec.provider ?? globalProvider;
|
|
3451
|
+
const provider = spec.provider ?? globalProvider();
|
|
3414
3452
|
const pinned = spec.model?.trim();
|
|
3415
3453
|
let resolution: RoleLlmResolution | undefined;
|
|
3416
3454
|
if (pinned) resolution = { model: pinned, provider, ...(spec.tier ? { tier: spec.tier } : {}), source };
|
|
@@ -3419,7 +3457,7 @@ export function resolveRoleLlm(role: ModelRole, opts: RoleLlmResolveOptions = {}
|
|
|
3419
3457
|
if (resolution) { observeRoleLlm(role, resolution, spec); return resolution; }
|
|
3420
3458
|
// 세 칸이 «다 비었으면» 아래 층으로 흘린다 — 빈 칸은 선언이 아니다.
|
|
3421
3459
|
}
|
|
3422
|
-
const baseline = resolveRoleLlmBaseline(role, config, globalProvider);
|
|
3460
|
+
const baseline = resolveRoleLlmBaseline(role, config, globalProvider());
|
|
3423
3461
|
if (opts.overrides || launchRoleLlmOverrides || config.roleLlm?.[role]) observeRoleLlm(role, baseline, flagSpec);
|
|
3424
3462
|
return baseline;
|
|
3425
3463
|
}
|
|
@@ -3435,21 +3473,66 @@ export function resolveRoleModel(role: ModelRole, config: UserConfig = getUserCo
|
|
|
3435
3473
|
}
|
|
3436
3474
|
|
|
3437
3475
|
|
|
3476
|
+
export type StewardLoopMode = 'off' | 'shadow' | 'live';
|
|
3477
|
+
|
|
3438
3478
|
export type SeatLoopMode = 'off' | 'shadow' | 'on';
|
|
3439
3479
|
|
|
3480
|
+
export interface PersonaLoopConfig { enabled: boolean }
|
|
3481
|
+
|
|
3440
3482
|
export interface SeatLoopConfig {
|
|
3441
3483
|
/** No seat actions by default; shadow observes without execution, on permits the seat loop to act. */
|
|
3442
3484
|
mode: SeatLoopMode;
|
|
3485
|
+
/** Seat-to-seat and human questions default to shadow even when the checklist loop is on. */
|
|
3486
|
+
questions?: 'shadow' | 'on';
|
|
3487
|
+
seats?: string[];
|
|
3488
|
+
podPool?: string;
|
|
3489
|
+
reportPr?: number;
|
|
3490
|
+
/** Parent routing and age limits for checklist stalls; omitted values use findStalls defaults. */
|
|
3491
|
+
stall?: { parents?: Record<string, string>; redMinutes?: number; blockedMinutes?: number };
|
|
3492
|
+
}
|
|
3493
|
+
|
|
3494
|
+
export type EventSeat = 'OP' | 'TC' | 'MK' | 'UX';
|
|
3495
|
+
export interface EventRoute { source: 'linear' | 'asana' | 'github'; kind: string; seat: EventSeat; loop: 'seat' }
|
|
3496
|
+
export interface EventsConfig { mode: 'shadow' | 'on'; routes: EventRoute[]; linearAssignees: Record<string, EventSeat> }
|
|
3497
|
+
|
|
3498
|
+
export function parseEventsConfig(input: unknown): EventsConfig {
|
|
3499
|
+
const events = input && typeof input === 'object' && !Array.isArray(input) ? input as Record<string, unknown> : {};
|
|
3500
|
+
const routes: EventRoute[] = [];
|
|
3501
|
+
const linearAssignees: Record<string, EventSeat> = Object.create(null);
|
|
3502
|
+
if (events.linearAssignees && typeof events.linearAssignees === 'object' && !Array.isArray(events.linearAssignees)) {
|
|
3503
|
+
for (const [id, seat] of Object.entries(events.linearAssignees)) {
|
|
3504
|
+
if (id.trim() && (seat === 'OP' || seat === 'TC' || seat === 'MK' || seat === 'UX')) linearAssignees[id] = seat;
|
|
3505
|
+
}
|
|
3506
|
+
}
|
|
3507
|
+
if (Array.isArray(events.routes)) for (const value of events.routes) {
|
|
3508
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) continue;
|
|
3509
|
+
const route = value as Record<string, unknown>;
|
|
3510
|
+
if ((route.source === 'linear' || route.source === 'asana' || route.source === 'github') && typeof route.kind === 'string' && route.kind.trim()
|
|
3511
|
+
&& (route.seat === 'OP' || route.seat === 'TC' || route.seat === 'MK' || route.seat === 'UX') && route.loop === 'seat')
|
|
3512
|
+
routes.push({ source: route.source, kind: route.kind, seat: route.seat, loop: route.loop });
|
|
3513
|
+
}
|
|
3514
|
+
return { mode: events.mode === 'on' ? 'on' : 'shadow', routes, linearAssignees };
|
|
3443
3515
|
}
|
|
3444
3516
|
|
|
3445
3517
|
export interface UserConfig {
|
|
3518
|
+
events?: EventsConfig;
|
|
3519
|
+
/** Explicit HTTPS destination for doctor diagnostics; absent means no upload. */
|
|
3520
|
+
diagnostics?: { uploadUrl?: string };
|
|
3521
|
+
/** Root CLI help audience; absent or invalid means owner. */
|
|
3522
|
+
cli?: { helpRole?: 'owner' | 'contributor' | 'general' };
|
|
3523
|
+
/** Execution-phase HITL answer deadline; absent means 30 minutes. */
|
|
3524
|
+
hitl?: { executionDeadlineMinutes?: number };
|
|
3525
|
+
coo?: { linearProject?: string };
|
|
3526
|
+
decisions?: { linearProjection: { enabled: boolean } };
|
|
3527
|
+
/** Per-seat goal and Pod limits; missing or invalid limits use seat-budget defaults. */
|
|
3528
|
+
org?: { budget?: Record<string, { dailyGoals?: number; concurrentPods?: number }> };
|
|
3446
3529
|
/** Steward and seat loops are parsed independently. An absent seat remains off. */
|
|
3447
|
-
loops?: { steward?: { mode?:
|
|
3530
|
+
loops?: { steward?: { mode?: StewardLoopMode; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number; launch?: 'off' | 'shadow' | 'live'; maxParallel?: number; podPool?: string }; seat?: SeatLoopConfig; persona?: PersonaLoopConfig };
|
|
3448
3531
|
/** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
|
|
3449
3532
|
* budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
|
|
3450
|
-
harness?: { pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; defaultRepo?: string; substrate?: 'local' | 'pod'; podPool?: string };
|
|
3451
|
-
/** ☸️ Pod 실행 칸 — `pool` = 기존 기본 풀(`컨텍스트[@ssh호스트][:상한]` 쉼표 · 앞이 우선). harness 실행은 인자·ELANOUS_POD_POOL·harness.podPool 다음으로 읽는다. */
|
|
3452
|
-
pod?: { pool?: string; /** 호스트 Git 미러 디렉터리 — Pod Job 에 읽기 전용으로 마운트한다. */ hostMirror?: string; /** 원격 그라운딩 엔드포인트(호스트 nexus · tailnet 주소) — Pod 가 토큰으로 «질의→인용»만 묻는다(P13). */ groundingUrl?: string };
|
|
3533
|
+
harness?: { pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; defaultRepo?: string; substrate?: 'local' | 'pod'; podPool?: string; worktreeAddTimeoutSec?: number };
|
|
3534
|
+
/** ☸️ Pod 실행 칸 — `pool` = 기존 기본 풀(`컨텍스트[@ssh호스트][:상한][#k3d-레지스트리:포트]` 쉼표 · 앞이 우선). harness 실행은 인자·ELANOUS_POD_POOL·harness.podPool 다음으로 읽는다. */
|
|
3535
|
+
pod?: { pool?: string; /** 호스트 Git 미러 디렉터리 — Pod Job 에 읽기 전용으로 마운트한다. */ hostMirror?: string; /** 원격 그라운딩 엔드포인트(호스트 nexus · tailnet 주소) — Pod 가 토큰으로 «질의→인용»만 묻는다(P13). */ groundingUrl?: string; /** 읽기 전용 Pod lease 권장에 쓰는 계정별 동시 수. */ lease?: { perAccount?: number } };
|
|
3453
3536
|
skillRouter: SkillRouterConfig;
|
|
3454
3537
|
llm: LLMConfig;
|
|
3455
3538
|
skills: SkillsConfig;
|
|
@@ -3773,7 +3856,10 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
|
|
|
3773
3856
|
|
|
3774
3857
|
function defaultConfig(): UserConfig {
|
|
3775
3858
|
return {
|
|
3776
|
-
|
|
3859
|
+
cli: { helpRole: 'owner' },
|
|
3860
|
+
coo: { linearProject: '외부 행정·큰 일 (COO)' },
|
|
3861
|
+
decisions: { linearProjection: { enabled: false } },
|
|
3862
|
+
loops: { steward: { mode: 'shadow' }, seat: { mode: 'off', questions: 'shadow', seats: ['MK'], podPool: 'pool-node-b@node-b:8' }, persona: { enabled: false } },
|
|
3777
3863
|
skillRouter: { ...SR_DEFAULTS },
|
|
3778
3864
|
llm: { ...LLM_DEFAULTS },
|
|
3779
3865
|
skills: skillsDefaults(),
|
|
@@ -3786,6 +3872,7 @@ function defaultConfig(): UserConfig {
|
|
|
3786
3872
|
logs: { retention: { ...LOGS_DEFAULTS.retention } },
|
|
3787
3873
|
shell: { ...SHELL_DEFAULTS },
|
|
3788
3874
|
chat: {
|
|
3875
|
+
factQuestion: { ...CHAT_DEFAULTS.factQuestion },
|
|
3789
3876
|
fastPath: CHAT_DEFAULTS.fastPath,
|
|
3790
3877
|
conciseness: { ...CHAT_CONCISENESS_DEFAULTS },
|
|
3791
3878
|
toolOutput: { ...CHAT_DEFAULTS.toolOutput },
|
|
@@ -3823,7 +3910,7 @@ function defaultConfig(): UserConfig {
|
|
|
3823
3910
|
iulForegroundOnStartup: false,
|
|
3824
3911
|
order: [...VW_ORDER_DEFAULT],
|
|
3825
3912
|
},
|
|
3826
|
-
acp: { hopCap: { ...ACP_DEFAULTS.hopCap }, scrubBillingEnv: ACP_DEFAULTS.scrubBillingEnv },
|
|
3913
|
+
acp: { hopCap: { ...ACP_DEFAULTS.hopCap }, toolApproval: { timeoutMs: acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs }, scrubBillingEnv: ACP_DEFAULTS.scrubBillingEnv },
|
|
3827
3914
|
lsp: cloneLspDefaults(),
|
|
3828
3915
|
plan: { ...PLAN_DEFAULTS },
|
|
3829
3916
|
goals: { ...GOALS_DEFAULTS },
|
|
@@ -4253,18 +4340,43 @@ function parseStewardTracks(input: unknown): Record<string, string> | undefined
|
|
|
4253
4340
|
}
|
|
4254
4341
|
|
|
4255
4342
|
function parseSeatLoopsConfig(input: unknown): SeatLoopConfig {
|
|
4256
|
-
|
|
4343
|
+
const defaults: SeatLoopConfig = { mode: 'off', questions: 'shadow', seats: ['MK'], podPool: 'pool-node-b@node-b:8' };
|
|
4344
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) return defaults;
|
|
4257
4345
|
const seat = (input as Record<string, unknown>).seat;
|
|
4258
|
-
if (!seat || typeof seat !== 'object' || Array.isArray(seat)) return
|
|
4259
|
-
const
|
|
4260
|
-
|
|
4346
|
+
if (!seat || typeof seat !== 'object' || Array.isArray(seat)) return defaults;
|
|
4347
|
+
const values = seat as Record<string, unknown>;
|
|
4348
|
+
const mode = values.mode;
|
|
4349
|
+
return {
|
|
4350
|
+
mode: mode === 'on' || mode === 'shadow' ? mode : 'off',
|
|
4351
|
+
questions: values.questions === 'on' ? 'on' : 'shadow',
|
|
4352
|
+
seats: Array.isArray(values.seats) && values.seats.length > 0
|
|
4353
|
+
&& values.seats.every((value) => typeof value === 'string' && /^(?:MK|OP|TC|UX)$/.test(value))
|
|
4354
|
+
? [...new Set(values.seats as string[])] : ['MK'],
|
|
4355
|
+
podPool: typeof values.podPool === 'string' && values.podPool.trim() ? values.podPool.trim() : defaults.podPool,
|
|
4356
|
+
...(typeof values.reportPr === 'number' && Number.isSafeInteger(values.reportPr) && values.reportPr > 0
|
|
4357
|
+
? { reportPr: values.reportPr } : {}),
|
|
4358
|
+
...(() => {
|
|
4359
|
+
const stall = values.stall;
|
|
4360
|
+
if (!stall || typeof stall !== 'object' || Array.isArray(stall)) return {};
|
|
4361
|
+
const raw = stall as Record<string, unknown>;
|
|
4362
|
+
const parents = raw.parents && typeof raw.parents === 'object' && !Array.isArray(raw.parents)
|
|
4363
|
+
? Object.fromEntries(Object.entries(raw.parents).filter(([from, to]) =>
|
|
4364
|
+
/^(?:MK|OP|TC|UX)$/.test(from) && typeof to === 'string' && /^(?:MK|OP|TC|UX)$/.test(to) && from !== to))
|
|
4365
|
+
: undefined;
|
|
4366
|
+
const minutes = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value) && value >= 0;
|
|
4367
|
+
return { stall: {
|
|
4368
|
+
...(parents ? { parents } : {}),
|
|
4369
|
+
...(minutes(raw.redMinutes) ? { redMinutes: raw.redMinutes } : {}),
|
|
4370
|
+
...(minutes(raw.blockedMinutes) ? { blockedMinutes: raw.blockedMinutes } : {}),
|
|
4371
|
+
} };
|
|
4372
|
+
})(),
|
|
4373
|
+
};
|
|
4261
4374
|
}
|
|
4262
4375
|
|
|
4263
4376
|
function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
|
|
4264
|
-
|
|
4265
|
-
const value =
|
|
4266
|
-
|
|
4267
|
-
const s = value as Record<string, unknown>;
|
|
4377
|
+
const loops = input && typeof input === 'object' && !Array.isArray(input) ? input as Record<string, unknown> : {};
|
|
4378
|
+
const value = loops.steward;
|
|
4379
|
+
const s = value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};
|
|
4268
4380
|
const roles: NonNullable<NonNullable<UserConfig['loops']>['steward']>['roles'] = {};
|
|
4269
4381
|
if (s.roles && typeof s.roles === 'object' && !Array.isArray(s.roles)) {
|
|
4270
4382
|
for (const [role, entry] of Object.entries(s.roles)) {
|
|
@@ -4274,7 +4386,12 @@ function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
|
|
|
4274
4386
|
}
|
|
4275
4387
|
}
|
|
4276
4388
|
return { steward: {
|
|
4277
|
-
mode: s.mode === '
|
|
4389
|
+
mode: s.mode === 'off' || s.mode === 'shadow' || s.mode === 'live' ? s.mode :
|
|
4390
|
+
s.launch === 'off' || s.launch === 'shadow' || s.launch === 'live' ? s.launch : 'shadow',
|
|
4391
|
+
// A valid legacy launch setting remains effective when mode is absent; explicit mode always wins.
|
|
4392
|
+
...(s.launch === 'off' || s.launch === 'shadow' || s.launch === 'live' ? { launch: s.launch } : {}),
|
|
4393
|
+
...(typeof s.maxParallel === 'number' && Number.isSafeInteger(s.maxParallel) && s.maxParallel > 0 ? { maxParallel: s.maxParallel } : {}),
|
|
4394
|
+
...(typeof s.podPool === 'string' && s.podPool.trim() ? { podPool: s.podPool.trim() } : {}),
|
|
4278
4395
|
...(typeof s.linearTeam === 'string' && s.linearTeam.trim() ? { linearTeam: s.linearTeam.trim() } : {}),
|
|
4279
4396
|
...(Object.keys(roles).length ? { roles } : {}),
|
|
4280
4397
|
...(typeof s.budget === 'number' && Number.isFinite(s.budget) && s.budget >= 0 ? { budget: s.budget } : {}),
|
|
@@ -4283,6 +4400,11 @@ function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
|
|
|
4283
4400
|
} };
|
|
4284
4401
|
}
|
|
4285
4402
|
|
|
4403
|
+
export function parseCliHelpRole(raw: unknown): NonNullable<UserConfig['cli']>['helpRole'] {
|
|
4404
|
+
const cli = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw as Record<string, unknown> : {};
|
|
4405
|
+
return cli.helpRole === 'general' || cli.helpRole === 'contributor' ? cli.helpRole : 'owner';
|
|
4406
|
+
}
|
|
4407
|
+
|
|
4286
4408
|
export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
4287
4409
|
if (!existsSync(path)) return defaultConfigWithRuntimeProvider();
|
|
4288
4410
|
let raw: unknown;
|
|
@@ -4338,6 +4460,8 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4338
4460
|
const logsRaw = (rawObj.logs ?? {}) as Record<string, unknown>;
|
|
4339
4461
|
const sh = (rawObj.shell ?? {}) as Record<string, unknown>;
|
|
4340
4462
|
const chat = (rawObj.chat ?? {}) as Record<string, unknown>;
|
|
4463
|
+
const chatFactQuestion = (chat.factQuestion && typeof chat.factQuestion === 'object' && !Array.isArray(chat.factQuestion))
|
|
4464
|
+
? chat.factQuestion as Record<string, unknown> : {};
|
|
4341
4465
|
const chatConciseness = (chat.conciseness ?? {}) as Record<string, unknown>;
|
|
4342
4466
|
const chatToolOutput = (chat.toolOutput ?? {}) as Record<string, unknown>;
|
|
4343
4467
|
const chatAutoCompact = (chat.autoCompact ?? {}) as Record<string, unknown>;
|
|
@@ -4370,6 +4494,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4370
4494
|
const vw = (rawObj.vw ?? {}) as Record<string, unknown>;
|
|
4371
4495
|
const acp = (rawObj.acp ?? {}) as Record<string, unknown>;
|
|
4372
4496
|
const acpHopCap = (acp.hopCap ?? {}) as Record<string, unknown>;
|
|
4497
|
+
const acpToolApproval = (acp.toolApproval ?? {}) as Record<string, unknown>;
|
|
4373
4498
|
const lspRaw = (rawObj.lsp ?? {}) as Record<string, unknown>;
|
|
4374
4499
|
|
|
4375
4500
|
// RFC #2161 (PLAN-config-unification-elanous-root) — `elanous nexus config
|
|
@@ -4385,17 +4510,40 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4385
4510
|
const rawNotifications = rawGlobalObj?.notifications ?? rawObj.notifications;
|
|
4386
4511
|
const autopilotConfig = parseAutopilotConfig(rawObj.autopilot);
|
|
4387
4512
|
const stewardLoops = parseStewardLoopsConfig(rawObj.loops);
|
|
4513
|
+
const orgRaw = rawObj.org && typeof rawObj.org === 'object' && !Array.isArray(rawObj.org) ? rawObj.org as Record<string, unknown> : {};
|
|
4514
|
+
const budgetRaw = orgRaw.budget && typeof orgRaw.budget === 'object' && !Array.isArray(orgRaw.budget) ? orgRaw.budget as Record<string, unknown> : {};
|
|
4515
|
+
const seatBudgets: NonNullable<NonNullable<UserConfig['org']>['budget']> = Object.create(null);
|
|
4516
|
+
for (const [seat, value] of Object.entries(budgetRaw)) {
|
|
4517
|
+
if (!seat || !value || typeof value !== 'object' || Array.isArray(value)) continue;
|
|
4518
|
+
const row = value as Record<string, unknown>;
|
|
4519
|
+
const dailyGoals = row.dailyGoals;
|
|
4520
|
+
const concurrentPods = row.concurrentPods;
|
|
4521
|
+
seatBudgets[seat] = {
|
|
4522
|
+
...(typeof dailyGoals === 'number' && Number.isSafeInteger(dailyGoals) && dailyGoals >= 0 ? { dailyGoals } : {}),
|
|
4523
|
+
...(typeof concurrentPods === 'number' && Number.isSafeInteger(concurrentPods) && concurrentPods >= 0 ? { concurrentPods } : {}),
|
|
4524
|
+
};
|
|
4525
|
+
}
|
|
4388
4526
|
|
|
4389
4527
|
return {
|
|
4528
|
+
...(Object.keys(seatBudgets).length ? { org: { budget: seatBudgets } } : {}),
|
|
4390
4529
|
pod: {
|
|
4391
4530
|
...(typeof legacyPod.pool === 'string' && legacyPod.pool.trim() ? { pool: legacyPod.pool.trim() } : {}),
|
|
4392
4531
|
...(typeof legacyPod.hostMirror === 'string' && legacyPod.hostMirror.trim() ? { hostMirror: legacyPod.hostMirror.trim() } : {}),
|
|
4393
4532
|
...(typeof legacyPod.groundingUrl === 'string' ? { groundingUrl: legacyPod.groundingUrl } : {}),
|
|
4533
|
+
lease: { perAccount: (() => {
|
|
4534
|
+
const lease = legacyPod.lease && typeof legacyPod.lease === 'object' && !Array.isArray(legacyPod.lease)
|
|
4535
|
+
? (legacyPod.lease as Record<string, unknown>) : {};
|
|
4536
|
+
return typeof lease.perAccount === 'number' && Number.isSafeInteger(lease.perAccount) && lease.perAccount > 0
|
|
4537
|
+
? lease.perAccount : 4;
|
|
4538
|
+
})() },
|
|
4394
4539
|
},
|
|
4395
4540
|
harness: {
|
|
4396
4541
|
pod: { grokApiKeyOptIn: harnessPod.grokApiKeyOptIn === true },
|
|
4397
4542
|
...(harness.substrate === 'local' || harness.substrate === 'pod' ? { substrate: harness.substrate } : {}),
|
|
4398
4543
|
...(typeof harness.podPool === 'string' && harness.podPool.trim() ? { podPool: harness.podPool.trim() } : {}),
|
|
4544
|
+
...(typeof harness.worktreeAddTimeoutSec === 'number' && Number.isSafeInteger(harness.worktreeAddTimeoutSec)
|
|
4545
|
+
&& harness.worktreeAddTimeoutSec > 0 && harness.worktreeAddTimeoutSec <= 2_147_483
|
|
4546
|
+
? { worktreeAddTimeoutSec: harness.worktreeAddTimeoutSec } : {}),
|
|
4399
4547
|
...(typeof harness.defaultRepo === 'string' && isAbsolute(harness.defaultRepo)
|
|
4400
4548
|
? { defaultRepo: harness.defaultRepo } : {}),
|
|
4401
4549
|
budgetGate: parseHarnessBudgetGate(
|
|
@@ -4509,6 +4657,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4509
4657
|
skills: {
|
|
4510
4658
|
activeSet: normalizeSkillSet(sk.activeSet),
|
|
4511
4659
|
dirs: strArray(sk.dirs, skillsDefaults().dirs),
|
|
4660
|
+
giftEndpoint: str(sk.giftEndpoint) ?? 'https://elanous.ai',
|
|
4512
4661
|
includeSharedAgentSkills: sk.includeSharedAgentSkills !== false,
|
|
4513
4662
|
...(() => { const sources = parsePersistedSkillSources(sk.sources, sk.connected); return sources ? { sources } : {}; })(),
|
|
4514
4663
|
allow: strArray(sk.allow, []),
|
|
@@ -4533,6 +4682,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4533
4682
|
...(tg.poller === 'standalone' || tg.poller === 'nexus' ? { poller: tg.poller } : {}),
|
|
4534
4683
|
...(normalizeKindRoles(tg.kindRoles) ? { kindRoles: normalizeKindRoles(tg.kindRoles)! } : {}),
|
|
4535
4684
|
...(str(tg.fieldDefaultEvent) ? { fieldDefaultEvent: str(tg.fieldDefaultEvent)! } : {}),
|
|
4685
|
+
...(tg.fieldReelMode === 'instant' || tg.fieldReelMode === 'standard' ? { fieldReelMode: tg.fieldReelMode } : {}),
|
|
4536
4686
|
},
|
|
4537
4687
|
discord: {
|
|
4538
4688
|
enabled: dc.enabled === true,
|
|
@@ -4593,6 +4743,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4593
4743
|
},
|
|
4594
4744
|
onboarding: {
|
|
4595
4745
|
...(typeof ob2.webFirst === 'boolean' ? { webFirst: ob2.webFirst } : {}),
|
|
4746
|
+
...(typeof ob2.ready === 'boolean' ? { ready: ob2.ready } : {}),
|
|
4596
4747
|
completed: ob2.completed === true,
|
|
4597
4748
|
completedAt: str(ob2.completedAt),
|
|
4598
4749
|
version: typeof ob2.version === 'number' ? ob2.version : 0,
|
|
@@ -4640,6 +4791,11 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4640
4791
|
},
|
|
4641
4792
|
...((): { errorReports?: ErrorReportsConfig } => { const er = parseErrorReportsConfig(rawObj.errorReports); return er ? { errorReports: er } : {}; })(),
|
|
4642
4793
|
chat: {
|
|
4794
|
+
factQuestion: {
|
|
4795
|
+
maxToolTurns: typeof chatFactQuestion.maxToolTurns === 'number'
|
|
4796
|
+
&& Number.isSafeInteger(chatFactQuestion.maxToolTurns) && chatFactQuestion.maxToolTurns > 0
|
|
4797
|
+
? chatFactQuestion.maxToolTurns : CHAT_DEFAULTS.factQuestion.maxToolTurns,
|
|
4798
|
+
},
|
|
4643
4799
|
fastPath: chat.fastPath === false || chat.fastPath === 'false' ? false : CHAT_DEFAULTS.fastPath,
|
|
4644
4800
|
conciseness: {
|
|
4645
4801
|
enabled: chatConciseness.enabled === false ? false : CHAT_CONCISENESS_DEFAULTS.enabled,
|
|
@@ -4999,6 +5155,10 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
4999
5155
|
})(),
|
|
5000
5156
|
acp: {
|
|
5001
5157
|
hopCap: parseHopCap(acpHopCap),
|
|
5158
|
+
toolApproval: {
|
|
5159
|
+
timeoutMs: acpApprovalTimeoutMs(acpToolApproval.timeoutMs)
|
|
5160
|
+
?? acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs,
|
|
5161
|
+
},
|
|
5002
5162
|
...(typeof acp.reviewBackend === 'string' && acp.reviewBackend.trim()
|
|
5003
5163
|
? { reviewBackend: acp.reviewBackend.trim() }
|
|
5004
5164
|
: {}),
|
|
@@ -5019,7 +5179,17 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5019
5179
|
goals: parseGoalsConfig(rawObj.goals),
|
|
5020
5180
|
registry: parseRegistryConfig(rawObj.registry),
|
|
5021
5181
|
tools: parseToolsConfig(rawObj.tools),
|
|
5022
|
-
|
|
5182
|
+
...(rawObj.hitl && typeof rawObj.hitl === 'object' && !Array.isArray(rawObj.hitl)
|
|
5183
|
+
&& typeof (rawObj.hitl as Record<string, unknown>).executionDeadlineMinutes === 'number'
|
|
5184
|
+
? { hitl: { executionDeadlineMinutes: (rawObj.hitl as { executionDeadlineMinutes: number }).executionDeadlineMinutes } }
|
|
5185
|
+
: {}),
|
|
5186
|
+
cli: { helpRole: parseCliHelpRole(rawObj.cli) },
|
|
5187
|
+
coo: { linearProject: typeof (rawObj.coo as { linearProject?: unknown } | undefined)?.linearProject === 'string' && (rawObj.coo as { linearProject: string }).linearProject.trim()
|
|
5188
|
+
? (rawObj.coo as { linearProject: string }).linearProject.trim() : '외부 행정·큰 일 (COO)' },
|
|
5189
|
+
decisions: { linearProjection: { enabled: ((rawObj.decisions as { linearProjection?: { enabled?: unknown } } | undefined)?.linearProjection?.enabled === true) } },
|
|
5190
|
+
loops: { ...(stewardLoops ?? {}), seat: parseSeatLoopsConfig(rawObj.loops),
|
|
5191
|
+
persona: { enabled: (rawObj.loops as { persona?: { enabled?: unknown } } | undefined)?.persona?.enabled === true } },
|
|
5192
|
+
events: parseEventsConfig(rawObj.events),
|
|
5023
5193
|
// M1-1: sparse — undefined when the user hasn't set anything, so
|
|
5024
5194
|
// resolvers fall through to zero-config defaults.
|
|
5025
5195
|
...spreadIfDefined('modelTier', parseModelTierConfig(rawObj.modelTier)),
|
|
@@ -5028,6 +5198,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5028
5198
|
...spreadIfDefined('taste', parseTasteConfig(rawObj.taste)),
|
|
5029
5199
|
...spreadIfDefined('webSearch', parseWebSearchConfig(rawObj.webSearch)),
|
|
5030
5200
|
...spreadIfDefined('design', parseDesignConfig(rawObj.design)),
|
|
5201
|
+
diagnostics: parseDiagnosticsConfig(rawObj.diagnostics),
|
|
5031
5202
|
...spreadIfDefined('budget', parseBudgetConfig(rawObj.budget)),
|
|
5032
5203
|
...spreadIfDefined('smartDefaults', parseSmartDefaultsConfig(rawObj.smartDefaults)),
|
|
5033
5204
|
...spreadIfDefined('roleModels', parseRoleModelConfig(rawObj.roleModels)),
|
|
@@ -5590,6 +5761,7 @@ export function saveUserConfig(
|
|
|
5590
5761
|
delete rawRest.budget;
|
|
5591
5762
|
delete rawRest.smartDefaults;
|
|
5592
5763
|
delete rawRest.grounding;
|
|
5764
|
+
delete rawRest.diagnostics;
|
|
5593
5765
|
const rawHarness = rawRest.harness && typeof rawRest.harness === 'object' && !Array.isArray(rawRest.harness)
|
|
5594
5766
|
? rawRest.harness as Record<string, unknown> : {};
|
|
5595
5767
|
delete rawRest.harness;
|
|
@@ -5597,6 +5769,8 @@ export function saveUserConfig(
|
|
|
5597
5769
|
? rawRest.autopilot as Record<string, unknown> : {};
|
|
5598
5770
|
const rawLoops = rawRest.loops && typeof rawRest.loops === 'object' && !Array.isArray(rawRest.loops)
|
|
5599
5771
|
? rawRest.loops as Record<string, unknown> : {};
|
|
5772
|
+
const rawSteward = rawLoops.steward && typeof rawLoops.steward === 'object' && !Array.isArray(rawLoops.steward)
|
|
5773
|
+
? rawLoops.steward as Record<string, unknown> : {};
|
|
5600
5774
|
if (cfg.loops) delete rawRest.loops;
|
|
5601
5775
|
if (cfg.pod?.hostMirror) {
|
|
5602
5776
|
const rawPod = rawRest.pod && typeof rawRest.pod === 'object' && !Array.isArray(rawRest.pod)
|
|
@@ -5616,7 +5790,14 @@ export function saveUserConfig(
|
|
|
5616
5790
|
...rawRest,
|
|
5617
5791
|
...(cfg.loops ? { loops: {
|
|
5618
5792
|
...rawLoops,
|
|
5619
|
-
...(cfg.loops.
|
|
5793
|
+
...(cfg.loops.steward ? { steward: { ...rawSteward, mode: cfg.loops.steward.mode ?? cfg.loops.steward.launch ?? 'shadow' } } : {}),
|
|
5794
|
+
...(cfg.loops.seat ? { seat: {
|
|
5795
|
+
mode: cfg.loops.seat.mode,
|
|
5796
|
+
questions: cfg.loops.seat.questions ?? 'shadow',
|
|
5797
|
+
seats: cfg.loops.seat.seats ?? ['MK'],
|
|
5798
|
+
podPool: cfg.loops.seat.podPool ?? 'pool-node-b@node-b:8',
|
|
5799
|
+
...(cfg.loops.seat.reportPr === undefined ? {} : { reportPr: cfg.loops.seat.reportPr }),
|
|
5800
|
+
} } : {}),
|
|
5620
5801
|
} } : {}),
|
|
5621
5802
|
...(cfg.autopilot ? { autopilot: {
|
|
5622
5803
|
...rawAutopilot,
|
|
@@ -5683,6 +5864,7 @@ export function saveUserConfig(
|
|
|
5683
5864
|
skills: stripUndef({
|
|
5684
5865
|
activeSet: cfg.skills.activeSet,
|
|
5685
5866
|
dirs: [...cfg.skills.dirs],
|
|
5867
|
+
giftEndpoint: cfg.skills.giftEndpoint === 'https://elanous.ai' ? undefined : cfg.skills.giftEndpoint,
|
|
5686
5868
|
// EN5 — only connected roots are persisted (preset/shared/package are derived). The dev-only `connected` key is not written back.
|
|
5687
5869
|
sources: cfg.skills.sources && cfg.skills.sources.some((source) => source.kind === 'connected')
|
|
5688
5870
|
? cfg.skills.sources.filter((source) => source.kind === 'connected').map(({ id, path, enabled }) => ({ id, path, enabled }))
|
|
@@ -5739,6 +5921,7 @@ export function saveUserConfig(
|
|
|
5739
5921
|
// 「직렬화 드롭」으로 조용히 사라졌다 — 운영 전환 스위치를 켤 방법이 없었다(07-22 botUsername 과 같은 모양).
|
|
5740
5922
|
poller: cfg.telegram.poller,
|
|
5741
5923
|
fieldDefaultEvent: cfg.telegram.fieldDefaultEvent,
|
|
5924
|
+
fieldReelMode: cfg.telegram.fieldReelMode,
|
|
5742
5925
|
}),
|
|
5743
5926
|
discord: stripUndef({
|
|
5744
5927
|
enabled: cfg.discord.enabled,
|
|
@@ -5773,6 +5956,7 @@ export function saveUserConfig(
|
|
|
5773
5956
|
}),
|
|
5774
5957
|
onboarding: stripUndef({
|
|
5775
5958
|
webFirst: cfg.onboarding.webFirst,
|
|
5959
|
+
ready: cfg.onboarding.ready,
|
|
5776
5960
|
completed: cfg.onboarding.completed,
|
|
5777
5961
|
completedAt: cfg.onboarding.completedAt,
|
|
5778
5962
|
version: cfg.onboarding.version,
|
|
@@ -5855,6 +6039,10 @@ export function saveUserConfig(
|
|
|
5855
6039
|
: undefined,
|
|
5856
6040
|
slashMaxTurns: cfg.acp.slashMaxTurns,
|
|
5857
6041
|
editApproval: cfg.acp.editApproval ? true : undefined,
|
|
6042
|
+
toolApproval: acpApprovalTimeoutMs(
|
|
6043
|
+
(cfg.raw?.acp as { toolApproval?: { timeoutMs?: unknown } } | undefined)?.toolApproval?.timeoutMs,
|
|
6044
|
+
) !== undefined || cfg.acp.toolApproval.timeoutMs !== (acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs)
|
|
6045
|
+
? { timeoutMs: cfg.acp.toolApproval.timeoutMs } : undefined,
|
|
5858
6046
|
scrubBillingEnv: cfg.acp.scrubBillingEnv === false ? false : undefined,
|
|
5859
6047
|
}),
|
|
5860
6048
|
lsp: stripUndef({
|
|
@@ -5933,12 +6121,13 @@ export function saveUserConfig(
|
|
|
5933
6121
|
...(cfg.tabs && Object.keys(cfg.tabs).length > 0 ? { tabs: cfg.tabs } : {}),
|
|
5934
6122
|
// M1-2b: sparse — emit only when explicitly set. Keeps Path-A-only
|
|
5935
6123
|
// users' file clean (no empty modelTier:{} blobs).
|
|
5936
|
-
...(cfg.modelTier ? { modelTier: cfg.modelTier } : {}),
|
|
6124
|
+
...(cfg.modelTier ? { modelTier: parseModelTierConfig(cfg.modelTier) } : {}),
|
|
5937
6125
|
...(cfg.sessionFabric ? { sessionFabric: cfg.sessionFabric } : {}),
|
|
5938
6126
|
...(cfg.nextFluent ? { nextFluent: cfg.nextFluent } : {}),
|
|
5939
6127
|
...(cfg.taste ? { taste: cfg.taste } : {}),
|
|
5940
6128
|
...(cfg.webSearch ? { webSearch: cfg.webSearch } : {}),
|
|
5941
6129
|
...(cfg.design ? { design: cfg.design } : {}),
|
|
6130
|
+
...(cfg.diagnostics?.uploadUrl ? { diagnostics: parseDiagnosticsConfig(cfg.diagnostics) } : {}),
|
|
5942
6131
|
...(cfg.budget ? { budget: cfg.budget } : {}),
|
|
5943
6132
|
...(cfg.smartDefaults ? { smartDefaults: cfg.smartDefaults } : {}),
|
|
5944
6133
|
...(cfg.grounding && cfg.grounding.sources.length > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"commit":"
|
|
1
|
+
{"commit":"e61a9846510a7f6ac0a0f223d8e4c8b384685df8"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { debug } from '../debug/log.js';
|
|
2
|
+
import type { ExecRequest } from '../exec-requests/store.js';
|
|
3
|
+
import { sendPushToAll } from './sender.js';
|
|
4
|
+
import { listSubscriptions } from './subscriptions.js';
|
|
5
|
+
|
|
6
|
+
export async function notifyExecRequestTransition(opts: {
|
|
7
|
+
id: string;
|
|
8
|
+
text: string;
|
|
9
|
+
from: ExecRequest['status'];
|
|
10
|
+
to: ExecRequest['status'];
|
|
11
|
+
summary?: string;
|
|
12
|
+
pendingApprovals: number;
|
|
13
|
+
}): Promise<void> {
|
|
14
|
+
const { id, text, from, to, summary, pendingApprovals } = opts;
|
|
15
|
+
const kind = from !== to && (to === 'done' || to === 'failed')
|
|
16
|
+
? to : pendingApprovals > 0 && from === to ? 'approval' : null;
|
|
17
|
+
if (!kind) return;
|
|
18
|
+
const subscribers = listSubscriptions().length;
|
|
19
|
+
const details = { id, kind, subscribers, textLength: text.length };
|
|
20
|
+
if (!subscribers) {
|
|
21
|
+
debug.log('webpush.exec', 'skipped', details);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const title = `${kind === 'done' ? '맡긴 일 완료' : kind === 'failed' ? '맡긴 일 실패' : '게시 승인 대기'} · ${text.slice(0, 40)}`;
|
|
25
|
+
const body = kind === 'approval' ? '승인하거나 보류해 주세요' : (summary ?? '').split(/\r?\n/, 1)[0]!.slice(0, 80);
|
|
26
|
+
try {
|
|
27
|
+
await sendPushToAll({ title, body, url: `/exec?id=${encodeURIComponent(id)}`, tag: `exec-${id}` });
|
|
28
|
+
debug.log('webpush.exec', 'sent', details);
|
|
29
|
+
} catch {
|
|
30
|
+
debug.log('webpush.exec', 'skipped', details);
|
|
31
|
+
}
|
|
32
|
+
}
|
package/src/web-search/grok.ts
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
import { getGrokApiKey } from '../config.js';
|
|
21
21
|
import { grokAgentSearch, GROK_SEARCH_MODEL } from '../grok/agent-search.js';
|
|
22
|
+
import { wantsXSearch } from './x-intent.js';
|
|
22
23
|
import type { WebSearchHit, WebSearchProvider, WebSearchResult } from './provider.js';
|
|
23
24
|
|
|
24
25
|
const DEFAULT_LIMIT = 5;
|
|
@@ -52,10 +53,15 @@ export function buildGrokWebSearchProvider(): WebSearchProvider {
|
|
|
52
53
|
|
|
53
54
|
if (!r.ok) throw new Error(r.error ?? 'grok search failed');
|
|
54
55
|
|
|
55
|
-
const
|
|
56
|
+
const xSourceUrls = new Set(r.xSearchSources ?? []);
|
|
57
|
+
const citations = wantsXSearch(q.query)
|
|
58
|
+
? [...r.citations.filter(c => xSourceUrls.has(c.url)), ...r.citations.filter(c => !xSourceUrls.has(c.url))]
|
|
59
|
+
: r.citations;
|
|
60
|
+
const hits: WebSearchHit[] = citations.slice(0, limit).map(c => ({
|
|
56
61
|
url: c.url,
|
|
57
62
|
title: c.title ?? c.url,
|
|
58
63
|
snippet: '',
|
|
64
|
+
...(xSourceUrls.has(c.url) ? { xSearchSource: true } : {}),
|
|
59
65
|
}));
|
|
60
66
|
|
|
61
67
|
const note = r.text.length > 0 ? r.text.slice(0, 1500) : undefined;
|