add cq tooling
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
/.idea/
|
||||
/.idea/
|
||||
/node_modules/
|
32
.prettierrc
Normal file
32
.prettierrc
Normal 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
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
80
README.md
80
README.md
@@ -1,7 +1,7 @@
|
||||
# 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
|
||||
|
||||

|
||||

|
||||
@@ -9,6 +9,7 @@
|
||||
CLI: `npx workflow-function-manifold`
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Overview](#overview)
|
||||
- [Installation](#installation)
|
||||
- [Quick Start](#quick-start)
|
||||
@@ -24,6 +25,7 @@ CLI: `npx workflow-function-manifold`
|
||||
## Overview
|
||||
|
||||
`workflow-function-manifold` enables you to create dynamic workflows that:
|
||||
|
||||
- Navigate between different execution regions based on LLM-interpreted intents.
|
||||
- Execute operations within regions based on state and context.
|
||||
- Maintain workflow state across operations.
|
||||
@@ -64,11 +66,11 @@ npm install workflow-function-manifold
|
||||
## Quick Start
|
||||
|
||||
```javascript
|
||||
import {
|
||||
WorkflowFunctionManifold,
|
||||
ManifoldRegion,
|
||||
WorkflowOperator,
|
||||
DummyLlmService
|
||||
import {
|
||||
WorkflowFunctionManifold,
|
||||
ManifoldRegion,
|
||||
WorkflowOperator,
|
||||
DummyLlmService,
|
||||
} from 'workflow-function-manifold';
|
||||
|
||||
// Initialize the manifold with an LLM service
|
||||
@@ -76,7 +78,7 @@ const llm = new DummyLlmService();
|
||||
const manifold = new WorkflowFunctionManifold(llm);
|
||||
|
||||
// Create an operator
|
||||
const analysisOperator = new WorkflowOperator('analysis', async (state) => {
|
||||
const analysisOperator = new WorkflowOperator('analysis', async state => {
|
||||
console.log('Analyzing data...');
|
||||
return { ...state, analyzed: true };
|
||||
});
|
||||
@@ -86,13 +88,15 @@ const analysisRegion = new ManifoldRegion('analysis', [analysisOperator]);
|
||||
manifold.addRegion(analysisRegion);
|
||||
|
||||
// Execute workflow
|
||||
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.navigate('analyze the data'); // This navigates to 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
|
||||
|
||||
@@ -115,7 +119,8 @@ await manifold.executeWorkflow(prompt);
|
||||
|
||||
### ManifoldRegion
|
||||
|
||||
Represents a workflow region containing operators and connections to other regions.
|
||||
Represents a workflow region containing operators and connections to other
|
||||
regions.
|
||||
|
||||
```javascript
|
||||
const region = new ManifoldRegion('regionName', [operator1, operator2]);
|
||||
@@ -132,7 +137,7 @@ region.addOperator(newOperator);
|
||||
Defines operations that can be executed within regions.
|
||||
|
||||
```javascript
|
||||
const operator = new WorkflowOperator('operatorName', async (state) => {
|
||||
const operator = new WorkflowOperator('operatorName', async state => {
|
||||
// Modify state
|
||||
return newState;
|
||||
});
|
||||
@@ -158,13 +163,13 @@ async function createWorkflow() {
|
||||
const manifold = new WorkflowFunctionManifold(llm);
|
||||
|
||||
// Create operators
|
||||
const analysisOp = new WorkflowOperator('analysis', async (state) => {
|
||||
const analysisOp = new WorkflowOperator('analysis', async state => {
|
||||
return { ...state, analyzed: true };
|
||||
});
|
||||
const processingOp = new WorkflowOperator('processing', async (state) => {
|
||||
const processingOp = new WorkflowOperator('processing', async state => {
|
||||
return { ...state, processed: true };
|
||||
});
|
||||
const transformOp = new WorkflowOperator('transformation', async (state) => {
|
||||
const transformOp = new WorkflowOperator('transformation', async state => {
|
||||
return { ...state, transformed: true };
|
||||
});
|
||||
|
||||
@@ -189,7 +194,7 @@ const manifold = await createWorkflow();
|
||||
const prompts = [
|
||||
'analyze the data',
|
||||
'process the results',
|
||||
'transform the output'
|
||||
'transform the output',
|
||||
];
|
||||
|
||||
for (const prompt of prompts) {
|
||||
@@ -197,7 +202,7 @@ for (const prompt of prompts) {
|
||||
await manifold.executeWorkflow(prompt);
|
||||
}
|
||||
|
||||
console.log(manifold.state); // Final state after all operations
|
||||
console.log(manifold.state); // Final state after all operations
|
||||
```
|
||||
|
||||
## API Reference
|
||||
@@ -205,9 +210,11 @@ console.log(manifold.state); // Final state after all operations
|
||||
### WorkflowFunctionManifold
|
||||
|
||||
#### Constructor
|
||||
|
||||
- `constructor(llmService: LLMService)`
|
||||
|
||||
#### Methods
|
||||
|
||||
- `addRegion(region: ManifoldRegion): void`
|
||||
- `async navigate(prompt: string): Promise<boolean>`
|
||||
- `async executeWorkflow(prompt: string): Promise<boolean>`
|
||||
@@ -215,9 +222,11 @@ console.log(manifold.state); // Final state after all operations
|
||||
### ManifoldRegion
|
||||
|
||||
#### Constructor
|
||||
|
||||
- `constructor(name: string, operators: WorkflowOperator[] = [])`
|
||||
|
||||
#### Methods
|
||||
|
||||
- `addOperator(operator: WorkflowOperator): void`
|
||||
- `connectTo(region: ManifoldRegion): void`
|
||||
- `async getValidOperators(state: any): Promise<WorkflowOperator[]>`
|
||||
@@ -225,24 +234,27 @@ console.log(manifold.state); // Final state after all operations
|
||||
### WorkflowOperator
|
||||
|
||||
#### Constructor
|
||||
|
||||
- `constructor(name: string, operation: (state: any) => Promise<any>)`
|
||||
|
||||
#### Methods
|
||||
|
||||
- `async execute(state: any): Promise<any>`
|
||||
|
||||
## 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
|
||||
const operator = new WorkflowOperator('example', async (state) => {
|
||||
const operator = new WorkflowOperator('example', async state => {
|
||||
// Access existing state
|
||||
const { previousValue } = state;
|
||||
|
||||
|
||||
// Return modified state
|
||||
return {
|
||||
...state,
|
||||
newValue: 'updated'
|
||||
newValue: 'updated',
|
||||
};
|
||||
});
|
||||
```
|
||||
@@ -251,7 +263,9 @@ The updated state persists across operators and regions.
|
||||
|
||||
## 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
|
||||
class CustomLLMService {
|
||||
@@ -259,7 +273,7 @@ class CustomLLMService {
|
||||
// Implement custom LLM logic
|
||||
return {
|
||||
confidence: number,
|
||||
action: string
|
||||
action: string,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -267,21 +281,27 @@ class CustomLLMService {
|
||||
|
||||
## 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
|
||||
|
||||
- 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
|
||||
|
||||
- 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
|
||||
|
||||
- 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
|
||||
|
||||
```javascript
|
||||
try {
|
||||
await manifold.navigate('unknown command');
|
||||
@@ -306,4 +326,4 @@ try {
|
||||
|
||||
## License
|
||||
|
||||
MIT © 2024 Geoff Seemueller
|
||||
MIT © 2024 Geoff Seemueller
|
||||
|
89
bin.js
89
bin.js
@@ -1,62 +1,63 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import {DummyLlmService, ManifoldRegion, WorkflowFunctionManifold, WorkflowOperator} from "./lib.js";
|
||||
import {
|
||||
DummyLlmService,
|
||||
ManifoldRegion,
|
||||
WorkflowFunctionManifold,
|
||||
WorkflowOperator,
|
||||
} from './lib.js';
|
||||
|
||||
async function demonstrateManifold() {
|
||||
// Initialize services and manifold
|
||||
const llm = new DummyLlmService();
|
||||
const manifold = new WorkflowFunctionManifold(llm);
|
||||
// Initialize services and manifold
|
||||
const llm = new DummyLlmService();
|
||||
const manifold = new WorkflowFunctionManifold(llm);
|
||||
|
||||
// Create operators
|
||||
const dataAnalysisOp = new WorkflowOperator('analysis', async (state) => {
|
||||
console.log('Performing data analysis...');
|
||||
return { ...state, analyzed: true };
|
||||
});
|
||||
// Create operators
|
||||
const dataAnalysisOp = new WorkflowOperator('analysis', async state => {
|
||||
console.log('Performing data analysis...');
|
||||
return { ...state, analyzed: true };
|
||||
});
|
||||
|
||||
const dataProcessingOp = new WorkflowOperator('processing', async (state) => {
|
||||
console.log('Processing data...');
|
||||
return { ...state, processed: true };
|
||||
});
|
||||
const dataProcessingOp = new WorkflowOperator('processing', async state => {
|
||||
console.log('Processing data...');
|
||||
return { ...state, processed: true };
|
||||
});
|
||||
|
||||
const dataTransformOp = new WorkflowOperator('transformation', async (state) => {
|
||||
console.log('Transforming data...');
|
||||
return { ...state, transformed: true };
|
||||
});
|
||||
const dataTransformOp = new WorkflowOperator('transformation', async state => {
|
||||
console.log('Transforming data...');
|
||||
return { ...state, transformed: true };
|
||||
});
|
||||
|
||||
// Create regions
|
||||
const analysisRegion = new ManifoldRegion('analysis', [dataAnalysisOp]);
|
||||
const processingRegion = new ManifoldRegion('processing', [dataProcessingOp]);
|
||||
const transformationRegion = new ManifoldRegion('transformation', [dataTransformOp]);
|
||||
// Create regions
|
||||
const analysisRegion = new ManifoldRegion('analysis', [dataAnalysisOp]);
|
||||
const processingRegion = new ManifoldRegion('processing', [dataProcessingOp]);
|
||||
const transformationRegion = new ManifoldRegion('transformation', [dataTransformOp]);
|
||||
|
||||
// Connect regions
|
||||
analysisRegion.connectTo(processingRegion);
|
||||
processingRegion.connectTo(transformationRegion);
|
||||
// Connect regions
|
||||
analysisRegion.connectTo(processingRegion);
|
||||
processingRegion.connectTo(transformationRegion);
|
||||
|
||||
// Add regions to manifold
|
||||
manifold.addRegion(analysisRegion);
|
||||
manifold.addRegion(processingRegion);
|
||||
manifold.addRegion(transformationRegion);
|
||||
// Add regions to manifold
|
||||
manifold.addRegion(analysisRegion);
|
||||
manifold.addRegion(processingRegion);
|
||||
manifold.addRegion(transformationRegion);
|
||||
|
||||
// Demonstrate workflow execution
|
||||
console.log('Starting workflow demonstration...');
|
||||
// Demonstrate workflow execution
|
||||
console.log('Starting workflow demonstration...');
|
||||
|
||||
const prompts = [
|
||||
'analyze the data',
|
||||
'process the results',
|
||||
'transform the output'
|
||||
];
|
||||
const prompts = ['analyze the data', 'process the results', 'transform the output'];
|
||||
|
||||
for (const prompt of prompts) {
|
||||
console.log(`\nExecuting prompt: "${prompt}"`);
|
||||
await manifold.navigate(prompt);
|
||||
const executed = await manifold.executeWorkflow(prompt);
|
||||
console.log(`Current state:`, manifold.state);
|
||||
console.log(`Current region: ${manifold.currentRegion.name}`);
|
||||
console.log(`Operation executed: ${executed}`);
|
||||
}
|
||||
for (const prompt of prompts) {
|
||||
console.log(`\nExecuting prompt: "${prompt}"`);
|
||||
await manifold.navigate(prompt);
|
||||
const executed = await manifold.executeWorkflow(prompt);
|
||||
console.log('Current state:', manifold.state);
|
||||
console.log(`Current region: ${manifold.currentRegion.name}`);
|
||||
console.log(`Operation executed: ${executed}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Run the demonstration
|
||||
demonstrateManifold().catch(console.error);
|
||||
|
||||
export {}
|
||||
export {};
|
||||
|
74
eslint.config.js
Normal file
74
eslint.config.js
Normal 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
258
lib.js
@@ -3,23 +3,24 @@
|
||||
* Simulates a Large Language Model (LLM) service for intent detection.
|
||||
*/
|
||||
export class DummyLlmService {
|
||||
/**
|
||||
* Queries the simulated LLM with a prompt.
|
||||
* @param {string} prompt - The input prompt to query the LLM.
|
||||
* @returns {Promise<{confidence: number, action: string}>} - The detected intent with confidence and action.
|
||||
*/
|
||||
async query(prompt) {
|
||||
const intents = {
|
||||
'analyze': { confidence: 0.9, action: 'analysis' },
|
||||
'process': { confidence: 0.8, action: 'processing' },
|
||||
'transform': { confidence: 0.7, action: 'transformation' }
|
||||
};
|
||||
/**
|
||||
* Queries the simulated LLM with a prompt.
|
||||
* @param {string} prompt - The input prompt to query the LLM.
|
||||
* @returns {Promise<{confidence: number, action: string}>} - The detected intent with confidence and action.
|
||||
*/
|
||||
async query(prompt) {
|
||||
const intents = {
|
||||
analyze: { confidence: 0.9, action: 'analysis' },
|
||||
process: { confidence: 0.8, action: 'processing' },
|
||||
transform: { confidence: 0.7, action: 'transformation' },
|
||||
};
|
||||
|
||||
const matchedIntent = Object.entries(intents)
|
||||
.find(([key]) => prompt.toLowerCase().includes(key));
|
||||
const matchedIntent = Object.entries(intents).find(([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
|
||||
@@ -27,24 +28,24 @@ export class DummyLlmService {
|
||||
* Represents a workflow operator responsible for performing a specific operation.
|
||||
*/
|
||||
export class WorkflowOperator {
|
||||
/**
|
||||
* Creates an instance of WorkflowOperator.
|
||||
* @param {string} name - The name of the operator.
|
||||
* @param {function(object): Promise<object>} operation - The operation function executed by the operator.
|
||||
*/
|
||||
constructor(name, operation) {
|
||||
this.name = name;
|
||||
this.operation = operation;
|
||||
}
|
||||
/**
|
||||
* Creates an instance of WorkflowOperator.
|
||||
* @param {string} name - The name of the operator.
|
||||
* @param {function(object): Promise<object>} operation - The operation function executed by the operator.
|
||||
*/
|
||||
constructor(name, operation) {
|
||||
this.name = name;
|
||||
this.operation = operation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes the operator's operation with the given state.
|
||||
* @param {object} state - The current state to be processed.
|
||||
* @returns {Promise<object>} - The updated state after the operation.
|
||||
*/
|
||||
async execute(state) {
|
||||
return await this.operation(state);
|
||||
}
|
||||
/**
|
||||
* Executes the operator's operation with the given state.
|
||||
* @param {object} state - The current state to be processed.
|
||||
* @returns {Promise<object>} - The updated state after the operation.
|
||||
*/
|
||||
async execute(state) {
|
||||
return await this.operation(state);
|
||||
}
|
||||
}
|
||||
|
||||
// Interface for manifold regions
|
||||
@@ -52,42 +53,42 @@ export class WorkflowOperator {
|
||||
* Represents a region within the manifold, containing workflow operators.
|
||||
*/
|
||||
export class ManifoldRegion {
|
||||
/**
|
||||
* Creates an instance of ManifoldRegion.
|
||||
* @param {string} name - The name of the region.
|
||||
* @param {WorkflowOperator[]} [operators=[]] - The operators available in this region.
|
||||
*/
|
||||
constructor(name, operators = []) {
|
||||
this.name = name;
|
||||
this.operators = operators;
|
||||
this.adjacentRegions = new Set();
|
||||
}
|
||||
/**
|
||||
* Creates an instance of ManifoldRegion.
|
||||
* @param {string} name - The name of the region.
|
||||
* @param {WorkflowOperator[]} [operators=[]] - The operators available in this region.
|
||||
*/
|
||||
constructor(name, operators = []) {
|
||||
this.name = name;
|
||||
this.operators = operators;
|
||||
this.adjacentRegions = new Set();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an operator to the region.
|
||||
* @param {WorkflowOperator} operator - The operator to be added.
|
||||
*/
|
||||
addOperator(operator) {
|
||||
this.operators.push(operator);
|
||||
}
|
||||
/**
|
||||
* Adds an operator to the region.
|
||||
* @param {WorkflowOperator} operator - The operator to be added.
|
||||
*/
|
||||
addOperator(operator) {
|
||||
this.operators.push(operator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Establishes a connection to another region.
|
||||
* @param {ManifoldRegion} region - The region to connect to.
|
||||
*/
|
||||
connectTo(region) {
|
||||
this.adjacentRegions.add(region);
|
||||
region.adjacentRegions.add(this);
|
||||
}
|
||||
/**
|
||||
* Establishes a connection to another region.
|
||||
* @param {ManifoldRegion} region - The region to connect to.
|
||||
*/
|
||||
connectTo(region) {
|
||||
this.adjacentRegions.add(region);
|
||||
region.adjacentRegions.add(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves valid operators for the given state.
|
||||
* @param {object} state - The current state.
|
||||
* @returns {Promise<WorkflowOperator[]>} - The list of valid operators.
|
||||
*/
|
||||
async getValidOperators(state) {
|
||||
return this.operators;
|
||||
}
|
||||
/**
|
||||
* Retrieves valid operators for the given state.
|
||||
* @param {object} _state - The current state.
|
||||
* @returns {Promise<WorkflowOperator[]>} - The list of valid operators.
|
||||
*/
|
||||
async getValidOperators(_state) {
|
||||
return this.operators;
|
||||
}
|
||||
}
|
||||
|
||||
// Main manifold implementation
|
||||
@@ -95,75 +96,74 @@ export class ManifoldRegion {
|
||||
* Represents the workflow function manifold managing regions and state transitions.
|
||||
*/
|
||||
export class WorkflowFunctionManifold {
|
||||
/**
|
||||
* Creates an instance of WorkflowFunctionManifold.
|
||||
* @param {DummyLlmService} llmService - The LLM service used for intent detection.
|
||||
*/
|
||||
constructor(llmService) {
|
||||
this.llmService = llmService;
|
||||
this.regions = new Map();
|
||||
this.currentRegion = null;
|
||||
this.state = {};
|
||||
/**
|
||||
* Creates an instance of WorkflowFunctionManifold.
|
||||
* @param {DummyLlmService} llmService - The LLM service used for intent detection.
|
||||
*/
|
||||
constructor(llmService) {
|
||||
this.llmService = llmService;
|
||||
this.regions = new Map();
|
||||
this.currentRegion = null;
|
||||
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.
|
||||
* @param {ManifoldRegion} region - The region to be added.
|
||||
*/
|
||||
addRegion(region) {
|
||||
this.regions.set(region.name, region);
|
||||
if (!this.currentRegion) {
|
||||
this.currentRegion = region;
|
||||
}
|
||||
/**
|
||||
* Navigates to the next region based on the provided prompt.
|
||||
* @param {string} prompt - The input prompt for intent matching.
|
||||
* @returns {Promise<boolean>} - Whether navigation was successful.
|
||||
*/
|
||||
async navigate(prompt) {
|
||||
try {
|
||||
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.
|
||||
* @param {string} prompt - The input prompt for intent matching.
|
||||
* @returns {Promise<boolean>} - Whether navigation was successful.
|
||||
*/
|
||||
async navigate(prompt) {
|
||||
try {
|
||||
const intent = await this.llmService.query(prompt);
|
||||
/**
|
||||
* 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 nextRegion = Array.from(this.currentRegion.adjacentRegions)
|
||||
.find(region => region.name.toLowerCase().includes(intent.action));
|
||||
const matchedOperator = operators.find(op => op.name.toLowerCase().includes(intent.action));
|
||||
|
||||
if (nextRegion && intent.confidence > 0.5) {
|
||||
this.currentRegion = nextRegion;
|
||||
return true;
|
||||
} else {
|
||||
console.warn(`No valid region found for prompt: "${prompt}"`);
|
||||
return false;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Error during navigation for prompt "${prompt}":`, error);
|
||||
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;
|
||||
}
|
||||
if (matchedOperator) {
|
||||
this.state = await matchedOperator.execute(this.state);
|
||||
return true;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
14
package.json
14
package.json
@@ -8,9 +8,19 @@
|
||||
},
|
||||
"scripts": {
|
||||
"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": [],
|
||||
"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
864
pnpm-lock.yaml
generated
Normal 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
|
Reference in New Issue
Block a user