add cq tooling

This commit is contained in:
2024-11-09 11:40:25 -05:00
parent 1541b63d85
commit ba0c279cbc
8 changed files with 1208 additions and 206 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
/.idea/ /.idea/
/node_modules/

32
.prettierrc Normal file
View File

@@ -0,0 +1,32 @@
{
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"tabWidth": 2,
"printWidth": 100,
"bracketSpacing": true,
"arrowParens": "avoid",
"endOfLine": "lf",
"jsxSingleQuote": false,
"quoteProps": "as-needed",
"bracketSameLine": false,
"proseWrap": "preserve",
"htmlWhitespaceSensitivity": "css",
"embeddedLanguageFormatting": "auto",
"singleAttributePerLine": false,
"overrides": [
{
"files": "*.md",
"options": {
"proseWrap": "always",
"printWidth": 80
}
},
{
"files": ["*.yml", "*.yaml"],
"options": {
"singleQuote": false
}
}
]
}

View File

@@ -1,7 +1,7 @@
# workflow-function-manifold # workflow-function-manifold
> A TypeScript/JavaScript library for building dynamic, LLM-driven workflows using a region-based execution model > A TypeScript/JavaScript library for building dynamic, LLM-driven workflows
> using a region-based execution model
![License: MIT](https://img.shields.io/badge/License-MIT-green.svg) ![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)
![Node Version](https://img.shields.io/badge/node-%3E%3D%2014.0.0-brightgreen) ![Node Version](https://img.shields.io/badge/node-%3E%3D%2014.0.0-brightgreen)
@@ -9,6 +9,7 @@
CLI: `npx workflow-function-manifold` CLI: `npx workflow-function-manifold`
## Table of Contents ## Table of Contents
- [Overview](#overview) - [Overview](#overview)
- [Installation](#installation) - [Installation](#installation)
- [Quick Start](#quick-start) - [Quick Start](#quick-start)
@@ -24,6 +25,7 @@ CLI: `npx workflow-function-manifold`
## Overview ## Overview
`workflow-function-manifold` enables you to create dynamic workflows that: `workflow-function-manifold` enables you to create dynamic workflows that:
- Navigate between different execution regions based on LLM-interpreted intents. - Navigate between different execution regions based on LLM-interpreted intents.
- Execute operations within regions based on state and context. - Execute operations within regions based on state and context.
- Maintain workflow state across operations. - Maintain workflow state across operations.
@@ -68,7 +70,7 @@ import {
WorkflowFunctionManifold, WorkflowFunctionManifold,
ManifoldRegion, ManifoldRegion,
WorkflowOperator, WorkflowOperator,
DummyLlmService DummyLlmService,
} from 'workflow-function-manifold'; } from 'workflow-function-manifold';
// Initialize the manifold with an LLM service // Initialize the manifold with an LLM service
@@ -76,7 +78,7 @@ const llm = new DummyLlmService();
const manifold = new WorkflowFunctionManifold(llm); const manifold = new WorkflowFunctionManifold(llm);
// Create an operator // Create an operator
const analysisOperator = new WorkflowOperator('analysis', async (state) => { const analysisOperator = new WorkflowOperator('analysis', async state => {
console.log('Analyzing data...'); console.log('Analyzing data...');
return { ...state, analyzed: true }; return { ...state, analyzed: true };
}); });
@@ -86,13 +88,15 @@ const analysisRegion = new ManifoldRegion('analysis', [analysisOperator]);
manifold.addRegion(analysisRegion); manifold.addRegion(analysisRegion);
// Execute workflow // Execute workflow
await manifold.navigate('analyze the data'); // This navigates to the 'analysis' region await manifold.navigate('analyze the data'); // This navigates to the 'analysis' region
await manifold.executeWorkflow('analyze the data'); // Executes the operator in the 'analysis' region await manifold.executeWorkflow('analyze the data'); // Executes the operator in the 'analysis' region
console.log(manifold.state); // { analyzed: true } console.log(manifold.state); // { analyzed: true }
``` ```
> **Note:** The `DummyLlmService` matches specific keywords in prompts. Ensure your prompts contain keywords like `'analyze'`, `'process'`, or `'transform'` for the default operators to function. > **Note:** The `DummyLlmService` matches specific keywords in prompts. Ensure
> your prompts contain keywords like `'analyze'`, `'process'`, or `'transform'`
> for the default operators to function.
## Core Components ## Core Components
@@ -115,7 +119,8 @@ await manifold.executeWorkflow(prompt);
### ManifoldRegion ### ManifoldRegion
Represents a workflow region containing operators and connections to other regions. Represents a workflow region containing operators and connections to other
regions.
```javascript ```javascript
const region = new ManifoldRegion('regionName', [operator1, operator2]); const region = new ManifoldRegion('regionName', [operator1, operator2]);
@@ -132,7 +137,7 @@ region.addOperator(newOperator);
Defines operations that can be executed within regions. Defines operations that can be executed within regions.
```javascript ```javascript
const operator = new WorkflowOperator('operatorName', async (state) => { const operator = new WorkflowOperator('operatorName', async state => {
// Modify state // Modify state
return newState; return newState;
}); });
@@ -158,13 +163,13 @@ async function createWorkflow() {
const manifold = new WorkflowFunctionManifold(llm); const manifold = new WorkflowFunctionManifold(llm);
// Create operators // Create operators
const analysisOp = new WorkflowOperator('analysis', async (state) => { const analysisOp = new WorkflowOperator('analysis', async state => {
return { ...state, analyzed: true }; return { ...state, analyzed: true };
}); });
const processingOp = new WorkflowOperator('processing', async (state) => { const processingOp = new WorkflowOperator('processing', async state => {
return { ...state, processed: true }; return { ...state, processed: true };
}); });
const transformOp = new WorkflowOperator('transformation', async (state) => { const transformOp = new WorkflowOperator('transformation', async state => {
return { ...state, transformed: true }; return { ...state, transformed: true };
}); });
@@ -189,7 +194,7 @@ const manifold = await createWorkflow();
const prompts = [ const prompts = [
'analyze the data', 'analyze the data',
'process the results', 'process the results',
'transform the output' 'transform the output',
]; ];
for (const prompt of prompts) { for (const prompt of prompts) {
@@ -197,7 +202,7 @@ for (const prompt of prompts) {
await manifold.executeWorkflow(prompt); await manifold.executeWorkflow(prompt);
} }
console.log(manifold.state); // Final state after all operations console.log(manifold.state); // Final state after all operations
``` ```
## API Reference ## API Reference
@@ -205,9 +210,11 @@ console.log(manifold.state); // Final state after all operations
### WorkflowFunctionManifold ### WorkflowFunctionManifold
#### Constructor #### Constructor
- `constructor(llmService: LLMService)` - `constructor(llmService: LLMService)`
#### Methods #### Methods
- `addRegion(region: ManifoldRegion): void` - `addRegion(region: ManifoldRegion): void`
- `async navigate(prompt: string): Promise<boolean>` - `async navigate(prompt: string): Promise<boolean>`
- `async executeWorkflow(prompt: string): Promise<boolean>` - `async executeWorkflow(prompt: string): Promise<boolean>`
@@ -215,9 +222,11 @@ console.log(manifold.state); // Final state after all operations
### ManifoldRegion ### ManifoldRegion
#### Constructor #### Constructor
- `constructor(name: string, operators: WorkflowOperator[] = [])` - `constructor(name: string, operators: WorkflowOperator[] = [])`
#### Methods #### Methods
- `addOperator(operator: WorkflowOperator): void` - `addOperator(operator: WorkflowOperator): void`
- `connectTo(region: ManifoldRegion): void` - `connectTo(region: ManifoldRegion): void`
- `async getValidOperators(state: any): Promise<WorkflowOperator[]>` - `async getValidOperators(state: any): Promise<WorkflowOperator[]>`
@@ -225,24 +234,27 @@ console.log(manifold.state); // Final state after all operations
### WorkflowOperator ### WorkflowOperator
#### Constructor #### Constructor
- `constructor(name: string, operation: (state: any) => Promise<any>)` - `constructor(name: string, operation: (state: any) => Promise<any>)`
#### Methods #### Methods
- `async execute(state: any): Promise<any>` - `async execute(state: any): Promise<any>`
## State Management ## State Management
The workflow maintains state across operations. Each operator can access and modify the state: The workflow maintains state across operations. Each operator can access and
modify the state:
```javascript ```javascript
const operator = new WorkflowOperator('example', async (state) => { const operator = new WorkflowOperator('example', async state => {
// Access existing state // Access existing state
const { previousValue } = state; const { previousValue } = state;
// Return modified state // Return modified state
return { return {
...state, ...state,
newValue: 'updated' newValue: 'updated',
}; };
}); });
``` ```
@@ -251,7 +263,9 @@ The updated state persists across operators and regions.
## LLM Integration ## LLM Integration
The system uses LLM services for intent recognition. The default `DummyLlmService` provides basic intent matching, but you can implement your own LLM service: The system uses LLM services for intent recognition. The default
`DummyLlmService` provides basic intent matching, but you can implement your own
LLM service:
```javascript ```javascript
class CustomLLMService { class CustomLLMService {
@@ -259,7 +273,7 @@ class CustomLLMService {
// Implement custom LLM logic // Implement custom LLM logic
return { return {
confidence: number, confidence: number,
action: string action: string,
}; };
} }
} }
@@ -267,21 +281,27 @@ class CustomLLMService {
## Error Handling ## Error Handling
This library includes basic error handling to ensure workflows run smoothly, even when unexpected issues arise. This library includes basic error handling to ensure workflows run smoothly,
even when unexpected issues arise.
### Navigation Errors ### Navigation Errors
- If a prompt doesn't match a valid adjacent region: - If a prompt doesn't match a valid adjacent region:
- Logs a warning: `No valid region found for prompt: "<prompt>"`. - Logs a warning: `No valid region found for prompt: "<prompt>"`.
### Operator Execution Errors ### Operator Execution Errors
- If no matching operator is found: - If no matching operator is found:
- Logs a warning: `No matching operator found for intent: <intent>`. - Logs a warning: `No matching operator found for intent: <intent>`.
### LLM Query Errors ### LLM Query Errors
- If issues arise during LLM queries: - If issues arise during LLM queries:
- Logs an error: `Error during navigation for prompt "<prompt>": <error message>`. - Logs an error:
`Error during navigation for prompt "<prompt>": <error message>`.
### Example Error Logging ### Example Error Logging
```javascript ```javascript
try { try {
await manifold.navigate('unknown command'); await manifold.navigate('unknown command');

89
bin.js
View File

@@ -1,62 +1,63 @@
#!/usr/bin/env node #!/usr/bin/env node
import {DummyLlmService, ManifoldRegion, WorkflowFunctionManifold, WorkflowOperator} from "./lib.js"; import {
DummyLlmService,
ManifoldRegion,
WorkflowFunctionManifold,
WorkflowOperator,
} from './lib.js';
async function demonstrateManifold() { async function demonstrateManifold() {
// Initialize services and manifold // Initialize services and manifold
const llm = new DummyLlmService(); const llm = new DummyLlmService();
const manifold = new WorkflowFunctionManifold(llm); const manifold = new WorkflowFunctionManifold(llm);
// Create operators // Create operators
const dataAnalysisOp = new WorkflowOperator('analysis', async (state) => { const dataAnalysisOp = new WorkflowOperator('analysis', async state => {
console.log('Performing data analysis...'); console.log('Performing data analysis...');
return { ...state, analyzed: true }; return { ...state, analyzed: true };
}); });
const dataProcessingOp = new WorkflowOperator('processing', async (state) => { const dataProcessingOp = new WorkflowOperator('processing', async state => {
console.log('Processing data...'); console.log('Processing data...');
return { ...state, processed: true }; return { ...state, processed: true };
}); });
const dataTransformOp = new WorkflowOperator('transformation', async (state) => { const dataTransformOp = new WorkflowOperator('transformation', async state => {
console.log('Transforming data...'); console.log('Transforming data...');
return { ...state, transformed: true }; return { ...state, transformed: true };
}); });
// Create regions // Create regions
const analysisRegion = new ManifoldRegion('analysis', [dataAnalysisOp]); const analysisRegion = new ManifoldRegion('analysis', [dataAnalysisOp]);
const processingRegion = new ManifoldRegion('processing', [dataProcessingOp]); const processingRegion = new ManifoldRegion('processing', [dataProcessingOp]);
const transformationRegion = new ManifoldRegion('transformation', [dataTransformOp]); const transformationRegion = new ManifoldRegion('transformation', [dataTransformOp]);
// Connect regions // Connect regions
analysisRegion.connectTo(processingRegion); analysisRegion.connectTo(processingRegion);
processingRegion.connectTo(transformationRegion); processingRegion.connectTo(transformationRegion);
// Add regions to manifold // Add regions to manifold
manifold.addRegion(analysisRegion); manifold.addRegion(analysisRegion);
manifold.addRegion(processingRegion); manifold.addRegion(processingRegion);
manifold.addRegion(transformationRegion); manifold.addRegion(transformationRegion);
// Demonstrate workflow execution // Demonstrate workflow execution
console.log('Starting workflow demonstration...'); console.log('Starting workflow demonstration...');
const prompts = [ const prompts = ['analyze the data', 'process the results', 'transform the output'];
'analyze the data',
'process the results',
'transform the output'
];
for (const prompt of prompts) { for (const prompt of prompts) {
console.log(`\nExecuting prompt: "${prompt}"`); console.log(`\nExecuting prompt: "${prompt}"`);
await manifold.navigate(prompt); await manifold.navigate(prompt);
const executed = await manifold.executeWorkflow(prompt); const executed = await manifold.executeWorkflow(prompt);
console.log(`Current state:`, manifold.state); console.log('Current state:', manifold.state);
console.log(`Current region: ${manifold.currentRegion.name}`); console.log(`Current region: ${manifold.currentRegion.name}`);
console.log(`Operation executed: ${executed}`); console.log(`Operation executed: ${executed}`);
} }
} }
// Run the demonstration // Run the demonstration
demonstrateManifold().catch(console.error); demonstrateManifold().catch(console.error);
export {} export {};

74
eslint.config.js Normal file
View File

@@ -0,0 +1,74 @@
import globals from 'globals';
import js from '@eslint/js';
/** @type {import('eslint').Linter.Config[]} */
export default [
{
ignores: ['dist/**', 'node_modules/**', '*.min.js', '*.d.ts'],
},
{
languageOptions: {
ecmaVersion: 2024,
sourceType: 'module',
globals: {
...globals.node,
...globals.browser,
},
},
linterOptions: {
reportUnusedDisableDirectives: true,
},
rules: {
...js.configs.recommended.rules,
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
'no-constant-condition': ['error', { checkLoops: false }],
'no-multiple-empty-lines': ['error', { max: 1, maxEOF: 0 }],
quotes: ['error', 'single', { avoidEscape: true }],
semi: ['error', 'always'],
indent: ['error', 2, { SwitchCase: 1 }],
'comma-dangle': ['error', 'always-multiline'],
'arrow-parens': ['error', 'as-needed'], // Changed from 'avoid' to 'as-needed'
'object-curly-spacing': ['error', 'always'],
'array-bracket-spacing': ['error', 'never'],
'space-before-function-paren': [
'error',
{
anonymous: 'never',
named: 'never',
asyncArrow: 'always',
},
],
'no-trailing-spaces': 'error',
'eol-last': ['error', 'always'],
'prefer-const': 'error',
'no-var': 'error',
eqeqeq: ['error', 'always'],
curly: ['error', 'all'],
'brace-style': ['error', '1tbs', { allowSingleLine: false }],
'keyword-spacing': ['error', { before: true, after: true }],
'space-infix-ops': 'error',
'comma-spacing': ['error', { before: false, after: true }],
'no-multi-spaces': 'error',
'no-irregular-whitespace': 'error',
'no-mixed-spaces-and-tabs': 'error',
'no-else-return': 'error',
},
},
{
files: ['src/TokenCleaner.js'],
rules: {
'no-useless-escape': 'off',
},
},
{
files: ['**/*.test.js', '**/*.spec.js'],
languageOptions: {
globals: {
...globals.jest,
},
},
},
];

258
lib.js
View File

@@ -3,23 +3,24 @@
* Simulates a Large Language Model (LLM) service for intent detection. * Simulates a Large Language Model (LLM) service for intent detection.
*/ */
export class DummyLlmService { export class DummyLlmService {
/** /**
* Queries the simulated LLM with a prompt. * Queries the simulated LLM with a prompt.
* @param {string} prompt - The input prompt to query the LLM. * @param {string} prompt - The input prompt to query the LLM.
* @returns {Promise<{confidence: number, action: string}>} - The detected intent with confidence and action. * @returns {Promise<{confidence: number, action: string}>} - The detected intent with confidence and action.
*/ */
async query(prompt) { async query(prompt) {
const intents = { const intents = {
'analyze': { confidence: 0.9, action: 'analysis' }, analyze: { confidence: 0.9, action: 'analysis' },
'process': { confidence: 0.8, action: 'processing' }, process: { confidence: 0.8, action: 'processing' },
'transform': { confidence: 0.7, action: 'transformation' } transform: { confidence: 0.7, action: 'transformation' },
}; };
const matchedIntent = Object.entries(intents) const matchedIntent = Object.entries(intents).find(([key]) =>
.find(([key]) => prompt.toLowerCase().includes(key)); prompt.toLowerCase().includes(key),
);
return matchedIntent ? matchedIntent[1] : { confidence: 0.1, action: 'unknown' }; return matchedIntent ? matchedIntent[1] : { confidence: 0.1, action: 'unknown' };
} }
} }
// Interface for workflow operators // Interface for workflow operators
@@ -27,24 +28,24 @@ export class DummyLlmService {
* Represents a workflow operator responsible for performing a specific operation. * Represents a workflow operator responsible for performing a specific operation.
*/ */
export class WorkflowOperator { export class WorkflowOperator {
/** /**
* Creates an instance of WorkflowOperator. * Creates an instance of WorkflowOperator.
* @param {string} name - The name of the operator. * @param {string} name - The name of the operator.
* @param {function(object): Promise<object>} operation - The operation function executed by the operator. * @param {function(object): Promise<object>} operation - The operation function executed by the operator.
*/ */
constructor(name, operation) { constructor(name, operation) {
this.name = name; this.name = name;
this.operation = operation; this.operation = operation;
} }
/** /**
* Executes the operator's operation with the given state. * Executes the operator's operation with the given state.
* @param {object} state - The current state to be processed. * @param {object} state - The current state to be processed.
* @returns {Promise<object>} - The updated state after the operation. * @returns {Promise<object>} - The updated state after the operation.
*/ */
async execute(state) { async execute(state) {
return await this.operation(state); return await this.operation(state);
} }
} }
// Interface for manifold regions // Interface for manifold regions
@@ -52,42 +53,42 @@ export class WorkflowOperator {
* Represents a region within the manifold, containing workflow operators. * Represents a region within the manifold, containing workflow operators.
*/ */
export class ManifoldRegion { export class ManifoldRegion {
/** /**
* Creates an instance of ManifoldRegion. * Creates an instance of ManifoldRegion.
* @param {string} name - The name of the region. * @param {string} name - The name of the region.
* @param {WorkflowOperator[]} [operators=[]] - The operators available in this region. * @param {WorkflowOperator[]} [operators=[]] - The operators available in this region.
*/ */
constructor(name, operators = []) { constructor(name, operators = []) {
this.name = name; this.name = name;
this.operators = operators; this.operators = operators;
this.adjacentRegions = new Set(); this.adjacentRegions = new Set();
} }
/** /**
* Adds an operator to the region. * Adds an operator to the region.
* @param {WorkflowOperator} operator - The operator to be added. * @param {WorkflowOperator} operator - The operator to be added.
*/ */
addOperator(operator) { addOperator(operator) {
this.operators.push(operator); this.operators.push(operator);
} }
/** /**
* Establishes a connection to another region. * Establishes a connection to another region.
* @param {ManifoldRegion} region - The region to connect to. * @param {ManifoldRegion} region - The region to connect to.
*/ */
connectTo(region) { connectTo(region) {
this.adjacentRegions.add(region); this.adjacentRegions.add(region);
region.adjacentRegions.add(this); region.adjacentRegions.add(this);
} }
/** /**
* Retrieves valid operators for the given state. * Retrieves valid operators for the given state.
* @param {object} state - The current state. * @param {object} _state - The current state.
* @returns {Promise<WorkflowOperator[]>} - The list of valid operators. * @returns {Promise<WorkflowOperator[]>} - The list of valid operators.
*/ */
async getValidOperators(state) { async getValidOperators(_state) {
return this.operators; return this.operators;
} }
} }
// Main manifold implementation // Main manifold implementation
@@ -95,75 +96,74 @@ export class ManifoldRegion {
* Represents the workflow function manifold managing regions and state transitions. * Represents the workflow function manifold managing regions and state transitions.
*/ */
export class WorkflowFunctionManifold { export class WorkflowFunctionManifold {
/** /**
* Creates an instance of WorkflowFunctionManifold. * Creates an instance of WorkflowFunctionManifold.
* @param {DummyLlmService} llmService - The LLM service used for intent detection. * @param {DummyLlmService} llmService - The LLM service used for intent detection.
*/ */
constructor(llmService) { constructor(llmService) {
this.llmService = llmService; this.llmService = llmService;
this.regions = new Map(); this.regions = new Map();
this.currentRegion = null; this.currentRegion = null;
this.state = {}; this.state = {};
}
/**
* Adds a region to the manifold.
* @param {ManifoldRegion} region - The region to be added.
*/
addRegion(region) {
this.regions.set(region.name, region);
if (!this.currentRegion) {
this.currentRegion = region;
} }
}
/** /**
* Adds a region to the manifold. * Navigates to the next region based on the provided prompt.
* @param {ManifoldRegion} region - The region to be added. * @param {string} prompt - The input prompt for intent matching.
*/ * @returns {Promise<boolean>} - Whether navigation was successful.
addRegion(region) { */
this.regions.set(region.name, region); async navigate(prompt) {
if (!this.currentRegion) { try {
this.currentRegion = region; const intent = await this.llmService.query(prompt);
}
const nextRegion = Array.from(this.currentRegion.adjacentRegions).find(region =>
region.name.toLowerCase().includes(intent.action),
);
if (nextRegion && intent.confidence > 0.5) {
this.currentRegion = nextRegion;
return true;
}
console.warn(`No valid region found for prompt: "${prompt}"`);
return false;
} catch (error) {
console.error(`Error during navigation for prompt "${prompt}":`, error);
return false;
} }
}
/** /**
* Navigates to the next region based on the provided prompt. * Executes the workflow based on the current region and provided prompt.
* @param {string} prompt - The input prompt for intent matching. * @param {string} prompt - The input prompt for intent matching.
* @returns {Promise<boolean>} - Whether navigation was successful. * @returns {Promise<boolean>} - Whether the workflow execution was successful.
*/ */
async navigate(prompt) { async executeWorkflow(prompt) {
try { try {
const intent = await this.llmService.query(prompt); const operators = await this.currentRegion.getValidOperators(this.state);
const intent = await this.llmService.query(prompt);
const nextRegion = Array.from(this.currentRegion.adjacentRegions) const matchedOperator = operators.find(op => op.name.toLowerCase().includes(intent.action));
.find(region => region.name.toLowerCase().includes(intent.action));
if (nextRegion && intent.confidence > 0.5) { if (matchedOperator) {
this.currentRegion = nextRegion; this.state = await matchedOperator.execute(this.state);
return true; return true;
} else { }
console.warn(`No valid region found for prompt: "${prompt}"`); console.warn(`No matching operator found for intent: ${intent.action}`);
return false; return false;
} } catch (error) {
} catch (error) { console.error(`Error during workflow execution for prompt "${prompt}":`, error);
console.error(`Error during navigation for prompt "${prompt}":`, error); return false;
return false;
}
}
/**
* Executes the workflow based on the current region and provided prompt.
* @param {string} prompt - The input prompt for intent matching.
* @returns {Promise<boolean>} - Whether the workflow execution was successful.
*/
async executeWorkflow(prompt) {
try {
const operators = await this.currentRegion.getValidOperators(this.state);
const intent = await this.llmService.query(prompt);
const matchedOperator = operators.find(op => op.name.toLowerCase().includes(intent.action));
if (matchedOperator) {
this.state = await matchedOperator.execute(this.state);
return true;
} else {
console.warn(`No matching operator found for intent: ${intent.action}`);
return false;
}
} catch (error) {
console.error(`Error during workflow execution for prompt "${prompt}":`, error);
return false;
}
} }
}
} }

View File

@@ -8,9 +8,19 @@
}, },
"scripts": { "scripts": {
"start": "node index.js", "start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1",
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
"lint:fix": "eslint . --fix",
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md,yml,yaml}\"",
"fix": "pnpm format && pnpm lint:fix"
}, },
"keywords": [], "keywords": [],
"author": "geoffsee", "author": "geoffsee",
"license": "MIT" "license": "MIT",
"devDependencies": {
"@eslint/js": "^9.14.0",
"eslint": "^9.14.0",
"globals": "^15.12.0",
"prettier": "^3.3.3"
}
} }

864
pnpm-lock.yaml generated Normal file
View File

@@ -0,0 +1,864 @@
lockfileVersion: "6.0"
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
devDependencies:
"@eslint/js":
specifier: ^9.14.0
version: 9.14.0
eslint:
specifier: ^9.14.0
version: 9.14.0
globals:
specifier: ^15.12.0
version: 15.12.0
prettier:
specifier: ^3.3.3
version: 3.3.3
packages:
/@eslint-community/eslint-utils@4.4.1(eslint@9.14.0):
resolution:
{
integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==,
}
engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
dependencies:
eslint: 9.14.0
eslint-visitor-keys: 3.4.3
dev: true
/@eslint-community/regexpp@4.12.1:
resolution:
{
integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==,
}
engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 }
dev: true
/@eslint/config-array@0.18.0:
resolution:
{
integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dependencies:
"@eslint/object-schema": 2.1.4
debug: 4.3.7
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
dev: true
/@eslint/core@0.7.0:
resolution:
{
integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dev: true
/@eslint/eslintrc@3.1.0:
resolution:
{
integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dependencies:
ajv: 6.12.6
debug: 4.3.7
espree: 10.3.0
globals: 14.0.0
ignore: 5.3.2
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
strip-json-comments: 3.1.1
transitivePeerDependencies:
- supports-color
dev: true
/@eslint/js@9.14.0:
resolution:
{
integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dev: true
/@eslint/object-schema@2.1.4:
resolution:
{
integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dev: true
/@eslint/plugin-kit@0.2.2:
resolution:
{
integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dependencies:
levn: 0.4.1
dev: true
/@humanfs/core@0.19.1:
resolution:
{
integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==,
}
engines: { node: ">=18.18.0" }
dev: true
/@humanfs/node@0.16.6:
resolution:
{
integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==,
}
engines: { node: ">=18.18.0" }
dependencies:
"@humanfs/core": 0.19.1
"@humanwhocodes/retry": 0.3.1
dev: true
/@humanwhocodes/module-importer@1.0.1:
resolution:
{
integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==,
}
engines: { node: ">=12.22" }
dev: true
/@humanwhocodes/retry@0.3.1:
resolution:
{
integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==,
}
engines: { node: ">=18.18" }
dev: true
/@humanwhocodes/retry@0.4.1:
resolution:
{
integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==,
}
engines: { node: ">=18.18" }
dev: true
/@types/estree@1.0.6:
resolution:
{
integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==,
}
dev: true
/@types/json-schema@7.0.15:
resolution:
{
integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==,
}
dev: true
/acorn-jsx@5.3.2(acorn@8.14.0):
resolution:
{
integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==,
}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
acorn: 8.14.0
dev: true
/acorn@8.14.0:
resolution:
{
integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==,
}
engines: { node: ">=0.4.0" }
hasBin: true
dev: true
/ajv@6.12.6:
resolution:
{
integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==,
}
dependencies:
fast-deep-equal: 3.1.3
fast-json-stable-stringify: 2.1.0
json-schema-traverse: 0.4.1
uri-js: 4.4.1
dev: true
/ansi-styles@4.3.0:
resolution:
{
integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==,
}
engines: { node: ">=8" }
dependencies:
color-convert: 2.0.1
dev: true
/argparse@2.0.1:
resolution:
{
integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==,
}
dev: true
/balanced-match@1.0.2:
resolution:
{
integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==,
}
dev: true
/brace-expansion@1.1.11:
resolution:
{
integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==,
}
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
dev: true
/callsites@3.1.0:
resolution:
{
integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==,
}
engines: { node: ">=6" }
dev: true
/chalk@4.1.2:
resolution:
{
integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==,
}
engines: { node: ">=10" }
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
dev: true
/color-convert@2.0.1:
resolution:
{
integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==,
}
engines: { node: ">=7.0.0" }
dependencies:
color-name: 1.1.4
dev: true
/color-name@1.1.4:
resolution:
{
integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==,
}
dev: true
/concat-map@0.0.1:
resolution:
{
integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==,
}
dev: true
/cross-spawn@7.0.5:
resolution:
{
integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==,
}
engines: { node: ">= 8" }
dependencies:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
dev: true
/debug@4.3.7:
resolution:
{
integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==,
}
engines: { node: ">=6.0" }
peerDependencies:
supports-color: "*"
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.1.3
dev: true
/deep-is@0.1.4:
resolution:
{
integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==,
}
dev: true
/escape-string-regexp@4.0.0:
resolution:
{
integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==,
}
engines: { node: ">=10" }
dev: true
/eslint-scope@8.2.0:
resolution:
{
integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
dev: true
/eslint-visitor-keys@3.4.3:
resolution:
{
integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==,
}
engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
dev: true
/eslint-visitor-keys@4.2.0:
resolution:
{
integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dev: true
/eslint@9.14.0:
resolution:
{
integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
hasBin: true
peerDependencies:
jiti: "*"
peerDependenciesMeta:
jiti:
optional: true
dependencies:
"@eslint-community/eslint-utils": 4.4.1(eslint@9.14.0)
"@eslint-community/regexpp": 4.12.1
"@eslint/config-array": 0.18.0
"@eslint/core": 0.7.0
"@eslint/eslintrc": 3.1.0
"@eslint/js": 9.14.0
"@eslint/plugin-kit": 0.2.2
"@humanfs/node": 0.16.6
"@humanwhocodes/module-importer": 1.0.1
"@humanwhocodes/retry": 0.4.1
"@types/estree": 1.0.6
"@types/json-schema": 7.0.15
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.5
debug: 4.3.7
escape-string-regexp: 4.0.0
eslint-scope: 8.2.0
eslint-visitor-keys: 4.2.0
espree: 10.3.0
esquery: 1.6.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
json-stable-stringify-without-jsonify: 1.0.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
optionator: 0.9.4
text-table: 0.2.0
transitivePeerDependencies:
- supports-color
dev: true
/espree@10.3.0:
resolution:
{
integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dependencies:
acorn: 8.14.0
acorn-jsx: 5.3.2(acorn@8.14.0)
eslint-visitor-keys: 4.2.0
dev: true
/esquery@1.6.0:
resolution:
{
integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==,
}
engines: { node: ">=0.10" }
dependencies:
estraverse: 5.3.0
dev: true
/esrecurse@4.3.0:
resolution:
{
integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==,
}
engines: { node: ">=4.0" }
dependencies:
estraverse: 5.3.0
dev: true
/estraverse@5.3.0:
resolution:
{
integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==,
}
engines: { node: ">=4.0" }
dev: true
/esutils@2.0.3:
resolution:
{
integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==,
}
engines: { node: ">=0.10.0" }
dev: true
/fast-deep-equal@3.1.3:
resolution:
{
integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==,
}
dev: true
/fast-json-stable-stringify@2.1.0:
resolution:
{
integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==,
}
dev: true
/fast-levenshtein@2.0.6:
resolution:
{
integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==,
}
dev: true
/file-entry-cache@8.0.0:
resolution:
{
integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==,
}
engines: { node: ">=16.0.0" }
dependencies:
flat-cache: 4.0.1
dev: true
/find-up@5.0.0:
resolution:
{
integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==,
}
engines: { node: ">=10" }
dependencies:
locate-path: 6.0.0
path-exists: 4.0.0
dev: true
/flat-cache@4.0.1:
resolution:
{
integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==,
}
engines: { node: ">=16" }
dependencies:
flatted: 3.3.1
keyv: 4.5.4
dev: true
/flatted@3.3.1:
resolution:
{
integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==,
}
dev: true
/glob-parent@6.0.2:
resolution:
{
integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==,
}
engines: { node: ">=10.13.0" }
dependencies:
is-glob: 4.0.3
dev: true
/globals@14.0.0:
resolution:
{
integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==,
}
engines: { node: ">=18" }
dev: true
/globals@15.12.0:
resolution:
{
integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==,
}
engines: { node: ">=18" }
dev: true
/has-flag@4.0.0:
resolution:
{
integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==,
}
engines: { node: ">=8" }
dev: true
/ignore@5.3.2:
resolution:
{
integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==,
}
engines: { node: ">= 4" }
dev: true
/import-fresh@3.3.0:
resolution:
{
integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==,
}
engines: { node: ">=6" }
dependencies:
parent-module: 1.0.1
resolve-from: 4.0.0
dev: true
/imurmurhash@0.1.4:
resolution:
{
integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==,
}
engines: { node: ">=0.8.19" }
dev: true
/is-extglob@2.1.1:
resolution:
{
integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==,
}
engines: { node: ">=0.10.0" }
dev: true
/is-glob@4.0.3:
resolution:
{
integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==,
}
engines: { node: ">=0.10.0" }
dependencies:
is-extglob: 2.1.1
dev: true
/isexe@2.0.0:
resolution:
{
integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==,
}
dev: true
/js-yaml@4.1.0:
resolution:
{
integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==,
}
hasBin: true
dependencies:
argparse: 2.0.1
dev: true
/json-buffer@3.0.1:
resolution:
{
integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==,
}
dev: true
/json-schema-traverse@0.4.1:
resolution:
{
integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==,
}
dev: true
/json-stable-stringify-without-jsonify@1.0.1:
resolution:
{
integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==,
}
dev: true
/keyv@4.5.4:
resolution:
{
integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==,
}
dependencies:
json-buffer: 3.0.1
dev: true
/levn@0.4.1:
resolution:
{
integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==,
}
engines: { node: ">= 0.8.0" }
dependencies:
prelude-ls: 1.2.1
type-check: 0.4.0
dev: true
/locate-path@6.0.0:
resolution:
{
integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==,
}
engines: { node: ">=10" }
dependencies:
p-locate: 5.0.0
dev: true
/lodash.merge@4.6.2:
resolution:
{
integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==,
}
dev: true
/minimatch@3.1.2:
resolution:
{
integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==,
}
dependencies:
brace-expansion: 1.1.11
dev: true
/ms@2.1.3:
resolution:
{
integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==,
}
dev: true
/natural-compare@1.4.0:
resolution:
{
integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==,
}
dev: true
/optionator@0.9.4:
resolution:
{
integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==,
}
engines: { node: ">= 0.8.0" }
dependencies:
deep-is: 0.1.4
fast-levenshtein: 2.0.6
levn: 0.4.1
prelude-ls: 1.2.1
type-check: 0.4.0
word-wrap: 1.2.5
dev: true
/p-limit@3.1.0:
resolution:
{
integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==,
}
engines: { node: ">=10" }
dependencies:
yocto-queue: 0.1.0
dev: true
/p-locate@5.0.0:
resolution:
{
integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==,
}
engines: { node: ">=10" }
dependencies:
p-limit: 3.1.0
dev: true
/parent-module@1.0.1:
resolution:
{
integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==,
}
engines: { node: ">=6" }
dependencies:
callsites: 3.1.0
dev: true
/path-exists@4.0.0:
resolution:
{
integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==,
}
engines: { node: ">=8" }
dev: true
/path-key@3.1.1:
resolution:
{
integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==,
}
engines: { node: ">=8" }
dev: true
/prelude-ls@1.2.1:
resolution:
{
integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==,
}
engines: { node: ">= 0.8.0" }
dev: true
/prettier@3.3.3:
resolution:
{
integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==,
}
engines: { node: ">=14" }
hasBin: true
dev: true
/punycode@2.3.1:
resolution:
{
integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==,
}
engines: { node: ">=6" }
dev: true
/resolve-from@4.0.0:
resolution:
{
integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==,
}
engines: { node: ">=4" }
dev: true
/shebang-command@2.0.0:
resolution:
{
integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==,
}
engines: { node: ">=8" }
dependencies:
shebang-regex: 3.0.0
dev: true
/shebang-regex@3.0.0:
resolution:
{
integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==,
}
engines: { node: ">=8" }
dev: true
/strip-json-comments@3.1.1:
resolution:
{
integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==,
}
engines: { node: ">=8" }
dev: true
/supports-color@7.2.0:
resolution:
{
integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==,
}
engines: { node: ">=8" }
dependencies:
has-flag: 4.0.0
dev: true
/text-table@0.2.0:
resolution:
{
integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==,
}
dev: true
/type-check@0.4.0:
resolution:
{
integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==,
}
engines: { node: ">= 0.8.0" }
dependencies:
prelude-ls: 1.2.1
dev: true
/uri-js@4.4.1:
resolution:
{
integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==,
}
dependencies:
punycode: 2.3.1
dev: true
/which@2.0.2:
resolution:
{
integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==,
}
engines: { node: ">= 8" }
hasBin: true
dependencies:
isexe: 2.0.0
dev: true
/word-wrap@1.2.5:
resolution:
{
integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==,
}
engines: { node: ">=0.10.0" }
dev: true
/yocto-queue@0.1.0:
resolution:
{
integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==,
}
engines: { node: ">=10" }
dev: true