@litfamily/lithermes 1.0.0
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/LICENSE +21 -0
- package/README.md +186 -0
- package/README_Ko-KR.md +188 -0
- package/assets/lithermes-plugin/NOTICE.md +46 -0
- package/assets/lithermes-plugin/README.md +390 -0
- package/assets/lithermes-plugin/__init__.py +589 -0
- package/assets/lithermes-plugin/auto_update.py +338 -0
- package/assets/lithermes-plugin/bounded_work.py +1120 -0
- package/assets/lithermes-plugin/bounded_work_tools.py +115 -0
- package/assets/lithermes-plugin/core.py +1813 -0
- package/assets/lithermes-plugin/core_commands.py +243 -0
- package/assets/lithermes-plugin/core_contexts.py +458 -0
- package/assets/lithermes-plugin/core_contract.py +456 -0
- package/assets/lithermes-plugin/core_plans.py +418 -0
- package/assets/lithermes-plugin/core_reader_args.py +34 -0
- package/assets/lithermes-plugin/core_recap_command.py +141 -0
- package/assets/lithermes-plugin/core_recap_state.py +175 -0
- package/assets/lithermes-plugin/core_review.py +198 -0
- package/assets/lithermes-plugin/core_routing.py +641 -0
- package/assets/lithermes-plugin/core_runs.py +283 -0
- package/assets/lithermes-plugin/core_runtime.py +251 -0
- package/assets/lithermes-plugin/core_workflow_commands.py +207 -0
- package/assets/lithermes-plugin/deliverable_hedge_guard.py +562 -0
- package/assets/lithermes-plugin/diagnostics.py +468 -0
- package/assets/lithermes-plugin/handoff.py +97 -0
- package/assets/lithermes-plugin/knowledge.py +920 -0
- package/assets/lithermes-plugin/knowledge_tools.py +130 -0
- package/assets/lithermes-plugin/lit_mark.py +140 -0
- package/assets/lithermes-plugin/lit_mark_rows.json +1363 -0
- package/assets/lithermes-plugin/litgoal/__init__.py +10 -0
- package/assets/lithermes-plugin/litgoal/cli.py +207 -0
- package/assets/lithermes-plugin/litgoal/hook.py +81 -0
- package/assets/lithermes-plugin/litgoal/model.py +203 -0
- package/assets/lithermes-plugin/litgoal/runtime.py +522 -0
- package/assets/lithermes-plugin/litgoal/store.py +367 -0
- package/assets/lithermes-plugin/litgoal/tools.py +300 -0
- package/assets/lithermes-plugin/output-styles/asd-ste100-ko.md +41 -0
- package/assets/lithermes-plugin/output-styles/asd-ste100.md +40 -0
- package/assets/lithermes-plugin/output-styles/eli5-ko.md +13 -0
- package/assets/lithermes-plugin/output-styles/eli5.md +11 -0
- package/assets/lithermes-plugin/output_styles.py +62 -0
- package/assets/lithermes-plugin/payload-version.json +2107 -0
- package/assets/lithermes-plugin/plugin.yaml +16 -0
- package/assets/lithermes-plugin/provider_metrics.py +161 -0
- package/assets/lithermes-plugin/redaction.py +148 -0
- package/assets/lithermes-plugin/rules/__init__.py +55 -0
- package/assets/lithermes-plugin/rules/bundled-rules/baseline-discipline.md +20 -0
- package/assets/lithermes-plugin/rules/bundled-rules/build-decision-gate.md +19 -0
- package/assets/lithermes-plugin/rules/bundled-rules/windows-git-bash.md +17 -0
- package/assets/lithermes-plugin/rules/constants.py +122 -0
- package/assets/lithermes-plugin/rules/discovery.py +276 -0
- package/assets/lithermes-plugin/rules/engine.py +447 -0
- package/assets/lithermes-plugin/rules/frontmatter.py +149 -0
- package/assets/lithermes-plugin/rules/globmatch.py +333 -0
- package/assets/lithermes-plugin/scientific_visualization.py +158 -0
- package/assets/lithermes-plugin/session_context.py +8 -0
- package/assets/lithermes-plugin/skill_loop.py +2044 -0
- package/assets/lithermes-plugin/skill_observer.py +1778 -0
- package/assets/lithermes-plugin/skills/autoconference/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/autoconference/ORIGIN.json +11 -0
- package/assets/lithermes-plugin/skills/autoconference/SKILL.md +163 -0
- package/assets/lithermes-plugin/skills/autoconference/assets/conference_template.md +76 -0
- package/assets/lithermes-plugin/skills/autoconference/assets/report_template.md +53 -0
- package/assets/lithermes-plugin/skills/autoconference/assets/synthesis_template.md +39 -0
- package/assets/lithermes-plugin/skills/autoconference/dependencies/autoresearch.md +14 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/analyze/SKILL.md +269 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/core/SKILL.md +134 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/core/convergence-guide.md +162 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/core/crash-recovery.md +63 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/debate/SKILL.md +383 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/plan/SKILL.md +304 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/resume/SKILL.md +82 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/ship/SKILL.md +78 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/survey/SKILL.md +376 -0
- package/assets/lithermes-plugin/skills/autoconference/references/agent-prompts.md +110 -0
- package/assets/lithermes-plugin/skills/autoconference/references/conference-protocol.md +90 -0
- package/assets/lithermes-plugin/skills/autoconference/references/core-principles.md +78 -0
- package/assets/lithermes-plugin/skills/autoconference/references/results-logging.md +165 -0
- package/assets/lithermes-plugin/skills/autoconference/references/visualization-guide.md +99 -0
- package/assets/lithermes-plugin/skills/autoconference/scripts/check_conference.sh +197 -0
- package/assets/lithermes-plugin/skills/autoconference/scripts/init_conference.py +489 -0
- package/assets/lithermes-plugin/skills/autoconference/scripts/style_presets.py +104 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/code-performance.md +59 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/debate-mode.md +50 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/prompt-optimization.md +58 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/quick-conference.md +48 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/research-synthesis.md +56 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/survey-mode.md +63 -0
- package/assets/lithermes-plugin/skills/autoresearch/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/autoresearch/ORIGIN.json +11 -0
- package/assets/lithermes-plugin/skills/autoresearch/SKILL.md +175 -0
- package/assets/lithermes-plugin/skills/autoresearch/assets/report_template.md +50 -0
- package/assets/lithermes-plugin/skills/autoresearch/assets/research_template.md +38 -0
- package/assets/lithermes-plugin/skills/autoresearch/assets/results_template.tsv +2 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/core/SKILL.md +204 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/core/evaluator-contract.md +108 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/core/stuck-detection.md +102 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/debug/SKILL.md +240 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/debug/investigation-techniques.md +254 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/fix/SKILL.md +176 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/learn/SKILL.md +96 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/plan/SKILL.md +291 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/predict/SKILL.md +271 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/predict/persona-templates.md +227 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/reason/SKILL.md +174 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/scenario/SKILL.md +168 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/scenario/dimensions.md +173 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/security/SKILL.md +287 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/security/owasp-checklist.md +156 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/security/stride-model.md +191 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/ship/SKILL.md +99 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/ship/type-checklists.md +158 -0
- package/assets/lithermes-plugin/skills/autoresearch/references/core-principles.md +75 -0
- package/assets/lithermes-plugin/skills/autoresearch/references/results-logging.md +55 -0
- package/assets/lithermes-plugin/skills/autoresearch/references/visualization-guide.md +90 -0
- package/assets/lithermes-plugin/skills/autoresearch/scripts/check_progress.sh +139 -0
- package/assets/lithermes-plugin/skills/autoresearch/scripts/init_research.py +219 -0
- package/assets/lithermes-plugin/skills/autoresearch/scripts/style_presets.py +104 -0
- package/assets/lithermes-plugin/skills/browser-drive/SKILL.md +147 -0
- package/assets/lithermes-plugin/skills/browser-drive/scripts/capability_probe.py +528 -0
- package/assets/lithermes-plugin/skills/comment-checker/SKILL.md +162 -0
- package/assets/lithermes-plugin/skills/debugging/SKILL.md +271 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/00-setup.md +108 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/02-investigate.md +122 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/04-oracle-triple.md +136 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/05-escalate.md +69 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/06-fix.md +116 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/08-qa.md +94 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/09-cleanup.md +164 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/partial-runtime-evidence.md +229 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/go.md +252 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/native-binary.md +484 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/node.md +260 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/python.md +248 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/rust.md +234 -0
- package/assets/lithermes-plugin/skills/debugging/references/tools/ghidra.md +212 -0
- package/assets/lithermes-plugin/skills/debugging/references/tools/playwright-cli.md +194 -0
- package/assets/lithermes-plugin/skills/debugging/references/tools/pwndbg.md +263 -0
- package/assets/lithermes-plugin/skills/debugging/references/tools/pwntools.md +265 -0
- package/assets/lithermes-plugin/skills/deep-interview/SKILL.md +419 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/SKILL.md +49 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/.gitattributes +2 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/README.md +248 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/_INDEX.md +191 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/airbnb.md +393 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/airtable.md +92 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/apple.md +250 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/aside.md +209 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/binance.md +348 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/bmw.md +183 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/brutalist-skill.md +92 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/bugatti.md +271 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/cal.md +262 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/claude.md +315 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/clay.md +307 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/clickhouse.md +284 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/clone-from-url.md +65 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/cohere.md +269 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/coinbase.md +132 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/composio.md +310 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/cursor.md +312 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/design-system-architecture.md +244 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/elevenlabs.md +268 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/expo.md +284 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/ferrari.md +317 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/figma.md +223 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/framer.md +249 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/gpt-tasteskill.md +74 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/hashicorp.md +281 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/ibm.md +335 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/image-to-code-skill.md +1228 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/imagegen-brandkit.md +798 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/imagegen-frontend-mobile.md +1465 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/imagegen-frontend-web.md +987 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/intercom.md +149 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/kraken.md +128 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/lamborghini.md +291 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/layout-skill.md +107 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/lazyweb.md +77 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/linear.app.md +370 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/lovable.md +301 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mastercard.md +368 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/meta.md +369 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/minimalist-skill.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/minimax.md +260 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mintlify.md +329 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/miro.md +111 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mistral.ai.md +264 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mongodb.md +269 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/nike.md +366 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/notion.md +312 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/nvidia.md +296 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/ollama.md +270 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/opencode.ai.md +284 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/output-skill.md +49 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/pinterest.md +233 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/playstation.md +367 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/posthog.md +259 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/raycast.md +271 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/react-dev-tooling-skill.md +230 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/redesign-skill.md +178 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/renault.md +314 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/replicate.md +264 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/resend.md +306 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/revolut.md +188 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/runwayml.md +247 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/sanity.md +360 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/sentry.md +265 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/shopify.md +353 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/soft-skill.md +98 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/spacex.md +197 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/spotify.md +249 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/starbucks.md +583 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/stitch-design-example.md +121 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/stitch-skill.md +184 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/stripe.md +325 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/supabase.md +258 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/superhuman.md +255 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/taste-skill.md +1206 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/tesla.md +289 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/theverge.md +342 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/together.ai.md +266 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/uber.md +298 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/vercel.md +313 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/vodafone.md +426 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/voltagent.md +326 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/warp.md +256 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/webflow.md +95 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/wired.md +281 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/wise.md +176 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/x.ai.md +260 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/zapier.md +331 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/EVIDENCE.md +97 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/README.md +48 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/UPSTREAM.md +80 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-a-direction.md +64 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-b-execution.md +65 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-c-review.md +65 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-d-memory.md +83 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/orchestration.md +80 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/routing.md +79 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/content-writer.md +132 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-builder.md +109 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-critic.md +89 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-lead.md +113 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-scout.md +78 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-strategist.md +121 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/inspiration-scout.md +107 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/motion-designer.md +120 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/accessible-content/reference.md +101 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/adaptive-interfaces/reference.md +109 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/cognitive-accessibility/reference.md +107 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-debate/reference.md +199 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-debt-tracker/reference.md +174 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-handoff/reference.md +125 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-md/reference.md +106 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-retrospective/reference.md +266 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-review/reference.md +123 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-system-alignment/reference.md +120 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/designpowers-critique/reference.md +164 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/heuristic-evaluation/reference.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/inclusive-personas/reference.md +98 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/inspiration-scouting/reference.md +165 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/interaction-design/reference.md +122 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/motion-choreography/reference.md +81 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/research-planning/reference.md +96 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/responsive-patterns/reference.md +77 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/synthetic-user-testing/reference.md +192 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/taste-feedback/reference.md +165 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/taste-report/reference.md +78 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/token-architecture/reference.md +75 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/ui-composition/reference.md +117 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/usability-testing/reference.md +78 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/verification-before-shipping/reference.md +125 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/voice-and-tone/reference.md +79 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/writing-design-plans/reference.md +119 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/perfection/README.md +160 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/perfection/react-perf-tooling.md +127 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/README.md +659 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/charts.csv +26 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/colors.csv +162 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/icons.csv +106 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/landing.csv +35 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/products.csv +162 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/react-performance.csv +45 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/astro.csv +54 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/flutter.csv +53 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/html-tailwind.csv +56 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/jetpack-compose.csv +53 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/nextjs.csv +53 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/nuxt-ui.csv +51 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/nuxtjs.csv +59 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/react-native.csv +52 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/react.csv +54 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/shadcn.csv +61 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/svelte.csv +54 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/swiftui.csv +51 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/vue.csv +50 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/styles.csv +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/typography.csv +74 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/ui-reasoning.csv +162 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/ux-guidelines.csv +100 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/web-interface.csv +31 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/scripts/core.py +262 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/scripts/design_system.py +1148 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/scripts/search.py +114 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/legal/ATTRIBUTION.md +217 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/legal/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/legal/LICENSE-Apache-2.0.txt +201 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/manifest.json +876 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/adaptive-layout.md +81 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/brand-and-imagery.md +84 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +457 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/composition.md +89 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/creative-directions.md +81 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/evidence-review.md +113 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/implementation-platforms.md +92 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/inclusive-interface.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/interaction-motion.md +87 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/operating-lanes.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/performance-delivery.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/product-direction.md +86 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/redesign-playbook.md +91 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/system-foundations.md +82 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/taste-direction.md +86 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-language.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-reconstruction.md +94 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/PROVENANCE.json +38 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/THIRD-PARTY-NOTICE.txt +14 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/design-intelligence.json +1 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/import-manifest.json +1060 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/schemas/design-contract-v1alpha1.schema.json +264 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/schemas/design-contract-v1beta1.schema.json +268 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/schemas/design-contract-v1beta2.schema.json +280 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design_contract_validation.py +996 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design_intelligence.py +128 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design_runtime.py +98 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/import_design_intelligence.py +56 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/source_import.py +144 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/source_manifest.py +65 -0
- package/assets/lithermes-plugin/skills/lit-burnoff/SKILL.md +448 -0
- package/assets/lithermes-plugin/skills/lit-burnoff-file/SKILL.md +254 -0
- package/assets/lithermes-plugin/skills/lit-code/SKILL.md +609 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/README.md +90 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/backend-stack.md +641 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/bootstrap.md +328 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/bubbletea-v2.md +359 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/cobra-stack.md +468 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/concurrency.md +362 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/data-modeling.md +329 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/error-handling.md +359 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/golangci-strict.md +236 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/grpc-connect.md +375 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/libraries.md +337 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/one-liners.md +202 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/sqlc-pgx.md +471 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/testing.md +467 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/type-patterns.md +298 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/README.md +314 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/async-anyio.md +442 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/data-modeling.md +233 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/data-processing.md +133 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/error-handling.md +218 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/fastapi-stack.md +316 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/httpx2-optimization.md +360 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/libraries.md +307 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/one-liners.md +268 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/orjson-stack.md +378 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/pydantic-ai.md +285 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/pyproject-strict.md +232 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/textual-tui.md +201 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/type-patterns.md +176 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/README.md +317 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/async-tokio.md +299 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/axum-stack.md +467 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/cargo-strict.md +317 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/clap-stack.md +409 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/concurrency.md +375 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/libraries.md +439 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/one-liners.md +291 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/proptest-insta.md +429 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/type-state.md +354 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/unsafe-discipline.md +250 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/zero-cost-safety.md +527 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust-ub/README.md +289 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust-ub/miri-sanitizers-loom.md +411 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust-ub/ub-taxonomy.md +269 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/README.md +195 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/backend-hono.md +672 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/bootstrap.md +199 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/data-modeling.md +202 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/error-handling.md +169 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/tsconfig-strict.md +152 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/type-patterns.md +196 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/check-no-excuse-rules.sh +173 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/new-project.py +138 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/.editorconfig +13 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/.golangci.yml +95 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/AGENTS.md.tmpl +24 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/README.md.tmpl +12 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/Taskfile.yml +40 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/ci.yml +37 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/config.go +24 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/gitignore +15 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/main.go.tmpl +22 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/run.go +15 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/python/check-no-excuse-rules.py +687 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/python/new-project.py +172 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/python/new-script.py +116 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/rust/check-no-excuse-rules.py +296 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/rust/check-no-excuse-rules.sh +158 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/rust/new-project.py +175 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/typescript/check-no-excuse-rules.ts +282 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/typescript/new-project.ts +177 -0
- package/assets/lithermes-plugin/skills/lit-commit/SKILL.md +242 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/SKILL.md +259 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/assets/explainer-scaffold.html +123 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/references/artifact-template.md +205 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/references/micro-worlds.md +139 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/scripts/verify-explainer.py +324 -0
- package/assets/lithermes-plugin/skills/lit-crucible/SKILL.md +315 -0
- package/assets/lithermes-plugin/skills/lit-handoff/ORIGIN.json +23 -0
- package/assets/lithermes-plugin/skills/lit-handoff/SKILL.md +145 -0
- package/assets/lithermes-plugin/skills/lit-init/SKILL.md +329 -0
- package/assets/lithermes-plugin/skills/lit-korean/SKILL.md +237 -0
- package/assets/lithermes-plugin/skills/lit-korean/references/quick-rules.md +24 -0
- package/assets/lithermes-plugin/skills/lit-korean/references/safety-checklist.md +23 -0
- package/assets/lithermes-plugin/skills/lit-plan/SKILL.md +596 -0
- package/assets/lithermes-plugin/skills/lit-recap/SKILL.md +183 -0
- package/assets/lithermes-plugin/skills/lit-scientific-visualization/ORIGIN.json +32 -0
- package/assets/lithermes-plugin/skills/lit-scientific-visualization/SKILL.md +170 -0
- package/assets/lithermes-plugin/skills/litgoal/.gitkeep +0 -0
- package/assets/lithermes-plugin/skills/litgoal/SKILL.md +372 -0
- package/assets/lithermes-plugin/skills/litresearch/ATTRIBUTION.md +50 -0
- package/assets/lithermes-plugin/skills/litresearch/SKILL.md +593 -0
- package/assets/lithermes-plugin/skills/litwork/SKILL.md +419 -0
- package/assets/lithermes-plugin/skills/lsp/SKILL.md +165 -0
- package/assets/lithermes-plugin/skills/lsp-setup/SKILL.md +265 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/bash/README.md +68 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/c-cpp/README.md +78 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/csharp/README.md +90 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/dart/README.md +59 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/elixir/README.md +61 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/go/README.md +63 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/haskell/README.md +69 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/java/README.md +70 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/julia/README.md +70 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/kotlin/README.md +72 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/lua/README.md +68 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/php/README.md +61 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/python/README.md +73 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/ruby/README.md +67 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/rust/README.md +65 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/swift/README.md +64 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/terraform/README.md +66 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/typescript/README.md +82 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/yaml/README.md +65 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/zig/README.md +59 -0
- package/assets/lithermes-plugin/skills/lsp-setup/scripts/detect-lsp.ts +221 -0
- package/assets/lithermes-plugin/skills/lsp-setup/scripts/lsp-server-table.ts +146 -0
- package/assets/lithermes-plugin/skills/lsp-setup/scripts/tsconfig.json +18 -0
- package/assets/lithermes-plugin/skills/lsp-setup/scripts/verify-lsp.ts +252 -0
- package/assets/lithermes-plugin/skills/refactor/SKILL.md +896 -0
- package/assets/lithermes-plugin/skills/review-work/SKILL.md +450 -0
- package/assets/lithermes-plugin/skills/rules/SKILL.md +194 -0
- package/assets/lithermes-plugin/skills/skill-observer/SKILL.md +190 -0
- package/assets/lithermes-plugin/skills/skill-observer/references/review-contract.md +77 -0
- package/assets/lithermes-plugin/skills/start-work/SKILL.md +550 -0
- package/assets/lithermes-plugin/skills/structural-search/SKILL.md +274 -0
- package/assets/lithermes-plugin/skills/visual-qa/SKILL.md +48 -0
- package/assets/lithermes-plugin/skills/visual-qa/references/capture-playbook.md +133 -0
- package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +522 -0
- package/assets/lithermes-plugin/skills/visual-qa/schemas/evidence-manifest-v1alpha1.schema.json +135 -0
- package/assets/lithermes-plugin/skills/visual-qa/schemas/evidence-manifest-v1beta1.schema.json +110 -0
- package/assets/lithermes-plugin/skills/visual-qa/schemas/review-receipt-v1alpha1.schema.json +49 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/contract_checks.py +71 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/evidence_contract.py +288 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/png_runtime.py +379 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/review_contract.py +151 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/tier_checks.py +190 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/tier_contract.py +103 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/tui_runtime.py +170 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/visual_contracts.py +31 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/visual_qa.py +79 -0
- package/assets/lithermes-plugin/skills/wikify/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/wikify/ORIGIN.json +12 -0
- package/assets/lithermes-plugin/skills/wikify/SKILL.md +192 -0
- package/assets/lithermes-plugin/skills/wikify/assets/home-template.md +44 -0
- package/assets/lithermes-plugin/skills/wikify/assets/maintenance-report-template.md +46 -0
- package/assets/lithermes-plugin/skills/wikify/assets/paper-source-note-template.md +138 -0
- package/assets/lithermes-plugin/skills/wikify/assets/source-note-template.md +45 -0
- package/assets/lithermes-plugin/skills/wikify/assets/wiki-rules-template.md +117 -0
- package/assets/lithermes-plugin/skills/wikify/modes/ingest/SKILL.md +24 -0
- package/assets/lithermes-plugin/skills/wikify/modes/init/SKILL.md +26 -0
- package/assets/lithermes-plugin/skills/wikify/modes/lint/SKILL.md +30 -0
- package/assets/lithermes-plugin/skills/wikify/modes/query/SKILL.md +22 -0
- package/assets/lithermes-plugin/skills/wikify/modes/save/SKILL.md +32 -0
- package/assets/lithermes-plugin/skills/wikify/references/full-contract.md +761 -0
- package/assets/lithermes-plugin/uiux_runtime_common.py +117 -0
- package/assets/lithermes-plugin/vendor/NOTICE.md +21 -0
- package/assets/lithermes-plugin/vendor/handoff/SKILL.md +199 -0
- package/assets/lithermes-plugin/vendor/handoff/evals/evals.json +154 -0
- package/assets/lithermes-plugin/vendor/handoff/examples/HANDOFF-example-generic-auth-refactor.md +97 -0
- package/assets/lithermes-plugin/vendor/handoff/templates/HANDOFF.md +121 -0
- package/assets/lithermes-plugin/vendor/licenses/022_handoff-MIT.txt +21 -0
- package/assets/lithermes-plugin/vendor/licenses/045_scientific-visualization-MIT.txt +21 -0
- package/assets/lithermes-plugin/vendor/provenance/022_handoff.md +16 -0
- package/assets/lithermes-plugin/vendor/provenance/045_scientific-visualization.md +18 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/SKILL.md +283 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/assets/color_palettes.py +197 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/assets/nature.mplstyle +75 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/assets/presentation.mplstyle +74 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/assets/publication.mplstyle +78 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/evals/evals.json +158 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/color_palettes.md +380 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/journal_requirements.md +359 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/matplotlib_examples.md +608 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/mdanalysis_martini_visualization.md +85 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/publication_guidelines.md +217 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/seaborn_for_publications.md +293 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/scripts/figure_export.py +238 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/scripts/style_presets.py +467 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/tests/test_figure_export.py +51 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/tests/test_style_presets.py +114 -0
- package/bin/lithermes.js +8 -0
- package/package.json +58 -0
- package/readme-assets/badge-license.svg +1 -0
- package/readme-assets/badge-version.svg +1 -0
- package/readme-assets/cover.webp +0 -0
- package/readme-assets/lithermes-clay-icon.png +0 -0
- package/readme-assets/lithermes-wordmark.svg +5 -0
- package/src/cli.js +396 -0
- package/src/lib/autoUpdate.js +4 -0
- package/src/lib/canonicalCorpus.js +436 -0
- package/src/lib/check.js +200 -0
- package/src/lib/config.js +229 -0
- package/src/lib/files.js +126 -0
- package/src/lib/hermesDiscovery.js +122 -0
- package/src/lib/hud.js +135 -0
- package/src/lib/install.js +559 -0
- package/src/lib/litMark.js +68 -0
- package/src/lib/modelConfig.js +431 -0
- package/src/lib/modelConfigBoundary.js +206 -0
- package/src/lib/modelPrompt.js +201 -0
- package/src/lib/modelRoutePolicy.js +379 -0
- package/src/lib/patch.js +153 -0
- package/src/lib/skillLoop.js +62 -0
- package/src/lib/skillPayload.js +306 -0
- package/src/lib/skins.js +274 -0
- package/src/lib/spinner.js +193 -0
- package/src/lib/updateNotifier.js +1133 -0
- package/src/lib/updateNotifierWorker.js +9 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
const fs = require("node:fs");
|
|
2
|
+
const path = require("node:path");
|
|
3
|
+
const { writeFileAtomic } = require("./files");
|
|
4
|
+
const { OPENAI_PROVIDER, RESPONSES_MODE, classifyHostVersion,
|
|
5
|
+
exactHostVersion, parseBoundary, sourceHash } = require("./modelConfigBoundary");
|
|
6
|
+
const {
|
|
7
|
+
ASTRA_MODEL,
|
|
8
|
+
MANAGED_PROVIDER_MODELS,
|
|
9
|
+
applyManagedRoute,
|
|
10
|
+
customChildTransportReason,
|
|
11
|
+
inspectEffectiveRouteSafety,
|
|
12
|
+
inspectLeadRoute,
|
|
13
|
+
inspectManagedRoute,
|
|
14
|
+
inspectOrdinaryWorkerRoute,
|
|
15
|
+
managedRequest,
|
|
16
|
+
unavailableReviewerRoutes,
|
|
17
|
+
unavailableTuiRouteVisibility,
|
|
18
|
+
} = require("./modelRoutePolicy");
|
|
19
|
+
|
|
20
|
+
const MODELS = new Set(["gpt-6-astra", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna"]);
|
|
21
|
+
|
|
22
|
+
// The route every "configured" verdict is measured against: explicit installer
|
|
23
|
+
// options win; otherwise the document's own route when it is a catalog route;
|
|
24
|
+
// otherwise today's shipped default.
|
|
25
|
+
function expectedRoute(options = {}, document = null) {
|
|
26
|
+
const explicit = ["provider", "model", "effort", "childProvider", "childModel", "childEffort"]
|
|
27
|
+
.some((key) => options[key] !== undefined && options[key] !== "");
|
|
28
|
+
if (explicit) return managedRequest(options);
|
|
29
|
+
if (document) {
|
|
30
|
+
try {
|
|
31
|
+
return managedRequest({
|
|
32
|
+
childEffort: document.getIn(["delegation", "reasoning_effort"]),
|
|
33
|
+
childModel: document.getIn(["delegation", "model"]),
|
|
34
|
+
childProvider: document.getIn(["delegation", "provider"]),
|
|
35
|
+
effort: document.getIn(["agent", "reasoning_effort"]),
|
|
36
|
+
model: document.getIn(["model", "default"]),
|
|
37
|
+
provider: document.getIn(["model", "provider"]),
|
|
38
|
+
});
|
|
39
|
+
} catch {
|
|
40
|
+
// not a catalog route; measure against the shipped default
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return managedRequest();
|
|
44
|
+
}
|
|
45
|
+
const SAFE_CONTEXT_LENGTH = 372000;
|
|
46
|
+
const SAFE_COMPRESSION_THRESHOLD = 0.9;
|
|
47
|
+
const SAFE_AUTO_COMPACTION_LIMIT = SAFE_CONTEXT_LENGTH * SAFE_COMPRESSION_THRESHOLD;
|
|
48
|
+
const MANAGED_SAMPLING_KEYS = ["temperature", "top_p", "top_logprobs"];
|
|
49
|
+
|
|
50
|
+
function hasValue(document, path) {
|
|
51
|
+
return document.getIn(path, true) !== undefined;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function isManagedAstraRoute(provider, model) {
|
|
55
|
+
return provider === OPENAI_PROVIDER && model === ASTRA_MODEL;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function inspectManagedAstraSampling(document, targetRoute = null, targetWrite = false) {
|
|
59
|
+
const parentProvider = targetWrite ? targetRoute?.provider : document.getIn(["model", "provider"]);
|
|
60
|
+
const parentModel = targetWrite ? targetRoute?.model : document.getIn(["model", "default"]);
|
|
61
|
+
const parentAstra = isManagedAstraRoute(parentProvider, parentModel);
|
|
62
|
+
const configuredChildProvider = targetWrite
|
|
63
|
+
? targetRoute?.childProvider
|
|
64
|
+
: document.getIn(["delegation", "provider"]) || parentProvider;
|
|
65
|
+
const configuredChildModel = targetWrite
|
|
66
|
+
? targetRoute?.childModel
|
|
67
|
+
: document.getIn(["delegation", "model"]);
|
|
68
|
+
const childModel = configuredChildModel === undefined || configuredChildModel === null || configuredChildModel === ""
|
|
69
|
+
? parentModel
|
|
70
|
+
: configuredChildModel;
|
|
71
|
+
const childAstra = isManagedAstraRoute(configuredChildProvider, childModel);
|
|
72
|
+
const childTransport = customChildTransportReason(document);
|
|
73
|
+
const sections = [];
|
|
74
|
+
if (parentAstra) sections.push("model", "agent");
|
|
75
|
+
if (childAstra && !childTransport) sections.push("delegation");
|
|
76
|
+
for (const section of sections) {
|
|
77
|
+
for (const key of MANAGED_SAMPLING_KEYS) {
|
|
78
|
+
if (hasValue(document, [section, key])) {
|
|
79
|
+
const route = section === "delegation" ? "global_child" : "parent";
|
|
80
|
+
return {
|
|
81
|
+
status: "blocked",
|
|
82
|
+
code: "LITHERMES_UNSAFE_MODEL_SAMPLING",
|
|
83
|
+
route,
|
|
84
|
+
observedSource: `${section}.${key}`,
|
|
85
|
+
reason: `managed Astra ${route} route contains unsupported sampling field ${section}.${key}; remove it before selecting Astra`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return parentAstra || childAstra
|
|
91
|
+
? {
|
|
92
|
+
status: "safe",
|
|
93
|
+
reason: "managed Astra route has no temperature, top_p, or top_logprobs field",
|
|
94
|
+
observedSource: "managed Astra model/agent/delegation config fields",
|
|
95
|
+
}
|
|
96
|
+
: {
|
|
97
|
+
status: "not_applicable",
|
|
98
|
+
reason: "no effective managed Astra parent or global-child route",
|
|
99
|
+
observedSource: "model.provider/default and delegation provider/model config",
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function fallback(reason, classification = { class: "malformed_unknown", originalDispatchId: null }, extra = {}) {
|
|
104
|
+
return {
|
|
105
|
+
action: "fallback",
|
|
106
|
+
backupAllowed: false,
|
|
107
|
+
capabilities: unavailableCapabilities(reason),
|
|
108
|
+
classification,
|
|
109
|
+
fallbackCommand: "hermes model",
|
|
110
|
+
reason,
|
|
111
|
+
text: null,
|
|
112
|
+
...extra,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function capability(status, reason, observedSource, extra = {}) {
|
|
117
|
+
return { status, reason, observedSource, ...extra };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function unavailableCapabilities(reason) {
|
|
121
|
+
const observedSource = "Hermes host/config validation";
|
|
122
|
+
return {
|
|
123
|
+
autoCompaction: capability("unavailable", reason, observedSource),
|
|
124
|
+
concurrency: capability("unavailable", reason, observedSource),
|
|
125
|
+
delegationRoute: capability("unavailable", reason, observedSource),
|
|
126
|
+
leadRoute: capability("unavailable", reason, observedSource),
|
|
127
|
+
modelSafety: capability("unavailable", reason, observedSource),
|
|
128
|
+
ordinaryWorkerRoute: capability("unavailable", reason, observedSource),
|
|
129
|
+
recursion: capability("unavailable", reason, observedSource),
|
|
130
|
+
reviewerRoutes: capability("unavailable", reason, observedSource),
|
|
131
|
+
runtime: capability("unavailable", reason, observedSource),
|
|
132
|
+
tuiRouteVisibility: capability("unavailable", reason, observedSource),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function safeOriginalDispatchId(dispatch) {
|
|
137
|
+
if (typeof dispatch !== "string" || !/^[A-Za-z0-9._:/-]{1,128}$/.test(dispatch)) return null;
|
|
138
|
+
return dispatch;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function classificationFromDocument(document, fresh) {
|
|
142
|
+
if (fresh) return { class: "fresh", originalDispatchId: null };
|
|
143
|
+
const provider = document.getIn(["model", "provider"]);
|
|
144
|
+
const dispatch = document.getIn(["model", "default"]);
|
|
145
|
+
const originalDispatchId = safeOriginalDispatchId(dispatch);
|
|
146
|
+
if (dispatch === undefined && provider === undefined) {
|
|
147
|
+
return { class: "unconfigured", originalDispatchId };
|
|
148
|
+
}
|
|
149
|
+
if (typeof dispatch !== "string" || (provider !== undefined && typeof provider !== "string")) {
|
|
150
|
+
return { class: "malformed_unknown", originalDispatchId };
|
|
151
|
+
}
|
|
152
|
+
const safety = inspectEffectiveRouteSafety(document, OPENAI_PROVIDER);
|
|
153
|
+
if (safety.status === "blocked") {
|
|
154
|
+
return { class: safety.classificationClass, originalDispatchId };
|
|
155
|
+
}
|
|
156
|
+
if (provider === OPENAI_PROVIDER && (dispatch === "gpt-5.4" || dispatch === "gpt-5.5")) {
|
|
157
|
+
return { class: "managed_legacy", originalDispatchId };
|
|
158
|
+
}
|
|
159
|
+
if (provider === OPENAI_PROVIDER && MODELS.has(dispatch)) {
|
|
160
|
+
return { class: "existing_managed", originalDispatchId };
|
|
161
|
+
}
|
|
162
|
+
if (MANAGED_PROVIDER_MODELS[provider]?.has(dispatch)) {
|
|
163
|
+
return { class: "existing_managed", originalDispatchId };
|
|
164
|
+
}
|
|
165
|
+
if (/^gpt-5\.6(?:$|-)/.test(dispatch)) {
|
|
166
|
+
return { class: "other_gpt56", originalDispatchId };
|
|
167
|
+
}
|
|
168
|
+
return { class: "custom", originalDispatchId };
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function classifyModelConfig(text, options = {}) {
|
|
172
|
+
const boundary = parseBoundary(text, options);
|
|
173
|
+
if (boundary.error) {
|
|
174
|
+
const safety = boundary.document
|
|
175
|
+
? inspectEffectiveRouteSafety(boundary.document, OPENAI_PROVIDER)
|
|
176
|
+
: null;
|
|
177
|
+
if (safety?.status === "blocked") {
|
|
178
|
+
return classificationFromDocument(boundary.document, boundary.fresh);
|
|
179
|
+
}
|
|
180
|
+
return { class: "malformed_unknown", originalDispatchId: null };
|
|
181
|
+
}
|
|
182
|
+
return classificationFromDocument(boundary.document, boundary.fresh);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function inspectHermesCapabilities(text, options = {}) {
|
|
186
|
+
const boundary = parseBoundary(text, options);
|
|
187
|
+
if (boundary.error) {
|
|
188
|
+
const capabilities = unavailableCapabilities(boundary.error);
|
|
189
|
+
const safety = boundary.document
|
|
190
|
+
? inspectEffectiveRouteSafety(boundary.document, OPENAI_PROVIDER)
|
|
191
|
+
: null;
|
|
192
|
+
if (safety?.status === "blocked") capabilities.modelSafety = safety;
|
|
193
|
+
return capabilities;
|
|
194
|
+
}
|
|
195
|
+
const concurrency = boundary.document.getIn(["delegation", "max_concurrent_children"]);
|
|
196
|
+
const asyncBatches = boundary.document.getIn(["delegation", "max_async_children"]);
|
|
197
|
+
const spawnDepth = boundary.document.getIn(["delegation", "max_spawn_depth"]);
|
|
198
|
+
const orchestratorEnabled = boundary.document.getIn(["delegation", "orchestrator_enabled"]);
|
|
199
|
+
const effectiveAsyncBatches = Number.isInteger(asyncBatches) ? asyncBatches : 3;
|
|
200
|
+
const effectiveSpawnDepth = Number.isInteger(spawnDepth) ? spawnDepth : 1;
|
|
201
|
+
const flatDelegation = effectiveSpawnDepth === 1 || orchestratorEnabled === false;
|
|
202
|
+
const contextLength = boundary.document.getIn(["model", "context_length"]);
|
|
203
|
+
const compressionThreshold = boundary.document.getIn(["compression", "threshold"]);
|
|
204
|
+
const provider = boundary.document.getIn(["model", "provider"]);
|
|
205
|
+
const model = boundary.document.getIn(["model", "default"]);
|
|
206
|
+
let route;
|
|
207
|
+
try {
|
|
208
|
+
route = expectedRoute(options, boundary.document);
|
|
209
|
+
} catch {
|
|
210
|
+
// Keep doctor/reporting total for a parsed but unsupported existing route.
|
|
211
|
+
// The route safety verdict below carries the typed fail-closed result.
|
|
212
|
+
route = managedRequest();
|
|
213
|
+
}
|
|
214
|
+
const routeSafety = inspectEffectiveRouteSafety(boundary.document, OPENAI_PROVIDER);
|
|
215
|
+
const samplingSafety = inspectManagedAstraSampling(boundary.document);
|
|
216
|
+
return {
|
|
217
|
+
autoCompaction: contextLength === SAFE_CONTEXT_LENGTH && compressionThreshold === SAFE_COMPRESSION_THRESHOLD
|
|
218
|
+
? {
|
|
219
|
+
status: "hard",
|
|
220
|
+
reason: `effective auto-compaction target is ${SAFE_AUTO_COMPACTION_LIMIT} tokens`,
|
|
221
|
+
observedSource: "model.context_length plus compression.threshold",
|
|
222
|
+
limit: SAFE_AUTO_COMPACTION_LIMIT,
|
|
223
|
+
}
|
|
224
|
+
: {
|
|
225
|
+
status: "unavailable",
|
|
226
|
+
reason: "Hermes 0.17.0 exposes ratio-only compression; no exact 650K trigger schema",
|
|
227
|
+
observedSource: "Hermes compression.threshold ratio-only schema",
|
|
228
|
+
},
|
|
229
|
+
concurrency: concurrency === 20
|
|
230
|
+
? {
|
|
231
|
+
status: "hard",
|
|
232
|
+
reason: "effective synchronous concurrency is configured to 20",
|
|
233
|
+
observedSource: "delegation.max_concurrent_children",
|
|
234
|
+
limit: 20,
|
|
235
|
+
scope: "per-batch",
|
|
236
|
+
asyncBatchLimit: effectiveAsyncBatches,
|
|
237
|
+
potentialChildCeiling: 20 * effectiveAsyncBatches,
|
|
238
|
+
}
|
|
239
|
+
: {
|
|
240
|
+
status: "unavailable",
|
|
241
|
+
reason: `effective synchronous concurrency is ${Number.isInteger(concurrency) ? concurrency : "not configured"}, not 20`,
|
|
242
|
+
observedSource: "delegation.max_concurrent_children",
|
|
243
|
+
},
|
|
244
|
+
delegationRoute: inspectManagedRoute(boundary.document, OPENAI_PROVIDER, route),
|
|
245
|
+
leadRoute: inspectLeadRoute(boundary.document, OPENAI_PROVIDER, route),
|
|
246
|
+
modelSafety: samplingSafety.status === "blocked" ? samplingSafety : routeSafety,
|
|
247
|
+
ordinaryWorkerRoute: inspectOrdinaryWorkerRoute(boundary.document, OPENAI_PROVIDER, route),
|
|
248
|
+
recursion: flatDelegation
|
|
249
|
+
? {
|
|
250
|
+
status: "hard",
|
|
251
|
+
reason: effectiveSpawnDepth === 1
|
|
252
|
+
? "flat delegation blocks grandchildren at depth 1"
|
|
253
|
+
: "orchestrator kill switch blocks grandchildren despite a higher configured depth",
|
|
254
|
+
observedSource: "delegation.max_spawn_depth plus delegation.orchestrator_enabled",
|
|
255
|
+
limit: effectiveSpawnDepth,
|
|
256
|
+
flatBy: effectiveSpawnDepth === 1 ? "depth" : "orchestrator-kill-switch",
|
|
257
|
+
}
|
|
258
|
+
: {
|
|
259
|
+
status: "unavailable",
|
|
260
|
+
reason: `nested delegation is enabled at max_spawn_depth ${effectiveSpawnDepth}`,
|
|
261
|
+
observedSource: "delegation.max_spawn_depth plus delegation.orchestrator_enabled",
|
|
262
|
+
limit: effectiveSpawnDepth,
|
|
263
|
+
},
|
|
264
|
+
reviewerRoutes: unavailableReviewerRoutes(),
|
|
265
|
+
runtime: provider === OPENAI_PROVIDER && typeof model === "string"
|
|
266
|
+
? {
|
|
267
|
+
status: "hard",
|
|
268
|
+
reason: "effective provider uses the verified OpenAI OAuth Responses route",
|
|
269
|
+
observedSource: "model.provider plus Hermes runtime provider markers",
|
|
270
|
+
provider: OPENAI_PROVIDER,
|
|
271
|
+
apiMode: RESPONSES_MODE,
|
|
272
|
+
}
|
|
273
|
+
: {
|
|
274
|
+
status: "unavailable",
|
|
275
|
+
reason: "effective model provider is not the verified OpenAI OAuth Responses route",
|
|
276
|
+
observedSource: "model.provider plus Hermes runtime provider markers",
|
|
277
|
+
},
|
|
278
|
+
tuiRouteVisibility: unavailableTuiRouteVisibility(),
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function planModelConfig(text, options = {}) {
|
|
283
|
+
const route = managedRequest(options);
|
|
284
|
+
const request = {
|
|
285
|
+
...route,
|
|
286
|
+
hostCapabilities: { ...options.hostCapabilities },
|
|
287
|
+
hostVersion: exactHostVersion(options.hostVersion),
|
|
288
|
+
reconfigure: Boolean(options.reconfigure),
|
|
289
|
+
};
|
|
290
|
+
const boundary = parseBoundary(text, options);
|
|
291
|
+
if (boundary.error && /^malformed model route/.test(boundary.error)) {
|
|
292
|
+
return fallback(boundary.error);
|
|
293
|
+
}
|
|
294
|
+
const safety = boundary.document
|
|
295
|
+
? inspectEffectiveRouteSafety(boundary.document, OPENAI_PROVIDER)
|
|
296
|
+
: null;
|
|
297
|
+
if (safety?.status === "blocked") {
|
|
298
|
+
return {
|
|
299
|
+
action: "stop",
|
|
300
|
+
backupAllowed: false,
|
|
301
|
+
capabilities: inspectHermesCapabilities(text, options),
|
|
302
|
+
classification: classificationFromDocument(boundary.document, boundary.fresh),
|
|
303
|
+
reason: safety.reason,
|
|
304
|
+
request,
|
|
305
|
+
sourceHash: sourceHash(String(text || "")),
|
|
306
|
+
stop: { code: safety.code, route: safety.route },
|
|
307
|
+
text: boundary.error || safety.redact ? null : String(text || ""),
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
if (boundary.error) {
|
|
311
|
+
return fallback(
|
|
312
|
+
boundary.error,
|
|
313
|
+
undefined,
|
|
314
|
+
boundary.credentialKey ? { credentialKey: boundary.credentialKey } : {},
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
const classification = classificationFromDocument(boundary.document, boundary.fresh);
|
|
318
|
+
if (classification.class === "malformed_unknown") {
|
|
319
|
+
return fallback("unknown model config schema", classification);
|
|
320
|
+
}
|
|
321
|
+
if (classification.class === "other_gpt56"
|
|
322
|
+
&& boundary.document.getIn(["model", "provider"]) === OPENAI_PROVIDER) {
|
|
323
|
+
return fallback("unknown model route", classification);
|
|
324
|
+
}
|
|
325
|
+
const shouldWrite = boundary.fresh || classification.class === "unconfigured" || Boolean(options.reconfigure);
|
|
326
|
+
const samplingSafety = inspectManagedAstraSampling(boundary.document, route, shouldWrite);
|
|
327
|
+
if (samplingSafety.status === "blocked") {
|
|
328
|
+
return {
|
|
329
|
+
action: "stop",
|
|
330
|
+
backupAllowed: false,
|
|
331
|
+
capabilities: inspectHermesCapabilities(text, options),
|
|
332
|
+
classification,
|
|
333
|
+
reason: samplingSafety.reason,
|
|
334
|
+
request,
|
|
335
|
+
sourceHash: sourceHash(String(text || "")),
|
|
336
|
+
stop: { code: samplingSafety.code, route: samplingSafety.route },
|
|
337
|
+
text: String(text || ""),
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
const transportReason = customChildTransportReason(boundary.document);
|
|
341
|
+
if (shouldWrite && transportReason) {
|
|
342
|
+
return {
|
|
343
|
+
action: "preserve",
|
|
344
|
+
backupAllowed: false,
|
|
345
|
+
capabilities: inspectHermesCapabilities(text, options),
|
|
346
|
+
classification,
|
|
347
|
+
reason: `${transportReason}; managed child route remains unapplied`,
|
|
348
|
+
request,
|
|
349
|
+
sourceHash: sourceHash(String(text || "")),
|
|
350
|
+
text: String(text || ""),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
if (!shouldWrite) {
|
|
354
|
+
return {
|
|
355
|
+
action: "preserve",
|
|
356
|
+
backupAllowed: false,
|
|
357
|
+
capabilities: inspectHermesCapabilities(text, options),
|
|
358
|
+
classification,
|
|
359
|
+
reason: "existing model settings preserved; pass --reconfigure-model to opt in",
|
|
360
|
+
request,
|
|
361
|
+
sourceHash: sourceHash(String(text || "")),
|
|
362
|
+
text: String(text || ""),
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
const document = boundary.document;
|
|
366
|
+
applyManagedRoute(document, route);
|
|
367
|
+
// The verified legacy context/compression defaults belong to legacy model
|
|
368
|
+
// resets only. Astra has no host-published limit evidence, so an Astra reset
|
|
369
|
+
// preserves explicit values and leaves missing values absent.
|
|
370
|
+
if (options.reconfigure && route.model !== ASTRA_MODEL && route.childModel !== ASTRA_MODEL) {
|
|
371
|
+
document.setIn(["model", "context_length"], SAFE_CONTEXT_LENGTH);
|
|
372
|
+
document.setIn(["compression", "threshold"], SAFE_COMPRESSION_THRESHOLD);
|
|
373
|
+
}
|
|
374
|
+
document.setIn(["delegation", "max_concurrent_children"], 20);
|
|
375
|
+
document.setIn(["delegation", "max_spawn_depth"], 1);
|
|
376
|
+
document.setIn(["delegation", "orchestrator_enabled"], false);
|
|
377
|
+
const plannedText = document.toString({ lineWidth: 0 });
|
|
378
|
+
return {
|
|
379
|
+
action: "write",
|
|
380
|
+
backupAllowed: true,
|
|
381
|
+
capabilities: inspectHermesCapabilities(plannedText, { ...options, ...route }),
|
|
382
|
+
classification,
|
|
383
|
+
reason:
|
|
384
|
+
classifyHostVersion(options.hostVersion).status === "beyond-verified"
|
|
385
|
+
? `Hermes ${request.hostVersion} is beyond the verified matrix; source and runtime markers verified, model schema written`
|
|
386
|
+
: `verified Hermes ${request.hostVersion} model schema`,
|
|
387
|
+
request,
|
|
388
|
+
sourceHash: sourceHash(String(text || "")),
|
|
389
|
+
text: plannedText,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
function revalidateModelConfigPlan(hermesHome, plan) {
|
|
394
|
+
const file = path.join(hermesHome, "config.yaml");
|
|
395
|
+
const current = fs.existsSync(file) ? fs.readFileSync(file, "utf8") : "";
|
|
396
|
+
if (plan.sourceHash === sourceHash(current)) return { current, ok: true };
|
|
397
|
+
const refreshed = planModelConfig(current, plan.request || {});
|
|
398
|
+
return {
|
|
399
|
+
classification: refreshed.classification,
|
|
400
|
+
current,
|
|
401
|
+
ok: false,
|
|
402
|
+
reason: `host config changed before write; ${refreshed.reason || refreshed.classification.class}`,
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
function applyModelConfigPlan(hermesHome, plan) {
|
|
407
|
+
if (plan.action !== "write") return { backupPath: null, written: false };
|
|
408
|
+
const validation = revalidateModelConfigPlan(hermesHome, plan);
|
|
409
|
+
if (!validation.ok) {
|
|
410
|
+
return { backupPath: null, drifted: true, reason: validation.reason, written: false };
|
|
411
|
+
}
|
|
412
|
+
const file = path.join(hermesHome, "config.yaml");
|
|
413
|
+
const before = validation.current;
|
|
414
|
+
const backupPath = before ? `${file}.lithermes-model.bak` : null;
|
|
415
|
+
fs.mkdirSync(hermesHome, { recursive: true });
|
|
416
|
+
if (backupPath) {
|
|
417
|
+
writeFileAtomic(backupPath, before, "utf8");
|
|
418
|
+
fs.chmodSync(backupPath, 0o600);
|
|
419
|
+
}
|
|
420
|
+
writeFileAtomic(file, plan.text, "utf8");
|
|
421
|
+
fs.chmodSync(file, 0o600);
|
|
422
|
+
return { backupPath, sourceHash: sourceHash(before), written: true };
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
module.exports = {
|
|
426
|
+
applyModelConfigPlan,
|
|
427
|
+
classifyModelConfig,
|
|
428
|
+
inspectHermesCapabilities,
|
|
429
|
+
planModelConfig,
|
|
430
|
+
revalidateModelConfigPlan,
|
|
431
|
+
};
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
const crypto = require("node:crypto");
|
|
2
|
+
const { isMap, isScalar, parseDocument, visit } = require("yaml");
|
|
3
|
+
|
|
4
|
+
// Host versions whose source and runtime markers were checked against this schema by
|
|
5
|
+
// hand. Being outside this set is not a rejection: an exact-membership gate turns every
|
|
6
|
+
// future Hermes release into a silent capability outage, which is precisely how the
|
|
7
|
+
// July 2026 campaign's headline defect happened (the set held 0.17.0 while the host had
|
|
8
|
+
// moved to 0.19.0, and the plugin went inert). The real gate is the source/runtime
|
|
9
|
+
// marker check below, which is probed from the host that is actually running.
|
|
10
|
+
const VERIFIED_HOST_VERSIONS = new Set(["0.17.0", "0.19.0"]);
|
|
11
|
+
const VERIFIED_HOST_VERSION_TEXT = [...VERIFIED_HOST_VERSIONS].join(", ");
|
|
12
|
+
// Below this the managed schema did not exist, so forward compatibility must not become
|
|
13
|
+
// backward acceptance.
|
|
14
|
+
const MINIMUM_HOST_VERSION = "0.17.0";
|
|
15
|
+
const CONFIG_VERSION = 30;
|
|
16
|
+
const CREDENTIAL_KEY = /(^|[_-])(api[_-]?key|client[_-]?secret|auth[_-]?token|(?:aws[_-]?)?access[_-]?key(?:[_-]?id)?|(?:ssh[_-]?)?private[_-]?key|token|password|passphrase|secret|credential|authorization)([_-]|$)/i;
|
|
17
|
+
const MAP_PATHS = ["model", "agent", "delegation", "compression"];
|
|
18
|
+
const SCALAR_PATHS = [
|
|
19
|
+
["model", "provider"],
|
|
20
|
+
["model", "default"],
|
|
21
|
+
["model", "context_length"],
|
|
22
|
+
["agent", "reasoning_effort"],
|
|
23
|
+
["delegation", "model"],
|
|
24
|
+
["delegation", "reasoning_effort"],
|
|
25
|
+
["delegation", "provider"],
|
|
26
|
+
["delegation", "base_url"],
|
|
27
|
+
["delegation", "api_mode"],
|
|
28
|
+
["delegation", "max_concurrent_children"],
|
|
29
|
+
["delegation", "max_async_children"],
|
|
30
|
+
["delegation", "max_spawn_depth"],
|
|
31
|
+
["delegation", "orchestrator_enabled"],
|
|
32
|
+
["compression", "threshold"],
|
|
33
|
+
];
|
|
34
|
+
const RUNTIME_STEM = ["co", "dex"].join("");
|
|
35
|
+
const OPENAI_PROVIDER = `openai-${RUNTIME_STEM}`;
|
|
36
|
+
const RESPONSES_MODE = `${RUNTIME_STEM}_responses`;
|
|
37
|
+
|
|
38
|
+
function isCredentialLikeKey(value) {
|
|
39
|
+
const normalized = String(value || "")
|
|
40
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1_$2")
|
|
41
|
+
.replace(/-/g, "_");
|
|
42
|
+
return CREDENTIAL_KEY.test(normalized);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function isEnvironmentName(value) {
|
|
46
|
+
return /^[A-Z][A-Z0-9_]*$/.test(value) && /_/.test(value);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function isSecretLookingScalar(node) {
|
|
50
|
+
if (!isScalar(node)) return false;
|
|
51
|
+
const value = node.value;
|
|
52
|
+
if (value === null || typeof value === "boolean" || typeof value === "number") return false;
|
|
53
|
+
if (typeof value !== "string") return false;
|
|
54
|
+
const trimmed = value.trim();
|
|
55
|
+
if (!trimmed || /^(?:true|false|null)$/i.test(trimmed)) return false;
|
|
56
|
+
if (isEnvironmentName(trimmed) || /^\$\{[A-Z][A-Z0-9_]*\}$/.test(trimmed)) return false;
|
|
57
|
+
// Explicitly redacted fixtures are test/documentation placeholders, not
|
|
58
|
+
// material that a config round-trip could expose; real non-empty secrets
|
|
59
|
+
// (including ordinary `sk-...` values) remain blocked.
|
|
60
|
+
if (/(?:^|[-_])(redacted|placeholder)(?:[-_]|$)/i.test(trimmed)) return false;
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function findCredentialRiskKey(document) {
|
|
65
|
+
let credentialKey = null;
|
|
66
|
+
// The writer serializes the complete document and may create a complete
|
|
67
|
+
// backup, so an unrelated credential can still be copied or reformatted.
|
|
68
|
+
visit(document, {
|
|
69
|
+
Pair(_key, pair) {
|
|
70
|
+
if (isScalar(pair.key)
|
|
71
|
+
&& isCredentialLikeKey(pair.key.value)
|
|
72
|
+
&& isSecretLookingScalar(pair.value)) {
|
|
73
|
+
credentialKey = String(pair.key.value);
|
|
74
|
+
return visit.BREAK;
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
return credentialKey;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function sourceHash(text) {
|
|
83
|
+
return crypto.createHash("sha256").update(text).digest("hex");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Hermes 0.19 prints "Hermes Agent v0.19.0 (2026.7.20) · upstream <hash>" plus an
|
|
87
|
+
// "Install directory:" second line; only that exact build/upstream shape is
|
|
88
|
+
// tolerated — arbitrary suffixes ("-beta", "_beta", " stable") stay rejected.
|
|
89
|
+
function exactHostVersion(raw) {
|
|
90
|
+
const firstLine = String(raw || "").split(/\r?\n/, 1)[0];
|
|
91
|
+
const match = firstLine
|
|
92
|
+
.match(/^(?:Hermes Agent )?v?([0-9]+(?:\.[0-9]+)+)(?: \([0-9]{4}\.[0-9]{1,2}\.[0-9]{1,2}\)(?: · upstream [0-9a-f]{7,40})?)?$/);
|
|
93
|
+
return match?.[1] || "";
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Compare dotted numeric versions. Returns <0, 0 or >0. */
|
|
97
|
+
function compareVersions(left, right) {
|
|
98
|
+
const a = left.split(".").map(Number);
|
|
99
|
+
const b = right.split(".").map(Number);
|
|
100
|
+
for (let index = 0; index < Math.max(a.length, b.length); index += 1) {
|
|
101
|
+
const diff = (a[index] ?? 0) - (b[index] ?? 0);
|
|
102
|
+
if (diff !== 0) return diff;
|
|
103
|
+
}
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Classify a host banner. The banner shape stays strict — arbitrary suffixes such as
|
|
109
|
+
* "-beta", "_beta", " stable" and four-part builds are still not a release we will write
|
|
110
|
+
* against — but a well-formed release at or above the floor is accepted whether or not
|
|
111
|
+
* this matrix has seen it.
|
|
112
|
+
*/
|
|
113
|
+
function classifyHostVersion(raw) {
|
|
114
|
+
const version = exactHostVersion(raw);
|
|
115
|
+
// A release is exactly major.minor.patch. Four-part builds such as 0.19.0.1 are not a
|
|
116
|
+
// published release line and were rejected before this gate accepted unseen versions.
|
|
117
|
+
if (!version || !/^\d+\.\d+\.\d+$/u.test(version)) return { version: "", status: "malformed" };
|
|
118
|
+
if (compareVersions(version, MINIMUM_HOST_VERSION) < 0) return { version, status: "too-old" };
|
|
119
|
+
if (VERIFIED_HOST_VERSIONS.has(version)) return { version, status: "verified" };
|
|
120
|
+
return { version, status: "beyond-verified" };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function hostVersionError(classified) {
|
|
124
|
+
if (classified.status === "malformed") {
|
|
125
|
+
return `unsupported Hermes host version; expected a release banner at or above ${MINIMUM_HOST_VERSION} (verified: ${VERIFIED_HOST_VERSION_TEXT})`;
|
|
126
|
+
}
|
|
127
|
+
if (classified.status === "too-old") {
|
|
128
|
+
return `Hermes host ${classified.version} is older than the minimum supported Hermes host ${MINIMUM_HOST_VERSION}`;
|
|
129
|
+
}
|
|
130
|
+
return "";
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function parseBoundary(text, options = {}) {
|
|
134
|
+
const raw = String(text || "");
|
|
135
|
+
if (!raw.trim()) {
|
|
136
|
+
const document = parseDocument(`_config_version: ${CONFIG_VERSION}\n`);
|
|
137
|
+
const classified = classifyHostVersion(options.hostVersion);
|
|
138
|
+
const versionError = hostVersionError(classified);
|
|
139
|
+
if (versionError) {
|
|
140
|
+
return { document, error: versionError, fresh: true };
|
|
141
|
+
}
|
|
142
|
+
if (!options.hostCapabilities?.concurrencyHard
|
|
143
|
+
|| !options.hostCapabilities?.delegationRouteHard
|
|
144
|
+
|| !options.hostCapabilities?.runtimeHard) {
|
|
145
|
+
return { document, error: "unverified Hermes host source/runtime markers", fresh: true };
|
|
146
|
+
}
|
|
147
|
+
return { document, fresh: true };
|
|
148
|
+
}
|
|
149
|
+
const document = parseDocument(raw, {
|
|
150
|
+
keepSourceTokens: true,
|
|
151
|
+
maxAliasCount: 50,
|
|
152
|
+
merge: false,
|
|
153
|
+
strict: true,
|
|
154
|
+
uniqueKeys: true,
|
|
155
|
+
});
|
|
156
|
+
if (document.errors.length || !isMap(document.contents)) {
|
|
157
|
+
return { error: "malformed host config" };
|
|
158
|
+
}
|
|
159
|
+
const credentialKey = findCredentialRiskKey(document);
|
|
160
|
+
if (document.get("_config_version") !== CONFIG_VERSION) {
|
|
161
|
+
return { error: `unknown host config schema; expected version ${CONFIG_VERSION}` };
|
|
162
|
+
}
|
|
163
|
+
for (const key of MAP_PATHS) {
|
|
164
|
+
const node = document.get(key, true);
|
|
165
|
+
if (node !== undefined && !isMap(node)) return { error: `unknown host config schema at ${key}` };
|
|
166
|
+
}
|
|
167
|
+
for (const routePath of SCALAR_PATHS) {
|
|
168
|
+
const node = document.getIn(routePath, true);
|
|
169
|
+
if (node !== undefined && !isScalar(node)) {
|
|
170
|
+
return {
|
|
171
|
+
document,
|
|
172
|
+
error: `malformed model route at ${routePath.join(".")}`,
|
|
173
|
+
fresh: false,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const classified = classifyHostVersion(options.hostVersion);
|
|
178
|
+
const versionError = hostVersionError(classified);
|
|
179
|
+
if (versionError) {
|
|
180
|
+
return { document, error: versionError, fresh: false };
|
|
181
|
+
}
|
|
182
|
+
if (!options.hostCapabilities?.concurrencyHard
|
|
183
|
+
|| !options.hostCapabilities?.delegationRouteHard
|
|
184
|
+
|| !options.hostCapabilities?.runtimeHard) {
|
|
185
|
+
return { document, error: "unverified Hermes host source/runtime markers", fresh: false };
|
|
186
|
+
}
|
|
187
|
+
if (credentialKey) {
|
|
188
|
+
return {
|
|
189
|
+
document,
|
|
190
|
+
credentialKey,
|
|
191
|
+
error: `credential-risk host config (key: ${credentialKey})`,
|
|
192
|
+
fresh: false,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
return { document, fresh: false };
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
module.exports = {
|
|
199
|
+
MINIMUM_HOST_VERSION,
|
|
200
|
+
OPENAI_PROVIDER,
|
|
201
|
+
RESPONSES_MODE,
|
|
202
|
+
classifyHostVersion,
|
|
203
|
+
exactHostVersion,
|
|
204
|
+
parseBoundary,
|
|
205
|
+
sourceHash,
|
|
206
|
+
};
|