@contractspec/bundle.workspace 1.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +79 -0
- package/dist/_virtual/rolldown_runtime.js +36 -0
- package/dist/adapters/ai.d.ts +12 -0
- package/dist/adapters/ai.d.ts.map +1 -0
- package/dist/adapters/ai.js +83 -0
- package/dist/adapters/ai.js.map +1 -0
- package/dist/adapters/factory.d.ts +29 -0
- package/dist/adapters/factory.d.ts.map +1 -0
- package/dist/adapters/factory.js +37 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/fs.d.ts +11 -0
- package/dist/adapters/fs.d.ts.map +1 -0
- package/dist/adapters/fs.js +131 -0
- package/dist/adapters/fs.js.map +1 -0
- package/dist/adapters/git.d.ts +11 -0
- package/dist/adapters/git.d.ts.map +1 -0
- package/dist/adapters/git.js +55 -0
- package/dist/adapters/git.js.map +1 -0
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.js +7 -0
- package/dist/adapters/logger.d.ts +18 -0
- package/dist/adapters/logger.d.ts.map +1 -0
- package/dist/adapters/logger.js +81 -0
- package/dist/adapters/logger.js.map +1 -0
- package/dist/adapters/watcher.d.ts +11 -0
- package/dist/adapters/watcher.d.ts.map +1 -0
- package/dist/adapters/watcher.js +74 -0
- package/dist/adapters/watcher.js.map +1 -0
- package/dist/adapters/workspace.d.ts +148 -0
- package/dist/adapters/workspace.d.ts.map +1 -0
- package/dist/adapters/workspace.js +275 -0
- package/dist/adapters/workspace.js.map +1 -0
- package/dist/ai/agents/claude-code-agent.d.ts +22 -0
- package/dist/ai/agents/claude-code-agent.d.ts.map +1 -0
- package/dist/ai/agents/claude-code-agent.js +182 -0
- package/dist/ai/agents/claude-code-agent.js.map +1 -0
- package/dist/ai/agents/cursor-agent.d.ts +68 -0
- package/dist/ai/agents/cursor-agent.d.ts.map +1 -0
- package/dist/ai/agents/cursor-agent.js +436 -0
- package/dist/ai/agents/cursor-agent.js.map +1 -0
- package/dist/ai/agents/index.js +5 -0
- package/dist/ai/agents/openai-codex-agent.d.ts +22 -0
- package/dist/ai/agents/openai-codex-agent.d.ts.map +1 -0
- package/dist/ai/agents/openai-codex-agent.js +167 -0
- package/dist/ai/agents/openai-codex-agent.js.map +1 -0
- package/dist/ai/agents/orchestrator.d.ts +50 -0
- package/dist/ai/agents/orchestrator.d.ts.map +1 -0
- package/dist/ai/agents/orchestrator.js +143 -0
- package/dist/ai/agents/orchestrator.js.map +1 -0
- package/dist/ai/agents/simple-agent.d.ts +17 -0
- package/dist/ai/agents/simple-agent.d.ts.map +1 -0
- package/dist/ai/agents/simple-agent.js +92 -0
- package/dist/ai/agents/simple-agent.js.map +1 -0
- package/dist/ai/agents/types.d.ts +36 -0
- package/dist/ai/agents/types.d.ts.map +1 -0
- package/dist/ai/client.d.ts +83 -0
- package/dist/ai/client.d.ts.map +1 -0
- package/dist/ai/client.js +163 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/index.d.ts +17 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +28 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts/code-generation.d.ts +26 -0
- package/dist/ai/prompts/code-generation.d.ts.map +1 -0
- package/dist/ai/prompts/code-generation.js +143 -0
- package/dist/ai/prompts/code-generation.js.map +1 -0
- package/dist/ai/prompts/index.d.ts +10 -0
- package/dist/ai/prompts/index.d.ts.map +1 -0
- package/dist/ai/prompts/index.js +13 -0
- package/dist/ai/prompts/index.js.map +1 -0
- package/dist/ai/prompts/spec-creation.d.ts +29 -0
- package/dist/ai/prompts/spec-creation.d.ts.map +1 -0
- package/dist/ai/prompts/spec-creation.js +111 -0
- package/dist/ai/prompts/spec-creation.js.map +1 -0
- package/dist/ai/providers.d.ts +29 -0
- package/dist/ai/providers.d.ts.map +1 -0
- package/dist/ai/providers.js +39 -0
- package/dist/ai/providers.js.map +1 -0
- package/dist/formatters/index.d.ts +11 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +19 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/json.d.ts +89 -0
- package/dist/formatters/json.d.ts.map +1 -0
- package/dist/formatters/json.js +72 -0
- package/dist/formatters/json.js.map +1 -0
- package/dist/formatters/sarif.d.ts +101 -0
- package/dist/formatters/sarif.d.ts.map +1 -0
- package/dist/formatters/sarif.js +163 -0
- package/dist/formatters/sarif.js.map +1 -0
- package/dist/formatters/text.d.ts +35 -0
- package/dist/formatters/text.d.ts.map +1 -0
- package/dist/formatters/text.js +209 -0
- package/dist/formatters/text.js.map +1 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +204 -0
- package/dist/index.js.map +1 -0
- package/dist/ports/ai.d.ts +59 -0
- package/dist/ports/ai.d.ts.map +1 -0
- package/dist/ports/fs.d.ts +81 -0
- package/dist/ports/fs.d.ts.map +1 -0
- package/dist/ports/git.d.ts +33 -0
- package/dist/ports/git.d.ts.map +1 -0
- package/dist/ports/index.d.ts +5 -0
- package/dist/ports/logger.d.ts +88 -0
- package/dist/ports/logger.d.ts.map +1 -0
- package/dist/ports/watcher.d.ts +52 -0
- package/dist/ports/watcher.d.ts.map +1 -0
- package/dist/services/agent-guide/adapters/claude-code.d.ts +35 -0
- package/dist/services/agent-guide/adapters/claude-code.d.ts.map +1 -0
- package/dist/services/agent-guide/adapters/claude-code.js +144 -0
- package/dist/services/agent-guide/adapters/claude-code.js.map +1 -0
- package/dist/services/agent-guide/adapters/cursor-cli.d.ts +39 -0
- package/dist/services/agent-guide/adapters/cursor-cli.d.ts.map +1 -0
- package/dist/services/agent-guide/adapters/cursor-cli.js +135 -0
- package/dist/services/agent-guide/adapters/cursor-cli.js.map +1 -0
- package/dist/services/agent-guide/adapters/generic-mcp.d.ts +53 -0
- package/dist/services/agent-guide/adapters/generic-mcp.d.ts.map +1 -0
- package/dist/services/agent-guide/adapters/generic-mcp.js +159 -0
- package/dist/services/agent-guide/adapters/generic-mcp.js.map +1 -0
- package/dist/services/agent-guide/adapters/index.d.ts +23 -0
- package/dist/services/agent-guide/adapters/index.d.ts.map +1 -0
- package/dist/services/agent-guide/adapters/index.js +31 -0
- package/dist/services/agent-guide/adapters/index.js.map +1 -0
- package/dist/services/agent-guide/agent-guide-service.d.ts +56 -0
- package/dist/services/agent-guide/agent-guide-service.d.ts.map +1 -0
- package/dist/services/agent-guide/agent-guide-service.js +147 -0
- package/dist/services/agent-guide/agent-guide-service.js.map +1 -0
- package/dist/services/agent-guide/index.d.ts +6 -0
- package/dist/services/agent-guide/index.js +5 -0
- package/dist/services/agent-guide/types.d.ts +58 -0
- package/dist/services/agent-guide/types.d.ts.map +1 -0
- package/dist/services/build.d.ts +59 -0
- package/dist/services/build.d.ts.map +1 -0
- package/dist/services/build.js +140 -0
- package/dist/services/build.js.map +1 -0
- package/dist/services/ci-check/ci-check-service.d.ts +16 -0
- package/dist/services/ci-check/ci-check-service.d.ts.map +1 -0
- package/dist/services/ci-check/ci-check-service.js +392 -0
- package/dist/services/ci-check/ci-check-service.js.map +1 -0
- package/dist/services/ci-check/index.d.ts +2 -0
- package/dist/services/ci-check/index.js +2 -0
- package/dist/services/ci-check/types.d.ts +143 -0
- package/dist/services/ci-check/types.d.ts.map +1 -0
- package/dist/services/ci-check/types.js +29 -0
- package/dist/services/ci-check/types.js.map +1 -0
- package/dist/services/clean.d.ts +41 -0
- package/dist/services/clean.d.ts.map +1 -0
- package/dist/services/clean.js +72 -0
- package/dist/services/clean.js.map +1 -0
- package/dist/services/config.d.ts +26 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +77 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/deps.d.ts +53 -0
- package/dist/services/deps.d.ts.map +1 -0
- package/dist/services/deps.js +62 -0
- package/dist/services/deps.js.map +1 -0
- package/dist/services/diff.d.ts +34 -0
- package/dist/services/diff.d.ts.map +1 -0
- package/dist/services/diff.js +34 -0
- package/dist/services/diff.js.map +1 -0
- package/dist/services/doctor/checks/ai.js +119 -0
- package/dist/services/doctor/checks/ai.js.map +1 -0
- package/dist/services/doctor/checks/cli.js +147 -0
- package/dist/services/doctor/checks/cli.js.map +1 -0
- package/dist/services/doctor/checks/config.js +171 -0
- package/dist/services/doctor/checks/config.js.map +1 -0
- package/dist/services/doctor/checks/deps.js +247 -0
- package/dist/services/doctor/checks/deps.js.map +1 -0
- package/dist/services/doctor/checks/index.js +6 -0
- package/dist/services/doctor/checks/mcp.js +145 -0
- package/dist/services/doctor/checks/mcp.js.map +1 -0
- package/dist/services/doctor/checks/workspace.js +244 -0
- package/dist/services/doctor/checks/workspace.js.map +1 -0
- package/dist/services/doctor/doctor-service.d.ts +24 -0
- package/dist/services/doctor/doctor-service.d.ts.map +1 -0
- package/dist/services/doctor/doctor-service.js +116 -0
- package/dist/services/doctor/doctor-service.js.map +1 -0
- package/dist/services/doctor/index.d.ts +2 -0
- package/dist/services/doctor/index.js +2 -0
- package/dist/services/doctor/types.d.ts +118 -0
- package/dist/services/doctor/types.d.ts.map +1 -0
- package/dist/services/doctor/types.js +27 -0
- package/dist/services/doctor/types.js.map +1 -0
- package/dist/services/impact/formatters.d.ts +27 -0
- package/dist/services/impact/formatters.d.ts.map +1 -0
- package/dist/services/impact/formatters.js +111 -0
- package/dist/services/impact/formatters.js.map +1 -0
- package/dist/services/impact/impact-detection-service.d.ts +22 -0
- package/dist/services/impact/impact-detection-service.d.ts.map +1 -0
- package/dist/services/impact/impact-detection-service.js +96 -0
- package/dist/services/impact/impact-detection-service.js.map +1 -0
- package/dist/services/impact/index.d.ts +11 -0
- package/dist/services/impact/index.d.ts.map +1 -0
- package/dist/services/impact/index.js +16 -0
- package/dist/services/impact/index.js.map +1 -0
- package/dist/services/impact/types.d.ts +58 -0
- package/dist/services/impact/types.d.ts.map +1 -0
- package/dist/services/implementation/discovery.d.ts +30 -0
- package/dist/services/implementation/discovery.d.ts.map +1 -0
- package/dist/services/implementation/discovery.js +144 -0
- package/dist/services/implementation/discovery.js.map +1 -0
- package/dist/services/implementation/index.d.ts +3 -0
- package/dist/services/implementation/index.js +2 -0
- package/dist/services/implementation/resolver.d.ts +44 -0
- package/dist/services/implementation/resolver.d.ts.map +1 -0
- package/dist/services/implementation/resolver.js +224 -0
- package/dist/services/implementation/resolver.js.map +1 -0
- package/dist/services/implementation/types.d.ts +79 -0
- package/dist/services/implementation/types.d.ts.map +1 -0
- package/dist/services/index.d.ts +60 -0
- package/dist/services/index.js +57 -0
- package/dist/services/integrity-diagram.d.ts +36 -0
- package/dist/services/integrity-diagram.d.ts.map +1 -0
- package/dist/services/integrity-diagram.js +275 -0
- package/dist/services/integrity-diagram.js.map +1 -0
- package/dist/services/integrity.d.ts +134 -0
- package/dist/services/integrity.d.ts.map +1 -0
- package/dist/services/integrity.js +272 -0
- package/dist/services/integrity.js.map +1 -0
- package/dist/services/list.d.ts +31 -0
- package/dist/services/list.d.ts.map +1 -0
- package/dist/services/list.js +36 -0
- package/dist/services/list.js.map +1 -0
- package/dist/services/openapi/export-service.d.ts +53 -0
- package/dist/services/openapi/export-service.d.ts.map +1 -0
- package/dist/services/openapi/export-service.js +50 -0
- package/dist/services/openapi/export-service.js.map +1 -0
- package/dist/services/openapi/import-service.d.ts +17 -0
- package/dist/services/openapi/import-service.d.ts.map +1 -0
- package/dist/services/openapi/import-service.js +74 -0
- package/dist/services/openapi/import-service.js.map +1 -0
- package/dist/services/openapi/index.d.ts +5 -0
- package/dist/services/openapi/index.js +4 -0
- package/dist/services/openapi/sync-service.d.ts +17 -0
- package/dist/services/openapi/sync-service.d.ts.map +1 -0
- package/dist/services/openapi/sync-service.js +120 -0
- package/dist/services/openapi/sync-service.js.map +1 -0
- package/dist/services/openapi/types.d.ts +162 -0
- package/dist/services/openapi/types.d.ts.map +1 -0
- package/dist/services/openapi/validate-service.d.ts +16 -0
- package/dist/services/openapi/validate-service.d.ts.map +1 -0
- package/dist/services/openapi/validate-service.js +130 -0
- package/dist/services/openapi/validate-service.js.map +1 -0
- package/dist/services/quickstart/dependencies.d.ts +31 -0
- package/dist/services/quickstart/dependencies.d.ts.map +1 -0
- package/dist/services/quickstart/dependencies.js +57 -0
- package/dist/services/quickstart/dependencies.js.map +1 -0
- package/dist/services/quickstart/index.js +2 -0
- package/dist/services/quickstart/quickstart-service.d.ts +20 -0
- package/dist/services/quickstart/quickstart-service.d.ts.map +1 -0
- package/dist/services/quickstart/quickstart-service.js +196 -0
- package/dist/services/quickstart/quickstart-service.js.map +1 -0
- package/dist/services/quickstart/types.d.ts +81 -0
- package/dist/services/quickstart/types.d.ts.map +1 -0
- package/dist/services/regenerator.d.ts +18 -0
- package/dist/services/regenerator.d.ts.map +1 -0
- package/dist/services/regenerator.js +23 -0
- package/dist/services/regenerator.js.map +1 -0
- package/dist/services/registry.d.ts +53 -0
- package/dist/services/registry.d.ts.map +1 -0
- package/dist/services/registry.js +74 -0
- package/dist/services/registry.js.map +1 -0
- package/dist/services/setup/config-generators.d.ts +42 -0
- package/dist/services/setup/config-generators.d.ts.map +1 -0
- package/dist/services/setup/config-generators.js +238 -0
- package/dist/services/setup/config-generators.js.map +1 -0
- package/dist/services/setup/file-merger.d.ts +27 -0
- package/dist/services/setup/file-merger.d.ts.map +1 -0
- package/dist/services/setup/file-merger.js +61 -0
- package/dist/services/setup/file-merger.js.map +1 -0
- package/dist/services/setup/index.js +4 -0
- package/dist/services/setup/setup-service.d.ts +12 -0
- package/dist/services/setup/setup-service.d.ts.map +1 -0
- package/dist/services/setup/setup-service.js +96 -0
- package/dist/services/setup/setup-service.js.map +1 -0
- package/dist/services/setup/targets/agents-md.js +47 -0
- package/dist/services/setup/targets/agents-md.js.map +1 -0
- package/dist/services/setup/targets/cli-config.js +60 -0
- package/dist/services/setup/targets/cli-config.js.map +1 -0
- package/dist/services/setup/targets/cursor-rules.js +48 -0
- package/dist/services/setup/targets/cursor-rules.js.map +1 -0
- package/dist/services/setup/targets/mcp-claude.js +60 -0
- package/dist/services/setup/targets/mcp-claude.js.map +1 -0
- package/dist/services/setup/targets/mcp-cursor.js +59 -0
- package/dist/services/setup/targets/mcp-cursor.js.map +1 -0
- package/dist/services/setup/targets/vscode-settings.js +63 -0
- package/dist/services/setup/targets/vscode-settings.js.map +1 -0
- package/dist/services/setup/types.d.ts +85 -0
- package/dist/services/setup/types.d.ts.map +1 -0
- package/dist/services/setup/types.js +27 -0
- package/dist/services/setup/types.js.map +1 -0
- package/dist/services/sync.d.ts +41 -0
- package/dist/services/sync.d.ts.map +1 -0
- package/dist/services/sync.js +63 -0
- package/dist/services/sync.js.map +1 -0
- package/dist/services/test.d.ts +15 -0
- package/dist/services/test.d.ts.map +1 -0
- package/dist/services/test.js +30 -0
- package/dist/services/test.js.map +1 -0
- package/dist/services/validate-implementation.d.ts +32 -0
- package/dist/services/validate-implementation.d.ts.map +1 -0
- package/dist/services/validate-implementation.js +64 -0
- package/dist/services/validate-implementation.js.map +1 -0
- package/dist/services/validate.d.ts +41 -0
- package/dist/services/validate.d.ts.map +1 -0
- package/dist/services/validate.js +48 -0
- package/dist/services/validate.js.map +1 -0
- package/dist/services/verification-cache/adapters/filesystem.d.ts +46 -0
- package/dist/services/verification-cache/adapters/filesystem.d.ts.map +1 -0
- package/dist/services/verification-cache/adapters/filesystem.js +120 -0
- package/dist/services/verification-cache/adapters/filesystem.js.map +1 -0
- package/dist/services/verification-cache/adapters/in-memory.d.ts +27 -0
- package/dist/services/verification-cache/adapters/in-memory.d.ts.map +1 -0
- package/dist/services/verification-cache/adapters/in-memory.js +46 -0
- package/dist/services/verification-cache/adapters/in-memory.js.map +1 -0
- package/dist/services/verification-cache/adapters/index.d.ts +3 -0
- package/dist/services/verification-cache/adapters/index.js +3 -0
- package/dist/services/verification-cache/adapters/workspace-state.d.ts +49 -0
- package/dist/services/verification-cache/adapters/workspace-state.d.ts.map +1 -0
- package/dist/services/verification-cache/adapters/workspace-state.js +91 -0
- package/dist/services/verification-cache/adapters/workspace-state.js.map +1 -0
- package/dist/services/verification-cache/cache-service.d.ts +70 -0
- package/dist/services/verification-cache/cache-service.d.ts.map +1 -0
- package/dist/services/verification-cache/cache-service.js +256 -0
- package/dist/services/verification-cache/cache-service.js.map +1 -0
- package/dist/services/verification-cache/index.d.ts +6 -0
- package/dist/services/verification-cache/index.js +6 -0
- package/dist/services/verification-cache/types.d.ts +124 -0
- package/dist/services/verification-cache/types.d.ts.map +1 -0
- package/dist/services/verification-cache/types.js +16 -0
- package/dist/services/verification-cache/types.js.map +1 -0
- package/dist/services/verify/ai-verifier.d.ts +25 -0
- package/dist/services/verify/ai-verifier.d.ts.map +1 -0
- package/dist/services/verify/ai-verifier.js +403 -0
- package/dist/services/verify/ai-verifier.js.map +1 -0
- package/dist/services/verify/behavior-verifier.d.ts +12 -0
- package/dist/services/verify/behavior-verifier.d.ts.map +1 -0
- package/dist/services/verify/behavior-verifier.js +186 -0
- package/dist/services/verify/behavior-verifier.js.map +1 -0
- package/dist/services/verify/index.d.ts +5 -0
- package/dist/services/verify/index.js +4 -0
- package/dist/services/verify/structure-verifier.d.ts +12 -0
- package/dist/services/verify/structure-verifier.d.ts.map +1 -0
- package/dist/services/verify/structure-verifier.js +196 -0
- package/dist/services/verify/structure-verifier.js.map +1 -0
- package/dist/services/verify/types.d.ts +137 -0
- package/dist/services/verify/types.d.ts.map +1 -0
- package/dist/services/verify/verify-service.d.ts +60 -0
- package/dist/services/verify/verify-service.d.ts.map +1 -0
- package/dist/services/verify/verify-service.js +204 -0
- package/dist/services/verify/verify-service.js.map +1 -0
- package/dist/services/watch.d.ts +25 -0
- package/dist/services/watch.d.ts.map +1 -0
- package/dist/services/watch.js +32 -0
- package/dist/services/watch.js.map +1 -0
- package/dist/services/workspace-info.d.ts +62 -0
- package/dist/services/workspace-info.d.ts.map +1 -0
- package/dist/services/workspace-info.js +103 -0
- package/dist/services/workspace-info.js.map +1 -0
- package/dist/templates/app-config.template.d.ts +7 -0
- package/dist/templates/app-config.template.d.ts.map +1 -0
- package/dist/templates/app-config.template.js +107 -0
- package/dist/templates/app-config.template.js.map +1 -0
- package/dist/templates/data-view.template.d.ts +7 -0
- package/dist/templates/data-view.template.d.ts.map +1 -0
- package/dist/templates/data-view.template.js +70 -0
- package/dist/templates/data-view.template.js.map +1 -0
- package/dist/templates/event.template.d.ts +11 -0
- package/dist/templates/event.template.d.ts.map +1 -0
- package/dist/templates/event.template.js +40 -0
- package/dist/templates/event.template.js.map +1 -0
- package/dist/templates/experiment.template.d.ts +7 -0
- package/dist/templates/experiment.template.d.ts.map +1 -0
- package/dist/templates/experiment.template.js +89 -0
- package/dist/templates/experiment.template.js.map +1 -0
- package/dist/templates/handler.template.d.ts +16 -0
- package/dist/templates/handler.template.d.ts.map +1 -0
- package/dist/templates/handler.template.js +100 -0
- package/dist/templates/handler.template.js.map +1 -0
- package/dist/templates/index.d.ts +21 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +37 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/integration.template.d.ts +7 -0
- package/dist/templates/integration.template.d.ts.map +1 -0
- package/dist/templates/integration.template.js +160 -0
- package/dist/templates/integration.template.js.map +1 -0
- package/dist/templates/knowledge.template.d.ts +7 -0
- package/dist/templates/knowledge.template.d.ts.map +1 -0
- package/dist/templates/knowledge.template.js +75 -0
- package/dist/templates/knowledge.template.js.map +1 -0
- package/dist/templates/migration.template.d.ts +7 -0
- package/dist/templates/migration.template.d.ts.map +1 -0
- package/dist/templates/migration.template.js +62 -0
- package/dist/templates/migration.template.js.map +1 -0
- package/dist/templates/operation.template.d.ts +11 -0
- package/dist/templates/operation.template.d.ts.map +1 -0
- package/dist/templates/operation.template.js +105 -0
- package/dist/templates/operation.template.js.map +1 -0
- package/dist/templates/presentation.template.d.ts +11 -0
- package/dist/templates/presentation.template.d.ts.map +1 -0
- package/dist/templates/presentation.template.js +80 -0
- package/dist/templates/presentation.template.js.map +1 -0
- package/dist/templates/telemetry.template.d.ts +7 -0
- package/dist/templates/telemetry.template.d.ts.map +1 -0
- package/dist/templates/telemetry.template.js +91 -0
- package/dist/templates/telemetry.template.js.map +1 -0
- package/dist/templates/workflow-runner.template.d.ts +16 -0
- package/dist/templates/workflow-runner.template.d.ts.map +1 -0
- package/dist/templates/workflow-runner.template.js +50 -0
- package/dist/templates/workflow-runner.template.js.map +1 -0
- package/dist/templates/workflow.template.d.ts +7 -0
- package/dist/templates/workflow.template.d.ts.map +1 -0
- package/dist/templates/workflow.template.js +69 -0
- package/dist/templates/workflow.template.js.map +1 -0
- package/dist/types/config.d.ts +34 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types.d.ts +324 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { scanSpecSource } from "@contractspec/module.workspace";
|
|
2
|
+
|
|
3
|
+
//#region src/services/validate-implementation.ts
|
|
4
|
+
function toKebabCase(value) {
|
|
5
|
+
return value.replace(/\./g, "-").replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
|
|
6
|
+
}
|
|
7
|
+
function toPascalCase(value) {
|
|
8
|
+
return value.split(/[-_.]/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
|
|
9
|
+
}
|
|
10
|
+
async function validateImplementationFiles(specFile, adapters, config, options = {}) {
|
|
11
|
+
const { fs } = adapters;
|
|
12
|
+
const errors = [];
|
|
13
|
+
const warnings = [];
|
|
14
|
+
if (!await fs.exists(specFile)) return {
|
|
15
|
+
valid: false,
|
|
16
|
+
errors: [`Spec file not found: ${specFile}`],
|
|
17
|
+
warnings: [],
|
|
18
|
+
expected: {}
|
|
19
|
+
};
|
|
20
|
+
const scan = scanSpecSource(await fs.readFile(specFile), specFile);
|
|
21
|
+
const specName = scan.key ?? fs.basename(specFile).replace(/\.[jt]s$/, "");
|
|
22
|
+
const outRoot = options.outputDir ?? config.outputDir ?? "./src";
|
|
23
|
+
const kebab = toKebabCase(specName);
|
|
24
|
+
const expected = {};
|
|
25
|
+
if (scan.specType === "operation") {
|
|
26
|
+
expected.handlerPath = fs.join(outRoot, "handlers", `${kebab}.handler.ts`);
|
|
27
|
+
expected.handlerTestPath = fs.join(outRoot, "handlers", `${kebab}.handler.test.ts`);
|
|
28
|
+
}
|
|
29
|
+
if (scan.specType === "presentation") {
|
|
30
|
+
expected.componentPath = fs.join(outRoot, "components", `${kebab}.tsx`);
|
|
31
|
+
expected.componentTestPath = fs.join(outRoot, "components", `${kebab}.test.tsx`);
|
|
32
|
+
}
|
|
33
|
+
if (scan.specType === "form") {
|
|
34
|
+
expected.formPath = fs.join(outRoot, "forms", `${kebab}.form.tsx`);
|
|
35
|
+
expected.formTestPath = fs.join(outRoot, "forms", `${kebab}.form.test.tsx`);
|
|
36
|
+
}
|
|
37
|
+
if (options.checkHandlers && expected.handlerPath) if (!await fs.exists(expected.handlerPath)) errors.push(`Missing handler file: ${expected.handlerPath}`);
|
|
38
|
+
else {
|
|
39
|
+
const handlerCode = await fs.readFile(expected.handlerPath);
|
|
40
|
+
const expectedSpecVar = `${toPascalCase(specName.split(".").pop() ?? specName)}Spec`;
|
|
41
|
+
const hasContractHandlerType = /ContractHandler<\s*typeof\s+\w+\s*>/.test(handlerCode);
|
|
42
|
+
const referencesExpectedSpec = (/* @__PURE__ */ new RegExp(`typeof\\s+${expectedSpecVar}\\b`)).test(handlerCode);
|
|
43
|
+
if (!hasContractHandlerType) warnings.push(`Handler does not appear to type itself as ContractHandler<typeof Spec>: ${expected.handlerPath}`);
|
|
44
|
+
else if (!referencesExpectedSpec) warnings.push(`Handler ContractHandler typing does not reference expected spec var (${expectedSpecVar}): ${expected.handlerPath}`);
|
|
45
|
+
}
|
|
46
|
+
if (options.checkTests) {
|
|
47
|
+
const candidateTests = [
|
|
48
|
+
expected.handlerTestPath,
|
|
49
|
+
expected.componentTestPath,
|
|
50
|
+
expected.formTestPath
|
|
51
|
+
].filter((p) => typeof p === "string");
|
|
52
|
+
for (const testPath of candidateTests) if (!await fs.exists(testPath)) errors.push(`Missing test file: ${testPath}`);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
valid: errors.length === 0,
|
|
56
|
+
errors,
|
|
57
|
+
warnings,
|
|
58
|
+
expected
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
//#endregion
|
|
63
|
+
export { validateImplementationFiles };
|
|
64
|
+
//# sourceMappingURL=validate-implementation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-implementation.js","names":["errors: string[]","warnings: string[]","expected: ValidateImplementationResult['expected']"],"sources":["../../src/services/validate-implementation.ts"],"sourcesContent":["/**\n * Implementation validation service (handlers + tests).\n *\n * Deterministic, static checks intended for reuse across CLI/VSCode/web tooling.\n * This does NOT execute spec modules.\n */\n\nimport type { WorkspaceConfig } from '@contractspec/module.workspace';\nimport { scanSpecSource } from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../ports/fs';\n\nexport interface ValidateImplementationOptions {\n checkHandlers?: boolean;\n checkTests?: boolean;\n /**\n * Override workspace outputDir (defaults to config.outputDir).\n */\n outputDir?: string;\n}\n\nexport interface ValidateImplementationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n expected: {\n handlerPath?: string;\n handlerTestPath?: string;\n componentPath?: string;\n componentTestPath?: string;\n formPath?: string;\n formTestPath?: string;\n };\n}\n\nfunction toKebabCase(value: string): string {\n return value\n .replace(/\\./g, '-')\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .toLowerCase();\n}\n\nfunction toPascalCase(value: string): string {\n return value\n .split(/[-_.]/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n}\n\nexport async function validateImplementationFiles(\n specFile: string,\n adapters: { fs: FsAdapter },\n config: WorkspaceConfig,\n options: ValidateImplementationOptions = {}\n): Promise<ValidateImplementationResult> {\n const { fs } = adapters;\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const exists = await fs.exists(specFile);\n if (!exists) {\n return {\n valid: false,\n errors: [`Spec file not found: ${specFile}`],\n warnings: [],\n expected: {},\n };\n }\n\n const code = await fs.readFile(specFile);\n const scan = scanSpecSource(code, specFile);\n const specName = scan.key ?? fs.basename(specFile).replace(/\\.[jt]s$/, '');\n const outRoot = options.outputDir ?? config.outputDir ?? './src';\n const kebab = toKebabCase(specName);\n\n const expected: ValidateImplementationResult['expected'] = {};\n\n if (scan.specType === 'operation') {\n expected.handlerPath = fs.join(outRoot, 'handlers', `${kebab}.handler.ts`);\n expected.handlerTestPath = fs.join(\n outRoot,\n 'handlers',\n `${kebab}.handler.test.ts`\n );\n }\n if (scan.specType === 'presentation') {\n expected.componentPath = fs.join(outRoot, 'components', `${kebab}.tsx`);\n expected.componentTestPath = fs.join(\n outRoot,\n 'components',\n `${kebab}.test.tsx`\n );\n }\n if (scan.specType === 'form') {\n expected.formPath = fs.join(outRoot, 'forms', `${kebab}.form.tsx`);\n expected.formTestPath = fs.join(outRoot, 'forms', `${kebab}.form.test.tsx`);\n }\n\n if (options.checkHandlers && expected.handlerPath) {\n const handlerExists = await fs.exists(expected.handlerPath);\n if (!handlerExists) {\n errors.push(`Missing handler file: ${expected.handlerPath}`);\n } else {\n const handlerCode = await fs.readFile(expected.handlerPath);\n\n const expectedSpecVar = `${toPascalCase(specName.split('.').pop() ?? specName)}Spec`;\n const hasContractHandlerType = /ContractHandler<\\s*typeof\\s+\\w+\\s*>/.test(\n handlerCode\n );\n const referencesExpectedSpec = new RegExp(\n `typeof\\\\s+${expectedSpecVar}\\\\b`\n ).test(handlerCode);\n if (!hasContractHandlerType) {\n warnings.push(\n `Handler does not appear to type itself as ContractHandler<typeof Spec>: ${expected.handlerPath}`\n );\n } else if (!referencesExpectedSpec) {\n warnings.push(\n `Handler ContractHandler typing does not reference expected spec var (${expectedSpecVar}): ${expected.handlerPath}`\n );\n }\n }\n }\n\n if (options.checkTests) {\n const candidateTests = [\n expected.handlerTestPath,\n expected.componentTestPath,\n expected.formTestPath,\n ].filter((p): p is string => typeof p === 'string');\n\n for (const testPath of candidateTests) {\n const testExists = await fs.exists(testPath);\n if (!testExists) {\n errors.push(`Missing test file: ${testPath}`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n expected,\n };\n}\n"],"mappings":";;;AAkCA,SAAS,YAAY,OAAuB;AAC1C,QAAO,MACJ,QAAQ,OAAO,IAAI,CACnB,QAAQ,mBAAmB,QAAQ,CACnC,aAAa;;AAGlB,SAAS,aAAa,OAAuB;AAC3C,QAAO,MACJ,MAAM,QAAQ,CACd,OAAO,QAAQ,CACf,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE,CAAC,CAC3D,KAAK,GAAG;;AAGb,eAAsB,4BACpB,UACA,UACA,QACA,UAAyC,EAAE,EACJ;CACvC,MAAM,EAAE,OAAO;CACf,MAAMA,SAAmB,EAAE;CAC3B,MAAMC,WAAqB,EAAE;AAG7B,KAAI,CADW,MAAM,GAAG,OAAO,SAAS,CAEtC,QAAO;EACL,OAAO;EACP,QAAQ,CAAC,wBAAwB,WAAW;EAC5C,UAAU,EAAE;EACZ,UAAU,EAAE;EACb;CAIH,MAAM,OAAO,eADA,MAAM,GAAG,SAAS,SAAS,EACN,SAAS;CAC3C,MAAM,WAAW,KAAK,OAAO,GAAG,SAAS,SAAS,CAAC,QAAQ,YAAY,GAAG;CAC1E,MAAM,UAAU,QAAQ,aAAa,OAAO,aAAa;CACzD,MAAM,QAAQ,YAAY,SAAS;CAEnC,MAAMC,WAAqD,EAAE;AAE7D,KAAI,KAAK,aAAa,aAAa;AACjC,WAAS,cAAc,GAAG,KAAK,SAAS,YAAY,GAAG,MAAM,aAAa;AAC1E,WAAS,kBAAkB,GAAG,KAC5B,SACA,YACA,GAAG,MAAM,kBACV;;AAEH,KAAI,KAAK,aAAa,gBAAgB;AACpC,WAAS,gBAAgB,GAAG,KAAK,SAAS,cAAc,GAAG,MAAM,MAAM;AACvE,WAAS,oBAAoB,GAAG,KAC9B,SACA,cACA,GAAG,MAAM,WACV;;AAEH,KAAI,KAAK,aAAa,QAAQ;AAC5B,WAAS,WAAW,GAAG,KAAK,SAAS,SAAS,GAAG,MAAM,WAAW;AAClE,WAAS,eAAe,GAAG,KAAK,SAAS,SAAS,GAAG,MAAM,gBAAgB;;AAG7E,KAAI,QAAQ,iBAAiB,SAAS,YAEpC,KAAI,CADkB,MAAM,GAAG,OAAO,SAAS,YAAY,CAEzD,QAAO,KAAK,yBAAyB,SAAS,cAAc;MACvD;EACL,MAAM,cAAc,MAAM,GAAG,SAAS,SAAS,YAAY;EAE3D,MAAM,kBAAkB,GAAG,aAAa,SAAS,MAAM,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;EAC/E,MAAM,yBAAyB,sCAAsC,KACnE,YACD;EACD,MAAM,0CAAyB,IAAI,OACjC,aAAa,gBAAgB,KAC9B,EAAC,KAAK,YAAY;AACnB,MAAI,CAAC,uBACH,UAAS,KACP,2EAA2E,SAAS,cACrF;WACQ,CAAC,uBACV,UAAS,KACP,wEAAwE,gBAAgB,KAAK,SAAS,cACvG;;AAKP,KAAI,QAAQ,YAAY;EACtB,MAAM,iBAAiB;GACrB,SAAS;GACT,SAAS;GACT,SAAS;GACV,CAAC,QAAQ,MAAmB,OAAO,MAAM,SAAS;AAEnD,OAAK,MAAM,YAAY,eAErB,KAAI,CADe,MAAM,GAAG,OAAO,SAAS,CAE1C,QAAO,KAAK,sBAAsB,WAAW;;AAKnD,QAAO;EACL,OAAO,OAAO,WAAW;EACzB;EACA;EACA;EACD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FsAdapter } from "../ports/fs.js";
|
|
2
|
+
import { LoggerAdapter } from "../ports/logger.js";
|
|
3
|
+
import { ValidationResult } from "@contractspec/module.workspace";
|
|
4
|
+
|
|
5
|
+
//#region src/services/validate.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Options for spec validation.
|
|
9
|
+
*/
|
|
10
|
+
interface ValidateSpecOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Skip spec structure validation (e.g., for blueprint files).
|
|
13
|
+
*/
|
|
14
|
+
skipStructure?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Result of spec validation.
|
|
18
|
+
*/
|
|
19
|
+
interface ValidateSpecResult {
|
|
20
|
+
valid: boolean;
|
|
21
|
+
structureResult?: ValidationResult;
|
|
22
|
+
errors: string[];
|
|
23
|
+
warnings: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validate a spec file.
|
|
27
|
+
*/
|
|
28
|
+
declare function validateSpec(specFile: string, adapters: {
|
|
29
|
+
fs: FsAdapter;
|
|
30
|
+
logger: LoggerAdapter;
|
|
31
|
+
}, options?: ValidateSpecOptions): Promise<ValidateSpecResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Validate multiple spec files.
|
|
34
|
+
*/
|
|
35
|
+
declare function validateSpecs(specFiles: string[], adapters: {
|
|
36
|
+
fs: FsAdapter;
|
|
37
|
+
logger: LoggerAdapter;
|
|
38
|
+
}, options?: ValidateSpecOptions): Promise<Map<string, ValidateSpecResult>>;
|
|
39
|
+
//#endregion
|
|
40
|
+
export { ValidateSpecOptions, ValidateSpecResult, validateSpec, validateSpecs };
|
|
41
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","names":[],"sources":["../../src/services/validate.ts"],"sourcesContent":[],"mappings":";;;;;;AAwBA;AAUA;;AAEqC,UAtBpB,mBAAA,CAsBoB;EAC1B;;;EACD,aAAA,CAAA,EAAA,OAAA;AAoCV;;;;AAIuB,UAtDN,kBAAA,CAsDM;EAAZ,KAAA,EAAA,OAAA;EAAR,eAAA,CAAA,EApDiB,gBAoDjB;EAAO,MAAA,EAAA,MAAA,EAAA;;;;;;iBA5CY,YAAA;MAEJ;UAAmB;aAC1B,sBACR,QAAQ;;;;iBAoCW,aAAA;MAEJ;UAAmB;aAC1B,sBACR,QAAQ,YAAY"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { validateSpecStructure } from "@contractspec/module.workspace";
|
|
2
|
+
|
|
3
|
+
//#region src/services/validate.ts
|
|
4
|
+
/**
|
|
5
|
+
* Validation service.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Validate a spec file.
|
|
9
|
+
*/
|
|
10
|
+
async function validateSpec(specFile, adapters, options = {}) {
|
|
11
|
+
const { fs } = adapters;
|
|
12
|
+
if (!await fs.exists(specFile)) return {
|
|
13
|
+
valid: false,
|
|
14
|
+
errors: [`Spec file not found: ${specFile}`],
|
|
15
|
+
warnings: []
|
|
16
|
+
};
|
|
17
|
+
const specCode = await fs.readFile(specFile);
|
|
18
|
+
const fileName = fs.basename(specFile);
|
|
19
|
+
const allErrors = [];
|
|
20
|
+
const allWarnings = [];
|
|
21
|
+
let structureResult;
|
|
22
|
+
if (!options.skipStructure) {
|
|
23
|
+
structureResult = validateSpecStructure(specCode, fileName);
|
|
24
|
+
allErrors.push(...structureResult.errors);
|
|
25
|
+
allWarnings.push(...structureResult.warnings);
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
valid: allErrors.length === 0,
|
|
29
|
+
structureResult,
|
|
30
|
+
errors: allErrors,
|
|
31
|
+
warnings: allWarnings
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validate multiple spec files.
|
|
36
|
+
*/
|
|
37
|
+
async function validateSpecs(specFiles, adapters, options = {}) {
|
|
38
|
+
const results = /* @__PURE__ */ new Map();
|
|
39
|
+
for (const specFile of specFiles) {
|
|
40
|
+
const result = await validateSpec(specFile, adapters, options);
|
|
41
|
+
results.set(specFile, result);
|
|
42
|
+
}
|
|
43
|
+
return results;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//#endregion
|
|
47
|
+
export { validateSpec, validateSpecs };
|
|
48
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","names":["allErrors: string[]","allWarnings: string[]","structureResult: ValidationResult | undefined"],"sources":["../../src/services/validate.ts"],"sourcesContent":["/**\n * Validation service.\n */\n\nimport {\n validateSpecStructure,\n type ValidationResult,\n} from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../ports/fs';\nimport type { LoggerAdapter } from '../ports/logger';\n\n/**\n * Options for spec validation.\n */\nexport interface ValidateSpecOptions {\n /**\n * Skip spec structure validation (e.g., for blueprint files).\n */\n skipStructure?: boolean;\n}\n\n/**\n * Result of spec validation.\n */\nexport interface ValidateSpecResult {\n valid: boolean;\n structureResult?: ValidationResult;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Validate a spec file.\n */\nexport async function validateSpec(\n specFile: string,\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: ValidateSpecOptions = {}\n): Promise<ValidateSpecResult> {\n const { fs } = adapters;\n\n const exists = await fs.exists(specFile);\n if (!exists) {\n return {\n valid: false,\n errors: [`Spec file not found: ${specFile}`],\n warnings: [],\n };\n }\n\n const specCode = await fs.readFile(specFile);\n const fileName = fs.basename(specFile);\n\n const allErrors: string[] = [];\n const allWarnings: string[] = [];\n let structureResult: ValidationResult | undefined;\n\n if (!options.skipStructure) {\n structureResult = validateSpecStructure(specCode, fileName);\n allErrors.push(...structureResult.errors);\n allWarnings.push(...structureResult.warnings);\n }\n\n return {\n valid: allErrors.length === 0,\n structureResult,\n errors: allErrors,\n warnings: allWarnings,\n };\n}\n\n/**\n * Validate multiple spec files.\n */\nexport async function validateSpecs(\n specFiles: string[],\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: ValidateSpecOptions = {}\n): Promise<Map<string, ValidateSpecResult>> {\n const results = new Map<string, ValidateSpecResult>();\n\n for (const specFile of specFiles) {\n const result = await validateSpec(specFile, adapters, options);\n results.set(specFile, result);\n }\n\n return results;\n}\n"],"mappings":";;;;;;;;;AAkCA,eAAsB,aACpB,UACA,UACA,UAA+B,EAAE,EACJ;CAC7B,MAAM,EAAE,OAAO;AAGf,KAAI,CADW,MAAM,GAAG,OAAO,SAAS,CAEtC,QAAO;EACL,OAAO;EACP,QAAQ,CAAC,wBAAwB,WAAW;EAC5C,UAAU,EAAE;EACb;CAGH,MAAM,WAAW,MAAM,GAAG,SAAS,SAAS;CAC5C,MAAM,WAAW,GAAG,SAAS,SAAS;CAEtC,MAAMA,YAAsB,EAAE;CAC9B,MAAMC,cAAwB,EAAE;CAChC,IAAIC;AAEJ,KAAI,CAAC,QAAQ,eAAe;AAC1B,oBAAkB,sBAAsB,UAAU,SAAS;AAC3D,YAAU,KAAK,GAAG,gBAAgB,OAAO;AACzC,cAAY,KAAK,GAAG,gBAAgB,SAAS;;AAG/C,QAAO;EACL,OAAO,UAAU,WAAW;EAC5B;EACA,QAAQ;EACR,UAAU;EACX;;;;;AAMH,eAAsB,cACpB,WACA,UACA,UAA+B,EAAE,EACS;CAC1C,MAAM,0BAAU,IAAI,KAAiC;AAErD,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,SAAS,MAAM,aAAa,UAAU,UAAU,QAAQ;AAC9D,UAAQ,IAAI,UAAU,OAAO;;AAG/B,QAAO"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { CacheKeyString, CacheStorageAdapter, VerificationCacheEntry } from "../types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/services/verification-cache/adapters/filesystem.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Filesystem storage adapter.
|
|
7
|
+
*/
|
|
8
|
+
declare class FileSystemCacheStorage implements CacheStorageAdapter {
|
|
9
|
+
private filePath;
|
|
10
|
+
private cache;
|
|
11
|
+
private isDirty;
|
|
12
|
+
constructor(filePath?: string, workspaceRoot?: string);
|
|
13
|
+
/**
|
|
14
|
+
* Load cache from disk synchronously.
|
|
15
|
+
*/
|
|
16
|
+
private loadSync;
|
|
17
|
+
/**
|
|
18
|
+
* Save cache to disk.
|
|
19
|
+
*/
|
|
20
|
+
private saveSync;
|
|
21
|
+
get(key: CacheKeyString): Promise<VerificationCacheEntry | null>;
|
|
22
|
+
set(key: CacheKeyString, entry: VerificationCacheEntry): Promise<void>;
|
|
23
|
+
delete(key: CacheKeyString): Promise<boolean>;
|
|
24
|
+
has(key: CacheKeyString): Promise<boolean>;
|
|
25
|
+
keys(): Promise<CacheKeyString[]>;
|
|
26
|
+
clear(): Promise<void>;
|
|
27
|
+
stats(): Promise<{
|
|
28
|
+
entryCount: number;
|
|
29
|
+
memoryUsage?: number;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Force save any pending changes.
|
|
33
|
+
*/
|
|
34
|
+
flush(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Reload cache from disk.
|
|
37
|
+
*/
|
|
38
|
+
reload(): void;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a filesystem cache storage adapter.
|
|
42
|
+
*/
|
|
43
|
+
declare function createFileSystemCacheStorage(filePath?: string, workspaceRoot?: string): FileSystemCacheStorage;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { FileSystemCacheStorage, createFileSystemCacheStorage };
|
|
46
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","names":[],"sources":["../../../../src/services/verification-cache/adapters/filesystem.ts"],"sourcesContent":[],"mappings":";;;;;;;AAwHoB,cAhFP,sBAAA,YAAkC,mBAgF3B,CAAA;EAAiB,QAAA,QAAA;EASpB,QAAA,KAAA;EAAiB,QAAA,OAAA;EAIV,WAAA,CAAA,QAAA,CAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,MAAA;EAAR;;;EA7F+B,QAAA,QAAA;EAAmB;AA4IlE;;;WAtEiB,iBAAiB,QAAQ;WAIzB,uBAAuB,yBAAyB;cAM7C,iBAAiB;WASpB,iBAAiB;UAIlB,QAAQ;WAIP;WAMA;;;;;;;;;;;;;;;;iBAqCD,4BAAA,6CAGb"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { dirname, join } from "path";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from "fs";
|
|
3
|
+
|
|
4
|
+
//#region src/services/verification-cache/adapters/filesystem.ts
|
|
5
|
+
/**
|
|
6
|
+
* Filesystem cache storage adapter.
|
|
7
|
+
*
|
|
8
|
+
* Stores cache entries in a JSON file for CLI and CI environments.
|
|
9
|
+
* Uses atomic writes to prevent corruption.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Default cache file location.
|
|
13
|
+
*/
|
|
14
|
+
const DEFAULT_CACHE_FILE = ".contractspec/verification-cache.json";
|
|
15
|
+
const CURRENT_VERSION = 1;
|
|
16
|
+
/**
|
|
17
|
+
* Filesystem storage adapter.
|
|
18
|
+
*/
|
|
19
|
+
var FileSystemCacheStorage = class {
|
|
20
|
+
filePath;
|
|
21
|
+
cache;
|
|
22
|
+
isDirty = false;
|
|
23
|
+
constructor(filePath, workspaceRoot) {
|
|
24
|
+
const root = workspaceRoot ?? process.cwd();
|
|
25
|
+
this.filePath = filePath ?? join(root, DEFAULT_CACHE_FILE);
|
|
26
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
27
|
+
this.loadSync();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Load cache from disk synchronously.
|
|
31
|
+
*/
|
|
32
|
+
loadSync() {
|
|
33
|
+
try {
|
|
34
|
+
if (!existsSync(this.filePath)) return;
|
|
35
|
+
const content = readFileSync(this.filePath, "utf-8");
|
|
36
|
+
const data = JSON.parse(content);
|
|
37
|
+
if (data.version !== CURRENT_VERSION) return;
|
|
38
|
+
for (const [key, entry] of Object.entries(data.entries)) this.cache.set(key, entry);
|
|
39
|
+
} catch {}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Save cache to disk.
|
|
43
|
+
*/
|
|
44
|
+
saveSync() {
|
|
45
|
+
if (!this.isDirty) return;
|
|
46
|
+
try {
|
|
47
|
+
const dir = dirname(this.filePath);
|
|
48
|
+
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
49
|
+
const data = {
|
|
50
|
+
version: CURRENT_VERSION,
|
|
51
|
+
entries: Object.fromEntries(this.cache.entries())
|
|
52
|
+
};
|
|
53
|
+
const tempPath = `${this.filePath}.tmp`;
|
|
54
|
+
writeFileSync(tempPath, JSON.stringify(data, null, 2), "utf-8");
|
|
55
|
+
renameSync(tempPath, this.filePath);
|
|
56
|
+
this.isDirty = false;
|
|
57
|
+
} catch {}
|
|
58
|
+
}
|
|
59
|
+
async get(key) {
|
|
60
|
+
return this.cache.get(key) ?? null;
|
|
61
|
+
}
|
|
62
|
+
async set(key, entry) {
|
|
63
|
+
this.cache.set(key, entry);
|
|
64
|
+
this.isDirty = true;
|
|
65
|
+
this.saveSync();
|
|
66
|
+
}
|
|
67
|
+
async delete(key) {
|
|
68
|
+
const existed = this.cache.delete(key);
|
|
69
|
+
if (existed) {
|
|
70
|
+
this.isDirty = true;
|
|
71
|
+
this.saveSync();
|
|
72
|
+
}
|
|
73
|
+
return existed;
|
|
74
|
+
}
|
|
75
|
+
async has(key) {
|
|
76
|
+
return this.cache.has(key);
|
|
77
|
+
}
|
|
78
|
+
async keys() {
|
|
79
|
+
return Array.from(this.cache.keys());
|
|
80
|
+
}
|
|
81
|
+
async clear() {
|
|
82
|
+
this.cache.clear();
|
|
83
|
+
this.isDirty = true;
|
|
84
|
+
this.saveSync();
|
|
85
|
+
}
|
|
86
|
+
async stats() {
|
|
87
|
+
let fileSize = 0;
|
|
88
|
+
try {
|
|
89
|
+
if (existsSync(this.filePath)) fileSize = statSync(this.filePath).size;
|
|
90
|
+
} catch {}
|
|
91
|
+
return {
|
|
92
|
+
entryCount: this.cache.size,
|
|
93
|
+
memoryUsage: fileSize
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Force save any pending changes.
|
|
98
|
+
*/
|
|
99
|
+
flush() {
|
|
100
|
+
this.saveSync();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Reload cache from disk.
|
|
104
|
+
*/
|
|
105
|
+
reload() {
|
|
106
|
+
this.cache.clear();
|
|
107
|
+
this.loadSync();
|
|
108
|
+
this.isDirty = false;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Create a filesystem cache storage adapter.
|
|
113
|
+
*/
|
|
114
|
+
function createFileSystemCacheStorage(filePath, workspaceRoot) {
|
|
115
|
+
return new FileSystemCacheStorage(filePath, workspaceRoot);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//#endregion
|
|
119
|
+
export { FileSystemCacheStorage, createFileSystemCacheStorage };
|
|
120
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","names":["data: CacheFileData"],"sources":["../../../../src/services/verification-cache/adapters/filesystem.ts"],"sourcesContent":["/**\n * Filesystem cache storage adapter.\n *\n * Stores cache entries in a JSON file for CLI and CI environments.\n * Uses atomic writes to prevent corruption.\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n statSync,\n renameSync,\n} from 'fs';\nimport { dirname, join } from 'path';\nimport type {\n CacheKeyString,\n CacheStorageAdapter,\n VerificationCacheEntry,\n} from '../types';\n\n/**\n * Default cache file location.\n */\nconst DEFAULT_CACHE_FILE = '.contractspec/verification-cache.json';\n\n/**\n * Cache file structure.\n */\ninterface CacheFileData {\n version: number;\n entries: Record<CacheKeyString, VerificationCacheEntry>;\n}\n\nconst CURRENT_VERSION = 1;\n\n/**\n * Filesystem storage adapter.\n */\nexport class FileSystemCacheStorage implements CacheStorageAdapter {\n private filePath: string;\n private cache: Map<CacheKeyString, VerificationCacheEntry>;\n private isDirty = false;\n\n constructor(filePath?: string, workspaceRoot?: string) {\n const root = workspaceRoot ?? process.cwd();\n this.filePath = filePath ?? join(root, DEFAULT_CACHE_FILE);\n this.cache = new Map();\n this.loadSync();\n }\n\n /**\n * Load cache from disk synchronously.\n */\n private loadSync(): void {\n try {\n if (!existsSync(this.filePath)) {\n return;\n }\n\n const content = readFileSync(this.filePath, 'utf-8');\n const data = JSON.parse(content) as CacheFileData;\n\n // Version check\n if (data.version !== CURRENT_VERSION) {\n // Incompatible version, start fresh\n return;\n }\n\n // Load entries\n for (const [key, entry] of Object.entries(data.entries)) {\n this.cache.set(key, entry);\n }\n } catch {\n // Ignore load errors, start with empty cache\n }\n }\n\n /**\n * Save cache to disk.\n */\n private saveSync(): void {\n if (!this.isDirty) return;\n\n try {\n // Ensure directory exists\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const data: CacheFileData = {\n version: CURRENT_VERSION,\n entries: Object.fromEntries(this.cache.entries()),\n };\n\n // Atomic write: write to temp file, then rename\n const tempPath = `${this.filePath}.tmp`;\n writeFileSync(tempPath, JSON.stringify(data, null, 2), 'utf-8');\n\n // Rename is atomic on most filesystems\n renameSync(tempPath, this.filePath);\n\n this.isDirty = false;\n } catch {\n // Ignore save errors\n }\n }\n\n async get(key: CacheKeyString): Promise<VerificationCacheEntry | null> {\n return this.cache.get(key) ?? null;\n }\n\n async set(key: CacheKeyString, entry: VerificationCacheEntry): Promise<void> {\n this.cache.set(key, entry);\n this.isDirty = true;\n this.saveSync();\n }\n\n async delete(key: CacheKeyString): Promise<boolean> {\n const existed = this.cache.delete(key);\n if (existed) {\n this.isDirty = true;\n this.saveSync();\n }\n return existed;\n }\n\n async has(key: CacheKeyString): Promise<boolean> {\n return this.cache.has(key);\n }\n\n async keys(): Promise<CacheKeyString[]> {\n return Array.from(this.cache.keys());\n }\n\n async clear(): Promise<void> {\n this.cache.clear();\n this.isDirty = true;\n this.saveSync();\n }\n\n async stats(): Promise<{ entryCount: number; memoryUsage?: number }> {\n let fileSize = 0;\n try {\n if (existsSync(this.filePath)) {\n const stat = statSync(this.filePath);\n fileSize = stat.size;\n }\n } catch {\n // Ignore\n }\n\n return {\n entryCount: this.cache.size,\n memoryUsage: fileSize,\n };\n }\n\n /**\n * Force save any pending changes.\n */\n flush(): void {\n this.saveSync();\n }\n\n /**\n * Reload cache from disk.\n */\n reload(): void {\n this.cache.clear();\n this.loadSync();\n this.isDirty = false;\n }\n}\n\n/**\n * Create a filesystem cache storage adapter.\n */\nexport function createFileSystemCacheStorage(\n filePath?: string,\n workspaceRoot?: string\n): FileSystemCacheStorage {\n return new FileSystemCacheStorage(filePath, workspaceRoot);\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,MAAM,qBAAqB;AAU3B,MAAM,kBAAkB;;;;AAKxB,IAAa,yBAAb,MAAmE;CACjE,AAAQ;CACR,AAAQ;CACR,AAAQ,UAAU;CAElB,YAAY,UAAmB,eAAwB;EACrD,MAAM,OAAO,iBAAiB,QAAQ,KAAK;AAC3C,OAAK,WAAW,YAAY,KAAK,MAAM,mBAAmB;AAC1D,OAAK,wBAAQ,IAAI,KAAK;AACtB,OAAK,UAAU;;;;;CAMjB,AAAQ,WAAiB;AACvB,MAAI;AACF,OAAI,CAAC,WAAW,KAAK,SAAS,CAC5B;GAGF,MAAM,UAAU,aAAa,KAAK,UAAU,QAAQ;GACpD,MAAM,OAAO,KAAK,MAAM,QAAQ;AAGhC,OAAI,KAAK,YAAY,gBAEnB;AAIF,QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,QAAQ,CACrD,MAAK,MAAM,IAAI,KAAK,MAAM;UAEtB;;;;;CAQV,AAAQ,WAAiB;AACvB,MAAI,CAAC,KAAK,QAAS;AAEnB,MAAI;GAEF,MAAM,MAAM,QAAQ,KAAK,SAAS;AAClC,OAAI,CAAC,WAAW,IAAI,CAClB,WAAU,KAAK,EAAE,WAAW,MAAM,CAAC;GAGrC,MAAMA,OAAsB;IAC1B,SAAS;IACT,SAAS,OAAO,YAAY,KAAK,MAAM,SAAS,CAAC;IAClD;GAGD,MAAM,WAAW,GAAG,KAAK,SAAS;AAClC,iBAAc,UAAU,KAAK,UAAU,MAAM,MAAM,EAAE,EAAE,QAAQ;AAG/D,cAAW,UAAU,KAAK,SAAS;AAEnC,QAAK,UAAU;UACT;;CAKV,MAAM,IAAI,KAA6D;AACrE,SAAO,KAAK,MAAM,IAAI,IAAI,IAAI;;CAGhC,MAAM,IAAI,KAAqB,OAA8C;AAC3E,OAAK,MAAM,IAAI,KAAK,MAAM;AAC1B,OAAK,UAAU;AACf,OAAK,UAAU;;CAGjB,MAAM,OAAO,KAAuC;EAClD,MAAM,UAAU,KAAK,MAAM,OAAO,IAAI;AACtC,MAAI,SAAS;AACX,QAAK,UAAU;AACf,QAAK,UAAU;;AAEjB,SAAO;;CAGT,MAAM,IAAI,KAAuC;AAC/C,SAAO,KAAK,MAAM,IAAI,IAAI;;CAG5B,MAAM,OAAkC;AACtC,SAAO,MAAM,KAAK,KAAK,MAAM,MAAM,CAAC;;CAGtC,MAAM,QAAuB;AAC3B,OAAK,MAAM,OAAO;AAClB,OAAK,UAAU;AACf,OAAK,UAAU;;CAGjB,MAAM,QAA+D;EACnE,IAAI,WAAW;AACf,MAAI;AACF,OAAI,WAAW,KAAK,SAAS,CAE3B,YADa,SAAS,KAAK,SAAS,CACpB;UAEZ;AAIR,SAAO;GACL,YAAY,KAAK,MAAM;GACvB,aAAa;GACd;;;;;CAMH,QAAc;AACZ,OAAK,UAAU;;;;;CAMjB,SAAe;AACb,OAAK,MAAM,OAAO;AAClB,OAAK,UAAU;AACf,OAAK,UAAU;;;;;;AAOnB,SAAgB,6BACd,UACA,eACwB;AACxB,QAAO,IAAI,uBAAuB,UAAU,cAAc"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CacheKeyString, CacheStorageAdapter, VerificationCacheEntry } from "../types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/services/verification-cache/adapters/in-memory.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* In-memory storage adapter using a Map.
|
|
7
|
+
*/
|
|
8
|
+
declare class InMemoryCacheStorage implements CacheStorageAdapter {
|
|
9
|
+
private cache;
|
|
10
|
+
get(key: CacheKeyString): Promise<VerificationCacheEntry | null>;
|
|
11
|
+
set(key: CacheKeyString, entry: VerificationCacheEntry): Promise<void>;
|
|
12
|
+
delete(key: CacheKeyString): Promise<boolean>;
|
|
13
|
+
has(key: CacheKeyString): Promise<boolean>;
|
|
14
|
+
keys(): Promise<CacheKeyString[]>;
|
|
15
|
+
clear(): Promise<void>;
|
|
16
|
+
stats(): Promise<{
|
|
17
|
+
entryCount: number;
|
|
18
|
+
memoryUsage?: number;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create an in-memory cache storage adapter.
|
|
23
|
+
*/
|
|
24
|
+
declare function createInMemoryCacheStorage(): InMemoryCacheStorage;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { InMemoryCacheStorage, createInMemoryCacheStorage };
|
|
27
|
+
//# sourceMappingURL=in-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory.d.ts","names":[],"sources":["../../../../src/services/verification-cache/adapters/in-memory.ts"],"sourcesContent":[],"mappings":";;;;;;;AA2BoB,cAXP,oBAAA,YAAgC,mBAWzB,CAAA;EAAiB,QAAA,KAAA;EAIpB,GAAA,CAAA,GAAA,EAZA,cAYA,CAAA,EAZiB,OAYjB,CAZyB,sBAYzB,GAAA,IAAA,CAAA;EAAiB,GAAA,CAAA,GAAA,EARjB,cAQiB,EAAA,KAAA,EARM,sBAQN,CAAA,EAR+B,OAQ/B,CAAA,IAAA,CAAA;EAIV,MAAA,CAAA,GAAA,EARJ,cAQI,CAAA,EARa,OAQb,CAAA,OAAA,CAAA;EAAR,GAAA,CAAA,GAAA,EAJC,cAID,CAAA,EAJkB,OAIlB,CAAA,OAAA,CAAA;EAIC,IAAA,CAAA,CAAA,EAJD,OAIC,CAJO,cAIP,EAAA,CAAA;EAIA,KAAA,CAAA,CAAA,EAJA,OAIA,CAAA,IAAA,CAAA;EA3B4B,KAAA,CAAA,CAAA,EA2B5B,OA3B4B,CAAA;IAAmB,UAAA,EAAA,MAAA;IA6ChD,WAAA,CAAA,EAAA,MAAA;;;;;;iBAAA,0BAAA,CAAA,GAA8B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region src/services/verification-cache/adapters/in-memory.ts
|
|
2
|
+
/**
|
|
3
|
+
* In-memory storage adapter using a Map.
|
|
4
|
+
*/
|
|
5
|
+
var InMemoryCacheStorage = class {
|
|
6
|
+
cache = /* @__PURE__ */ new Map();
|
|
7
|
+
async get(key) {
|
|
8
|
+
return this.cache.get(key) ?? null;
|
|
9
|
+
}
|
|
10
|
+
async set(key, entry) {
|
|
11
|
+
this.cache.set(key, entry);
|
|
12
|
+
}
|
|
13
|
+
async delete(key) {
|
|
14
|
+
return this.cache.delete(key);
|
|
15
|
+
}
|
|
16
|
+
async has(key) {
|
|
17
|
+
return this.cache.has(key);
|
|
18
|
+
}
|
|
19
|
+
async keys() {
|
|
20
|
+
return Array.from(this.cache.keys());
|
|
21
|
+
}
|
|
22
|
+
async clear() {
|
|
23
|
+
this.cache.clear();
|
|
24
|
+
}
|
|
25
|
+
async stats() {
|
|
26
|
+
let memoryUsage = 0;
|
|
27
|
+
for (const [key, value] of this.cache.entries()) {
|
|
28
|
+
memoryUsage += key.length * 2;
|
|
29
|
+
memoryUsage += JSON.stringify(value).length * 2;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
entryCount: this.cache.size,
|
|
33
|
+
memoryUsage
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Create an in-memory cache storage adapter.
|
|
39
|
+
*/
|
|
40
|
+
function createInMemoryCacheStorage() {
|
|
41
|
+
return new InMemoryCacheStorage();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { InMemoryCacheStorage, createInMemoryCacheStorage };
|
|
46
|
+
//# sourceMappingURL=in-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory.js","names":[],"sources":["../../../../src/services/verification-cache/adapters/in-memory.ts"],"sourcesContent":["/**\n * In-memory cache storage adapter.\n *\n * Suitable for tests and single-process environments.\n * Data is lost on process restart.\n */\n\nimport type {\n CacheKeyString,\n CacheStorageAdapter,\n VerificationCacheEntry,\n} from '../types';\n\n/**\n * In-memory storage adapter using a Map.\n */\nexport class InMemoryCacheStorage implements CacheStorageAdapter {\n private cache = new Map<CacheKeyString, VerificationCacheEntry>();\n\n async get(key: CacheKeyString): Promise<VerificationCacheEntry | null> {\n return this.cache.get(key) ?? null;\n }\n\n async set(key: CacheKeyString, entry: VerificationCacheEntry): Promise<void> {\n this.cache.set(key, entry);\n }\n\n async delete(key: CacheKeyString): Promise<boolean> {\n return this.cache.delete(key);\n }\n\n async has(key: CacheKeyString): Promise<boolean> {\n return this.cache.has(key);\n }\n\n async keys(): Promise<CacheKeyString[]> {\n return Array.from(this.cache.keys());\n }\n\n async clear(): Promise<void> {\n this.cache.clear();\n }\n\n async stats(): Promise<{ entryCount: number; memoryUsage?: number }> {\n // Estimate memory usage (rough approximation)\n let memoryUsage = 0;\n for (const [key, value] of this.cache.entries()) {\n memoryUsage += key.length * 2; // UTF-16 string\n memoryUsage += JSON.stringify(value).length * 2;\n }\n\n return {\n entryCount: this.cache.size,\n memoryUsage,\n };\n }\n}\n\n/**\n * Create an in-memory cache storage adapter.\n */\nexport function createInMemoryCacheStorage(): InMemoryCacheStorage {\n return new InMemoryCacheStorage();\n}\n"],"mappings":";;;;AAgBA,IAAa,uBAAb,MAAiE;CAC/D,AAAQ,wBAAQ,IAAI,KAA6C;CAEjE,MAAM,IAAI,KAA6D;AACrE,SAAO,KAAK,MAAM,IAAI,IAAI,IAAI;;CAGhC,MAAM,IAAI,KAAqB,OAA8C;AAC3E,OAAK,MAAM,IAAI,KAAK,MAAM;;CAG5B,MAAM,OAAO,KAAuC;AAClD,SAAO,KAAK,MAAM,OAAO,IAAI;;CAG/B,MAAM,IAAI,KAAuC;AAC/C,SAAO,KAAK,MAAM,IAAI,IAAI;;CAG5B,MAAM,OAAkC;AACtC,SAAO,MAAM,KAAK,KAAK,MAAM,MAAM,CAAC;;CAGtC,MAAM,QAAuB;AAC3B,OAAK,MAAM,OAAO;;CAGpB,MAAM,QAA+D;EAEnE,IAAI,cAAc;AAClB,OAAK,MAAM,CAAC,KAAK,UAAU,KAAK,MAAM,SAAS,EAAE;AAC/C,kBAAe,IAAI,SAAS;AAC5B,kBAAe,KAAK,UAAU,MAAM,CAAC,SAAS;;AAGhD,SAAO;GACL,YAAY,KAAK,MAAM;GACvB;GACD;;;;;;AAOL,SAAgB,6BAAmD;AACjE,QAAO,IAAI,sBAAsB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InMemoryCacheStorage, createInMemoryCacheStorage } from "./in-memory.js";
|
|
2
|
+
import { FileSystemCacheStorage, createFileSystemCacheStorage } from "./filesystem.js";
|
|
3
|
+
import { KeyValueStore, WorkspaceStateCacheStorage, createWorkspaceStateCacheStorage } from "./workspace-state.js";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { CacheKeyString, CacheStorageAdapter, VerificationCacheEntry } from "../types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/services/verification-cache/adapters/workspace-state.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Interface for key-value store (compatible with VSCode's Memento).
|
|
7
|
+
*/
|
|
8
|
+
interface KeyValueStore {
|
|
9
|
+
get<T>(key: string): T | undefined;
|
|
10
|
+
update(key: string, value: unknown): Thenable<void>;
|
|
11
|
+
keys?(): readonly string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Workspace state storage adapter.
|
|
15
|
+
*/
|
|
16
|
+
declare class WorkspaceStateCacheStorage implements CacheStorageAdapter {
|
|
17
|
+
private store;
|
|
18
|
+
private keyIndex;
|
|
19
|
+
constructor(store: KeyValueStore);
|
|
20
|
+
/**
|
|
21
|
+
* Load the key index from storage.
|
|
22
|
+
*/
|
|
23
|
+
private loadKeyIndex;
|
|
24
|
+
/**
|
|
25
|
+
* Save the key index to storage.
|
|
26
|
+
*/
|
|
27
|
+
private saveKeyIndex;
|
|
28
|
+
/**
|
|
29
|
+
* Get the storage key for a cache key.
|
|
30
|
+
*/
|
|
31
|
+
private getStorageKey;
|
|
32
|
+
get(key: CacheKeyString): Promise<VerificationCacheEntry | null>;
|
|
33
|
+
set(key: CacheKeyString, entry: VerificationCacheEntry): Promise<void>;
|
|
34
|
+
delete(key: CacheKeyString): Promise<boolean>;
|
|
35
|
+
has(key: CacheKeyString): Promise<boolean>;
|
|
36
|
+
keys(): Promise<CacheKeyString[]>;
|
|
37
|
+
clear(): Promise<void>;
|
|
38
|
+
stats(): Promise<{
|
|
39
|
+
entryCount: number;
|
|
40
|
+
memoryUsage?: number;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a workspace state cache storage adapter.
|
|
45
|
+
*/
|
|
46
|
+
declare function createWorkspaceStateCacheStorage(store: KeyValueStore): WorkspaceStateCacheStorage;
|
|
47
|
+
//#endregion
|
|
48
|
+
export { KeyValueStore, WorkspaceStateCacheStorage, createWorkspaceStateCacheStorage };
|
|
49
|
+
//# sourceMappingURL=workspace-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-state.d.ts","names":[],"sources":["../../../../src/services/verification-cache/adapters/workspace-state.ts"],"sourcesContent":[],"mappings":";;;;;;;AA4EwC,UA5DvB,aAAA,CA4DuB;EAAyB,GAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,MAAA,CAAA,EA3D1C,CA2D0C,GAAA,SAAA;EAU7C,MAAA,CAAA,GAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,CAAA,EApEmB,QAoEnB,CAAA,IAAA,CAAA;EAAiB,IAAA,GAAA,EAAA,SAAA,MAAA,EAAA;;;;;AAqBpB,cAxEJ,0BAAA,YAAsC,mBAwElC,CAAA;EAYA,QAAA,KAAA;EApFkC,QAAA,QAAA;EAAmB,WAAA,CAAA,KAAA,EAIjD,aAJiD;EA8FtD;;;;;;;;;;;;WA3DC,iBAAiB,QAAQ;WAMzB,uBAAuB,yBAAyB;cAU7C,iBAAiB;WAapB,iBAAiB;UAIlB,QAAQ;WAIP;WAYA;;;;;;;;iBAUD,gCAAA,QACP,gBACN"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
//#region src/services/verification-cache/adapters/workspace-state.ts
|
|
2
|
+
/**
|
|
3
|
+
* Cache key prefix to avoid collisions.
|
|
4
|
+
*/
|
|
5
|
+
const CACHE_PREFIX = "contractspec.verification-cache.";
|
|
6
|
+
/**
|
|
7
|
+
* Index key for tracking all cache keys.
|
|
8
|
+
*/
|
|
9
|
+
const INDEX_KEY = `${CACHE_PREFIX}__index__`;
|
|
10
|
+
/**
|
|
11
|
+
* Workspace state storage adapter.
|
|
12
|
+
*/
|
|
13
|
+
var WorkspaceStateCacheStorage = class {
|
|
14
|
+
store;
|
|
15
|
+
keyIndex;
|
|
16
|
+
constructor(store) {
|
|
17
|
+
this.store = store;
|
|
18
|
+
this.keyIndex = new Set(this.loadKeyIndex());
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Load the key index from storage.
|
|
22
|
+
*/
|
|
23
|
+
loadKeyIndex() {
|
|
24
|
+
try {
|
|
25
|
+
return this.store.get(INDEX_KEY) ?? [];
|
|
26
|
+
} catch {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Save the key index to storage.
|
|
32
|
+
*/
|
|
33
|
+
async saveKeyIndex() {
|
|
34
|
+
await this.store.update(INDEX_KEY, Array.from(this.keyIndex));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get the storage key for a cache key.
|
|
38
|
+
*/
|
|
39
|
+
getStorageKey(key) {
|
|
40
|
+
return `${CACHE_PREFIX}${key}`;
|
|
41
|
+
}
|
|
42
|
+
async get(key) {
|
|
43
|
+
const storageKey = this.getStorageKey(key);
|
|
44
|
+
return this.store.get(storageKey) ?? null;
|
|
45
|
+
}
|
|
46
|
+
async set(key, entry) {
|
|
47
|
+
const storageKey = this.getStorageKey(key);
|
|
48
|
+
await this.store.update(storageKey, entry);
|
|
49
|
+
if (!this.keyIndex.has(key)) {
|
|
50
|
+
this.keyIndex.add(key);
|
|
51
|
+
await this.saveKeyIndex();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async delete(key) {
|
|
55
|
+
const storageKey = this.getStorageKey(key);
|
|
56
|
+
const existed = this.keyIndex.has(key);
|
|
57
|
+
if (existed) {
|
|
58
|
+
await this.store.update(storageKey, void 0);
|
|
59
|
+
this.keyIndex.delete(key);
|
|
60
|
+
await this.saveKeyIndex();
|
|
61
|
+
}
|
|
62
|
+
return existed;
|
|
63
|
+
}
|
|
64
|
+
async has(key) {
|
|
65
|
+
return this.keyIndex.has(key);
|
|
66
|
+
}
|
|
67
|
+
async keys() {
|
|
68
|
+
return Array.from(this.keyIndex);
|
|
69
|
+
}
|
|
70
|
+
async clear() {
|
|
71
|
+
for (const key of this.keyIndex) {
|
|
72
|
+
const storageKey = this.getStorageKey(key);
|
|
73
|
+
await this.store.update(storageKey, void 0);
|
|
74
|
+
}
|
|
75
|
+
this.keyIndex.clear();
|
|
76
|
+
await this.saveKeyIndex();
|
|
77
|
+
}
|
|
78
|
+
async stats() {
|
|
79
|
+
return { entryCount: this.keyIndex.size };
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Create a workspace state cache storage adapter.
|
|
84
|
+
*/
|
|
85
|
+
function createWorkspaceStateCacheStorage(store) {
|
|
86
|
+
return new WorkspaceStateCacheStorage(store);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
//#endregion
|
|
90
|
+
export { WorkspaceStateCacheStorage, createWorkspaceStateCacheStorage };
|
|
91
|
+
//# sourceMappingURL=workspace-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-state.js","names":[],"sources":["../../../../src/services/verification-cache/adapters/workspace-state.ts"],"sourcesContent":["/**\n * Workspace state cache storage adapter.\n *\n * Generic adapter for key-value stores like VSCode's ExtensionContext.workspaceState.\n * Can also be used with localStorage-like APIs.\n */\n\nimport type {\n CacheKeyString,\n CacheStorageAdapter,\n VerificationCacheEntry,\n} from '../types';\n\n/**\n * Interface for key-value store (compatible with VSCode's Memento).\n */\nexport interface KeyValueStore {\n get<T>(key: string): T | undefined;\n update(key: string, value: unknown): Thenable<void>;\n keys?(): readonly string[];\n}\n\n/**\n * Cache key prefix to avoid collisions.\n */\nconst CACHE_PREFIX = 'contractspec.verification-cache.';\n\n/**\n * Index key for tracking all cache keys.\n */\nconst INDEX_KEY = `${CACHE_PREFIX}__index__`;\n\n/**\n * Workspace state storage adapter.\n */\nexport class WorkspaceStateCacheStorage implements CacheStorageAdapter {\n private store: KeyValueStore;\n private keyIndex: Set<string>;\n\n constructor(store: KeyValueStore) {\n this.store = store;\n this.keyIndex = new Set(this.loadKeyIndex());\n }\n\n /**\n * Load the key index from storage.\n */\n private loadKeyIndex(): string[] {\n try {\n const index = this.store.get<string[]>(INDEX_KEY);\n return index ?? [];\n } catch {\n return [];\n }\n }\n\n /**\n * Save the key index to storage.\n */\n private async saveKeyIndex(): Promise<void> {\n await this.store.update(INDEX_KEY, Array.from(this.keyIndex));\n }\n\n /**\n * Get the storage key for a cache key.\n */\n private getStorageKey(key: CacheKeyString): string {\n return `${CACHE_PREFIX}${key}`;\n }\n\n async get(key: CacheKeyString): Promise<VerificationCacheEntry | null> {\n const storageKey = this.getStorageKey(key);\n const entry = this.store.get<VerificationCacheEntry>(storageKey);\n return entry ?? null;\n }\n\n async set(key: CacheKeyString, entry: VerificationCacheEntry): Promise<void> {\n const storageKey = this.getStorageKey(key);\n await this.store.update(storageKey, entry);\n\n if (!this.keyIndex.has(key)) {\n this.keyIndex.add(key);\n await this.saveKeyIndex();\n }\n }\n\n async delete(key: CacheKeyString): Promise<boolean> {\n const storageKey = this.getStorageKey(key);\n const existed = this.keyIndex.has(key);\n\n if (existed) {\n await this.store.update(storageKey, undefined);\n this.keyIndex.delete(key);\n await this.saveKeyIndex();\n }\n\n return existed;\n }\n\n async has(key: CacheKeyString): Promise<boolean> {\n return this.keyIndex.has(key);\n }\n\n async keys(): Promise<CacheKeyString[]> {\n return Array.from(this.keyIndex);\n }\n\n async clear(): Promise<void> {\n // Delete all entries\n for (const key of this.keyIndex) {\n const storageKey = this.getStorageKey(key);\n await this.store.update(storageKey, undefined);\n }\n\n // Clear index\n this.keyIndex.clear();\n await this.saveKeyIndex();\n }\n\n async stats(): Promise<{ entryCount: number; memoryUsage?: number }> {\n return {\n entryCount: this.keyIndex.size,\n };\n }\n}\n\n/**\n * Create a workspace state cache storage adapter.\n */\nexport function createWorkspaceStateCacheStorage(\n store: KeyValueStore\n): WorkspaceStateCacheStorage {\n return new WorkspaceStateCacheStorage(store);\n}\n"],"mappings":";;;;AAyBA,MAAM,eAAe;;;;AAKrB,MAAM,YAAY,GAAG,aAAa;;;;AAKlC,IAAa,6BAAb,MAAuE;CACrE,AAAQ;CACR,AAAQ;CAER,YAAY,OAAsB;AAChC,OAAK,QAAQ;AACb,OAAK,WAAW,IAAI,IAAI,KAAK,cAAc,CAAC;;;;;CAM9C,AAAQ,eAAyB;AAC/B,MAAI;AAEF,UADc,KAAK,MAAM,IAAc,UAAU,IACjC,EAAE;UACZ;AACN,UAAO,EAAE;;;;;;CAOb,MAAc,eAA8B;AAC1C,QAAM,KAAK,MAAM,OAAO,WAAW,MAAM,KAAK,KAAK,SAAS,CAAC;;;;;CAM/D,AAAQ,cAAc,KAA6B;AACjD,SAAO,GAAG,eAAe;;CAG3B,MAAM,IAAI,KAA6D;EACrE,MAAM,aAAa,KAAK,cAAc,IAAI;AAE1C,SADc,KAAK,MAAM,IAA4B,WAAW,IAChD;;CAGlB,MAAM,IAAI,KAAqB,OAA8C;EAC3E,MAAM,aAAa,KAAK,cAAc,IAAI;AAC1C,QAAM,KAAK,MAAM,OAAO,YAAY,MAAM;AAE1C,MAAI,CAAC,KAAK,SAAS,IAAI,IAAI,EAAE;AAC3B,QAAK,SAAS,IAAI,IAAI;AACtB,SAAM,KAAK,cAAc;;;CAI7B,MAAM,OAAO,KAAuC;EAClD,MAAM,aAAa,KAAK,cAAc,IAAI;EAC1C,MAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AAEtC,MAAI,SAAS;AACX,SAAM,KAAK,MAAM,OAAO,YAAY,OAAU;AAC9C,QAAK,SAAS,OAAO,IAAI;AACzB,SAAM,KAAK,cAAc;;AAG3B,SAAO;;CAGT,MAAM,IAAI,KAAuC;AAC/C,SAAO,KAAK,SAAS,IAAI,IAAI;;CAG/B,MAAM,OAAkC;AACtC,SAAO,MAAM,KAAK,KAAK,SAAS;;CAGlC,MAAM,QAAuB;AAE3B,OAAK,MAAM,OAAO,KAAK,UAAU;GAC/B,MAAM,aAAa,KAAK,cAAc,IAAI;AAC1C,SAAM,KAAK,MAAM,OAAO,YAAY,OAAU;;AAIhD,OAAK,SAAS,OAAO;AACrB,QAAM,KAAK,cAAc;;CAG3B,MAAM,QAA+D;AACnE,SAAO,EACL,YAAY,KAAK,SAAS,MAC3B;;;;;;AAOL,SAAgB,iCACd,OAC4B;AAC5B,QAAO,IAAI,2BAA2B,MAAM"}
|