task-o-matic-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +646 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/lib/ai-service/ai-operations.d.ts +45 -0
- package/dist/lib/ai-service/ai-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/ai-operations.js +60 -0
- package/dist/lib/ai-service/base-operations.d.ts +43 -0
- package/dist/lib/ai-service/base-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/base-operations.js +119 -0
- package/dist/lib/ai-service/documentation-operations.d.ts +18 -0
- package/dist/lib/ai-service/documentation-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/documentation-operations.js +308 -0
- package/dist/lib/ai-service/filesystem-tools.d.ts +69 -0
- package/dist/lib/ai-service/filesystem-tools.d.ts.map +1 -0
- package/dist/lib/ai-service/filesystem-tools.js +70 -0
- package/dist/lib/ai-service/json-parser.d.ts +34 -0
- package/dist/lib/ai-service/json-parser.d.ts.map +1 -0
- package/dist/lib/ai-service/json-parser.js +177 -0
- package/dist/lib/ai-service/mcp-client.d.ts +9 -0
- package/dist/lib/ai-service/mcp-client.d.ts.map +1 -0
- package/dist/lib/ai-service/mcp-client.js +48 -0
- package/dist/lib/ai-service/model-provider.d.ts +12 -0
- package/dist/lib/ai-service/model-provider.d.ts.map +1 -0
- package/dist/lib/ai-service/model-provider.js +146 -0
- package/dist/lib/ai-service/prd-operations.d.ts +25 -0
- package/dist/lib/ai-service/prd-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/prd-operations.js +592 -0
- package/dist/lib/ai-service/research-tools.d.ts +4 -0
- package/dist/lib/ai-service/research-tools.d.ts.map +1 -0
- package/dist/lib/ai-service/research-tools.js +8 -0
- package/dist/lib/ai-service/retry-handler.d.ts +8 -0
- package/dist/lib/ai-service/retry-handler.d.ts.map +1 -0
- package/dist/lib/ai-service/retry-handler.js +63 -0
- package/dist/lib/ai-service/task-operations.d.ts +13 -0
- package/dist/lib/ai-service/task-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/task-operations.js +220 -0
- package/dist/lib/benchmark/registry.d.ts +11 -0
- package/dist/lib/benchmark/registry.d.ts.map +1 -0
- package/dist/lib/benchmark/registry.js +212 -0
- package/dist/lib/benchmark/runner.d.ts +6 -0
- package/dist/lib/benchmark/runner.d.ts.map +1 -0
- package/dist/lib/benchmark/runner.js +150 -0
- package/dist/lib/benchmark/storage.d.ts +13 -0
- package/dist/lib/benchmark/storage.d.ts.map +1 -0
- package/dist/lib/benchmark/storage.js +100 -0
- package/dist/lib/benchmark/types.d.ts +104 -0
- package/dist/lib/benchmark/types.d.ts.map +1 -0
- package/dist/lib/benchmark/types.js +2 -0
- package/dist/lib/better-t-stack-cli.d.ts +50 -0
- package/dist/lib/better-t-stack-cli.d.ts.map +1 -0
- package/dist/lib/better-t-stack-cli.js +428 -0
- package/dist/lib/bootstrap/cli-bootstrap.d.ts +14 -0
- package/dist/lib/bootstrap/cli-bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap/cli-bootstrap.js +322 -0
- package/dist/lib/bootstrap/index.d.ts +3 -0
- package/dist/lib/bootstrap/index.d.ts.map +1 -0
- package/dist/lib/bootstrap/index.js +18 -0
- package/dist/lib/bootstrap/medusa-bootstrap.d.ts +14 -0
- package/dist/lib/bootstrap/medusa-bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap/medusa-bootstrap.js +215 -0
- package/dist/lib/config-validation.d.ts +215 -0
- package/dist/lib/config-validation.d.ts.map +1 -0
- package/dist/lib/config-validation.js +254 -0
- package/dist/lib/config.d.ts +55 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +351 -0
- package/dist/lib/context-builder.d.ts +66 -0
- package/dist/lib/context-builder.d.ts.map +1 -0
- package/dist/lib/context-builder.js +322 -0
- package/dist/lib/executors/claude-code-executor.d.ts +9 -0
- package/dist/lib/executors/claude-code-executor.d.ts.map +1 -0
- package/dist/lib/executors/claude-code-executor.js +69 -0
- package/dist/lib/executors/codex-executor.d.ts +9 -0
- package/dist/lib/executors/codex-executor.d.ts.map +1 -0
- package/dist/lib/executors/codex-executor.js +73 -0
- package/dist/lib/executors/executor-factory.d.ts +5 -0
- package/dist/lib/executors/executor-factory.d.ts.map +1 -0
- package/dist/lib/executors/executor-factory.js +27 -0
- package/dist/lib/executors/gemini-executor.d.ts +9 -0
- package/dist/lib/executors/gemini-executor.d.ts.map +1 -0
- package/dist/lib/executors/gemini-executor.js +67 -0
- package/dist/lib/executors/kilo-executor.d.ts +9 -0
- package/dist/lib/executors/kilo-executor.d.ts.map +1 -0
- package/dist/lib/executors/kilo-executor.js +69 -0
- package/dist/lib/executors/opencode-executor.d.ts +9 -0
- package/dist/lib/executors/opencode-executor.d.ts.map +1 -0
- package/dist/lib/executors/opencode-executor.js +67 -0
- package/dist/lib/git-utils.d.ts +88 -0
- package/dist/lib/git-utils.d.ts.map +1 -0
- package/dist/lib/git-utils.js +242 -0
- package/dist/lib/hooks.d.ts +73 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +62 -0
- package/dist/lib/index.d.ts +100 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +143 -0
- package/dist/lib/logger.d.ts +20 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +32 -0
- package/dist/lib/notifications.d.ts +7 -0
- package/dist/lib/notifications.d.ts.map +1 -0
- package/dist/lib/notifications.js +81 -0
- package/dist/lib/prompt-builder.d.ts +70 -0
- package/dist/lib/prompt-builder.d.ts.map +1 -0
- package/dist/lib/prompt-builder.js +344 -0
- package/dist/lib/prompt-registry.d.ts +22 -0
- package/dist/lib/prompt-registry.d.ts.map +1 -0
- package/dist/lib/prompt-registry.js +409 -0
- package/dist/lib/provider-defaults.json +32 -0
- package/dist/lib/storage/file-system.d.ts +57 -0
- package/dist/lib/storage/file-system.d.ts.map +1 -0
- package/dist/lib/storage/file-system.js +638 -0
- package/dist/lib/storage/storage-callbacks.d.ts +17 -0
- package/dist/lib/storage/storage-callbacks.d.ts.map +1 -0
- package/dist/lib/storage/storage-callbacks.js +94 -0
- package/dist/lib/storage/types.d.ts +43 -0
- package/dist/lib/storage/types.d.ts.map +1 -0
- package/dist/lib/storage/types.js +2 -0
- package/dist/lib/task-execution-core.d.ts +7 -0
- package/dist/lib/task-execution-core.d.ts.map +1 -0
- package/dist/lib/task-execution-core.js +381 -0
- package/dist/lib/task-execution.d.ts +7 -0
- package/dist/lib/task-execution.d.ts.map +1 -0
- package/dist/lib/task-execution.js +40 -0
- package/dist/lib/task-loop-execution.d.ts +7 -0
- package/dist/lib/task-loop-execution.d.ts.map +1 -0
- package/dist/lib/task-loop-execution.js +156 -0
- package/dist/lib/task-planning.d.ts +29 -0
- package/dist/lib/task-planning.d.ts.map +1 -0
- package/dist/lib/task-planning.js +103 -0
- package/dist/lib/task-review.d.ts +27 -0
- package/dist/lib/task-review.d.ts.map +1 -0
- package/dist/lib/task-review.js +103 -0
- package/dist/lib/validation.d.ts +26 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +98 -0
- package/dist/prompts/documentation-detection.d.ts +2 -0
- package/dist/prompts/documentation-detection.d.ts.map +1 -0
- package/dist/prompts/documentation-detection.js +24 -0
- package/dist/prompts/documentation-recap.d.ts +3 -0
- package/dist/prompts/documentation-recap.d.ts.map +1 -0
- package/dist/prompts/documentation-recap.js +13 -0
- package/dist/prompts/index.d.ts +15 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +30 -0
- package/dist/prompts/prd-combination.d.ts +2 -0
- package/dist/prompts/prd-combination.d.ts.map +1 -0
- package/dist/prompts/prd-combination.js +35 -0
- package/dist/prompts/prd-generation.d.ts +2 -0
- package/dist/prompts/prd-generation.d.ts.map +1 -0
- package/dist/prompts/prd-generation.js +49 -0
- package/dist/prompts/prd-parsing.d.ts +3 -0
- package/dist/prompts/prd-parsing.d.ts.map +1 -0
- package/dist/prompts/prd-parsing.js +172 -0
- package/dist/prompts/prd-question-answer.d.ts +3 -0
- package/dist/prompts/prd-question-answer.d.ts.map +1 -0
- package/dist/prompts/prd-question-answer.js +27 -0
- package/dist/prompts/prd-question.d.ts +3 -0
- package/dist/prompts/prd-question.d.ts.map +1 -0
- package/dist/prompts/prd-question.js +40 -0
- package/dist/prompts/prd-rework.d.ts +3 -0
- package/dist/prompts/prd-rework.d.ts.map +1 -0
- package/dist/prompts/prd-rework.js +81 -0
- package/dist/prompts/prd-suggest-stack.d.ts +3 -0
- package/dist/prompts/prd-suggest-stack.d.ts.map +1 -0
- package/dist/prompts/prd-suggest-stack.js +99 -0
- package/dist/prompts/task-breakdown.d.ts +3 -0
- package/dist/prompts/task-breakdown.d.ts.map +1 -0
- package/dist/prompts/task-breakdown.js +151 -0
- package/dist/prompts/task-enhancement.d.ts +3 -0
- package/dist/prompts/task-enhancement.d.ts.map +1 -0
- package/dist/prompts/task-enhancement.js +140 -0
- package/dist/prompts/task-execution.d.ts +3 -0
- package/dist/prompts/task-execution.d.ts.map +1 -0
- package/dist/prompts/task-execution.js +24 -0
- package/dist/prompts/task-planning.d.ts +3 -0
- package/dist/prompts/task-planning.d.ts.map +1 -0
- package/dist/prompts/task-planning.js +66 -0
- package/dist/prompts/workflow-assistance.d.ts +32 -0
- package/dist/prompts/workflow-assistance.d.ts.map +1 -0
- package/dist/prompts/workflow-assistance.js +130 -0
- package/dist/prompts/workflow-prompts.d.ts +9 -0
- package/dist/prompts/workflow-prompts.d.ts.map +1 -0
- package/dist/prompts/workflow-prompts.js +93 -0
- package/dist/services/benchmark.d.ts +26 -0
- package/dist/services/benchmark.d.ts.map +1 -0
- package/dist/services/benchmark.js +343 -0
- package/dist/services/prd.d.ts +136 -0
- package/dist/services/prd.d.ts.map +1 -0
- package/dist/services/prd.js +550 -0
- package/dist/services/tasks.d.ts +388 -0
- package/dist/services/tasks.d.ts.map +1 -0
- package/dist/services/tasks.js +1150 -0
- package/dist/services/workflow-ai-assistant.d.ts +74 -0
- package/dist/services/workflow-ai-assistant.d.ts.map +1 -0
- package/dist/services/workflow-ai-assistant.js +175 -0
- package/dist/services/workflow-benchmark.d.ts +34 -0
- package/dist/services/workflow-benchmark.d.ts.map +1 -0
- package/dist/services/workflow-benchmark.js +318 -0
- package/dist/services/workflow.d.ts +107 -0
- package/dist/services/workflow.d.ts.map +1 -0
- package/dist/services/workflow.js +580 -0
- package/dist/test/hooks.test.d.ts +2 -0
- package/dist/test/hooks.test.d.ts.map +1 -0
- package/dist/test/hooks.test.js +67 -0
- package/dist/test/integration/callbacks.test.d.ts +2 -0
- package/dist/test/integration/callbacks.test.d.ts.map +1 -0
- package/dist/test/integration/callbacks.test.js +64 -0
- package/dist/test/lib/ai-service/task-operations.test.d.ts +2 -0
- package/dist/test/lib/ai-service/task-operations.test.d.ts.map +1 -0
- package/dist/test/lib/ai-service/task-operations.test.js +362 -0
- package/dist/test/lib/config.test.d.ts +2 -0
- package/dist/test/lib/config.test.d.ts.map +1 -0
- package/dist/test/lib/config.test.js +128 -0
- package/dist/test/lib/git-utils.test.d.ts +2 -0
- package/dist/test/lib/git-utils.test.d.ts.map +1 -0
- package/dist/test/lib/git-utils.test.js +168 -0
- package/dist/test/mocks/mock-ai-operations.d.ts +15 -0
- package/dist/test/mocks/mock-ai-operations.d.ts.map +1 -0
- package/dist/test/mocks/mock-ai-operations.js +107 -0
- package/dist/test/mocks/mock-context-builder.d.ts +10 -0
- package/dist/test/mocks/mock-context-builder.d.ts.map +1 -0
- package/dist/test/mocks/mock-context-builder.js +81 -0
- package/dist/test/mocks/mock-model-provider.d.ts +7 -0
- package/dist/test/mocks/mock-model-provider.d.ts.map +1 -0
- package/dist/test/mocks/mock-model-provider.js +21 -0
- package/dist/test/mocks/mock-service-factory.d.ts +11 -0
- package/dist/test/mocks/mock-service-factory.d.ts.map +1 -0
- package/dist/test/mocks/mock-service-factory.js +61 -0
- package/dist/test/mocks/mock-storage.d.ts +50 -0
- package/dist/test/mocks/mock-storage.d.ts.map +1 -0
- package/dist/test/mocks/mock-storage.js +145 -0
- package/dist/test/model-parsing.test.d.ts +2 -0
- package/dist/test/model-parsing.test.d.ts.map +1 -0
- package/dist/test/model-parsing.test.js +73 -0
- package/dist/test/services/task-service.test.d.ts +2 -0
- package/dist/test/services/task-service.test.d.ts.map +1 -0
- package/dist/test/services/task-service.test.js +459 -0
- package/dist/test/storage.test.d.ts +2 -0
- package/dist/test/storage.test.d.ts.map +1 -0
- package/dist/test/storage.test.js +207 -0
- package/dist/test/task-loop-git.test.d.ts +2 -0
- package/dist/test/task-loop-git.test.d.ts.map +1 -0
- package/dist/test/task-loop-git.test.js +95 -0
- package/dist/test/test-mock-setup.d.ts +26 -0
- package/dist/test/test-mock-setup.d.ts.map +1 -0
- package/dist/test/test-mock-setup.js +41 -0
- package/dist/test/test-setup.d.ts +9 -0
- package/dist/test/test-setup.d.ts.map +1 -0
- package/dist/test/test-setup.js +44 -0
- package/dist/test/test-utils.d.ts +22 -0
- package/dist/test/test-utils.d.ts.map +1 -0
- package/dist/test/test-utils.js +37 -0
- package/dist/test/utils/ai-operation-utility.test.d.ts +2 -0
- package/dist/test/utils/ai-operation-utility.test.d.ts.map +1 -0
- package/dist/test/utils/ai-operation-utility.test.js +290 -0
- package/dist/test/utils/error-handling.test.d.ts +2 -0
- package/dist/test/utils/error-handling.test.d.ts.map +1 -0
- package/dist/test/utils/error-handling.test.js +231 -0
- package/dist/test/utils/file-utils.test.d.ts +2 -0
- package/dist/test/utils/file-utils.test.d.ts.map +1 -0
- package/dist/test/utils/file-utils.test.js +76 -0
- package/dist/test/utils/id-generator.test.d.ts +2 -0
- package/dist/test/utils/id-generator.test.d.ts.map +1 -0
- package/dist/test/utils/id-generator.test.js +41 -0
- package/dist/test/utils/model-parser.test.d.ts +2 -0
- package/dist/test/utils/model-parser.test.d.ts.map +1 -0
- package/dist/test/utils/model-parser.test.js +65 -0
- package/dist/test/validation.test.d.ts +2 -0
- package/dist/test/validation.test.d.ts.map +1 -0
- package/dist/test/validation.test.js +22 -0
- package/dist/types/callbacks.d.ts +30 -0
- package/dist/types/callbacks.d.ts.map +1 -0
- package/dist/types/callbacks.js +2 -0
- package/dist/types/index.d.ts +435 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +30 -0
- package/dist/types/mcp.d.ts +3 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +3 -0
- package/dist/types/options.d.ts +112 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +2 -0
- package/dist/types/results.d.ts +200 -0
- package/dist/types/results.d.ts.map +1 -0
- package/dist/types/results.js +2 -0
- package/dist/types/workflow-options.d.ts +82 -0
- package/dist/types/workflow-options.d.ts.map +1 -0
- package/dist/types/workflow-options.js +2 -0
- package/dist/types/workflow-results.d.ts +82 -0
- package/dist/types/workflow-results.d.ts.map +1 -0
- package/dist/types/workflow-results.js +2 -0
- package/dist/utils/ai-config-builder.d.ts +14 -0
- package/dist/utils/ai-config-builder.d.ts.map +1 -0
- package/dist/utils/ai-config-builder.js +22 -0
- package/dist/utils/ai-operation-utility.d.ts +142 -0
- package/dist/utils/ai-operation-utility.d.ts.map +1 -0
- package/dist/utils/ai-operation-utility.js +303 -0
- package/dist/utils/ai-service-factory.d.ts +34 -0
- package/dist/utils/ai-service-factory.d.ts.map +1 -0
- package/dist/utils/ai-service-factory.js +99 -0
- package/dist/utils/error-utils.d.ts +70 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +104 -0
- package/dist/utils/file-utils.d.ts +107 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +171 -0
- package/dist/utils/id-generator.d.ts +92 -0
- package/dist/utils/id-generator.d.ts.map +1 -0
- package/dist/utils/id-generator.js +146 -0
- package/dist/utils/metadata-utils.d.ts +40 -0
- package/dist/utils/metadata-utils.d.ts.map +1 -0
- package/dist/utils/metadata-utils.js +43 -0
- package/dist/utils/model-executor-parser.d.ts +38 -0
- package/dist/utils/model-executor-parser.d.ts.map +1 -0
- package/dist/utils/model-executor-parser.js +69 -0
- package/dist/utils/model-parser.d.ts +6 -0
- package/dist/utils/model-parser.d.ts.map +1 -0
- package/dist/utils/model-parser.js +49 -0
- package/dist/utils/stack-formatter.d.ts +12 -0
- package/dist/utils/stack-formatter.d.ts.map +1 -0
- package/dist/utils/stack-formatter.js +36 -0
- package/dist/utils/storage-utils.d.ts +49 -0
- package/dist/utils/storage-utils.d.ts.map +1 -0
- package/dist/utils/storage-utils.js +80 -0
- package/dist/utils/streaming-utils.d.ts +38 -0
- package/dist/utils/streaming-utils.d.ts.map +1 -0
- package/dist/utils/streaming-utils.js +64 -0
- package/dist/utils/task-o-matic-error.d.ts +206 -0
- package/dist/utils/task-o-matic-error.d.ts.map +1 -0
- package/dist/utils/task-o-matic-error.js +304 -0
- package/package.json +40 -0
- package/src/index.ts +36 -0
- package/src/lib/ai-service/ai-operations.ts +310 -0
- package/src/lib/ai-service/base-operations.ts +139 -0
- package/src/lib/ai-service/documentation-operations.ts +438 -0
- package/src/lib/ai-service/filesystem-tools.ts +73 -0
- package/src/lib/ai-service/gemini-proxy.ts.bak +52 -0
- package/src/lib/ai-service/json-parser.ts +203 -0
- package/src/lib/ai-service/mcp-client.ts +54 -0
- package/src/lib/ai-service/model-provider.ts +192 -0
- package/src/lib/ai-service/prd-operations.ts +854 -0
- package/src/lib/ai-service/research-tools.ts +207 -0
- package/src/lib/ai-service/retry-handler.ts +89 -0
- package/src/lib/ai-service/task-operations.ts +342 -0
- package/src/lib/benchmark/registry.ts +307 -0
- package/src/lib/benchmark/runner.ts +190 -0
- package/src/lib/benchmark/storage.ts +140 -0
- package/src/lib/benchmark/types.ts +121 -0
- package/src/lib/better-t-stack-cli.ts +524 -0
- package/src/lib/bootstrap/cli-bootstrap.ts +397 -0
- package/src/lib/bootstrap/index.ts +2 -0
- package/src/lib/bootstrap/medusa-bootstrap.ts +261 -0
- package/src/lib/config-validation.ts +278 -0
- package/src/lib/config.ts +435 -0
- package/src/lib/context-builder.ts +383 -0
- package/src/lib/executors/claude-code-executor.ts +83 -0
- package/src/lib/executors/codex-executor.ts +85 -0
- package/src/lib/executors/executor-factory.ts +28 -0
- package/src/lib/executors/gemini-executor.ts +80 -0
- package/src/lib/executors/kilo-executor.ts +83 -0
- package/src/lib/executors/opencode-executor.ts +81 -0
- package/src/lib/git-utils.ts +334 -0
- package/src/lib/hooks.ts +121 -0
- package/src/lib/index.ts +166 -0
- package/src/lib/logger.ts +43 -0
- package/src/lib/notifications.ts +103 -0
- package/src/lib/prompt-builder.ts +471 -0
- package/src/lib/prompt-registry.ts +491 -0
- package/src/lib/provider-defaults.json +32 -0
- package/src/lib/storage/file-system.ts +864 -0
- package/src/lib/storage/storage-callbacks.ts +120 -0
- package/src/lib/storage/types.ts +58 -0
- package/src/lib/task-execution-core.ts +591 -0
- package/src/lib/task-execution.ts +59 -0
- package/src/lib/task-loop-execution.ts +214 -0
- package/src/lib/task-planning.ts +157 -0
- package/src/lib/task-review.ts +138 -0
- package/src/lib/validation.ts +140 -0
- package/src/prompts/documentation-detection.ts +21 -0
- package/src/prompts/documentation-recap.ts +11 -0
- package/src/prompts/index.ts +14 -0
- package/src/prompts/prd-combination.ts +32 -0
- package/src/prompts/prd-generation.ts +46 -0
- package/src/prompts/prd-parsing.ts +170 -0
- package/src/prompts/prd-question-answer.ts +25 -0
- package/src/prompts/prd-question.ts +38 -0
- package/src/prompts/prd-rework.ts +79 -0
- package/src/prompts/prd-suggest-stack.ts +97 -0
- package/src/prompts/task-breakdown.ts +149 -0
- package/src/prompts/task-enhancement.ts +138 -0
- package/src/prompts/task-execution.ts +22 -0
- package/src/prompts/task-planning.ts +64 -0
- package/src/prompts/workflow-assistance.ts +151 -0
- package/src/prompts/workflow-prompts.ts +97 -0
- package/src/services/benchmark.ts +433 -0
- package/src/services/prd.ts +845 -0
- package/src/services/tasks.ts +1515 -0
- package/src/services/workflow-ai-assistant.ts +298 -0
- package/src/services/workflow-benchmark.ts +339 -0
- package/src/services/workflow.ts +779 -0
- package/src/test/hooks.test.ts +77 -0
- package/src/test/integration/callbacks.test.ts +39 -0
- package/src/test/lib/ai-service/task-operations.test.ts +430 -0
- package/src/test/lib/config.test.ts +150 -0
- package/src/test/lib/git-utils.test.ts +198 -0
- package/src/test/mocks/mock-ai-operations.ts +205 -0
- package/src/test/mocks/mock-context-builder.ts +84 -0
- package/src/test/mocks/mock-model-provider.ts +21 -0
- package/src/test/mocks/mock-service-factory.ts +64 -0
- package/src/test/mocks/mock-storage.ts +204 -0
- package/src/test/model-parsing.test.ts +78 -0
- package/src/test/services/task-service.test.ts +551 -0
- package/src/test/storage.test.ts +206 -0
- package/src/test/task-loop-git.test.ts +142 -0
- package/src/test/test-mock-setup.ts +46 -0
- package/src/test/test-setup.ts +48 -0
- package/src/test/test-utils.ts +45 -0
- package/src/test/utils/ai-operation-utility.test.ts +306 -0
- package/src/test/utils/error-handling.test.ts +241 -0
- package/src/test/utils/file-utils.test.ts +80 -0
- package/src/test/utils/id-generator.test.ts +44 -0
- package/src/test/utils/model-parser.test.ts +67 -0
- package/src/test/validation.test.ts +19 -0
- package/src/types/callbacks.ts +14 -0
- package/src/types/index.ts +628 -0
- package/src/types/mcp.ts +5 -0
- package/src/types/options.ts +165 -0
- package/src/types/results.ts +216 -0
- package/src/types/workflow-options.ts +113 -0
- package/src/types/workflow-results.ts +87 -0
- package/src/utils/ai-config-builder.ts +33 -0
- package/src/utils/ai-operation-utility.ts +380 -0
- package/src/utils/ai-service-factory.ts +125 -0
- package/src/utils/error-utils.ts +124 -0
- package/src/utils/file-utils.ts +197 -0
- package/src/utils/id-generator.ts +168 -0
- package/src/utils/metadata-utils.ts +48 -0
- package/src/utils/model-executor-parser.ts +80 -0
- package/src/utils/model-parser.ts +58 -0
- package/src/utils/stack-formatter.ts +53 -0
- package/src/utils/storage-utils.ts +94 -0
- package/src/utils/streaming-utils.ts +91 -0
- package/src/utils/task-o-matic-error.ts +393 -0
- package/tsconfig.json +20 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PromptBuilder = void 0;
|
|
4
|
+
const prompt_registry_1 = require("./prompt-registry");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const config_1 = require("./config");
|
|
7
|
+
const ai_service_factory_1 = require("../utils/ai-service-factory");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const logger_1 = require("./logger");
|
|
10
|
+
class PromptBuilder {
|
|
11
|
+
/**
|
|
12
|
+
* Build a prompt with variable replacement
|
|
13
|
+
*/
|
|
14
|
+
static buildPrompt(options) {
|
|
15
|
+
const { name, type = "user", variables, ...directVars } = options;
|
|
16
|
+
// Get the prompt name with type suffix if specified
|
|
17
|
+
const promptName = type === "system" ? `${name}-system` : name;
|
|
18
|
+
// Get prompt metadata from registry
|
|
19
|
+
const metadata = prompt_registry_1.PromptRegistry.getPrompt(promptName);
|
|
20
|
+
if (!metadata) {
|
|
21
|
+
return {
|
|
22
|
+
success: false,
|
|
23
|
+
error: `Prompt not found: ${promptName}. Available prompts:\n${prompt_registry_1.PromptRegistry.listPrompts()}`,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Combine all variables (direct variables + variables object)
|
|
27
|
+
const allVariables = { ...variables, ...directVars };
|
|
28
|
+
// Validate required variables
|
|
29
|
+
const validation = prompt_registry_1.PromptRegistry.validatePrompt(promptName, allVariables);
|
|
30
|
+
if (!validation.valid) {
|
|
31
|
+
return {
|
|
32
|
+
success: false,
|
|
33
|
+
error: `Missing required variables: ${validation.missingRequired.join(", ")}`,
|
|
34
|
+
missingVariables: validation.missingRequired,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// Log missing optional variables for user awareness
|
|
38
|
+
if (validation.missingOptional.length > 0) {
|
|
39
|
+
logger_1.logger.warn(`Note: Missing optional variables: ${validation.missingOptional.join(", ")}`);
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
// Replace variables in the prompt text
|
|
43
|
+
let promptText = metadata.promptText;
|
|
44
|
+
// Replace all {VAR_NAME} patterns with their values
|
|
45
|
+
for (const [key, value] of Object.entries(allVariables)) {
|
|
46
|
+
const pattern = new RegExp(`\\{${key}\\}`, "g");
|
|
47
|
+
promptText = promptText.replace(pattern, value || "");
|
|
48
|
+
}
|
|
49
|
+
// Check for any unreplaced variables (optional ones that weren't provided)
|
|
50
|
+
const unreplacedVars = promptText.match(/\{[^}]+\}/g);
|
|
51
|
+
if (unreplacedVars && unreplacedVars.length > 0) {
|
|
52
|
+
const varNames = unreplacedVars.map((v) => v.slice(1, -1));
|
|
53
|
+
const optionalUnreplaced = varNames.filter((v) => metadata.optionalVariables.includes(v));
|
|
54
|
+
if (optionalUnreplaced.length > 0) {
|
|
55
|
+
logger_1.logger.warn(`Note: Optional variables not replaced: ${optionalUnreplaced.join(", ")}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
success: true,
|
|
60
|
+
prompt: promptText,
|
|
61
|
+
metadata,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
error: `Error building prompt: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* List all available prompts
|
|
73
|
+
*/
|
|
74
|
+
static listPrompts() {
|
|
75
|
+
return prompt_registry_1.PromptRegistry.listPrompts();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get metadata for a specific prompt
|
|
79
|
+
*/
|
|
80
|
+
static getPromptMetadata(name, type) {
|
|
81
|
+
const promptName = type === "system" ? `${name}-system` : name;
|
|
82
|
+
return prompt_registry_1.PromptRegistry.getPrompt(promptName) || null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Load PRD content from file
|
|
86
|
+
*/
|
|
87
|
+
static loadPRDContent(filePath) {
|
|
88
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
89
|
+
throw new Error(`PRD file not found: ${filePath}`);
|
|
90
|
+
}
|
|
91
|
+
return (0, fs_1.readFileSync)(filePath, "utf-8");
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Auto-detect and load PRD content from project
|
|
95
|
+
*/
|
|
96
|
+
static async autoDetectPRDContent() {
|
|
97
|
+
try {
|
|
98
|
+
const contextBuilder = (0, ai_service_factory_1.getContextBuilder)();
|
|
99
|
+
// Build context for a dummy task to get PRD content
|
|
100
|
+
const context = await contextBuilder.buildContextForNewTask("Dummy Task", "For PRD detection");
|
|
101
|
+
return context.prdContent;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
logger_1.logger.warn(`Could not auto-detect PRD content: ${error}`);
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Build task context from file or content using ContextBuilder
|
|
110
|
+
*/
|
|
111
|
+
static async buildTaskContext(taskTitle, content, filePath) {
|
|
112
|
+
let taskDescription = "";
|
|
113
|
+
if (filePath) {
|
|
114
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
115
|
+
throw new Error(`Task file not found: ${filePath}`);
|
|
116
|
+
}
|
|
117
|
+
taskDescription = (0, fs_1.readFileSync)(filePath, "utf-8");
|
|
118
|
+
}
|
|
119
|
+
else if (content) {
|
|
120
|
+
taskDescription = content;
|
|
121
|
+
}
|
|
122
|
+
// Use ContextBuilder to get rich context if we have a title
|
|
123
|
+
if (taskTitle) {
|
|
124
|
+
try {
|
|
125
|
+
const contextBuilder = (0, ai_service_factory_1.getContextBuilder)();
|
|
126
|
+
const context = await contextBuilder.buildContextForNewTask(taskTitle, taskDescription);
|
|
127
|
+
// Return formatted context instead of just description
|
|
128
|
+
return contextBuilder.formatContextForAI(context);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
logger_1.logger.warn(`Could not build rich task context, using basic description: ${error}`);
|
|
132
|
+
return taskDescription;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return taskDescription;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Detect stack info using ContextBuilder (proper BTS config loading)
|
|
139
|
+
*/
|
|
140
|
+
static async detectStackInfo(projectPath) {
|
|
141
|
+
try {
|
|
142
|
+
// Default to current working directory if not provided
|
|
143
|
+
const workDir = projectPath || process.cwd();
|
|
144
|
+
config_1.configManager.setWorkingDirectory(workDir);
|
|
145
|
+
await config_1.configManager.load();
|
|
146
|
+
const contextBuilder = (0, ai_service_factory_1.getContextBuilder)();
|
|
147
|
+
// Build context for a dummy task to get stack info
|
|
148
|
+
const context = await contextBuilder.buildContextForNewTask("Dummy Task", "For stack detection");
|
|
149
|
+
if (context.stack && context.stack._source === "file") {
|
|
150
|
+
const parts = [
|
|
151
|
+
`Frontend: ${context.stack.frontend}`,
|
|
152
|
+
`Backend: ${context.stack.backend}`,
|
|
153
|
+
];
|
|
154
|
+
if (context.stack.database !== "none") {
|
|
155
|
+
parts.push(`Database: ${context.stack.database}`);
|
|
156
|
+
}
|
|
157
|
+
if (context.stack.orm !== "none") {
|
|
158
|
+
parts.push(`ORM: ${context.stack.orm}`);
|
|
159
|
+
}
|
|
160
|
+
parts.push(`Auth: ${context.stack.auth}`);
|
|
161
|
+
if (context.stack.addons.length > 0) {
|
|
162
|
+
parts.push(`Addons: ${context.stack.addons.join(", ")}`);
|
|
163
|
+
}
|
|
164
|
+
return parts.join(", ");
|
|
165
|
+
}
|
|
166
|
+
return "Not detected";
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
logger_1.logger.warn(`Could not detect stack info using ContextBuilder: ${error}`);
|
|
170
|
+
return "Not detected";
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Build comprehensive project context for external executors
|
|
175
|
+
*/
|
|
176
|
+
static async buildFullProjectContext(projectPath) {
|
|
177
|
+
const contextParts = [];
|
|
178
|
+
contextParts.push("**Project Context:**");
|
|
179
|
+
// Detect package.json and dependencies
|
|
180
|
+
const packageJsonPath = (0, path_1.join)(projectPath, "package.json");
|
|
181
|
+
if ((0, fs_1.existsSync)(packageJsonPath)) {
|
|
182
|
+
try {
|
|
183
|
+
const packageJson = JSON.parse((0, fs_1.readFileSync)(packageJsonPath, "utf-8"));
|
|
184
|
+
const deps = Object.keys(packageJson.dependencies || {});
|
|
185
|
+
const devDeps = Object.keys(packageJson.devDependencies || {});
|
|
186
|
+
contextParts.push(`\n**Dependencies:**`);
|
|
187
|
+
if (deps.length > 0) {
|
|
188
|
+
contextParts.push(`- Production: ${deps.slice(0, 10).join(", ")}${deps.length > 10 ? ` (+${deps.length - 10} more)` : ""}`);
|
|
189
|
+
}
|
|
190
|
+
if (devDeps.length > 0) {
|
|
191
|
+
contextParts.push(`- Development: ${devDeps.slice(0, 10).join(", ")}${devDeps.length > 10 ? ` (+${devDeps.length - 10} more)` : ""}`);
|
|
192
|
+
}
|
|
193
|
+
if (packageJson.scripts) {
|
|
194
|
+
const scripts = Object.keys(packageJson.scripts);
|
|
195
|
+
contextParts.push(`\n**Available Scripts:** ${scripts.join(", ")}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
logger_1.logger.warn(`Could not parse package.json: ${error}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Detect project structure
|
|
203
|
+
try {
|
|
204
|
+
const files = (0, fs_1.readdirSync)(projectPath);
|
|
205
|
+
const directories = files.filter((f) => {
|
|
206
|
+
try {
|
|
207
|
+
const stat = (0, fs_1.statSync)((0, path_1.join)(projectPath, f));
|
|
208
|
+
return stat.isDirectory() && !f.startsWith(".");
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
if (directories.length > 0) {
|
|
215
|
+
contextParts.push(`\n**Project Structure:** ${directories.join(", ")}`);
|
|
216
|
+
}
|
|
217
|
+
// Detect configuration files
|
|
218
|
+
const configFiles = files.filter((f) => f.match(/\.(config|rc)\.(js|ts|json|yaml|yml)$/) ||
|
|
219
|
+
[
|
|
220
|
+
"tsconfig.json",
|
|
221
|
+
"next.config.js",
|
|
222
|
+
"vite.config.ts",
|
|
223
|
+
"tailwind.config.js",
|
|
224
|
+
].includes(f));
|
|
225
|
+
if (configFiles.length > 0) {
|
|
226
|
+
contextParts.push(`\n**Configuration Files:** ${configFiles.join(", ")}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
logger_1.logger.warn(`Could not read project structure: ${error}`);
|
|
231
|
+
}
|
|
232
|
+
// Detect frameworks and tools
|
|
233
|
+
const detectedTools = [];
|
|
234
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, "next.config.js")) ||
|
|
235
|
+
(0, fs_1.existsSync)((0, path_1.join)(projectPath, "next.config.ts"))) {
|
|
236
|
+
detectedTools.push("Next.js");
|
|
237
|
+
}
|
|
238
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, "vite.config.ts")) ||
|
|
239
|
+
(0, fs_1.existsSync)((0, path_1.join)(projectPath, "vite.config.js"))) {
|
|
240
|
+
detectedTools.push("Vite");
|
|
241
|
+
}
|
|
242
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, "tailwind.config.js")) ||
|
|
243
|
+
(0, fs_1.existsSync)((0, path_1.join)(projectPath, "tailwind.config.ts"))) {
|
|
244
|
+
detectedTools.push("Tailwind CSS");
|
|
245
|
+
}
|
|
246
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, "convex"))) {
|
|
247
|
+
detectedTools.push("Convex");
|
|
248
|
+
}
|
|
249
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, "turbo.json"))) {
|
|
250
|
+
detectedTools.push("Turborepo");
|
|
251
|
+
}
|
|
252
|
+
if (detectedTools.length > 0) {
|
|
253
|
+
contextParts.push(`\n**Detected Tools:** ${detectedTools.join(", ")}`);
|
|
254
|
+
}
|
|
255
|
+
return contextParts.join("\n");
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Format prompt for specific executor
|
|
259
|
+
*/
|
|
260
|
+
static formatForExecutor(prompt, executor) {
|
|
261
|
+
// Most executors work well with plain text prompts
|
|
262
|
+
// This method exists for future customization if needed
|
|
263
|
+
switch (executor) {
|
|
264
|
+
case "claude":
|
|
265
|
+
// Claude Code works well with structured markdown
|
|
266
|
+
return prompt;
|
|
267
|
+
case "gemini":
|
|
268
|
+
// Gemini CLI supports file references with @
|
|
269
|
+
return prompt;
|
|
270
|
+
case "codex":
|
|
271
|
+
// Codex CLI supports structured prompts
|
|
272
|
+
return prompt;
|
|
273
|
+
case "opencode":
|
|
274
|
+
default:
|
|
275
|
+
return prompt;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Build execution prompt with task context
|
|
280
|
+
*/
|
|
281
|
+
static buildExecutionPrompt(options) {
|
|
282
|
+
const { taskTitle, taskDescription, taskPlan, stack, documentation, retryContext, prdContent, } = options;
|
|
283
|
+
// Build TASK_PLAN variable
|
|
284
|
+
let taskPlanText = "";
|
|
285
|
+
if (taskPlan) {
|
|
286
|
+
taskPlanText = `# Task Plan\n\n${taskPlan}\n`;
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
taskPlanText = `# Task: ${taskTitle}\n\n${taskDescription || "No description"}\n`;
|
|
290
|
+
}
|
|
291
|
+
// Build STACK_INFO variable
|
|
292
|
+
let stackInfo = "";
|
|
293
|
+
if (stack) {
|
|
294
|
+
const stackParts = [];
|
|
295
|
+
stackParts.push(`- **Project**: ${stack.projectName}`);
|
|
296
|
+
stackParts.push(`- **Frontend**: ${stack.frontend}`);
|
|
297
|
+
stackParts.push(`- **Backend**: ${stack.backend}`);
|
|
298
|
+
if (stack.database !== "none") {
|
|
299
|
+
stackParts.push(`- **Database**: ${stack.database}`);
|
|
300
|
+
}
|
|
301
|
+
if (stack.orm !== "none") {
|
|
302
|
+
stackParts.push(`- **ORM**: ${stack.orm}`);
|
|
303
|
+
}
|
|
304
|
+
stackParts.push(`- **Auth**: ${stack.auth}`);
|
|
305
|
+
if (stack.addons && stack.addons.length > 0) {
|
|
306
|
+
stackParts.push(`- **Addons**: ${stack.addons.join(", ")}`);
|
|
307
|
+
}
|
|
308
|
+
stackParts.push(`- **Package Manager**: ${stack.packageManager}`);
|
|
309
|
+
stackInfo = stackParts.join("\n");
|
|
310
|
+
}
|
|
311
|
+
// Build DOCUMENTATION_CONTEXT variable
|
|
312
|
+
let docContext = "";
|
|
313
|
+
if (documentation) {
|
|
314
|
+
const docParts = [];
|
|
315
|
+
docParts.push(`\n# Documentation Context\n`);
|
|
316
|
+
docParts.push(documentation.recap);
|
|
317
|
+
if (documentation.files && documentation.files.length > 0) {
|
|
318
|
+
docParts.push(`\n**Relevant Documentation Files**:`);
|
|
319
|
+
documentation.files.forEach((file) => {
|
|
320
|
+
docParts.push(`- ${file.path}`);
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
docContext = docParts.join("\n");
|
|
324
|
+
}
|
|
325
|
+
// Build PRD_CONTENT variable
|
|
326
|
+
let prdCtx = "";
|
|
327
|
+
if (prdContent) {
|
|
328
|
+
prdCtx = `\n# Product Requirements Document\n\n${prdContent}\n`;
|
|
329
|
+
}
|
|
330
|
+
// Build RETRY_CONTEXT variable
|
|
331
|
+
const retryCtx = retryContext || "";
|
|
332
|
+
return this.buildPrompt({
|
|
333
|
+
name: "task-execution",
|
|
334
|
+
variables: {
|
|
335
|
+
RETRY_CONTEXT: retryCtx,
|
|
336
|
+
TASK_PLAN: taskPlanText,
|
|
337
|
+
STACK_INFO: stackInfo,
|
|
338
|
+
DOCUMENTATION_CONTEXT: docContext,
|
|
339
|
+
PRD_CONTENT: prdCtx,
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
exports.PromptBuilder = PromptBuilder;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface PromptMetadata {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
type: "system" | "user";
|
|
5
|
+
requiredVariables: string[];
|
|
6
|
+
optionalVariables: string[];
|
|
7
|
+
promptText: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class PromptRegistry {
|
|
10
|
+
private static prompts;
|
|
11
|
+
static getPrompt(name: string): PromptMetadata | undefined;
|
|
12
|
+
static getAllPrompts(): PromptMetadata[];
|
|
13
|
+
static getPromptsByType(type: "system" | "user"): PromptMetadata[];
|
|
14
|
+
static hasPrompt(name: string): boolean;
|
|
15
|
+
static listPrompts(): string;
|
|
16
|
+
static validatePrompt(name: string, variables: Record<string, string>): {
|
|
17
|
+
valid: boolean;
|
|
18
|
+
missingRequired: string[];
|
|
19
|
+
missingOptional: string[];
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=prompt-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-registry.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-registry.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,OAAO,CA6VnB;IAEH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI1D,MAAM,CAAC,aAAa,IAAI,cAAc,EAAE;IAIxC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,cAAc,EAAE;IAMlE,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIvC,MAAM,CAAC,WAAW,IAAI,MAAM;IAiD5B,MAAM,CAAC,cAAc,CACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC;QACD,KAAK,EAAE,OAAO,CAAC;QACf,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;KAC3B;CAuBF"}
|