opencode-telos 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/README.md +927 -0
- package/dist/code-intelligence/analyzer.d.ts +9 -0
- package/dist/code-intelligence/analyzer.d.ts.map +1 -0
- package/dist/code-intelligence/analyzer.js +321 -0
- package/dist/code-intelligence/analyzer.js.map +1 -0
- package/dist/code-intelligence/ast/cache.d.ts +16 -0
- package/dist/code-intelligence/ast/cache.d.ts.map +1 -0
- package/dist/code-intelligence/ast/cache.js +44 -0
- package/dist/code-intelligence/ast/cache.js.map +1 -0
- package/dist/code-intelligence/ast/common.d.ts +8 -0
- package/dist/code-intelligence/ast/common.d.ts.map +1 -0
- package/dist/code-intelligence/ast/common.js +42 -0
- package/dist/code-intelligence/ast/common.js.map +1 -0
- package/dist/code-intelligence/ast/component.d.ts +10 -0
- package/dist/code-intelligence/ast/component.d.ts.map +1 -0
- package/dist/code-intelligence/ast/component.js +38 -0
- package/dist/code-intelligence/ast/component.js.map +1 -0
- package/dist/code-intelligence/ast/fallback.d.ts +9 -0
- package/dist/code-intelligence/ast/fallback.d.ts.map +1 -0
- package/dist/code-intelligence/ast/fallback.js +38 -0
- package/dist/code-intelligence/ast/fallback.js.map +1 -0
- package/dist/code-intelligence/ast/index.d.ts +5 -0
- package/dist/code-intelligence/ast/index.d.ts.map +1 -0
- package/dist/code-intelligence/ast/index.js +5 -0
- package/dist/code-intelligence/ast/index.js.map +1 -0
- package/dist/code-intelligence/ast/ir.d.ts +72 -0
- package/dist/code-intelligence/ast/ir.d.ts.map +1 -0
- package/dist/code-intelligence/ast/ir.js +2 -0
- package/dist/code-intelligence/ast/ir.js.map +1 -0
- package/dist/code-intelligence/ast/metrics.d.ts +25 -0
- package/dist/code-intelligence/ast/metrics.d.ts.map +1 -0
- package/dist/code-intelligence/ast/metrics.js +38 -0
- package/dist/code-intelligence/ast/metrics.js.map +1 -0
- package/dist/code-intelligence/ast/registry.d.ts +5 -0
- package/dist/code-intelligence/ast/registry.d.ts.map +1 -0
- package/dist/code-intelligence/ast/registry.js +22 -0
- package/dist/code-intelligence/ast/registry.js.map +1 -0
- package/dist/code-intelligence/ast/tree-sitter.d.ts +8 -0
- package/dist/code-intelligence/ast/tree-sitter.d.ts.map +1 -0
- package/dist/code-intelligence/ast/tree-sitter.js +247 -0
- package/dist/code-intelligence/ast/tree-sitter.js.map +1 -0
- package/dist/code-intelligence/ast/typescript.d.ts +8 -0
- package/dist/code-intelligence/ast/typescript.d.ts.map +1 -0
- package/dist/code-intelligence/ast/typescript.js +147 -0
- package/dist/code-intelligence/ast/typescript.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +27 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +67 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/opencode/hooks.d.ts +9 -0
- package/dist/opencode/hooks.d.ts.map +1 -0
- package/dist/opencode/hooks.js +583 -0
- package/dist/opencode/hooks.js.map +1 -0
- package/dist/opencode/router/categories.d.ts +31 -0
- package/dist/opencode/router/categories.d.ts.map +1 -0
- package/dist/opencode/router/categories.js +165 -0
- package/dist/opencode/router/categories.js.map +1 -0
- package/dist/opencode/router/embeddings.d.ts +41 -0
- package/dist/opencode/router/embeddings.d.ts.map +1 -0
- package/dist/opencode/router/embeddings.js +136 -0
- package/dist/opencode/router/embeddings.js.map +1 -0
- package/dist/opencode/router/graph-state-snapshot.d.ts +35 -0
- package/dist/opencode/router/graph-state-snapshot.d.ts.map +1 -0
- package/dist/opencode/router/graph-state-snapshot.js +129 -0
- package/dist/opencode/router/graph-state-snapshot.js.map +1 -0
- package/dist/opencode/router/index.d.ts +21 -0
- package/dist/opencode/router/index.d.ts.map +1 -0
- package/dist/opencode/router/index.js +23 -0
- package/dist/opencode/router/index.js.map +1 -0
- package/dist/opencode/router/intent-classifier.d.ts +35 -0
- package/dist/opencode/router/intent-classifier.d.ts.map +1 -0
- package/dist/opencode/router/intent-classifier.js +108 -0
- package/dist/opencode/router/intent-classifier.js.map +1 -0
- package/dist/opencode/router/semantic-nudge.d.ts +42 -0
- package/dist/opencode/router/semantic-nudge.d.ts.map +1 -0
- package/dist/opencode/router/semantic-nudge.js +73 -0
- package/dist/opencode/router/semantic-nudge.js.map +1 -0
- package/dist/opencode/router/state-gate.d.ts +25 -0
- package/dist/opencode/router/state-gate.d.ts.map +1 -0
- package/dist/opencode/router/state-gate.js +178 -0
- package/dist/opencode/router/state-gate.js.map +1 -0
- package/dist/opencode/router/tool-embeddings.d.ts +36 -0
- package/dist/opencode/router/tool-embeddings.d.ts.map +1 -0
- package/dist/opencode/router/tool-embeddings.js +140 -0
- package/dist/opencode/router/tool-embeddings.js.map +1 -0
- package/dist/opencode/router/tool-registry.d.ts +45 -0
- package/dist/opencode/router/tool-registry.d.ts.map +1 -0
- package/dist/opencode/router/tool-registry.js +103 -0
- package/dist/opencode/router/tool-registry.js.map +1 -0
- package/dist/opencode/router/tool-taxonomy.d.ts +51 -0
- package/dist/opencode/router/tool-taxonomy.d.ts.map +1 -0
- package/dist/opencode/router/tool-taxonomy.js +250 -0
- package/dist/opencode/router/tool-taxonomy.js.map +1 -0
- package/dist/opencode/router/tools-composite.d.ts +21 -0
- package/dist/opencode/router/tools-composite.d.ts.map +1 -0
- package/dist/opencode/router/tools-composite.js +684 -0
- package/dist/opencode/router/tools-composite.js.map +1 -0
- package/dist/opencode/shell-hooks.d.ts +7 -0
- package/dist/opencode/shell-hooks.d.ts.map +1 -0
- package/dist/opencode/shell-hooks.js +96 -0
- package/dist/opencode/shell-hooks.js.map +1 -0
- package/dist/opencode/system-prompt.d.ts +10 -0
- package/dist/opencode/system-prompt.d.ts.map +1 -0
- package/dist/opencode/system-prompt.js +600 -0
- package/dist/opencode/system-prompt.js.map +1 -0
- package/dist/opencode/tools.d.ts +8 -0
- package/dist/opencode/tools.d.ts.map +1 -0
- package/dist/opencode/tools.js +3731 -0
- package/dist/opencode/tools.js.map +1 -0
- package/dist/opencode/workflows/chains.d.ts +52 -0
- package/dist/opencode/workflows/chains.d.ts.map +1 -0
- package/dist/opencode/workflows/chains.js +170 -0
- package/dist/opencode/workflows/chains.js.map +1 -0
- package/dist/opencode/workflows/executor.d.ts +52 -0
- package/dist/opencode/workflows/executor.d.ts.map +1 -0
- package/dist/opencode/workflows/executor.js +130 -0
- package/dist/opencode/workflows/executor.js.map +1 -0
- package/dist/opencode/workflows/index.d.ts +14 -0
- package/dist/opencode/workflows/index.d.ts.map +1 -0
- package/dist/opencode/workflows/index.js +15 -0
- package/dist/opencode/workflows/index.js.map +1 -0
- package/dist/opencode/workflows/tools-workflow.d.ts +24 -0
- package/dist/opencode/workflows/tools-workflow.d.ts.map +1 -0
- package/dist/opencode/workflows/tools-workflow.js +85 -0
- package/dist/opencode/workflows/tools-workflow.js.map +1 -0
- package/dist/opencode/workflows/types.d.ts +32 -0
- package/dist/opencode/workflows/types.d.ts.map +1 -0
- package/dist/opencode/workflows/types.js +13 -0
- package/dist/opencode/workflows/types.js.map +1 -0
- package/dist/sdd/analysis/compliance.d.ts +30 -0
- package/dist/sdd/analysis/compliance.d.ts.map +1 -0
- package/dist/sdd/analysis/compliance.js +251 -0
- package/dist/sdd/analysis/compliance.js.map +1 -0
- package/dist/sdd/analysis/scalability.d.ts +15 -0
- package/dist/sdd/analysis/scalability.d.ts.map +1 -0
- package/dist/sdd/analysis/scalability.js +72 -0
- package/dist/sdd/analysis/scalability.js.map +1 -0
- package/dist/sdd/analysis/security.d.ts +25 -0
- package/dist/sdd/analysis/security.d.ts.map +1 -0
- package/dist/sdd/analysis/security.js +94 -0
- package/dist/sdd/analysis/security.js.map +1 -0
- package/dist/sdd/brownfield/scanner.d.ts +31 -0
- package/dist/sdd/brownfield/scanner.d.ts.map +1 -0
- package/dist/sdd/brownfield/scanner.js +228 -0
- package/dist/sdd/brownfield/scanner.js.map +1 -0
- package/dist/sdd/cache/manager.d.ts +237 -0
- package/dist/sdd/cache/manager.d.ts.map +1 -0
- package/dist/sdd/cache/manager.js +770 -0
- package/dist/sdd/cache/manager.js.map +1 -0
- package/dist/sdd/cache/snapshot-store.d.ts +39 -0
- package/dist/sdd/cache/snapshot-store.d.ts.map +1 -0
- package/dist/sdd/cache/snapshot-store.js +156 -0
- package/dist/sdd/cache/snapshot-store.js.map +1 -0
- package/dist/sdd/changes/manager.d.ts +58 -0
- package/dist/sdd/changes/manager.d.ts.map +1 -0
- package/dist/sdd/changes/manager.js +235 -0
- package/dist/sdd/changes/manager.js.map +1 -0
- package/dist/sdd/cicd/generators.d.ts +16 -0
- package/dist/sdd/cicd/generators.d.ts.map +1 -0
- package/dist/sdd/cicd/generators.js +1042 -0
- package/dist/sdd/cicd/generators.js.map +1 -0
- package/dist/sdd/code-quality/complexity.d.ts +38 -0
- package/dist/sdd/code-quality/complexity.d.ts.map +1 -0
- package/dist/sdd/code-quality/complexity.js +161 -0
- package/dist/sdd/code-quality/complexity.js.map +1 -0
- package/dist/sdd/code-quality/conventions.d.ts +33 -0
- package/dist/sdd/code-quality/conventions.d.ts.map +1 -0
- package/dist/sdd/code-quality/conventions.js +193 -0
- package/dist/sdd/code-quality/conventions.js.map +1 -0
- package/dist/sdd/code-quality/dependencies.d.ts +27 -0
- package/dist/sdd/code-quality/dependencies.d.ts.map +1 -0
- package/dist/sdd/code-quality/dependencies.js +142 -0
- package/dist/sdd/code-quality/dependencies.js.map +1 -0
- package/dist/sdd/code-quality/import-analyzer.d.ts +49 -0
- package/dist/sdd/code-quality/import-analyzer.d.ts.map +1 -0
- package/dist/sdd/code-quality/import-analyzer.js +213 -0
- package/dist/sdd/code-quality/import-analyzer.js.map +1 -0
- package/dist/sdd/code-quality/metrics.d.ts +35 -0
- package/dist/sdd/code-quality/metrics.d.ts.map +1 -0
- package/dist/sdd/code-quality/metrics.js +172 -0
- package/dist/sdd/code-quality/metrics.js.map +1 -0
- package/dist/sdd/code-quality/smells.d.ts +38 -0
- package/dist/sdd/code-quality/smells.d.ts.map +1 -0
- package/dist/sdd/code-quality/smells.js +319 -0
- package/dist/sdd/code-quality/smells.js.map +1 -0
- package/dist/sdd/code-quality/symbol-parser.d.ts +28 -0
- package/dist/sdd/code-quality/symbol-parser.d.ts.map +1 -0
- package/dist/sdd/code-quality/symbol-parser.js +230 -0
- package/dist/sdd/code-quality/symbol-parser.js.map +1 -0
- package/dist/sdd/code-quality/usage-tracker.d.ts +59 -0
- package/dist/sdd/code-quality/usage-tracker.d.ts.map +1 -0
- package/dist/sdd/code-quality/usage-tracker.js +402 -0
- package/dist/sdd/code-quality/usage-tracker.js.map +1 -0
- package/dist/sdd/code-quality/utils.d.ts +6 -0
- package/dist/sdd/code-quality/utils.d.ts.map +1 -0
- package/dist/sdd/code-quality/utils.js +14 -0
- package/dist/sdd/code-quality/utils.js.map +1 -0
- package/dist/sdd/codegen/generator.d.ts +42 -0
- package/dist/sdd/codegen/generator.d.ts.map +1 -0
- package/dist/sdd/codegen/generator.js +1023 -0
- package/dist/sdd/codegen/generator.js.map +1 -0
- package/dist/sdd/constitution/validator.d.ts +37 -0
- package/dist/sdd/constitution/validator.d.ts.map +1 -0
- package/dist/sdd/constitution/validator.js +192 -0
- package/dist/sdd/constitution/validator.js.map +1 -0
- package/dist/sdd/cost/estimator.d.ts +31 -0
- package/dist/sdd/cost/estimator.d.ts.map +1 -0
- package/dist/sdd/cost/estimator.js +92 -0
- package/dist/sdd/cost/estimator.js.map +1 -0
- package/dist/sdd/coverage/tracker.d.ts +47 -0
- package/dist/sdd/coverage/tracker.d.ts.map +1 -0
- package/dist/sdd/coverage/tracker.js +251 -0
- package/dist/sdd/coverage/tracker.js.map +1 -0
- package/dist/sdd/disaster/recovery.d.ts +11 -0
- package/dist/sdd/disaster/recovery.d.ts.map +1 -0
- package/dist/sdd/disaster/recovery.js +55 -0
- package/dist/sdd/disaster/recovery.js.map +1 -0
- package/dist/sdd/discovery/adaptive.d.ts +14 -0
- package/dist/sdd/discovery/adaptive.d.ts.map +1 -0
- package/dist/sdd/discovery/adaptive.js +145 -0
- package/dist/sdd/discovery/adaptive.js.map +1 -0
- package/dist/sdd/discovery/briefing-analyzer.d.ts +66 -0
- package/dist/sdd/discovery/briefing-analyzer.d.ts.map +1 -0
- package/dist/sdd/discovery/briefing-analyzer.js +672 -0
- package/dist/sdd/discovery/briefing-analyzer.js.map +1 -0
- package/dist/sdd/discovery/briefing.d.ts +109 -0
- package/dist/sdd/discovery/briefing.d.ts.map +1 -0
- package/dist/sdd/discovery/briefing.js +617 -0
- package/dist/sdd/discovery/briefing.js.map +1 -0
- package/dist/sdd/discovery/graph-builder.d.ts +10 -0
- package/dist/sdd/discovery/graph-builder.d.ts.map +1 -0
- package/dist/sdd/discovery/graph-builder.js +510 -0
- package/dist/sdd/discovery/graph-builder.js.map +1 -0
- package/dist/sdd/documentation/generator.d.ts +7 -0
- package/dist/sdd/documentation/generator.d.ts.map +1 -0
- package/dist/sdd/documentation/generator.js +119 -0
- package/dist/sdd/documentation/generator.js.map +1 -0
- package/dist/sdd/domain/types.d.ts +460 -0
- package/dist/sdd/domain/types.d.ts.map +1 -0
- package/dist/sdd/domain/types.js +25 -0
- package/dist/sdd/domain/types.js.map +1 -0
- package/dist/sdd/drift/detector.d.ts +28 -0
- package/dist/sdd/drift/detector.d.ts.map +1 -0
- package/dist/sdd/drift/detector.js +379 -0
- package/dist/sdd/drift/detector.js.map +1 -0
- package/dist/sdd/drift/exclusion.d.ts +54 -0
- package/dist/sdd/drift/exclusion.d.ts.map +1 -0
- package/dist/sdd/drift/exclusion.js +179 -0
- package/dist/sdd/drift/exclusion.js.map +1 -0
- package/dist/sdd/drift/signals.d.ts +52 -0
- package/dist/sdd/drift/signals.d.ts.map +1 -0
- package/dist/sdd/drift/signals.js +470 -0
- package/dist/sdd/drift/signals.js.map +1 -0
- package/dist/sdd/enforcement/interceptor.d.ts +47 -0
- package/dist/sdd/enforcement/interceptor.d.ts.map +1 -0
- package/dist/sdd/enforcement/interceptor.js +365 -0
- package/dist/sdd/enforcement/interceptor.js.map +1 -0
- package/dist/sdd/enforcement/workflow-tracker.d.ts +66 -0
- package/dist/sdd/enforcement/workflow-tracker.d.ts.map +1 -0
- package/dist/sdd/enforcement/workflow-tracker.js +229 -0
- package/dist/sdd/enforcement/workflow-tracker.js.map +1 -0
- package/dist/sdd/graph/engine.d.ts +44 -0
- package/dist/sdd/graph/engine.d.ts.map +1 -0
- package/dist/sdd/graph/engine.js +203 -0
- package/dist/sdd/graph/engine.js.map +1 -0
- package/dist/sdd/graph/index.d.ts +160 -0
- package/dist/sdd/graph/index.d.ts.map +1 -0
- package/dist/sdd/graph/index.js +624 -0
- package/dist/sdd/graph/index.js.map +1 -0
- package/dist/sdd/graph/integrity-guard.d.ts +129 -0
- package/dist/sdd/graph/integrity-guard.d.ts.map +1 -0
- package/dist/sdd/graph/integrity-guard.js +263 -0
- package/dist/sdd/graph/integrity-guard.js.map +1 -0
- package/dist/sdd/graph/integrity.d.ts +79 -0
- package/dist/sdd/graph/integrity.d.ts.map +1 -0
- package/dist/sdd/graph/integrity.js +462 -0
- package/dist/sdd/graph/integrity.js.map +1 -0
- package/dist/sdd/graph/pruner.d.ts +27 -0
- package/dist/sdd/graph/pruner.d.ts.map +1 -0
- package/dist/sdd/graph/pruner.js +203 -0
- package/dist/sdd/graph/pruner.js.map +1 -0
- package/dist/sdd/graph/traverse.d.ts +43 -0
- package/dist/sdd/graph/traverse.d.ts.map +1 -0
- package/dist/sdd/graph/traverse.js +265 -0
- package/dist/sdd/graph/traverse.js.map +1 -0
- package/dist/sdd/incidents/manager.d.ts +10 -0
- package/dist/sdd/incidents/manager.d.ts.map +1 -0
- package/dist/sdd/incidents/manager.js +63 -0
- package/dist/sdd/incidents/manager.js.map +1 -0
- package/dist/sdd/knowledge/transfer.d.ts +24 -0
- package/dist/sdd/knowledge/transfer.d.ts.map +1 -0
- package/dist/sdd/knowledge/transfer.js +94 -0
- package/dist/sdd/knowledge/transfer.js.map +1 -0
- package/dist/sdd/migrations/fixes.d.ts +2 -0
- package/dist/sdd/migrations/fixes.d.ts.map +1 -0
- package/dist/sdd/migrations/fixes.js +159 -0
- package/dist/sdd/migrations/fixes.js.map +1 -0
- package/dist/sdd/migrations/index.d.ts +2 -0
- package/dist/sdd/migrations/index.d.ts.map +1 -0
- package/dist/sdd/migrations/index.js +5 -0
- package/dist/sdd/migrations/index.js.map +1 -0
- package/dist/sdd/migrations/migration-runner.d.ts +41 -0
- package/dist/sdd/migrations/migration-runner.d.ts.map +1 -0
- package/dist/sdd/migrations/migration-runner.js +91 -0
- package/dist/sdd/migrations/migration-runner.js.map +1 -0
- package/dist/sdd/monitoring/setup.d.ts +40 -0
- package/dist/sdd/monitoring/setup.d.ts.map +1 -0
- package/dist/sdd/monitoring/setup.js +177 -0
- package/dist/sdd/monitoring/setup.js.map +1 -0
- package/dist/sdd/monitoring/telemetry.d.ts +18 -0
- package/dist/sdd/monitoring/telemetry.d.ts.map +1 -0
- package/dist/sdd/monitoring/telemetry.js +37 -0
- package/dist/sdd/monitoring/telemetry.js.map +1 -0
- package/dist/sdd/patterns/anti-patterns.d.ts +21 -0
- package/dist/sdd/patterns/anti-patterns.d.ts.map +1 -0
- package/dist/sdd/patterns/anti-patterns.js +286 -0
- package/dist/sdd/patterns/anti-patterns.js.map +1 -0
- package/dist/sdd/patterns/ast-clones.d.ts +23 -0
- package/dist/sdd/patterns/ast-clones.d.ts.map +1 -0
- package/dist/sdd/patterns/ast-clones.js +171 -0
- package/dist/sdd/patterns/ast-clones.js.map +1 -0
- package/dist/sdd/patterns/config-drift.d.ts +16 -0
- package/dist/sdd/patterns/config-drift.d.ts.map +1 -0
- package/dist/sdd/patterns/config-drift.js +322 -0
- package/dist/sdd/patterns/config-drift.js.map +1 -0
- package/dist/sdd/patterns/contradictions.d.ts +38 -0
- package/dist/sdd/patterns/contradictions.d.ts.map +1 -0
- package/dist/sdd/patterns/contradictions.js +237 -0
- package/dist/sdd/patterns/contradictions.js.map +1 -0
- package/dist/sdd/patterns/learner.d.ts +49 -0
- package/dist/sdd/patterns/learner.d.ts.map +1 -0
- package/dist/sdd/patterns/learner.js +226 -0
- package/dist/sdd/patterns/learner.js.map +1 -0
- package/dist/sdd/permissions/access.d.ts +69 -0
- package/dist/sdd/permissions/access.d.ts.map +1 -0
- package/dist/sdd/permissions/access.js +333 -0
- package/dist/sdd/permissions/access.js.map +1 -0
- package/dist/sdd/persistence/repository.d.ts +60 -0
- package/dist/sdd/persistence/repository.d.ts.map +1 -0
- package/dist/sdd/persistence/repository.js +96 -0
- package/dist/sdd/persistence/repository.js.map +1 -0
- package/dist/sdd/persistence/sqlite.d.ts +122 -0
- package/dist/sdd/persistence/sqlite.d.ts.map +1 -0
- package/dist/sdd/persistence/sqlite.js +602 -0
- package/dist/sdd/persistence/sqlite.js.map +1 -0
- package/dist/sdd/persistence/yaml.d.ts +41 -0
- package/dist/sdd/persistence/yaml.d.ts.map +1 -0
- package/dist/sdd/persistence/yaml.js +382 -0
- package/dist/sdd/persistence/yaml.js.map +1 -0
- package/dist/sdd/promises/classifier.d.ts +48 -0
- package/dist/sdd/promises/classifier.d.ts.map +1 -0
- package/dist/sdd/promises/classifier.js +215 -0
- package/dist/sdd/promises/classifier.js.map +1 -0
- package/dist/sdd/promises/tracker.d.ts +20 -0
- package/dist/sdd/promises/tracker.d.ts.map +1 -0
- package/dist/sdd/promises/tracker.js +204 -0
- package/dist/sdd/promises/tracker.js.map +1 -0
- package/dist/sdd/quality/scorer.d.ts +44 -0
- package/dist/sdd/quality/scorer.d.ts.map +1 -0
- package/dist/sdd/quality/scorer.js +216 -0
- package/dist/sdd/quality/scorer.js.map +1 -0
- package/dist/sdd/rollback/manager.d.ts +45 -0
- package/dist/sdd/rollback/manager.d.ts.map +1 -0
- package/dist/sdd/rollback/manager.js +266 -0
- package/dist/sdd/rollback/manager.js.map +1 -0
- package/dist/sdd/session/handoff.d.ts +52 -0
- package/dist/sdd/session/handoff.d.ts.map +1 -0
- package/dist/sdd/session/handoff.js +264 -0
- package/dist/sdd/session/handoff.js.map +1 -0
- package/dist/sdd/sla/tracker.d.ts +11 -0
- package/dist/sdd/sla/tracker.d.ts.map +1 -0
- package/dist/sdd/sla/tracker.js +52 -0
- package/dist/sdd/sla/tracker.js.map +1 -0
- package/dist/sdd/sync/git-sync.d.ts +61 -0
- package/dist/sdd/sync/git-sync.d.ts.map +1 -0
- package/dist/sdd/sync/git-sync.js +297 -0
- package/dist/sdd/sync/git-sync.js.map +1 -0
- package/dist/sdd/toggle/state.d.ts +8 -0
- package/dist/sdd/toggle/state.d.ts.map +1 -0
- package/dist/sdd/toggle/state.js +32 -0
- package/dist/sdd/toggle/state.js.map +1 -0
- package/dist/sdd/transactions/manager.d.ts +12 -0
- package/dist/sdd/transactions/manager.d.ts.map +1 -0
- package/dist/sdd/transactions/manager.js +80 -0
- package/dist/sdd/transactions/manager.js.map +1 -0
- package/dist/sdd/validation/coverage-index.d.ts +117 -0
- package/dist/sdd/validation/coverage-index.d.ts.map +1 -0
- package/dist/sdd/validation/coverage-index.js +251 -0
- package/dist/sdd/validation/coverage-index.js.map +1 -0
- package/dist/sdd/validation/executable.d.ts +26 -0
- package/dist/sdd/validation/executable.d.ts.map +1 -0
- package/dist/sdd/validation/executable.js +122 -0
- package/dist/sdd/validation/executable.js.map +1 -0
- package/dist/sdd/validation/smart-validator.d.ts +53 -0
- package/dist/sdd/validation/smart-validator.d.ts.map +1 -0
- package/dist/sdd/validation/smart-validator.js +347 -0
- package/dist/sdd/validation/smart-validator.js.map +1 -0
- package/dist/sdd/validation/validator.d.ts +39 -0
- package/dist/sdd/validation/validator.d.ts.map +1 -0
- package/dist/sdd/validation/validator.js +512 -0
- package/dist/sdd/validation/validator.js.map +1 -0
- package/dist/sdd/workflow/exporter.d.ts +36 -0
- package/dist/sdd/workflow/exporter.d.ts.map +1 -0
- package/dist/sdd/workflow/exporter.js +112 -0
- package/dist/sdd/workflow/exporter.js.map +1 -0
- package/dist/sdd/workflows/ab-testing.d.ts +18 -0
- package/dist/sdd/workflows/ab-testing.d.ts.map +1 -0
- package/dist/sdd/workflows/ab-testing.js +67 -0
- package/dist/sdd/workflows/ab-testing.js.map +1 -0
- package/dist/sdd/workflows/bug-fix.d.ts +13 -0
- package/dist/sdd/workflows/bug-fix.d.ts.map +1 -0
- package/dist/sdd/workflows/bug-fix.js +65 -0
- package/dist/sdd/workflows/bug-fix.js.map +1 -0
- package/dist/sdd/workflows/data-migration.d.ts +14 -0
- package/dist/sdd/workflows/data-migration.d.ts.map +1 -0
- package/dist/sdd/workflows/data-migration.js +68 -0
- package/dist/sdd/workflows/data-migration.js.map +1 -0
- package/dist/sdd/workflows/deprecation.d.ts +15 -0
- package/dist/sdd/workflows/deprecation.d.ts.map +1 -0
- package/dist/sdd/workflows/deprecation.js +68 -0
- package/dist/sdd/workflows/deprecation.js.map +1 -0
- package/dist/sdd/workflows/feature-flags.d.ts +14 -0
- package/dist/sdd/workflows/feature-flags.d.ts.map +1 -0
- package/dist/sdd/workflows/feature-flags.js +73 -0
- package/dist/sdd/workflows/feature-flags.js.map +1 -0
- package/dist/sdd/workflows/hotfix.d.ts +13 -0
- package/dist/sdd/workflows/hotfix.d.ts.map +1 -0
- package/dist/sdd/workflows/hotfix.js +67 -0
- package/dist/sdd/workflows/hotfix.js.map +1 -0
- package/dist/sdd/workflows/multi-tenancy.d.ts +13 -0
- package/dist/sdd/workflows/multi-tenancy.d.ts.map +1 -0
- package/dist/sdd/workflows/multi-tenancy.js +68 -0
- package/dist/sdd/workflows/multi-tenancy.js.map +1 -0
- package/dist/sdd/workflows/onboarding.d.ts +7 -0
- package/dist/sdd/workflows/onboarding.d.ts.map +1 -0
- package/dist/sdd/workflows/onboarding.js +43 -0
- package/dist/sdd/workflows/onboarding.js.map +1 -0
- package/dist/sdd/workflows/refactoring.d.ts +14 -0
- package/dist/sdd/workflows/refactoring.d.ts.map +1 -0
- package/dist/sdd/workflows/refactoring.js +73 -0
- package/dist/sdd/workflows/refactoring.js.map +1 -0
- package/dist/server/events.d.ts +64 -0
- package/dist/server/events.d.ts.map +1 -0
- package/dist/server/events.js +149 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/server.d.ts +33 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +1019 -0
- package/dist/server/server.js.map +1 -0
- package/marketplace.json +39 -0
- package/package.json +65 -0
- package/src/code-intelligence/analyzer.ts +350 -0
- package/src/code-intelligence/ast/cache.ts +61 -0
- package/src/code-intelligence/ast/common.ts +62 -0
- package/src/code-intelligence/ast/component.ts +39 -0
- package/src/code-intelligence/ast/fallback.ts +44 -0
- package/src/code-intelligence/ast/index.ts +4 -0
- package/src/code-intelligence/ast/ir.ts +91 -0
- package/src/code-intelligence/ast/metrics.ts +65 -0
- package/src/code-intelligence/ast/registry.ts +28 -0
- package/src/code-intelligence/ast/tree-sitter.ts +226 -0
- package/src/code-intelligence/ast/typescript.ts +140 -0
- package/src/index.ts +22 -0
- package/src/mcp/server.ts +77 -0
- package/src/opencode/hooks.ts +728 -0
- package/src/opencode/router/categories.ts +192 -0
- package/src/opencode/router/embeddings.ts +149 -0
- package/src/opencode/router/graph-state-snapshot.ts +163 -0
- package/src/opencode/router/index.ts +44 -0
- package/src/opencode/router/intent-classifier.ts +140 -0
- package/src/opencode/router/semantic-nudge.ts +89 -0
- package/src/opencode/router/state-gate.ts +192 -0
- package/src/opencode/router/tool-embeddings.ts +162 -0
- package/src/opencode/router/tool-registry.ts +135 -0
- package/src/opencode/router/tool-taxonomy.ts +284 -0
- package/src/opencode/router/tools-composite.ts +685 -0
- package/src/opencode/shell-hooks.ts +115 -0
- package/src/opencode/system-prompt.ts +617 -0
- package/src/opencode/tools.ts +4102 -0
- package/src/opencode/workflows/chains.ts +205 -0
- package/src/opencode/workflows/executor.ts +172 -0
- package/src/opencode/workflows/index.ts +21 -0
- package/src/opencode/workflows/tools-workflow.ts +91 -0
- package/src/opencode/workflows/types.ts +42 -0
- package/src/sdd/analysis/compliance.ts +279 -0
- package/src/sdd/analysis/scalability.ts +97 -0
- package/src/sdd/analysis/security.ts +135 -0
- package/src/sdd/brownfield/scanner.ts +276 -0
- package/src/sdd/cache/manager.ts +899 -0
- package/src/sdd/cache/snapshot-store.ts +185 -0
- package/src/sdd/changes/manager.ts +326 -0
- package/src/sdd/cicd/generators.ts +1095 -0
- package/src/sdd/code-quality/complexity.ts +235 -0
- package/src/sdd/code-quality/conventions.ts +220 -0
- package/src/sdd/code-quality/dependencies.ts +203 -0
- package/src/sdd/code-quality/import-analyzer.ts +294 -0
- package/src/sdd/code-quality/metrics.ts +232 -0
- package/src/sdd/code-quality/smells.ts +415 -0
- package/src/sdd/code-quality/symbol-parser.ts +335 -0
- package/src/sdd/code-quality/usage-tracker.ts +527 -0
- package/src/sdd/code-quality/utils.ts +13 -0
- package/src/sdd/codegen/generator.ts +1181 -0
- package/src/sdd/constitution/validator.ts +253 -0
- package/src/sdd/cost/estimator.ts +147 -0
- package/src/sdd/coverage/tracker.ts +342 -0
- package/src/sdd/disaster/recovery.ts +79 -0
- package/src/sdd/discovery/adaptive.ts +167 -0
- package/src/sdd/discovery/briefing-analyzer.ts +802 -0
- package/src/sdd/discovery/briefing.ts +770 -0
- package/src/sdd/discovery/graph-builder.ts +598 -0
- package/src/sdd/documentation/generator.ts +158 -0
- package/src/sdd/domain/types.ts +658 -0
- package/src/sdd/drift/detector.ts +465 -0
- package/src/sdd/drift/exclusion.ts +223 -0
- package/src/sdd/drift/signals.ts +577 -0
- package/src/sdd/enforcement/interceptor.ts +444 -0
- package/src/sdd/enforcement/workflow-tracker.ts +263 -0
- package/src/sdd/graph/engine.ts +277 -0
- package/src/sdd/graph/index.ts +700 -0
- package/src/sdd/graph/integrity-guard.ts +348 -0
- package/src/sdd/graph/integrity.ts +628 -0
- package/src/sdd/graph/pruner.ts +221 -0
- package/src/sdd/graph/traverse.ts +331 -0
- package/src/sdd/incidents/manager.ts +87 -0
- package/src/sdd/knowledge/transfer.ts +140 -0
- package/src/sdd/migrations/fixes.ts +154 -0
- package/src/sdd/migrations/index.ts +14 -0
- package/src/sdd/migrations/migration-runner.ts +118 -0
- package/src/sdd/monitoring/setup.ts +237 -0
- package/src/sdd/monitoring/telemetry.ts +44 -0
- package/src/sdd/patterns/anti-patterns.ts +333 -0
- package/src/sdd/patterns/ast-clones.ts +214 -0
- package/src/sdd/patterns/config-drift.ts +346 -0
- package/src/sdd/patterns/contradictions.ts +323 -0
- package/src/sdd/patterns/learner.ts +266 -0
- package/src/sdd/permissions/access.ts +478 -0
- package/src/sdd/persistence/repository.ts +166 -0
- package/src/sdd/persistence/sqlite.ts +703 -0
- package/src/sdd/persistence/yaml.ts +409 -0
- package/src/sdd/promises/classifier.ts +253 -0
- package/src/sdd/promises/tracker.ts +258 -0
- package/src/sdd/quality/scorer.ts +263 -0
- package/src/sdd/rollback/manager.ts +361 -0
- package/src/sdd/session/handoff.ts +354 -0
- package/src/sdd/sla/tracker.ts +68 -0
- package/src/sdd/sync/git-sync.ts +401 -0
- package/src/sdd/toggle/state.ts +38 -0
- package/src/sdd/transactions/manager.ts +93 -0
- package/src/sdd/validation/coverage-index.ts +339 -0
- package/src/sdd/validation/executable.ts +127 -0
- package/src/sdd/validation/smart-validator.ts +470 -0
- package/src/sdd/validation/validator.ts +641 -0
- package/src/sdd/workflow/exporter.ts +169 -0
- package/src/sdd/workflows/ab-testing.ts +90 -0
- package/src/sdd/workflows/bug-fix.ts +81 -0
- package/src/sdd/workflows/data-migration.ts +86 -0
- package/src/sdd/workflows/deprecation.ts +87 -0
- package/src/sdd/workflows/feature-flags.ts +91 -0
- package/src/sdd/workflows/hotfix.ts +83 -0
- package/src/sdd/workflows/multi-tenancy.ts +84 -0
- package/src/sdd/workflows/onboarding.ts +82 -0
- package/src/sdd/workflows/refactoring.ts +90 -0
- package/src/server/events.ts +184 -0
- package/src/server/server.ts +1088 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Categories — Mapeamento de tools para categorias de intenção.
|
|
3
|
+
*
|
|
4
|
+
* Cada tool é classificada em uma ou mais categorias.
|
|
5
|
+
* O intent classifier usa isso para filtrar tools por categoria.
|
|
6
|
+
*
|
|
7
|
+
* Consumido por: intent-classifier.ts, tool-registry.ts
|
|
8
|
+
* Dependências: tool-taxonomy.ts
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { STANDALONE_TOOLS, TOOL_TAXONOMY, type ToolCategory } from "./tool-taxonomy.js"
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Categorias de intenção do usuário.
|
|
15
|
+
*/
|
|
16
|
+
export type IntentCategory =
|
|
17
|
+
| "mutation" // Criar, modificar, remover nós/relações
|
|
18
|
+
| "query" // Buscar, consultar, inspecionar o grafo
|
|
19
|
+
| "workflow" // Gerenciar changes, aprovações, ciclo de vida
|
|
20
|
+
| "analysis" // Análise de impacto, drift, validação
|
|
21
|
+
| "quality" // Qualidade de código, métricas, smells
|
|
22
|
+
| "enterprise" // Workflows empresariais (migration, security, etc.)
|
|
23
|
+
| "admin" // Administração: permissões, sync, cache, snapshots
|
|
24
|
+
| "discovery" // Descoberta de requisitos, briefing, perguntas
|
|
25
|
+
| "implementation" // Geração de código, planejamento, implementação
|
|
26
|
+
| "info" // Informação: status, histórico, help
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Mapeamento de tools standalone para categorias de intenção.
|
|
30
|
+
*/
|
|
31
|
+
const STANDALONE_CATEGORIES: Record<string, IntentCategory[]> = {
|
|
32
|
+
// Mutation
|
|
33
|
+
"sdd.initialize": ["mutation"],
|
|
34
|
+
"sdd.build_graph": ["mutation", "discovery"],
|
|
35
|
+
"sdd.update_from_answers": ["mutation", "discovery"],
|
|
36
|
+
"sdd.discover": ["discovery"],
|
|
37
|
+
|
|
38
|
+
// Query
|
|
39
|
+
"sdd.inspect": ["query"],
|
|
40
|
+
"sdd.query_graph": ["query"],
|
|
41
|
+
"sdd.get_context": ["query"],
|
|
42
|
+
|
|
43
|
+
// Workflow
|
|
44
|
+
"sdd.enforce": ["workflow"],
|
|
45
|
+
"sdd.enforce_rules": ["workflow"],
|
|
46
|
+
"sdd.full_cycle": ["workflow"],
|
|
47
|
+
"sdd.create_change": ["workflow"],
|
|
48
|
+
"sdd.approve_change": ["workflow"],
|
|
49
|
+
"sdd.complete_change": ["workflow"],
|
|
50
|
+
"sdd.fail_change": ["workflow"],
|
|
51
|
+
"sdd.pending_changes": ["workflow", "info"],
|
|
52
|
+
"sdd.change_history": ["info"],
|
|
53
|
+
"sdd.impact_report": ["analysis"],
|
|
54
|
+
"sdd.toggle": ["admin"],
|
|
55
|
+
"sdd.toggle_status": ["admin"],
|
|
56
|
+
|
|
57
|
+
// Analysis
|
|
58
|
+
"sdd.analyze_impact": ["analysis"],
|
|
59
|
+
"sdd.validate": ["analysis"],
|
|
60
|
+
"sdd.detect_drift": ["analysis"],
|
|
61
|
+
"sdd.drift_signals": ["analysis"],
|
|
62
|
+
"sdd.anti_patterns": ["analysis"],
|
|
63
|
+
"sdd.clone_detection": ["analysis"],
|
|
64
|
+
"sdd.contradictions": ["analysis"],
|
|
65
|
+
"sdd.coverage": ["analysis"],
|
|
66
|
+
"sdd.promises": ["analysis"],
|
|
67
|
+
|
|
68
|
+
// Implementation
|
|
69
|
+
"sdd.generate_code": ["implementation"],
|
|
70
|
+
"sdd.auto_link_tests": ["implementation"],
|
|
71
|
+
|
|
72
|
+
// Quality (individual tools, não composits)
|
|
73
|
+
"sdd.quality": ["quality"],
|
|
74
|
+
"sdd.constitution": ["analysis"],
|
|
75
|
+
|
|
76
|
+
// Enterprise
|
|
77
|
+
"sdd.bug_fix": ["workflow", "implementation"],
|
|
78
|
+
"sdd.hotfix": ["workflow", "implementation"],
|
|
79
|
+
"sdd.refactoring": ["workflow", "implementation"],
|
|
80
|
+
"sdd.deprecate": ["workflow"],
|
|
81
|
+
"sdd.install_hooks": ["implementation"],
|
|
82
|
+
"sdd.brownfield_scan": ["analysis"],
|
|
83
|
+
"sdd.generate_cicd": ["implementation"],
|
|
84
|
+
"sdd.session_handoff": ["info"],
|
|
85
|
+
"sdd.migrate_storage": ["admin"],
|
|
86
|
+
|
|
87
|
+
// Info
|
|
88
|
+
"sdd.start_dashboard": ["admin"],
|
|
89
|
+
"sdd.mcp_server_info": ["info"],
|
|
90
|
+
"sdd.handle_mcp_tool": ["info"],
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Mapeamento de tools composits para categorias de intenção.
|
|
95
|
+
*/
|
|
96
|
+
const COMPOSITE_CATEGORIES: Record<string, IntentCategory[]> = {
|
|
97
|
+
"sdd.graph_mutation": ["mutation"],
|
|
98
|
+
"sdd.graph_query": ["query"],
|
|
99
|
+
"sdd.traverse": ["query"],
|
|
100
|
+
"sdd.permissions": ["admin"],
|
|
101
|
+
"sdd.snapshot": ["admin"],
|
|
102
|
+
"sdd.sync": ["admin"],
|
|
103
|
+
"sdd.graph_admin": ["admin", "analysis"],
|
|
104
|
+
"sdd.code_quality": ["quality"],
|
|
105
|
+
"sdd.enterprise": ["enterprise"],
|
|
106
|
+
"sdd.drift_whitelist": ["analysis"],
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Obtém as categorias de intenção para uma tool.
|
|
111
|
+
*/
|
|
112
|
+
export function getToolCategories(toolName: string): IntentCategory[] {
|
|
113
|
+
if (STANDALONE_CATEGORIES[toolName]) return STANDALONE_CATEGORIES[toolName]
|
|
114
|
+
if (COMPOSITE_CATEGORIES[toolName]) return COMPOSITE_CATEGORIES[toolName]
|
|
115
|
+
return ["info"] // fallback
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Obtém todas as tools de uma categoria de intenção.
|
|
120
|
+
*/
|
|
121
|
+
export function getToolsByCategory(category: IntentCategory): string[] {
|
|
122
|
+
const tools: string[] = []
|
|
123
|
+
|
|
124
|
+
for (const [name, categories] of Object.entries(STANDALONE_CATEGORIES)) {
|
|
125
|
+
if (categories.includes(category)) tools.push(name)
|
|
126
|
+
}
|
|
127
|
+
for (const [name, categories] of Object.entries(COMPOSITE_CATEGORIES)) {
|
|
128
|
+
if (categories.includes(category)) tools.push(name)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return tools
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Obtém categorias representadas em um conjunto de tools.
|
|
136
|
+
*/
|
|
137
|
+
export function getCategoriesInToolSet(toolNames: Set<string>): IntentCategory[] {
|
|
138
|
+
const categories = new Set<IntentCategory>()
|
|
139
|
+
for (const name of toolNames) {
|
|
140
|
+
for (const cat of getToolCategories(name)) {
|
|
141
|
+
categories.add(cat)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return [...categories]
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Keywords associadas a cada categoria de intenção.
|
|
149
|
+
* Usado como sinal auxiliar no intent classifier.
|
|
150
|
+
*/
|
|
151
|
+
export const CATEGORY_KEYWORDS: Record<IntentCategory, string[]> = {
|
|
152
|
+
mutation: [
|
|
153
|
+
"criar", "adicionar", "remover", "deletar", "modificar", "atualizar",
|
|
154
|
+
"create", "add", "remove", "delete", "modify", "update",
|
|
155
|
+
],
|
|
156
|
+
query: [
|
|
157
|
+
"buscar", "consultar", "mostrar", "listar", "ver", "inspecionar",
|
|
158
|
+
"search", "query", "show", "list", "find", "inspect", "get",
|
|
159
|
+
],
|
|
160
|
+
workflow: [
|
|
161
|
+
"aprovar", "rejeitar", "completar", "falhar", "mudar", "change",
|
|
162
|
+
"approve", "reject", "complete", "fail", "change", "enforce",
|
|
163
|
+
],
|
|
164
|
+
analysis: [
|
|
165
|
+
"analisar", "validar", "verificar", "detectar", "drift", "impacto",
|
|
166
|
+
"analyze", "validate", "verify", "detect", "drift", "impact",
|
|
167
|
+
],
|
|
168
|
+
quality: [
|
|
169
|
+
"qualidade", "métrica", "smell", "complexidade", "dependência",
|
|
170
|
+
"quality", "metric", "smell", "complexity", "dependency", "dead code",
|
|
171
|
+
],
|
|
172
|
+
enterprise: [
|
|
173
|
+
"migration", "experimento", "flag", "tenant", "segurança", "compliance",
|
|
174
|
+
"security", "monitoring", "incident", "sla", "custo",
|
|
175
|
+
],
|
|
176
|
+
admin: [
|
|
177
|
+
"permissão", "role", "audit", "sync", "snapshot", "rollback", "cache",
|
|
178
|
+
"permission", "role", "sync", "snapshot", "rollback",
|
|
179
|
+
],
|
|
180
|
+
discovery: [
|
|
181
|
+
"briefing", "descobrir", "perguntar", "especificação", "requisito",
|
|
182
|
+
"discover", "briefing", "question", "specification", "requirement",
|
|
183
|
+
],
|
|
184
|
+
implementation: [
|
|
185
|
+
"implementar", "gerar código", "code", "generate", "planejar",
|
|
186
|
+
"implement", "build", "write", "plan",
|
|
187
|
+
],
|
|
188
|
+
info: [
|
|
189
|
+
"status", "histórico", "help", "informação", "info",
|
|
190
|
+
"status", "history", "help", "information", "info",
|
|
191
|
+
],
|
|
192
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Similaridade local entre input do usuário e tools SDD.
|
|
3
|
+
*
|
|
4
|
+
* O roteamento usa BM25 lexical; as funções de embedding permanecem apenas
|
|
5
|
+
* como compatibilidade para consumidores externos e migração futura.
|
|
6
|
+
*
|
|
7
|
+
* Consumido por: intent-classifier.ts, semantic-nudge.ts
|
|
8
|
+
* Dependências: nenhuma (módulo puro)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Dimensão dos embeddings (compatível com sentence-transformers all-MiniLM-L6-v2) */
|
|
12
|
+
const EMBEDDING_DIM = 384
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Gera um embedding determinístico a partir de uma string.
|
|
16
|
+
* Usa hash simples para criar um vetor pseudo-aleatório.
|
|
17
|
+
* Para produção, substituir por chamada a um modelo real.
|
|
18
|
+
*/
|
|
19
|
+
function hashToEmbedding(text: string): number[] {
|
|
20
|
+
const embedding: number[] = new Array(EMBEDDING_DIM)
|
|
21
|
+
const normalized = text.toLowerCase().replace(/[^a-z0-9\s]/g, " ").trim()
|
|
22
|
+
const words = normalized.split(/\s+/).filter(w => w.length > 1)
|
|
23
|
+
|
|
24
|
+
// Inicializar com zeros
|
|
25
|
+
for (let i = 0; i < EMBEDDING_DIM; i++) {
|
|
26
|
+
embedding[i] = 0
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Adicionar contribuição de cada palavra
|
|
30
|
+
for (const word of words) {
|
|
31
|
+
let hash = 0
|
|
32
|
+
for (let i = 0; i < word.length; i++) {
|
|
33
|
+
hash = ((hash << 5) - hash + word.charCodeAt(i)) | 0
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Espalhar a contribuição da palavra pelo vetor
|
|
37
|
+
const seed = Math.abs(hash)
|
|
38
|
+
for (let i = 0; i < EMBEDDING_DIM; i++) {
|
|
39
|
+
const val = Math.sin(seed * (i + 1) * 0.001) * 0.1
|
|
40
|
+
embedding[i] += val
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Normalizar
|
|
45
|
+
let norm = 0
|
|
46
|
+
for (let i = 0; i < EMBEDDING_DIM; i++) {
|
|
47
|
+
norm += embedding[i] * embedding[i]
|
|
48
|
+
}
|
|
49
|
+
norm = Math.sqrt(norm)
|
|
50
|
+
if (norm > 0) {
|
|
51
|
+
for (let i = 0; i < EMBEDDING_DIM; i++) {
|
|
52
|
+
embedding[i] /= norm
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return embedding
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Calcula similaridade coseno entre dois vetores.
|
|
61
|
+
*/
|
|
62
|
+
export function cosineSimilarity(a: number[], b: number[]): number {
|
|
63
|
+
if (a.length !== b.length) return 0
|
|
64
|
+
let dotProduct = 0
|
|
65
|
+
let normA = 0
|
|
66
|
+
let normB = 0
|
|
67
|
+
for (let i = 0; i < a.length; i++) {
|
|
68
|
+
dotProduct += a[i] * b[i]
|
|
69
|
+
normA += a[i] * a[i]
|
|
70
|
+
normB += b[i] * b[i]
|
|
71
|
+
}
|
|
72
|
+
const denominator = Math.sqrt(normA) * Math.sqrt(normB)
|
|
73
|
+
return denominator === 0 ? 0 : dotProduct / denominator
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Cache de embeddings calculados.
|
|
78
|
+
*/
|
|
79
|
+
const embeddingCache = new Map<string, number[]>()
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Obtém o embedding para uma string (com cache).
|
|
83
|
+
*/
|
|
84
|
+
export function getEmbedding(text: string): number[] {
|
|
85
|
+
const cached = embeddingCache.get(text)
|
|
86
|
+
if (cached) return cached
|
|
87
|
+
|
|
88
|
+
const embedding = hashToEmbedding(text)
|
|
89
|
+
embeddingCache.set(text, embedding)
|
|
90
|
+
return embedding
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Calcula similaridade entre um texto e múltiplas opções.
|
|
95
|
+
* Retorna pares (label, score) ordenados por similaridade decrescente.
|
|
96
|
+
*/
|
|
97
|
+
export function rankSimilarity(
|
|
98
|
+
query: string,
|
|
99
|
+
options: Array<{ label: string; text: string }>,
|
|
100
|
+
): Array<{ label: string; score: number }> {
|
|
101
|
+
// Tool routing needs dependable lexical relevance, not an untrained hash
|
|
102
|
+
// vector that merely looks semantic. BM25 is local, deterministic and
|
|
103
|
+
// preserves exact technical terms, filenames and command names.
|
|
104
|
+
const tokenize = (text: string) => text.toLowerCase()
|
|
105
|
+
.normalize("NFD").replace(/[\u0300-\u036f]/g, "")
|
|
106
|
+
.split(/[^a-z0-9_./-]+/).filter((term) => term.length > 1)
|
|
107
|
+
const terms = tokenize(query)
|
|
108
|
+
const documents = options.map((option) => tokenize(option.text))
|
|
109
|
+
const averageLength = documents.reduce((sum, document) => sum + document.length, 0) / Math.max(documents.length, 1)
|
|
110
|
+
const documentFrequency = new Map<string, number>()
|
|
111
|
+
for (const document of documents) {
|
|
112
|
+
for (const term of new Set(document)) documentFrequency.set(term, (documentFrequency.get(term) || 0) + 1)
|
|
113
|
+
}
|
|
114
|
+
return options.map((option, index) => {
|
|
115
|
+
const document = documents[index]
|
|
116
|
+
const frequencies = new Map<string, number>()
|
|
117
|
+
for (const term of document) frequencies.set(term, (frequencies.get(term) || 0) + 1)
|
|
118
|
+
const score = [...new Set(terms)].reduce((total, term) => {
|
|
119
|
+
const frequency = frequencies.get(term) || 0
|
|
120
|
+
if (!frequency) return total
|
|
121
|
+
const idf = Math.log(1 + (options.length - (documentFrequency.get(term) || 0) + 0.5) / ((documentFrequency.get(term) || 0) + 0.5))
|
|
122
|
+
const k1 = 1.2
|
|
123
|
+
const b = 0.75
|
|
124
|
+
return total + idf * (frequency * (k1 + 1)) / (frequency + k1 * (1 - b + b * document.length / Math.max(averageLength, 1)))
|
|
125
|
+
}, 0)
|
|
126
|
+
return { label: option.label, score }
|
|
127
|
+
}).sort((a, b) => b.score - a.score)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Limpa o cache de embeddings.
|
|
132
|
+
*/
|
|
133
|
+
export function clearEmbeddingCache(): void {
|
|
134
|
+
embeddingCache.clear()
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Gera embeddings para todas as tools e retorna o mapa.
|
|
139
|
+
* Útil para pré-computação e persistência.
|
|
140
|
+
*/
|
|
141
|
+
export function generateToolEmbeddings(
|
|
142
|
+
tools: Array<{ name: string; description: string }>,
|
|
143
|
+
): Map<string, number[]> {
|
|
144
|
+
const map = new Map<string, number[]>()
|
|
145
|
+
for (const tool of tools) {
|
|
146
|
+
map.set(tool.name, getEmbedding(tool.description))
|
|
147
|
+
}
|
|
148
|
+
return map
|
|
149
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph State Snapshot — Captura o estado do grafo para decisão de visibilidade de tools.
|
|
3
|
+
*
|
|
4
|
+
* Cache por sessão com TTL de 30s para evitar reads redundantes do disco.
|
|
5
|
+
*
|
|
6
|
+
* Consumido por: state-gate.ts, hooks.ts
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { createRepository } from "../../sdd/persistence/repository.js"
|
|
10
|
+
import type { KnowledgeGraph } from "../../sdd/domain/types.js"
|
|
11
|
+
|
|
12
|
+
export type GraphState =
|
|
13
|
+
| "uninitialized"
|
|
14
|
+
| "empty"
|
|
15
|
+
| "partial"
|
|
16
|
+
| "ready"
|
|
17
|
+
| "has_change"
|
|
18
|
+
| "has_approved_change"
|
|
19
|
+
| "emergency"
|
|
20
|
+
|
|
21
|
+
export interface GraphSnapshot {
|
|
22
|
+
state: GraphState
|
|
23
|
+
nodeCount: number
|
|
24
|
+
relationshipCount: number
|
|
25
|
+
nodeTypes: string[]
|
|
26
|
+
hasSpecNodes: boolean
|
|
27
|
+
hasChanges: boolean
|
|
28
|
+
pendingChangeCount: number
|
|
29
|
+
approvedChangeCount: number
|
|
30
|
+
hasWorkflow: boolean
|
|
31
|
+
/** Timestamp do snapshot (para TTL cache) */
|
|
32
|
+
timestamp: number
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const CACHE_TTL_MS = 30_000 // 30 segundos
|
|
36
|
+
|
|
37
|
+
const SPEC_NODE_TYPES = ["feature", "entity", "requirement", "architecture_component", "module"]
|
|
38
|
+
|
|
39
|
+
let cachedSnapshot: GraphSnapshot | null = null
|
|
40
|
+
let cachedDirectory: string | null = null
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Captura o estado atual do grafo (com cache).
|
|
44
|
+
* Se o cache ainda é válido (TTL < 30s), retorna o cache.
|
|
45
|
+
*/
|
|
46
|
+
export function getGraphSnapshot(directory: string): GraphSnapshot {
|
|
47
|
+
const now = Date.now()
|
|
48
|
+
if (cachedSnapshot && cachedDirectory === directory && (now - cachedSnapshot.timestamp) < CACHE_TTL_MS) {
|
|
49
|
+
return cachedSnapshot
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const snapshot = captureSnapshot(directory)
|
|
53
|
+
cachedSnapshot = snapshot
|
|
54
|
+
cachedDirectory = directory
|
|
55
|
+
return snapshot
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Força refresh do cache (após mutações no grafo).
|
|
60
|
+
*/
|
|
61
|
+
export function invalidateSnapshotCache(): void {
|
|
62
|
+
cachedSnapshot = null
|
|
63
|
+
cachedDirectory = null
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function captureSnapshot(directory: string): GraphSnapshot {
|
|
67
|
+
const now = Date.now()
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
const repo = createRepository(directory)
|
|
71
|
+
if (!repo.isInitialized()) {
|
|
72
|
+
return {
|
|
73
|
+
state: "uninitialized",
|
|
74
|
+
nodeCount: 0, relationshipCount: 0, nodeTypes: [],
|
|
75
|
+
hasSpecNodes: false, hasChanges: false,
|
|
76
|
+
pendingChangeCount: 0, approvedChangeCount: 0,
|
|
77
|
+
hasWorkflow: false, timestamp: now,
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const graph = repo.loadGraph()
|
|
82
|
+
const nodeTypes = [...new Set(graph.nodes.map(n => n.type))]
|
|
83
|
+
const hasSpecNodes = graph.nodes.some(n => SPEC_NODE_TYPES.includes(n.type))
|
|
84
|
+
const changes = graph.nodes.filter(n => n.type === "change")
|
|
85
|
+
const pendingChanges = changes.filter(c => ["DRAFT", "PROPOSED"].includes(c.status))
|
|
86
|
+
const approvedChanges = changes.filter(c => c.status === "APPROVED")
|
|
87
|
+
|
|
88
|
+
// Detectar emergência (hotfix)
|
|
89
|
+
const hasEmergency = changes.some(c =>
|
|
90
|
+
c.name.toLowerCase().includes("hotfix") ||
|
|
91
|
+
c.name.toLowerCase().includes("emergency") ||
|
|
92
|
+
(c.metadata as Record<string, unknown>)?.approval_level === "POST_HOC"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
// Detectar workflow ativo
|
|
96
|
+
let hasWorkflow = false
|
|
97
|
+
try {
|
|
98
|
+
const { getWorkflowState } = require("../../sdd/enforcement/workflow-tracker.js")
|
|
99
|
+
const wfState = getWorkflowState()
|
|
100
|
+
hasWorkflow = wfState.enforced === true
|
|
101
|
+
} catch {}
|
|
102
|
+
|
|
103
|
+
// Determinar estado
|
|
104
|
+
let state: GraphState
|
|
105
|
+
if (hasEmergency) {
|
|
106
|
+
state = "emergency"
|
|
107
|
+
} else if (approvedChanges.length > 0) {
|
|
108
|
+
state = "has_approved_change"
|
|
109
|
+
} else if (pendingChanges.length > 0) {
|
|
110
|
+
state = "has_change"
|
|
111
|
+
} else if (graph.nodes.length <= 1) {
|
|
112
|
+
state = "empty"
|
|
113
|
+
} else if (!hasSpecNodes) {
|
|
114
|
+
state = "partial"
|
|
115
|
+
} else {
|
|
116
|
+
state = "ready"
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
state,
|
|
121
|
+
nodeCount: graph.nodes.length,
|
|
122
|
+
relationshipCount: graph.relationships.length,
|
|
123
|
+
nodeTypes,
|
|
124
|
+
hasSpecNodes,
|
|
125
|
+
hasChanges: changes.length > 0,
|
|
126
|
+
pendingChangeCount: pendingChanges.length,
|
|
127
|
+
approvedChangeCount: approvedChanges.length,
|
|
128
|
+
hasWorkflow,
|
|
129
|
+
timestamp: now,
|
|
130
|
+
}
|
|
131
|
+
} catch {
|
|
132
|
+
return {
|
|
133
|
+
state: "uninitialized",
|
|
134
|
+
nodeCount: 0, relationshipCount: 0, nodeTypes: [],
|
|
135
|
+
hasSpecNodes: false, hasChanges: false,
|
|
136
|
+
pendingChangeCount: 0, approvedChangeCount: 0,
|
|
137
|
+
hasWorkflow: false, timestamp: now,
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Descrição legível do estado para debugging.
|
|
144
|
+
*/
|
|
145
|
+
export function formatGraphState(snapshot: GraphSnapshot): string {
|
|
146
|
+
const stateLabels: Record<GraphState, string> = {
|
|
147
|
+
uninitialized: "❌ Não inicializado",
|
|
148
|
+
empty: "📭 Grafo vazio",
|
|
149
|
+
partial: "⚠️ Parcial (sem spec nodes)",
|
|
150
|
+
ready: "✅ Pronto",
|
|
151
|
+
has_change: "📝 Com changes pendentes",
|
|
152
|
+
has_approved_change: "🟢 Com change aprovada",
|
|
153
|
+
emergency: "🚨 Emergência (hotfix)",
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return [
|
|
157
|
+
`Estado: ${stateLabels[snapshot.state]}`,
|
|
158
|
+
`Nós: ${snapshot.nodeCount} | Relações: ${snapshot.relationshipCount}`,
|
|
159
|
+
`Spec nodes: ${snapshot.hasSpecNodes ? "sim" : "não"}`,
|
|
160
|
+
`Changes: ${snapshot.pendingChangeCount} pendente(s), ${snapshot.approvedChangeCount} aprovada(s)`,
|
|
161
|
+
`Workflow: ${snapshot.hasWorkflow ? "ativo" : "inativo"}`,
|
|
162
|
+
].join("\n")
|
|
163
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router Module — Barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Exporta todas as funções públicas do módulo router.
|
|
5
|
+
* Consumido por: hooks.ts
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// State Gate
|
|
9
|
+
export { getVisibleTools, formatVisibleTools, ESCAPE_HATCH_INSTRUCTION } from "./state-gate.js"
|
|
10
|
+
|
|
11
|
+
// Graph State Snapshot
|
|
12
|
+
export { getGraphSnapshot, invalidateSnapshotCache, formatGraphState } from "./graph-state-snapshot.js"
|
|
13
|
+
export type { GraphSnapshot, GraphState } from "./graph-state-snapshot.js"
|
|
14
|
+
|
|
15
|
+
// Intent Classifier
|
|
16
|
+
export { classifyIntent, getToolsForIntent } from "./intent-classifier.js"
|
|
17
|
+
export type { IntentResult } from "./intent-classifier.js"
|
|
18
|
+
|
|
19
|
+
// Tool Registry
|
|
20
|
+
export { getToolsForSession, getToolDescription, listAllTools } from "./tool-registry.js"
|
|
21
|
+
export type { ToolRegistryResult } from "./tool-registry.js"
|
|
22
|
+
|
|
23
|
+
// Semantic Nudge
|
|
24
|
+
export { calculateSemanticNudge, formatNudgeInput, isToolSuggested, getTopSuggestion } from "./semantic-nudge.js"
|
|
25
|
+
export type { NudgeResult } from "./semantic-nudge.js"
|
|
26
|
+
|
|
27
|
+
// Embeddings
|
|
28
|
+
export { cosineSimilarity, getEmbedding, rankSimilarity } from "./embeddings.js"
|
|
29
|
+
|
|
30
|
+
// Categories
|
|
31
|
+
export { getToolCategories, getToolsByCategory, getCategoriesInToolSet, CATEGORY_KEYWORDS } from "./categories.js"
|
|
32
|
+
export type { IntentCategory } from "./categories.js"
|
|
33
|
+
|
|
34
|
+
// Tool Taxonomy
|
|
35
|
+
export {
|
|
36
|
+
TOOL_TAXONOMY,
|
|
37
|
+
STANDALONE_TOOLS,
|
|
38
|
+
DEPRECATED_TOOLS,
|
|
39
|
+
TOOL_TO_COMPOSITE,
|
|
40
|
+
isDeprecatedTool,
|
|
41
|
+
getCompositeForTool,
|
|
42
|
+
countActiveTools,
|
|
43
|
+
} from "./tool-taxonomy.js"
|
|
44
|
+
export type { CompositeTool, SubAction, ToolCategory } from "./tool-taxonomy.js"
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intent Classifier — Classifica a intenção do usuário a partir do input.
|
|
3
|
+
*
|
|
4
|
+
* Combina similaridade semântica (embeddings) com keywords para classificar
|
|
5
|
+
* a intenção em uma das categorias: mutation, query, workflow, analysis, etc.
|
|
6
|
+
*
|
|
7
|
+
* Consumido por: hooks.ts (experimental.chat.system.transform)
|
|
8
|
+
* Dependências: embeddings.ts, categories.ts
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { rankSimilarity } from "./embeddings.js"
|
|
12
|
+
import {
|
|
13
|
+
CATEGORY_KEYWORDS,
|
|
14
|
+
getToolsByCategory,
|
|
15
|
+
type IntentCategory,
|
|
16
|
+
} from "./categories.js"
|
|
17
|
+
import { TOOL_TAXONOMY, STANDALONE_TOOLS } from "./tool-taxonomy.js"
|
|
18
|
+
|
|
19
|
+
export interface IntentResult {
|
|
20
|
+
category: IntentCategory
|
|
21
|
+
confidence: number
|
|
22
|
+
/** Top-3 categorias com scores */
|
|
23
|
+
topCategories: Array<{ category: IntentCategory; score: number }>
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Embeddings pré-computados para descrições de categorias.
|
|
28
|
+
* Cada categoria tem uma descrição representativa.
|
|
29
|
+
*/
|
|
30
|
+
const CATEGORY_DESCRIPTIONS: Record<IntentCategory, string> = {
|
|
31
|
+
mutation: "Create, add, update, or remove nodes and relationships in the knowledge graph",
|
|
32
|
+
query: "Search, query, list, inspect, or retrieve information from the knowledge graph",
|
|
33
|
+
workflow: "Manage changes, approvals, enforcement, lifecycle of specifications",
|
|
34
|
+
analysis: "Analyze impact, validate, detect drift, check integrity of the specification",
|
|
35
|
+
quality: "Code quality metrics, complexity, smells, dependencies, dead code detection",
|
|
36
|
+
enterprise: "Enterprise workflows: migrations, experiments, feature flags, security, compliance",
|
|
37
|
+
admin: "Administration: permissions, roles, sync, snapshots, cache, configuration",
|
|
38
|
+
discovery: "Discover requirements, analyze briefings, ask questions, elicit specifications",
|
|
39
|
+
implementation: "Generate code, plan implementation, create files from specification",
|
|
40
|
+
info: "Get status, history, help, general information about the project",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Calcula score de keywords para cada categoria.
|
|
45
|
+
*/
|
|
46
|
+
function keywordScore(text: string): Record<IntentCategory, number> {
|
|
47
|
+
const normalized = text.toLowerCase()
|
|
48
|
+
const scores: Record<IntentCategory, number> = {} as any
|
|
49
|
+
|
|
50
|
+
for (const [category, keywords] of Object.entries(CATEGORY_KEYWORDS) as [IntentCategory, string[]][]) {
|
|
51
|
+
let score = 0
|
|
52
|
+
for (const keyword of keywords) {
|
|
53
|
+
if (normalized.includes(keyword.toLowerCase())) {
|
|
54
|
+
score += 1
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
scores[category] = score
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return scores
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Calcula score de embeddings para cada categoria.
|
|
65
|
+
*/
|
|
66
|
+
function embeddingScore(text: string): Record<IntentCategory, number> {
|
|
67
|
+
const options = Object.entries(CATEGORY_DESCRIPTIONS).map(([category, description]) => ({
|
|
68
|
+
label: category,
|
|
69
|
+
text: description,
|
|
70
|
+
}))
|
|
71
|
+
|
|
72
|
+
const ranked = rankSimilarity(text, options)
|
|
73
|
+
|
|
74
|
+
const scores: Record<IntentCategory, number> = {} as any
|
|
75
|
+
for (const r of ranked) {
|
|
76
|
+
scores[r.label as IntentCategory] = r.score
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return scores
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Combina keyword score e embedding score com pesos.
|
|
84
|
+
* Keywords: 0.4, Embeddings: 0.6
|
|
85
|
+
*/
|
|
86
|
+
function combinedScore(text: string): Record<IntentCategory, number> {
|
|
87
|
+
const kw = keywordScore(text)
|
|
88
|
+
const emb = embeddingScore(text)
|
|
89
|
+
|
|
90
|
+
const combined: Record<IntentCategory, number> = {} as any
|
|
91
|
+
for (const category of Object.keys(kw) as IntentCategory[]) {
|
|
92
|
+
combined[category] = (kw[category] * 0.4) + ((emb[category] || 0) * 0.6)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return combined
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Classifica a intenção do usuário.
|
|
100
|
+
*
|
|
101
|
+
* @param text - Input do usuário
|
|
102
|
+
* @returns IntentResult com categoria, confidence e top-3
|
|
103
|
+
*/
|
|
104
|
+
export function classifyIntent(text: string): IntentResult {
|
|
105
|
+
const scores = combinedScore(text)
|
|
106
|
+
|
|
107
|
+
// Ordenar por score decrescente
|
|
108
|
+
const sorted = Object.entries(scores)
|
|
109
|
+
.map(([category, score]) => ({ category: category as IntentCategory, score }))
|
|
110
|
+
.sort((a, b) => b.score - a.score)
|
|
111
|
+
|
|
112
|
+
const top = sorted[0]
|
|
113
|
+
const totalScore = sorted.reduce((sum, s) => sum + Math.max(0, s.score), 0)
|
|
114
|
+
const confidence = totalScore > 0 ? top.score / totalScore : 0
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
category: top.category,
|
|
118
|
+
confidence: Math.min(1, Math.max(0, confidence)),
|
|
119
|
+
topCategories: sorted.slice(0, 3),
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Obtém as tools relevantes para uma intenção, combinando com o state gate.
|
|
125
|
+
*
|
|
126
|
+
* @param intent - Resultado da classificação
|
|
127
|
+
* @param stateTools - Tools visíveis pelo state gate (null = todas)
|
|
128
|
+
* @returns Lista de tools relevantes
|
|
129
|
+
*/
|
|
130
|
+
export function getToolsForIntent(
|
|
131
|
+
intent: IntentResult,
|
|
132
|
+
stateTools: Set<string> | null,
|
|
133
|
+
): string[] {
|
|
134
|
+
const categoryTools = getToolsByCategory(intent.category)
|
|
135
|
+
|
|
136
|
+
if (!stateTools) return categoryTools
|
|
137
|
+
|
|
138
|
+
// Interseção: tools da categoria ∩ tools visíveis pelo estado
|
|
139
|
+
return categoryTools.filter(t => stateTools.has(t))
|
|
140
|
+
}
|