@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
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 +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -9
|
@@ -0,0 +1,661 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice Calibration System
|
|
3
|
+
*
|
|
4
|
+
* Fine-tunes voice detection and transformation accuracy across different domains
|
|
5
|
+
* (academic, technical, executive, casual) through systematic calibration and optimization.
|
|
6
|
+
*/
|
|
7
|
+
import voiceProfilesData from './voice-profiles.json';
|
|
8
|
+
/**
|
|
9
|
+
* Voice Calibration System for fine-tuning detection and transformation
|
|
10
|
+
*/
|
|
11
|
+
export class VoiceCalibration {
|
|
12
|
+
analyzer;
|
|
13
|
+
diversifier;
|
|
14
|
+
profiles;
|
|
15
|
+
calibrationHistory;
|
|
16
|
+
constructor(analyzer, diversifier) {
|
|
17
|
+
this.analyzer = analyzer;
|
|
18
|
+
this.diversifier = diversifier;
|
|
19
|
+
this.profiles = new Map();
|
|
20
|
+
this.calibrationHistory = new Map();
|
|
21
|
+
this.loadVoiceProfiles();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Calibrate a specific voice using training and validation corpora
|
|
25
|
+
*/
|
|
26
|
+
async calibrateVoice(config) {
|
|
27
|
+
const { voice, targetCharacteristics, trainingCorpus, validationCorpus } = config;
|
|
28
|
+
// Measure baseline accuracy
|
|
29
|
+
const beforeAccuracy = trainingCorpus
|
|
30
|
+
? await this.measureAccuracy(voice, trainingCorpus)
|
|
31
|
+
: 0;
|
|
32
|
+
const characteristicsAdjusted = [];
|
|
33
|
+
const profile = this.profiles.get(voice);
|
|
34
|
+
if (!profile) {
|
|
35
|
+
throw new Error(`Voice profile not found: ${voice}`);
|
|
36
|
+
}
|
|
37
|
+
// Apply target characteristics if provided
|
|
38
|
+
if (targetCharacteristics) {
|
|
39
|
+
for (const [key, value] of Object.entries(targetCharacteristics)) {
|
|
40
|
+
if (value !== undefined && key in profile.characteristics) {
|
|
41
|
+
profile.characteristics[key] = value;
|
|
42
|
+
characteristicsAdjusted.push(key);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Optimize markers if training corpus provided
|
|
47
|
+
if (trainingCorpus && trainingCorpus.length > 0) {
|
|
48
|
+
await this.optimizeMarkers(voice, trainingCorpus);
|
|
49
|
+
characteristicsAdjusted.push('markers');
|
|
50
|
+
}
|
|
51
|
+
// Measure after accuracy
|
|
52
|
+
const afterAccuracy = validationCorpus
|
|
53
|
+
? await this.measureAccuracy(voice, validationCorpus)
|
|
54
|
+
: trainingCorpus
|
|
55
|
+
? await this.measureAccuracy(voice, trainingCorpus)
|
|
56
|
+
: 0;
|
|
57
|
+
// Calculate validation results
|
|
58
|
+
const validationResults = validationCorpus
|
|
59
|
+
? await this.calculateValidationResults(voice, validationCorpus)
|
|
60
|
+
: await this.calculateValidationResults(voice, trainingCorpus || []);
|
|
61
|
+
const result = {
|
|
62
|
+
voice,
|
|
63
|
+
beforeAccuracy,
|
|
64
|
+
afterAccuracy,
|
|
65
|
+
improvement: afterAccuracy - beforeAccuracy,
|
|
66
|
+
characteristicsAdjusted,
|
|
67
|
+
validationResults,
|
|
68
|
+
};
|
|
69
|
+
// Store calibration history
|
|
70
|
+
if (!this.calibrationHistory.has(voice)) {
|
|
71
|
+
this.calibrationHistory.set(voice, []);
|
|
72
|
+
}
|
|
73
|
+
this.calibrationHistory.get(voice).push(result);
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Calibrate all voices using a corpus map
|
|
78
|
+
*/
|
|
79
|
+
async calibrateAllVoices(corpus) {
|
|
80
|
+
const results = new Map();
|
|
81
|
+
for (const [voice, texts] of corpus.entries()) {
|
|
82
|
+
if (this.isValidVoice(voice)) {
|
|
83
|
+
const trainingSize = Math.floor(texts.length * 0.7);
|
|
84
|
+
const trainingCorpus = texts.slice(0, trainingSize);
|
|
85
|
+
const validationCorpus = texts.slice(trainingSize);
|
|
86
|
+
const result = await this.calibrateVoice({
|
|
87
|
+
voice: voice,
|
|
88
|
+
trainingCorpus,
|
|
89
|
+
validationCorpus,
|
|
90
|
+
});
|
|
91
|
+
results.set(voice, result);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return results;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get voice profile
|
|
98
|
+
*/
|
|
99
|
+
getVoiceProfile(voice) {
|
|
100
|
+
const profile = this.profiles.get(voice);
|
|
101
|
+
if (!profile) {
|
|
102
|
+
throw new Error(`Voice profile not found: ${voice}`);
|
|
103
|
+
}
|
|
104
|
+
return profile;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Update voice profile
|
|
108
|
+
*/
|
|
109
|
+
updateVoiceProfile(voice, updates) {
|
|
110
|
+
const profile = this.profiles.get(voice);
|
|
111
|
+
if (!profile) {
|
|
112
|
+
throw new Error(`Voice profile not found: ${voice}`);
|
|
113
|
+
}
|
|
114
|
+
Object.assign(profile, updates);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create custom voice profile
|
|
118
|
+
*/
|
|
119
|
+
createCustomVoiceProfile(name, characteristics, markers) {
|
|
120
|
+
const profile = {
|
|
121
|
+
voice: name,
|
|
122
|
+
characteristics,
|
|
123
|
+
markers,
|
|
124
|
+
detectionConfidence: 0.5,
|
|
125
|
+
};
|
|
126
|
+
this.profiles.set(name, profile);
|
|
127
|
+
return profile;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Test detection accuracy for a voice
|
|
131
|
+
*/
|
|
132
|
+
async testDetectionAccuracy(voice, corpus) {
|
|
133
|
+
let correct = 0;
|
|
134
|
+
let confidentCorrect = 0;
|
|
135
|
+
let confidentWrong = 0;
|
|
136
|
+
let truePositives = 0;
|
|
137
|
+
let falsePositives = 0;
|
|
138
|
+
let falseNegatives = 0;
|
|
139
|
+
for (const text of corpus) {
|
|
140
|
+
const profile = this.analyzer.analyzeVoice(text);
|
|
141
|
+
const detected = profile.primaryVoice;
|
|
142
|
+
const confidence = profile.confidence / 100;
|
|
143
|
+
if (detected === voice) {
|
|
144
|
+
correct++;
|
|
145
|
+
truePositives++;
|
|
146
|
+
if (confidence > 0.75)
|
|
147
|
+
confidentCorrect++;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
if (confidence > 0.75)
|
|
151
|
+
confidentWrong++;
|
|
152
|
+
if (detected !== 'mixed') {
|
|
153
|
+
falsePositives++;
|
|
154
|
+
}
|
|
155
|
+
falseNegatives++;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const accuracy = corpus.length > 0 ? correct / corpus.length : 0;
|
|
159
|
+
const precision = truePositives + falsePositives > 0
|
|
160
|
+
? truePositives / (truePositives + falsePositives)
|
|
161
|
+
: 0;
|
|
162
|
+
const recall = truePositives + falseNegatives > 0
|
|
163
|
+
? truePositives / (truePositives + falseNegatives)
|
|
164
|
+
: 0;
|
|
165
|
+
const f1Score = precision + recall > 0
|
|
166
|
+
? 2 * (precision * recall) / (precision + recall)
|
|
167
|
+
: 0;
|
|
168
|
+
return {
|
|
169
|
+
voice,
|
|
170
|
+
accuracy,
|
|
171
|
+
precision,
|
|
172
|
+
recall,
|
|
173
|
+
f1Score,
|
|
174
|
+
confidentCorrect,
|
|
175
|
+
confidentWrong,
|
|
176
|
+
samples: corpus.length,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Validate cross-voice detection
|
|
181
|
+
*/
|
|
182
|
+
async validateCrossVoiceDetection(testSet) {
|
|
183
|
+
const voices = Array.from(testSet.keys());
|
|
184
|
+
const matrix = {};
|
|
185
|
+
// Initialize matrix
|
|
186
|
+
for (const voice of voices) {
|
|
187
|
+
matrix[voice] = {};
|
|
188
|
+
for (const detectedVoice of voices) {
|
|
189
|
+
matrix[voice][detectedVoice] = 0;
|
|
190
|
+
}
|
|
191
|
+
matrix[voice]['mixed'] = 0;
|
|
192
|
+
}
|
|
193
|
+
let totalSamples = 0;
|
|
194
|
+
let correctDetections = 0;
|
|
195
|
+
// Populate matrix
|
|
196
|
+
for (const [actualVoice, corpus] of testSet.entries()) {
|
|
197
|
+
for (const text of corpus) {
|
|
198
|
+
const profile = this.analyzer.analyzeVoice(text);
|
|
199
|
+
const detectedVoice = profile.primaryVoice;
|
|
200
|
+
matrix[actualVoice][detectedVoice] = (matrix[actualVoice][detectedVoice] || 0) + 1;
|
|
201
|
+
totalSamples++;
|
|
202
|
+
if (detectedVoice === actualVoice) {
|
|
203
|
+
correctDetections++;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Calculate per-voice accuracy
|
|
208
|
+
const perVoiceAccuracy = {};
|
|
209
|
+
for (const [voice, detections] of Object.entries(matrix)) {
|
|
210
|
+
const total = Object.values(detections).reduce((sum, count) => sum + count, 0);
|
|
211
|
+
const correct = detections[voice] || 0;
|
|
212
|
+
perVoiceAccuracy[voice] = total > 0 ? correct / total : 0;
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
matrix,
|
|
216
|
+
accuracy: totalSamples > 0 ? correctDetections / totalSamples : 0,
|
|
217
|
+
perVoiceAccuracy,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Tune a specific characteristic
|
|
222
|
+
*/
|
|
223
|
+
async tuneCharacteristic(voice, characteristic, target) {
|
|
224
|
+
const profile = this.profiles.get(voice);
|
|
225
|
+
if (!profile) {
|
|
226
|
+
throw new Error(`Voice profile not found: ${voice}`);
|
|
227
|
+
}
|
|
228
|
+
const beforeValue = profile.characteristics[characteristic];
|
|
229
|
+
// Apply tuning
|
|
230
|
+
if (characteristic === 'sentenceLength') {
|
|
231
|
+
throw new Error('Cannot tune sentenceLength directly - it is a complex object');
|
|
232
|
+
}
|
|
233
|
+
profile.characteristics[characteristic] = target;
|
|
234
|
+
// Test accuracy with simple corpus
|
|
235
|
+
const testCorpus = this.generateTestCorpus(voice, 10);
|
|
236
|
+
const accuracy = await this.measureAccuracy(voice, testCorpus);
|
|
237
|
+
return {
|
|
238
|
+
characteristic,
|
|
239
|
+
beforeValue: typeof beforeValue === 'number' ? beforeValue : 0,
|
|
240
|
+
afterValue: target,
|
|
241
|
+
improvement: accuracy - 0.5, // baseline is 0.5
|
|
242
|
+
accuracy,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Tune all characteristics
|
|
247
|
+
*/
|
|
248
|
+
async tuneAllCharacteristics(voice, targets) {
|
|
249
|
+
const results = [];
|
|
250
|
+
for (const [key, value] of Object.entries(targets)) {
|
|
251
|
+
if (key !== 'sentenceLength' && key !== 'vocabularyLevel' && typeof value === 'number') {
|
|
252
|
+
const result = await this.tuneCharacteristic(voice, key, value);
|
|
253
|
+
results.push(result);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return results;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Optimize markers for a voice
|
|
260
|
+
*/
|
|
261
|
+
async optimizeMarkers(voice, corpus) {
|
|
262
|
+
const profile = this.profiles.get(voice);
|
|
263
|
+
if (!profile) {
|
|
264
|
+
throw new Error(`Voice profile not found: ${voice}`);
|
|
265
|
+
}
|
|
266
|
+
// Analyze corpus to find effective markers
|
|
267
|
+
const markerScores = new Map();
|
|
268
|
+
for (const marker of profile.markers) {
|
|
269
|
+
let hits = 0;
|
|
270
|
+
for (const text of corpus) {
|
|
271
|
+
if (text.toLowerCase().includes(marker.indicator.toLowerCase())) {
|
|
272
|
+
hits++;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
markerScores.set(marker.indicator, { hits, total: corpus.length });
|
|
276
|
+
}
|
|
277
|
+
// Update marker weights based on effectiveness
|
|
278
|
+
for (const marker of profile.markers) {
|
|
279
|
+
const score = markerScores.get(marker.indicator);
|
|
280
|
+
if (score) {
|
|
281
|
+
const effectiveness = score.hits / score.total;
|
|
282
|
+
marker.weight = Math.min(1, effectiveness * 2); // Scale to 0-1
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Remove weak markers (weight < 0.1)
|
|
286
|
+
profile.markers = profile.markers.filter(m => m.weight >= 0.1);
|
|
287
|
+
// Sort by weight descending
|
|
288
|
+
profile.markers.sort((a, b) => b.weight - a.weight);
|
|
289
|
+
return profile.markers;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Add marker to voice profile
|
|
293
|
+
*/
|
|
294
|
+
async addMarker(voice, marker) {
|
|
295
|
+
const profile = this.profiles.get(voice);
|
|
296
|
+
if (!profile) {
|
|
297
|
+
throw new Error(`Voice profile not found: ${voice}`);
|
|
298
|
+
}
|
|
299
|
+
// Check if marker already exists
|
|
300
|
+
const exists = profile.markers.some(m => m.indicator === marker.indicator);
|
|
301
|
+
if (!exists) {
|
|
302
|
+
profile.markers.push(marker);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Remove marker from voice profile
|
|
307
|
+
*/
|
|
308
|
+
async removeMarker(voice, markerType, indicator) {
|
|
309
|
+
const profile = this.profiles.get(voice);
|
|
310
|
+
if (!profile) {
|
|
311
|
+
throw new Error(`Voice profile not found: ${voice}`);
|
|
312
|
+
}
|
|
313
|
+
profile.markers = profile.markers.filter(m => !(m.type === markerType && m.indicator === indicator));
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Test transformation accuracy
|
|
317
|
+
*/
|
|
318
|
+
async testTransformationAccuracy(fromVoice, toVoice, corpus) {
|
|
319
|
+
let totalConfidence = 0;
|
|
320
|
+
let correctTransformations = 0;
|
|
321
|
+
let totalFidelity = 0;
|
|
322
|
+
for (const text of corpus) {
|
|
323
|
+
// Transform text
|
|
324
|
+
const transformed = this.diversifier.transformVoice(text, fromVoice, toVoice);
|
|
325
|
+
// Analyze transformed text
|
|
326
|
+
const profile = this.analyzer.analyzeVoice(transformed);
|
|
327
|
+
const confidence = profile.confidence / 100;
|
|
328
|
+
totalConfidence += confidence;
|
|
329
|
+
// Check if detected as target voice
|
|
330
|
+
if (profile.primaryVoice === toVoice) {
|
|
331
|
+
correctTransformations++;
|
|
332
|
+
}
|
|
333
|
+
// Calculate fidelity (how well it matches target characteristics)
|
|
334
|
+
const fidelity = this.calculateTransformationFidelity(toVoice, profile);
|
|
335
|
+
totalFidelity += fidelity;
|
|
336
|
+
}
|
|
337
|
+
return {
|
|
338
|
+
fromVoice,
|
|
339
|
+
toVoice,
|
|
340
|
+
accuracy: corpus.length > 0 ? correctTransformations / corpus.length : 0,
|
|
341
|
+
averageConfidence: corpus.length > 0 ? totalConfidence / corpus.length : 0,
|
|
342
|
+
fidelity: corpus.length > 0 ? totalFidelity / corpus.length : 0,
|
|
343
|
+
samples: corpus.length,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Optimize transformations
|
|
348
|
+
*/
|
|
349
|
+
async optimizeTransformations(config) {
|
|
350
|
+
const { fromVoice, toVoice, corpus } = config;
|
|
351
|
+
// Measure before optimization
|
|
352
|
+
const before = await this.testTransformationAccuracy(fromVoice, toVoice, corpus);
|
|
353
|
+
const beforeFidelity = before.fidelity;
|
|
354
|
+
// Optimization: adjust target voice characteristics based on transformation results
|
|
355
|
+
const adjustmentsMade = [];
|
|
356
|
+
// Sample transformations to identify issues
|
|
357
|
+
const samples = corpus.slice(0, Math.min(5, corpus.length));
|
|
358
|
+
for (const text of samples) {
|
|
359
|
+
const transformed = this.diversifier.transformVoice(text, fromVoice, toVoice);
|
|
360
|
+
const profile = this.analyzer.analyzeVoice(transformed);
|
|
361
|
+
// Analyze what's missing or weak
|
|
362
|
+
const targetProfile = this.profiles.get(toVoice);
|
|
363
|
+
if (targetProfile) {
|
|
364
|
+
// Check if formality is off
|
|
365
|
+
const formalityScore = this.estimateFormality(profile);
|
|
366
|
+
const targetFormality = targetProfile.characteristics.formality;
|
|
367
|
+
if (Math.abs(formalityScore - targetFormality) > 0.2) {
|
|
368
|
+
adjustmentsMade.push(`Adjusted formality target for ${toVoice}`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// Measure after optimization
|
|
373
|
+
const after = await this.testTransformationAccuracy(fromVoice, toVoice, corpus);
|
|
374
|
+
const afterFidelity = after.fidelity;
|
|
375
|
+
return {
|
|
376
|
+
fromVoice,
|
|
377
|
+
toVoice,
|
|
378
|
+
beforeFidelity,
|
|
379
|
+
afterFidelity,
|
|
380
|
+
improvement: afterFidelity - beforeFidelity,
|
|
381
|
+
adjustmentsMade,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Generate calibration report
|
|
386
|
+
*/
|
|
387
|
+
generateCalibrationReport(voice) {
|
|
388
|
+
const profile = this.profiles.get(voice);
|
|
389
|
+
if (!profile) {
|
|
390
|
+
throw new Error(`Voice profile not found: ${voice}`);
|
|
391
|
+
}
|
|
392
|
+
// Generate test corpus for accuracy measurement
|
|
393
|
+
const testCorpus = this.generateTestCorpus(voice, 20);
|
|
394
|
+
const accuracy = this.testDetectionAccuracy(voice, testCorpus);
|
|
395
|
+
// Calculate marker statistics
|
|
396
|
+
const markersByType = {
|
|
397
|
+
vocabulary: 0,
|
|
398
|
+
structure: 0,
|
|
399
|
+
tone: 0,
|
|
400
|
+
perspective: 0,
|
|
401
|
+
};
|
|
402
|
+
for (const marker of profile.markers) {
|
|
403
|
+
markersByType[marker.type]++;
|
|
404
|
+
}
|
|
405
|
+
const averageWeight = profile.markers.length > 0
|
|
406
|
+
? profile.markers.reduce((sum, m) => sum + m.weight, 0) / profile.markers.length
|
|
407
|
+
: 0;
|
|
408
|
+
return {
|
|
409
|
+
voice,
|
|
410
|
+
profile,
|
|
411
|
+
accuracy: accuracy, // Will be resolved by async call
|
|
412
|
+
markers: {
|
|
413
|
+
total: profile.markers.length,
|
|
414
|
+
byType: markersByType,
|
|
415
|
+
averageWeight,
|
|
416
|
+
},
|
|
417
|
+
characteristics: profile.characteristics,
|
|
418
|
+
recentCalibrations: this.calibrationHistory.get(voice) || [],
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Compare two voice profiles
|
|
423
|
+
*/
|
|
424
|
+
compareVoiceProfiles(voice1, voice2) {
|
|
425
|
+
const profile1 = this.profiles.get(voice1);
|
|
426
|
+
const profile2 = this.profiles.get(voice2);
|
|
427
|
+
if (!profile1 || !profile2) {
|
|
428
|
+
throw new Error('One or both voice profiles not found');
|
|
429
|
+
}
|
|
430
|
+
// Calculate characteristic differences
|
|
431
|
+
const differences = [];
|
|
432
|
+
const numericCharacteristics = ['formality', 'technicality', 'assertiveness', 'complexity', 'firstPersonUsage', 'passiveVoiceRatio'];
|
|
433
|
+
for (const char of numericCharacteristics) {
|
|
434
|
+
const value1 = profile1.characteristics[char];
|
|
435
|
+
const value2 = profile2.characteristics[char];
|
|
436
|
+
if (typeof value1 === 'number' && typeof value2 === 'number') {
|
|
437
|
+
differences.push({
|
|
438
|
+
characteristic: char,
|
|
439
|
+
value1,
|
|
440
|
+
value2,
|
|
441
|
+
delta: Math.abs(value1 - value2),
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// Calculate similarity (inverse of average delta)
|
|
446
|
+
const avgDelta = differences.reduce((sum, d) => sum + d.delta, 0) / differences.length;
|
|
447
|
+
const similarity = Math.max(0, 1 - avgDelta);
|
|
448
|
+
// Find distinguishing markers
|
|
449
|
+
const markers1Set = new Set(profile1.markers.map(m => m.indicator));
|
|
450
|
+
const markers2Set = new Set(profile2.markers.map(m => m.indicator));
|
|
451
|
+
const voice1Only = profile1.markers.filter(m => !markers2Set.has(m.indicator));
|
|
452
|
+
const voice2Only = profile2.markers.filter(m => !markers1Set.has(m.indicator));
|
|
453
|
+
return {
|
|
454
|
+
voice1,
|
|
455
|
+
voice2,
|
|
456
|
+
similarity,
|
|
457
|
+
differences: differences.sort((a, b) => b.delta - a.delta),
|
|
458
|
+
distinguishingMarkers: {
|
|
459
|
+
voice1Only,
|
|
460
|
+
voice2Only,
|
|
461
|
+
},
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Export voice profiles
|
|
466
|
+
*/
|
|
467
|
+
exportVoiceProfiles(format) {
|
|
468
|
+
const data = Array.from(this.profiles.entries()).map(([_key, profile]) => ({
|
|
469
|
+
...profile,
|
|
470
|
+
}));
|
|
471
|
+
if (format === 'json') {
|
|
472
|
+
return JSON.stringify(data, null, 2);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
// Simple YAML serialization
|
|
476
|
+
let yaml = '';
|
|
477
|
+
for (const item of data) {
|
|
478
|
+
yaml += `- voice: ${item.voice}\n`;
|
|
479
|
+
yaml += ` detectionConfidence: ${item.detectionConfidence}\n`;
|
|
480
|
+
yaml += ` characteristics:\n`;
|
|
481
|
+
yaml += ` formality: ${item.characteristics.formality}\n`;
|
|
482
|
+
yaml += ` technicality: ${item.characteristics.technicality}\n`;
|
|
483
|
+
yaml += ` assertiveness: ${item.characteristics.assertiveness}\n`;
|
|
484
|
+
yaml += ` complexity: ${item.characteristics.complexity}\n`;
|
|
485
|
+
yaml += ` markers:\n`;
|
|
486
|
+
for (const marker of item.markers.slice(0, 3)) {
|
|
487
|
+
yaml += ` - type: ${marker.type}\n`;
|
|
488
|
+
yaml += ` indicator: "${marker.indicator}"\n`;
|
|
489
|
+
yaml += ` weight: ${marker.weight}\n`;
|
|
490
|
+
}
|
|
491
|
+
yaml += '\n';
|
|
492
|
+
}
|
|
493
|
+
return yaml;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Import voice profiles
|
|
498
|
+
*/
|
|
499
|
+
importVoiceProfiles(data, format = 'json') {
|
|
500
|
+
if (format === 'yaml') {
|
|
501
|
+
throw new Error('YAML import not fully implemented');
|
|
502
|
+
}
|
|
503
|
+
const profiles = JSON.parse(data);
|
|
504
|
+
for (const profileData of profiles) {
|
|
505
|
+
const voice = profileData.voice;
|
|
506
|
+
// Store the full profile data including voice field
|
|
507
|
+
this.profiles.set(voice, profileData);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
// Private helper methods
|
|
511
|
+
loadVoiceProfiles() {
|
|
512
|
+
// Load profiles from JSON data
|
|
513
|
+
const profilesArray = voiceProfilesData.profiles;
|
|
514
|
+
for (const profileData of profilesArray) {
|
|
515
|
+
this.profiles.set(profileData.voice, profileData);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
async measureAccuracy(voice, corpus) {
|
|
519
|
+
if (corpus.length === 0)
|
|
520
|
+
return 0;
|
|
521
|
+
let correct = 0;
|
|
522
|
+
for (const text of corpus) {
|
|
523
|
+
const profile = this.analyzer.analyzeVoice(text);
|
|
524
|
+
if (profile.primaryVoice === voice) {
|
|
525
|
+
correct++;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
return correct / corpus.length;
|
|
529
|
+
}
|
|
530
|
+
async calculateValidationResults(voice, corpus) {
|
|
531
|
+
let truePositives = 0;
|
|
532
|
+
let falsePositives = 0;
|
|
533
|
+
let falseNegatives = 0;
|
|
534
|
+
let trueNegatives = 0;
|
|
535
|
+
for (const text of corpus) {
|
|
536
|
+
const profile = this.analyzer.analyzeVoice(text);
|
|
537
|
+
const detected = profile.primaryVoice;
|
|
538
|
+
if (detected === voice) {
|
|
539
|
+
truePositives++;
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
falseNegatives++;
|
|
543
|
+
}
|
|
544
|
+
// For negative cases, we'd need corpus from other voices
|
|
545
|
+
// Simplified: assume some proportion of corpus are true negatives
|
|
546
|
+
if (detected !== voice && detected === 'mixed') {
|
|
547
|
+
trueNegatives++;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
const precision = truePositives + falsePositives > 0
|
|
551
|
+
? truePositives / (truePositives + falsePositives)
|
|
552
|
+
: 0;
|
|
553
|
+
const recall = truePositives + falseNegatives > 0
|
|
554
|
+
? truePositives / (truePositives + falseNegatives)
|
|
555
|
+
: 0;
|
|
556
|
+
const f1Score = precision + recall > 0
|
|
557
|
+
? 2 * (precision * recall) / (precision + recall)
|
|
558
|
+
: 0;
|
|
559
|
+
return {
|
|
560
|
+
truePositives,
|
|
561
|
+
falsePositives,
|
|
562
|
+
falseNegatives,
|
|
563
|
+
trueNegatives,
|
|
564
|
+
precision,
|
|
565
|
+
recall,
|
|
566
|
+
f1Score,
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
isValidVoice(voice) {
|
|
570
|
+
return ['academic', 'technical', 'executive', 'casual'].includes(voice);
|
|
571
|
+
}
|
|
572
|
+
generateTestCorpus(voice, count) {
|
|
573
|
+
const corpus = [];
|
|
574
|
+
const profile = this.profiles.get(voice);
|
|
575
|
+
if (!profile) {
|
|
576
|
+
return corpus;
|
|
577
|
+
}
|
|
578
|
+
// Generate sample texts that match voice characteristics
|
|
579
|
+
for (let i = 0; i < count; i++) {
|
|
580
|
+
corpus.push(this.generateSampleText(voice, profile));
|
|
581
|
+
}
|
|
582
|
+
return corpus;
|
|
583
|
+
}
|
|
584
|
+
generateSampleText(voice, profile) {
|
|
585
|
+
// Generate text with markers from this voice
|
|
586
|
+
const markers = profile.markers.filter(m => m.weight > 0.5).slice(0, 3);
|
|
587
|
+
const parts = [];
|
|
588
|
+
switch (voice) {
|
|
589
|
+
case 'academic':
|
|
590
|
+
parts.push('The research suggests that systematic analysis provides empirical evidence.');
|
|
591
|
+
if (markers.length > 0) {
|
|
592
|
+
parts.push(`Furthermore, ${markers[0].examples[0] || 'this framework demonstrates theoretical validity'}.`);
|
|
593
|
+
}
|
|
594
|
+
break;
|
|
595
|
+
case 'technical':
|
|
596
|
+
parts.push('The implementation achieves 99.5% uptime with sub-50ms latency.');
|
|
597
|
+
if (markers.length > 0) {
|
|
598
|
+
parts.push(`Performance optimization through ${markers[0].examples[0] || 'connection pooling'} reduces overhead by 30%.`);
|
|
599
|
+
}
|
|
600
|
+
break;
|
|
601
|
+
case 'executive':
|
|
602
|
+
parts.push('This strategic initiative delivers $2M in annual cost savings and 40% ROI.');
|
|
603
|
+
if (markers.length > 0) {
|
|
604
|
+
parts.push(`We recommend ${markers[0].examples[0] || 'prioritizing market expansion'} for Q3 targets.`);
|
|
605
|
+
}
|
|
606
|
+
break;
|
|
607
|
+
case 'casual':
|
|
608
|
+
parts.push("Here's the thing - we've seen this pattern before in production.");
|
|
609
|
+
if (markers.length > 0) {
|
|
610
|
+
parts.push(`It's basically ${markers[0].examples[0] || "like managing a conveyor belt"} where timing matters.`);
|
|
611
|
+
}
|
|
612
|
+
break;
|
|
613
|
+
default:
|
|
614
|
+
parts.push('This is a sample text for testing purposes.');
|
|
615
|
+
}
|
|
616
|
+
return parts.join(' ');
|
|
617
|
+
}
|
|
618
|
+
calculateTransformationFidelity(targetVoice, actualProfile) {
|
|
619
|
+
const targetProfile = this.profiles.get(targetVoice);
|
|
620
|
+
if (!targetProfile) {
|
|
621
|
+
return 0;
|
|
622
|
+
}
|
|
623
|
+
// Calculate how well actual characteristics match target
|
|
624
|
+
let score = 0;
|
|
625
|
+
let checks = 0;
|
|
626
|
+
// Check formality alignment
|
|
627
|
+
const actualFormality = this.estimateFormality(actualProfile);
|
|
628
|
+
const targetFormality = targetProfile.characteristics.formality;
|
|
629
|
+
score += 1 - Math.abs(actualFormality - targetFormality);
|
|
630
|
+
checks++;
|
|
631
|
+
// Check if primary voice matches
|
|
632
|
+
if (actualProfile.primaryVoice === targetVoice) {
|
|
633
|
+
score += 1;
|
|
634
|
+
}
|
|
635
|
+
checks++;
|
|
636
|
+
// Check marker presence
|
|
637
|
+
const actualText = JSON.stringify(actualProfile.markers);
|
|
638
|
+
let markerMatches = 0;
|
|
639
|
+
for (const marker of targetProfile.markers.slice(0, 5)) {
|
|
640
|
+
if (actualText.includes(marker.indicator)) {
|
|
641
|
+
markerMatches++;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
const markerDivisor = Math.max(1, Math.min(5, targetProfile.markers.length));
|
|
645
|
+
score += markerMatches / markerDivisor;
|
|
646
|
+
checks++;
|
|
647
|
+
return score / checks;
|
|
648
|
+
}
|
|
649
|
+
estimateFormality(profile) {
|
|
650
|
+
// Estimate formality based on voice characteristics
|
|
651
|
+
const formalityMap = {
|
|
652
|
+
academic: 0.85,
|
|
653
|
+
technical: 0.60,
|
|
654
|
+
executive: 0.75,
|
|
655
|
+
casual: 0.30,
|
|
656
|
+
mixed: 0.50,
|
|
657
|
+
};
|
|
658
|
+
return formalityMap[profile.primaryVoice] || 0.50;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
//# sourceMappingURL=voice-calibration.js.map
|