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/memory.ts
CHANGED
|
@@ -35,6 +35,7 @@ import { randomUUID, createHash } from 'node:crypto';
|
|
|
35
35
|
import { debug } from './debug/log.js';
|
|
36
36
|
import { estimateTokens } from './tokens.js';
|
|
37
37
|
import { budgetModel } from './llm/model-defaults.js';
|
|
38
|
+
import { getAppliedGlobalTestRoot } from './cli/test-flag.js';
|
|
38
39
|
|
|
39
40
|
/**
|
|
40
41
|
* 임시 파일 → fsync → rename → 폴더 fsync. rename 만으로는 «원자적»이지만 «내구적»이 아니다.
|
|
@@ -86,14 +87,16 @@ export interface MemoryEntry {
|
|
|
86
87
|
* Use for core / safety / reference-location facts that must always be
|
|
87
88
|
* in context. Costs tokens every turn, so keep pinned bodies short. */
|
|
88
89
|
pinned: boolean;
|
|
90
|
+
/** Optional pinned-memory freshness window; absent memories retain their original injection text. */
|
|
91
|
+
staleAfterMinutes?: number;
|
|
89
92
|
}
|
|
90
93
|
|
|
91
94
|
// ── Paths ────────────────────────────────────────────────────────────
|
|
92
95
|
|
|
93
96
|
export function memoryRoot(): string {
|
|
94
|
-
const base = process.env.XDG_DATA_HOME && process.env.XDG_DATA_HOME.trim()
|
|
97
|
+
const base = getAppliedGlobalTestRoot() ?? (process.env.XDG_DATA_HOME && process.env.XDG_DATA_HOME.trim()
|
|
95
98
|
? process.env.XDG_DATA_HOME
|
|
96
|
-
: join(homedir(), '.local', 'share');
|
|
99
|
+
: join(homedir(), '.local', 'share'));
|
|
97
100
|
return join(base, 'elanous', 'memory');
|
|
98
101
|
}
|
|
99
102
|
|
|
@@ -124,6 +127,12 @@ function parseFrontmatter(raw: string): { fm: Record<string, string>; body: stri
|
|
|
124
127
|
return { fm, body };
|
|
125
128
|
}
|
|
126
129
|
|
|
130
|
+
function parseStaleAfterMinutes(value: string | number | undefined): number | undefined {
|
|
131
|
+
if (value === undefined || value === '') return undefined;
|
|
132
|
+
const n = Number(value);
|
|
133
|
+
return Number.isFinite(n) && n > 0 ? n : undefined;
|
|
134
|
+
}
|
|
135
|
+
|
|
127
136
|
function renderFrontmatter(fm: Record<string, string>, body: string): string {
|
|
128
137
|
const lines = ['---'];
|
|
129
138
|
for (const [k, v] of Object.entries(fm)) lines.push(`${k}: ${v}`);
|
|
@@ -179,6 +188,8 @@ export interface SaveMemoryOpts {
|
|
|
179
188
|
priority?: number;
|
|
180
189
|
/** Always-inject (bypass keyword gate). Default false — or preserve on update. */
|
|
181
190
|
pinned?: boolean;
|
|
191
|
+
/** Pinned injection warns after this many minutes; preserved on update. */
|
|
192
|
+
staleAfterMinutes?: number;
|
|
182
193
|
/** Override the generated id (tests). */
|
|
183
194
|
id?: string;
|
|
184
195
|
}
|
|
@@ -195,16 +206,19 @@ export function saveMemory(opts: SaveMemoryOpts, root: string = memoryRoot()): M
|
|
|
195
206
|
let createdAt = now;
|
|
196
207
|
let existingPriority: number | undefined;
|
|
197
208
|
let existingPinned: boolean | undefined;
|
|
209
|
+
let existingStaleAfterMinutes: number | undefined;
|
|
198
210
|
if (existsSync(path)) {
|
|
199
211
|
try {
|
|
200
212
|
const parsed = parseFrontmatter(readFileSync(path, 'utf-8'));
|
|
201
213
|
if (parsed.fm.created) createdAt = parsed.fm.created;
|
|
202
214
|
if (parsed.fm.priority) existingPriority = parseInt(parsed.fm.priority, 10) || 0;
|
|
203
215
|
if (parsed.fm.pinned) existingPinned = parsed.fm.pinned === 'true';
|
|
216
|
+
existingStaleAfterMinutes = parseStaleAfterMinutes(parsed.fm['stale-after-minutes']);
|
|
204
217
|
} catch { /* keep new createdAt */ }
|
|
205
218
|
}
|
|
206
219
|
const priority = opts.priority ?? existingPriority ?? 0;
|
|
207
220
|
const pinned = opts.pinned ?? existingPinned ?? false;
|
|
221
|
+
const staleAfterMinutes = parseStaleAfterMinutes(opts.staleAfterMinutes) ?? existingStaleAfterMinutes;
|
|
208
222
|
const frontmatter: Record<string, string> = {
|
|
209
223
|
name: opts.name,
|
|
210
224
|
description: opts.description,
|
|
@@ -214,6 +228,7 @@ export function saveMemory(opts: SaveMemoryOpts, root: string = memoryRoot()): M
|
|
|
214
228
|
};
|
|
215
229
|
if (priority > 0) frontmatter.priority = String(Math.floor(priority));
|
|
216
230
|
if (pinned) frontmatter.pinned = 'true';
|
|
231
|
+
if (staleAfterMinutes !== undefined) frontmatter['stale-after-minutes'] = String(staleAfterMinutes);
|
|
217
232
|
const raw = renderFrontmatter(frontmatter, opts.body);
|
|
218
233
|
writeFileDurable(path, raw);
|
|
219
234
|
|
|
@@ -232,6 +247,7 @@ export function saveMemory(opts: SaveMemoryOpts, root: string = memoryRoot()): M
|
|
|
232
247
|
keywords: extractKeywords(`${opts.name} ${opts.description}`),
|
|
233
248
|
priority,
|
|
234
249
|
pinned,
|
|
250
|
+
staleAfterMinutes,
|
|
235
251
|
};
|
|
236
252
|
}
|
|
237
253
|
|
|
@@ -257,6 +273,7 @@ function parseMemoryFile(path: string): MemoryEntry | null {
|
|
|
257
273
|
keywords: extractKeywords(`${fm.name} ${fm.description ?? ''}`),
|
|
258
274
|
priority: fm.priority ? (parseInt(fm.priority, 10) || 0) : 0,
|
|
259
275
|
pinned: fm.pinned === 'true',
|
|
276
|
+
staleAfterMinutes: parseStaleAfterMinutes(fm['stale-after-minutes']),
|
|
260
277
|
};
|
|
261
278
|
}
|
|
262
279
|
|
|
@@ -432,6 +449,17 @@ export function readIndex(root: string = memoryRoot()): string {
|
|
|
432
449
|
|
|
433
450
|
// ── Injection heuristic ──────────────────────────────────────────────
|
|
434
451
|
|
|
452
|
+
function pinnedChunk(e: MemoryEntry): string {
|
|
453
|
+
const header = `### 📌 [${e.type}] ${e.name}\n\n`;
|
|
454
|
+
const body = (e.body || '').trim() || e.description;
|
|
455
|
+
const updated = Date.parse(e.updatedAt);
|
|
456
|
+
if (e.staleAfterMinutes === undefined || !Number.isFinite(updated)) return header + body;
|
|
457
|
+
const ageMinutes = (Date.now() - updated) / 60_000;
|
|
458
|
+
if (ageMinutes <= e.staleAfterMinutes) return header + body;
|
|
459
|
+
const hours = Math.floor(ageMinutes / 60);
|
|
460
|
+
return header + `⚠️ 이 기억은 ${hours}시간 전 것이다 — 답하기 전에 원장 도구 release_status(판 일정·칸) · decisions_pending(미결 결정) · ops_seats(자리 현황)로 다시 확인하고, 확인 전에는 «확인 중»이라고 말한다.\n${body}`;
|
|
461
|
+
}
|
|
462
|
+
|
|
435
463
|
export interface InjectionResult {
|
|
436
464
|
/** Markdown block to prepend to the system prompt (or '' when empty). */
|
|
437
465
|
block: string;
|
|
@@ -490,7 +518,7 @@ export function buildMemoryInjection(
|
|
|
490
518
|
const pinnedMems = listMemories({}, root).filter(m => m.pinned).sort((a, b) => b.priority - a.priority);
|
|
491
519
|
const pinnedParts: string[] = [];
|
|
492
520
|
for (const e of pinnedMems) {
|
|
493
|
-
const chunk =
|
|
521
|
+
const chunk = pinnedChunk(e);
|
|
494
522
|
const tok = estimateTokens(chunk);
|
|
495
523
|
if (usedTokens + tok > maxTokens) break;
|
|
496
524
|
pinnedParts.push(chunk);
|
|
@@ -653,7 +681,7 @@ export async function buildMemoryInjectionLLM(
|
|
|
653
681
|
const pinnedMems = listMemories({}, root).filter((m) => m.pinned).sort((a, b) => b.priority - a.priority);
|
|
654
682
|
const pinnedParts: string[] = [];
|
|
655
683
|
for (const e of pinnedMems) {
|
|
656
|
-
const chunk =
|
|
684
|
+
const chunk = pinnedChunk(e);
|
|
657
685
|
const tok = estimateTokens(chunk);
|
|
658
686
|
if (usedTokens + tok > maxTokens) break;
|
|
659
687
|
pinnedParts.push(chunk); injected.push(e.id); usedTokens += tok;
|
package/src/model-tier/index.ts
CHANGED
|
@@ -7,12 +7,12 @@ export {
|
|
|
7
7
|
MODEL_TIER_LABELS,
|
|
8
8
|
TTS_VOICE_CONTEXTS,
|
|
9
9
|
isModelTier,
|
|
10
|
-
|
|
10
|
+
isModelTierProfile,
|
|
11
11
|
isTtsVoiceContext,
|
|
12
12
|
modelTierRank,
|
|
13
13
|
type BudgetUserConfig,
|
|
14
14
|
type ModelTier,
|
|
15
|
-
type
|
|
15
|
+
type ModelTierProfile,
|
|
16
16
|
type ModelTierSurface,
|
|
17
17
|
type ModelTierUserConfig,
|
|
18
18
|
type ModelTierVoiceConfig,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// Precedence (high → low):
|
|
5
5
|
// 1. `modelTier.voice.stt` (per-surface override · §3.4a.1)
|
|
6
6
|
// 2. `modelTier.preset` (Phase 2 preset catalog · undefined today)
|
|
7
|
-
// 3. `modelTier.
|
|
7
|
+
// 3. `modelTier.profile`-based default (casual & power both ↦ Balanced
|
|
8
8
|
// today; Phase 3 can broaden)
|
|
9
9
|
// 4. DEFAULT_MODEL_TIER ('balanced')
|
|
10
10
|
//
|
|
@@ -40,7 +40,7 @@ export type SttTierSource =
|
|
|
40
40
|
| 'session-override'
|
|
41
41
|
| 'user-config-surface'
|
|
42
42
|
| 'preset'
|
|
43
|
-
| '
|
|
43
|
+
| 'profile'
|
|
44
44
|
| 'default';
|
|
45
45
|
|
|
46
46
|
export interface ResolvedSttTier extends SttTierSpec {
|
|
@@ -83,14 +83,14 @@ export function resolveSttTier(
|
|
|
83
83
|
};
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
// 3.
|
|
86
|
+
// 3. Profile-driven default — casual and power both land on
|
|
87
87
|
// Balanced today (PLAN §3.0.3). `custom` keeps the same default
|
|
88
88
|
// until an override or preset is set.
|
|
89
|
-
if (modelTier?.
|
|
89
|
+
if (modelTier?.profile) {
|
|
90
90
|
return {
|
|
91
91
|
...STT_TIER_MAP[DEFAULT_MODEL_TIER],
|
|
92
92
|
tier: DEFAULT_MODEL_TIER,
|
|
93
|
-
source: '
|
|
93
|
+
source: 'profile',
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
96
|
|
|
@@ -108,7 +108,7 @@ export type LlmTierSource =
|
|
|
108
108
|
| 'session-override'
|
|
109
109
|
| 'user-config-surface'
|
|
110
110
|
| 'preset'
|
|
111
|
-
| '
|
|
111
|
+
| 'profile'
|
|
112
112
|
| 'default';
|
|
113
113
|
|
|
114
114
|
export interface ResolvedLlmTier extends LlmTierSpec {
|
|
@@ -126,7 +126,7 @@ export type TtsTierSource =
|
|
|
126
126
|
| 'session-override'
|
|
127
127
|
| 'user-config-surface'
|
|
128
128
|
| 'preset'
|
|
129
|
-
| '
|
|
129
|
+
| 'profile'
|
|
130
130
|
| 'default';
|
|
131
131
|
|
|
132
132
|
export interface ResolvedTtsTier extends TtsTierSpec {
|
|
@@ -153,13 +153,13 @@ export function resolveTtsTier(
|
|
|
153
153
|
if (modelTier?.preset) {
|
|
154
154
|
return { ...TTS_TIER_MAP[DEFAULT_MODEL_TIER], tier: DEFAULT_MODEL_TIER, source: 'preset' };
|
|
155
155
|
}
|
|
156
|
-
if (modelTier?.
|
|
157
|
-
return { ...TTS_TIER_MAP[DEFAULT_MODEL_TIER], tier: DEFAULT_MODEL_TIER, source: '
|
|
156
|
+
if (modelTier?.profile) {
|
|
157
|
+
return { ...TTS_TIER_MAP[DEFAULT_MODEL_TIER], tier: DEFAULT_MODEL_TIER, source: 'profile' };
|
|
158
158
|
}
|
|
159
159
|
return { ...TTS_TIER_MAP[DEFAULT_MODEL_TIER], tier: DEFAULT_MODEL_TIER, source: 'default' };
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
/** Resolve LLM tier. Precedence mirrors STT (surface → preset →
|
|
162
|
+
/** Resolve LLM tier. Precedence mirrors STT (surface → preset → profile
|
|
163
163
|
* → default) — diverges only in that the resolver needs the active
|
|
164
164
|
* `llm.provider` to expand the tier ladder. */
|
|
165
165
|
export function resolveLlmTier(
|
|
@@ -196,12 +196,12 @@ export function resolveLlmTier(
|
|
|
196
196
|
provider,
|
|
197
197
|
};
|
|
198
198
|
}
|
|
199
|
-
// 3.
|
|
200
|
-
if (modelTier?.
|
|
199
|
+
// 3. Profile-driven default.
|
|
200
|
+
if (modelTier?.profile) {
|
|
201
201
|
return {
|
|
202
202
|
...lookupLlmTierSpec(provider, DEFAULT_MODEL_TIER),
|
|
203
203
|
tier: DEFAULT_MODEL_TIER,
|
|
204
|
-
source: '
|
|
204
|
+
source: 'profile',
|
|
205
205
|
provider,
|
|
206
206
|
};
|
|
207
207
|
}
|
|
@@ -220,7 +220,7 @@ export type EmbeddingTierSource =
|
|
|
220
220
|
| 'session-override'
|
|
221
221
|
| 'user-config-surface'
|
|
222
222
|
| 'preset'
|
|
223
|
-
| '
|
|
223
|
+
| 'profile'
|
|
224
224
|
| 'default';
|
|
225
225
|
|
|
226
226
|
export interface ResolvedEmbeddingTier extends EmbeddingTierSpec {
|
|
@@ -230,7 +230,7 @@ export interface ResolvedEmbeddingTier extends EmbeddingTierSpec {
|
|
|
230
230
|
}
|
|
231
231
|
|
|
232
232
|
/** Resolve the embedding tier. Same precedence chain as LLM: session
|
|
233
|
-
* override → per-surface (modelTier.embedding) → preset →
|
|
233
|
+
* override → per-surface (modelTier.embedding) → preset → profile →
|
|
234
234
|
* default. The provider is supplied by the caller — typical wiring
|
|
235
235
|
* reads `cfg.embedding?.provider` (future field) and falls back to
|
|
236
236
|
* 'openai'. */
|
|
@@ -273,11 +273,11 @@ export function resolveEmbeddingTier(
|
|
|
273
273
|
provider,
|
|
274
274
|
};
|
|
275
275
|
}
|
|
276
|
-
if (modelTier?.
|
|
276
|
+
if (modelTier?.profile) {
|
|
277
277
|
return {
|
|
278
278
|
...lookupEmbeddingTierSpec(provider, DEFAULT_MODEL_TIER),
|
|
279
279
|
tier: DEFAULT_MODEL_TIER,
|
|
280
|
-
source: '
|
|
280
|
+
source: 'profile',
|
|
281
281
|
provider,
|
|
282
282
|
};
|
|
283
283
|
}
|
|
@@ -295,7 +295,7 @@ export type VisionTierSource =
|
|
|
295
295
|
| 'session-override'
|
|
296
296
|
| 'user-config-surface'
|
|
297
297
|
| 'preset'
|
|
298
|
-
| '
|
|
298
|
+
| 'profile'
|
|
299
299
|
| 'default';
|
|
300
300
|
|
|
301
301
|
export interface ResolvedVisionTier extends VisionTierSpec {
|
|
@@ -337,11 +337,11 @@ export function resolveVisionTier(
|
|
|
337
337
|
provider,
|
|
338
338
|
};
|
|
339
339
|
}
|
|
340
|
-
if (modelTier?.
|
|
340
|
+
if (modelTier?.profile) {
|
|
341
341
|
return {
|
|
342
342
|
...lookupVisionTierSpec(provider, DEFAULT_MODEL_TIER),
|
|
343
343
|
tier: DEFAULT_MODEL_TIER,
|
|
344
|
-
source: '
|
|
344
|
+
source: 'profile',
|
|
345
345
|
provider,
|
|
346
346
|
};
|
|
347
347
|
}
|
package/src/model-tier/types.ts
CHANGED
|
@@ -61,15 +61,15 @@ export function modelTierRank(t: ModelTier): number {
|
|
|
61
61
|
* adds `llm` and `tts`. Embedding / vision land in Phase 3. */
|
|
62
62
|
export type ModelTierSurface = 'stt' | 'llm' | 'tts';
|
|
63
63
|
|
|
64
|
-
// ──
|
|
64
|
+
// ── Model tier profile ─────────────────────────────────────────────
|
|
65
65
|
|
|
66
|
-
/** Zero-config baseline (§3.0 of the PLAN) —
|
|
66
|
+
/** Zero-config baseline (§3.0 of the PLAN) — model tier profiles.
|
|
67
67
|
* - `casual`: never touches settings; surfaces minimal UI.
|
|
68
68
|
* - `power`: opens slider / picker / preset etc.
|
|
69
69
|
* - `custom`: preset or per-surface overrides decide. */
|
|
70
|
-
export type
|
|
70
|
+
export type ModelTierProfile = 'casual' | 'power' | 'custom';
|
|
71
71
|
|
|
72
|
-
export function
|
|
72
|
+
export function isModelTierProfile(v: unknown): v is ModelTierProfile {
|
|
73
73
|
return v === 'casual' || v === 'power' || v === 'custom';
|
|
74
74
|
}
|
|
75
75
|
|
|
@@ -112,9 +112,9 @@ export function isTtsVoiceContext(v: unknown): v is TtsVoiceContext {
|
|
|
112
112
|
|
|
113
113
|
/** Root `modelTier` sub-tree of UserConfig. Sparse — every field is
|
|
114
114
|
* optional so the resolver can fall through (surface override → preset
|
|
115
|
-
* →
|
|
115
|
+
* → profile → default). */
|
|
116
116
|
export interface ModelTierUserConfig {
|
|
117
|
-
|
|
117
|
+
profile?: ModelTierProfile;
|
|
118
118
|
preset?: string;
|
|
119
119
|
voice?: ModelTierVoiceConfig;
|
|
120
120
|
llm?: ModelTier;
|
|
@@ -125,6 +125,9 @@ export interface LogQuery {
|
|
|
125
125
|
/** event/data/category LIKE 부분 일치. */
|
|
126
126
|
grep?: string;
|
|
127
127
|
sessionId?: string;
|
|
128
|
+
/** Trace ownership: explicit row projectId takes precedence over session ownership. */
|
|
129
|
+
projectId?: string;
|
|
130
|
+
projectSessionIds?: readonly string[];
|
|
128
131
|
sinceMs?: number;
|
|
129
132
|
untilMs?: number;
|
|
130
133
|
/** 증분 커서 — id > afterId 를 오름차순으로(SSE 드레인). */
|
|
@@ -397,6 +400,18 @@ export class LogStore {
|
|
|
397
400
|
params.push(needle, needle, needle);
|
|
398
401
|
}
|
|
399
402
|
if (q.sessionId) { where.push('session_id = ?'); params.push(q.sessionId); }
|
|
403
|
+
if (q.projectId !== undefined) {
|
|
404
|
+
const sessionIds = [...new Set(q.projectSessionIds ?? [])];
|
|
405
|
+
// An explicit project tag wins, even if the row's session belongs to another project.
|
|
406
|
+
// Guard JSON extraction so malformed and absent payloads cannot match by accident.
|
|
407
|
+
const tagged = "CASE WHEN json_valid(data) THEN json_extract(data, '$.projectId') ELSE NULL END";
|
|
408
|
+
const session = "CASE WHEN json_valid(data) THEN json_extract(data, '$.sessionId') ELSE NULL END";
|
|
409
|
+
const untagged = "CASE WHEN json_valid(data) THEN json_type(data, '$.projectId') IS NULL ELSE 1 END";
|
|
410
|
+
where.push(`(${tagged} = ? OR (${untagged} AND (${sessionIds.length
|
|
411
|
+
? `session_id IN (${sessionIds.map(() => '?').join(',')}) OR ${session} IN (${sessionIds.map(() => '?').join(',')})`
|
|
412
|
+
: '0'})))`);
|
|
413
|
+
params.push(q.projectId, ...sessionIds, ...sessionIds);
|
|
414
|
+
}
|
|
400
415
|
if (q.sinceMs !== undefined) { where.push('ts_ms >= ?'); params.push(q.sinceMs); }
|
|
401
416
|
if (q.untilMs !== undefined) { where.push('ts_ms <= ?'); params.push(q.untilMs); }
|
|
402
417
|
if (q.afterId !== undefined) { where.push('id > ?'); params.push(q.afterId); }
|
|
@@ -39,7 +39,7 @@ function jsonResponse(body: unknown, status = 200): Response {
|
|
|
39
39
|
|
|
40
40
|
import {
|
|
41
41
|
isModelTier,
|
|
42
|
-
|
|
42
|
+
isModelTierProfile,
|
|
43
43
|
type BudgetUserConfig,
|
|
44
44
|
type ModelTier,
|
|
45
45
|
type ModelTierUserConfig,
|
|
@@ -74,9 +74,10 @@ function normalizeModelTier(v: unknown): ModelTierUserConfig | undefined | 'inva
|
|
|
74
74
|
if (!v || typeof v !== 'object' || Array.isArray(v)) return 'invalid';
|
|
75
75
|
const r = v as Record<string, unknown>;
|
|
76
76
|
const out: ModelTierUserConfig = {};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
const profile = r.profile === undefined ? r.persona : r.profile;
|
|
78
|
+
if (profile !== undefined) {
|
|
79
|
+
if (!isModelTierProfile(profile)) return 'invalid';
|
|
80
|
+
out.profile = profile;
|
|
80
81
|
}
|
|
81
82
|
if (r.preset !== undefined) {
|
|
82
83
|
if (typeof r.preset !== 'string' || r.preset.trim().length === 0) return 'invalid';
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { realpathSync, statSync } from 'node:fs';
|
|
2
|
+
import { extname, isAbsolute, join, sep } from 'node:path';
|
|
2
3
|
import { ExecRequestRunner } from '../../exec-requests/runner.js';
|
|
4
|
+
import type { ExecAttachment } from '../../exec-requests/store.js';
|
|
5
|
+
import { getElanousConfigDir } from '../../elanous-config-dir.js';
|
|
6
|
+
import { defaultAttachmentBaseDir } from '../../boot/attachment-store.js';
|
|
3
7
|
import { jsonResponse } from './json-response.js';
|
|
4
8
|
|
|
5
9
|
const mime: Record<string, string> = {
|
|
@@ -8,7 +12,21 @@ const mime: Record<string, string> = {
|
|
|
8
12
|
'.md': 'text/markdown; charset=utf-8', '.txt': 'text/plain; charset=utf-8',
|
|
9
13
|
};
|
|
10
14
|
|
|
11
|
-
|
|
15
|
+
function resolveAttachment(path: string, roots: string[]): string | null {
|
|
16
|
+
if (!isAbsolute(path)) return null;
|
|
17
|
+
try {
|
|
18
|
+
const real = realpathSync(path);
|
|
19
|
+
if (!statSync(real).isFile()) return null;
|
|
20
|
+
return roots.some(root => {
|
|
21
|
+
try {
|
|
22
|
+
const base = realpathSync(root);
|
|
23
|
+
return real.startsWith(`${base}${sep}`);
|
|
24
|
+
} catch { return false; }
|
|
25
|
+
}) ? real : null;
|
|
26
|
+
} catch { return null; }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function handleExecRequests(req: Request, runner: ExecRequestRunner, uploadDir = defaultAttachmentBaseDir(), fieldDir = join(getElanousConfigDir(), 'field')): Promise<Response> {
|
|
12
30
|
const path = new URL(req.url).pathname;
|
|
13
31
|
if (path === '/v1/exec-requests') {
|
|
14
32
|
if (req.method === 'POST') {
|
|
@@ -16,7 +34,19 @@ export async function handleExecRequests(req: Request, runner: ExecRequestRunner
|
|
|
16
34
|
try { body = await req.json(); } catch { return jsonResponse({ error: 'bad_request' }, 400); }
|
|
17
35
|
const text = body && typeof body === 'object' && !Array.isArray(body) ? (body as { text?: unknown }).text : undefined;
|
|
18
36
|
if (typeof text !== 'string' || !text.trim()) return jsonResponse({ error: 'bad_request', reason: 'text required' }, 400);
|
|
19
|
-
const
|
|
37
|
+
const supplied = (body as { attachments?: unknown }).attachments;
|
|
38
|
+
if (supplied !== undefined && (!Array.isArray(supplied) || supplied.some(entry =>
|
|
39
|
+
!entry || typeof entry !== 'object' || Array.isArray(entry)
|
|
40
|
+
|| typeof entry.name !== 'string' || !entry.name.trim() || typeof entry.path !== 'string'))) {
|
|
41
|
+
return jsonResponse({ error: 'bad_request', reason: 'attachments must be [{name,path}]' }, 400);
|
|
42
|
+
}
|
|
43
|
+
const roots = [uploadDir, fieldDir];
|
|
44
|
+
const resolved: Array<{ name: string; path: string | null }> | undefined = supplied?.map((entry: ExecAttachment) => ({
|
|
45
|
+
name: entry.name, path: resolveAttachment(entry.path, roots),
|
|
46
|
+
}));
|
|
47
|
+
if (resolved?.some(entry => !entry.path)) return jsonResponse({ error: 'attachment-outside' }, 400);
|
|
48
|
+
const attachments: ExecAttachment[] | undefined = resolved?.map(entry => ({ name: entry.name, path: entry.path! }));
|
|
49
|
+
const item = runner.submit(text.trim(), attachments);
|
|
20
50
|
return jsonResponse({ id: item.id, status: 'planning' }, 202);
|
|
21
51
|
}
|
|
22
52
|
if (req.method === 'GET') return jsonResponse({ items: runner.store.list().map(item => {
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { effectiveInstanceRoot } from '../../instance/resolve.js';
|
|
2
|
+
import {
|
|
3
|
+
approveFabricPlan,
|
|
4
|
+
createFabricPlan,
|
|
5
|
+
loadFabricPlan,
|
|
6
|
+
type FabricPlan,
|
|
7
|
+
} from '../../self-dev/fabric-plan-core.js';
|
|
8
|
+
import { jsonResponse } from './json-response.js';
|
|
9
|
+
|
|
10
|
+
export interface FabricPlansRouteOpts {
|
|
11
|
+
create?: (root: string, request: string) => Promise<FabricPlan>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** This route never launches a plan. Only approval writes the fabric execution-candidate ledger. */
|
|
15
|
+
export async function handleFabricPlans(req: Request, opts: FabricPlansRouteOpts = {}): Promise<Response> {
|
|
16
|
+
const pathname = new URL(req.url).pathname;
|
|
17
|
+
const root = effectiveInstanceRoot();
|
|
18
|
+
if (pathname === '/v1/fabric/decompose') {
|
|
19
|
+
if (req.method !== 'POST') return jsonResponse({ error: 'method-not-allowed' }, 405);
|
|
20
|
+
let body: unknown;
|
|
21
|
+
try { body = await req.json(); }
|
|
22
|
+
catch { return jsonResponse({ error: 'invalid_json' }, 400); }
|
|
23
|
+
const request = body && typeof body === 'object' && !Array.isArray(body)
|
|
24
|
+
? (body as Record<string, unknown>).request : undefined;
|
|
25
|
+
if (typeof request !== 'string' || !request.trim()) return jsonResponse({ error: 'invalid_request' }, 400);
|
|
26
|
+
try {
|
|
27
|
+
const plan = await (opts.create ?? createFabricPlan)(root, request);
|
|
28
|
+
return jsonResponse({ plan }, 201);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
return jsonResponse({ error: 'decomposition_failed', reason: error instanceof Error ? error.message : String(error) }, 422);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const match = /^\/v1\/fabric\/plans\/([^/]+)(\/approve)?$/.exec(pathname);
|
|
34
|
+
if (!match) return jsonResponse({ error: 'not-found' }, 404);
|
|
35
|
+
let id: string;
|
|
36
|
+
try { id = decodeURIComponent(match[1]!); }
|
|
37
|
+
catch { return jsonResponse({ error: 'invalid_plan_id' }, 400); }
|
|
38
|
+
if (!/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(id)) return jsonResponse({ error: 'invalid_plan_id' }, 400);
|
|
39
|
+
if (!match[2]) {
|
|
40
|
+
if (req.method !== 'GET') return jsonResponse({ error: 'method-not-allowed' }, 405);
|
|
41
|
+
const plan = loadFabricPlan(root, id);
|
|
42
|
+
return plan ? jsonResponse({ plan }) : jsonResponse({ error: 'not-found' }, 404);
|
|
43
|
+
}
|
|
44
|
+
if (req.method !== 'POST') return jsonResponse({ error: 'method-not-allowed' }, 405);
|
|
45
|
+
// The ledger transition is atomic and rejects a second approval; no draft is executable.
|
|
46
|
+
try {
|
|
47
|
+
return jsonResponse({ candidate: approveFabricPlan(root, id) });
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (error instanceof Error && error.message.startsWith('fabric plan not found:')) return jsonResponse({ error: 'not-found' }, 404);
|
|
50
|
+
if (error instanceof Error && error.message === 'fabric plan already approved') return jsonResponse({ error: 'already-approved' }, 409);
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -19,6 +19,7 @@ import { resolveHarnessTarget } from '../../self-implement/harness-target-option
|
|
|
19
19
|
import { queryRunningRuns, type RunningRunsResult } from '../../self-implement/running-runs.js';
|
|
20
20
|
import { getDefaultLogStore, type LogStore } from '../../mss/logging/log-store.js';
|
|
21
21
|
import { createSeqTracker, makeEnvelope, type FeedbackEnvelope } from '../../feedback/envelope.js';
|
|
22
|
+
import { publishInsideEvent } from './inside-events.js';
|
|
22
23
|
|
|
23
24
|
const JSON_HEADERS = { 'content-type': 'application/json; charset=utf-8' };
|
|
24
25
|
const ASK_USAGE = 'usage: POST /v1/harness/ask with JSON body {"text":"<ask>"} — optional "target":"<path>" (홈 안의 git repo·디렉터리·파일)';
|
|
@@ -248,7 +249,10 @@ export async function handleHarnessAskPost(req: Request, _metaApi: HarnessMetaAp
|
|
|
248
249
|
}
|
|
249
250
|
|
|
250
251
|
const acceptanceId = deps.createAcceptanceId?.() ?? crypto.randomUUID();
|
|
251
|
-
const log =
|
|
252
|
+
const log = (event: string, data: Record<string, unknown>) => {
|
|
253
|
+
(deps.log ?? ((name: string, payload: Record<string, unknown>) => debug.log('harness-http', name, payload)))(event, data);
|
|
254
|
+
publishInsideEvent({ ...data, kind: 'harness-run', event });
|
|
255
|
+
};
|
|
252
256
|
const suppliedOrigin = (body as { origin?: unknown }).origin;
|
|
253
257
|
const origin = suppliedOrigin === undefined ? null
|
|
254
258
|
: readReportOrigin({ [REPORT_ORIGIN_ENV]: JSON.stringify(suppliedOrigin) });
|
package/src/nexus/api/health.ts
CHANGED
|
@@ -128,6 +128,8 @@ export function handleHealth(
|
|
|
128
128
|
universeRoot: safeUniverseRoot(),
|
|
129
129
|
testUniverse: safeTestUniverse(),
|
|
130
130
|
bindHost: safeBindHost(bind),
|
|
131
|
+
// W4 — POST /v1/workflows/:name/run understands onlyNode · fromNode+fromRunId · mode (PWA enables its run-mode buttons on this).
|
|
132
|
+
workflowRunModes: true as const,
|
|
131
133
|
...(setup?.mode === true
|
|
132
134
|
? { setupMode: true as const, setupMissing: setup.missing }
|
|
133
135
|
: {}),
|