@nella-labs/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/run.d.ts +63 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +259 -0
- package/dist/run.js.map +1 -0
- package/dist/safety/index.d.ts +5 -0
- package/dist/safety/index.d.ts.map +1 -0
- package/dist/safety/index.js +21 -0
- package/dist/safety/index.js.map +1 -0
- package/dist/safety/refusal-detector.d.ts +60 -0
- package/dist/safety/refusal-detector.d.ts.map +1 -0
- package/dist/safety/refusal-detector.js +250 -0
- package/dist/safety/refusal-detector.js.map +1 -0
- package/dist/types/agent.d.ts +39 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +8 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/result.d.ts +166 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +8 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/task.d.ts +105 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +8 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +56 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +127 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/workspace.d.ts +45 -0
- package/dist/utils/workspace.d.ts.map +1 -0
- package/dist/utils/workspace.js +199 -0
- package/dist/utils/workspace.js.map +1 -0
- package/dist/validators/command-runner.d.ts +33 -0
- package/dist/validators/command-runner.d.ts.map +1 -0
- package/dist/validators/command-runner.js +135 -0
- package/dist/validators/command-runner.js.map +1 -0
- package/dist/validators/constraint-checker.d.ts +37 -0
- package/dist/validators/constraint-checker.d.ts.map +1 -0
- package/dist/validators/constraint-checker.js +127 -0
- package/dist/validators/constraint-checker.js.map +1 -0
- package/dist/validators/index.d.ts +7 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +23 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/validators/scope-checker.d.ts +15 -0
- package/dist/validators/scope-checker.d.ts.map +1 -0
- package/dist/validators/scope-checker.js +64 -0
- package/dist/validators/scope-checker.js.map +1 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# @nella/core
|
|
2
|
+
|
|
3
|
+
Reliability layer for coding agents. Enforces behavioral contracts that prevent agents from making unsafe or incorrect changes.
|
|
4
|
+
|
|
5
|
+
## What It Does
|
|
6
|
+
|
|
7
|
+
Core gates and validates agent changes:
|
|
8
|
+
|
|
9
|
+
- **Refuses** when prerequisites are missing or risk patterns detected
|
|
10
|
+
- **Validates constraints** (don't touch forbidden files, no forbidden patterns)
|
|
11
|
+
- **Runs validation** (test/lint/compile) and captures proof
|
|
12
|
+
- **Checks scope** (detect scope creep outside declared plan)
|
|
13
|
+
- **Calculates metrics** (scope creep ratio, constraint violations, validation integrity)
|
|
14
|
+
- **Emits structured logs** (JSONL run records)
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install @nella/core
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { runTask, check, Task } from '@nella/core';
|
|
26
|
+
|
|
27
|
+
// Pre-flight check: can this task proceed?
|
|
28
|
+
const refusal = check(task, '/path/to/repo');
|
|
29
|
+
if (refusal.shouldRefuse) {
|
|
30
|
+
console.log('Refused:', refusal.reason);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Full validation with changes
|
|
34
|
+
const result = await runTask('/path/to/repo', task, {
|
|
35
|
+
files: [
|
|
36
|
+
{ path: 'src/users.ts', operation: 'modify', content: '...' }
|
|
37
|
+
]
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
console.log('Passed:', result.passed);
|
|
41
|
+
console.log('Metrics:', result.metrics);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## API
|
|
45
|
+
|
|
46
|
+
### `runTask(repoPath, task, changes?, options?) → RunResult`
|
|
47
|
+
|
|
48
|
+
Main entrypoint. Orchestrates the full validation flow.
|
|
49
|
+
|
|
50
|
+
### `check(task, workspacePath, options?) → RefusalResult`
|
|
51
|
+
|
|
52
|
+
Pre-flight check. Returns whether the task should be refused.
|
|
53
|
+
|
|
54
|
+
### `checkConstraints(files, diff, constraints) → ConstraintResult[]`
|
|
55
|
+
|
|
56
|
+
Validate changes against constraint definitions.
|
|
57
|
+
|
|
58
|
+
### `runValidation(config, workDir) → ValidationResult`
|
|
59
|
+
|
|
60
|
+
Execute test/lint/compile commands.
|
|
61
|
+
|
|
62
|
+
### `checkScope(files, expected) → ScopeResult`
|
|
63
|
+
|
|
64
|
+
Detect scope creep.
|
|
65
|
+
|
|
66
|
+
## Types
|
|
67
|
+
|
|
68
|
+
See [types/](./src/types/) for full type definitions:
|
|
69
|
+
|
|
70
|
+
- `Task` - Task definition
|
|
71
|
+
- `Constraint` - Constraint rules
|
|
72
|
+
- `RunResult` - Complete run output
|
|
73
|
+
- `Metrics` - Computed quality metrics
|
|
74
|
+
|
|
75
|
+
## Development
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pnpm build # Build the package
|
|
79
|
+
pnpm dev # Watch mode
|
|
80
|
+
pnpm test # Run tests
|
|
81
|
+
```
|
|
82
|
+
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nella Core
|
|
3
|
+
*
|
|
4
|
+
* Reliability layer for coding agents.
|
|
5
|
+
*
|
|
6
|
+
* Core enforces behavioral contracts that prevent agents from:
|
|
7
|
+
* - Contradicting prior intent/decisions
|
|
8
|
+
* - Touching forbidden areas
|
|
9
|
+
* - Pretending tests ran when they didn't
|
|
10
|
+
* - Scope-creeping outside the declared plan
|
|
11
|
+
* - Proceeding when prerequisites are missing
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
export { runTask, check, validate } from "./run";
|
|
16
|
+
export type { RunTaskOptions } from "./run";
|
|
17
|
+
export * from "./types";
|
|
18
|
+
export { checkConstraints, checkConstraint, checkFilesNotToModify, checkForbiddenPatterns, getViolatedConstraints, countViolations, } from "./validators/constraint-checker";
|
|
19
|
+
export { checkScope, } from "./validators/scope-checker";
|
|
20
|
+
export { runCommand, runValidation, getValidationErrors, calculateValidationIntegrity, } from "./validators/command-runner";
|
|
21
|
+
export { shouldRefuse, detectRiskPatterns, detectRefusalInResponse, checkPrerequisites, checkRefusalCorrectness, RISK_PATTERNS, REFUSAL_RESPONSE_PATTERNS, } from "./safety/refusal-detector";
|
|
22
|
+
export type { PrerequisiteCheck, RefusalCheckOptions, } from "./safety/refusal-detector";
|
|
23
|
+
export { RunLogger, generateRunId, } from "./utils/logger";
|
|
24
|
+
export { createTempWorkspace, applyChanges, getDiff, getModifiedFiles, createNellaDir, writeArtifacts, cleanupTempWorkspace, } from "./utils/workspace";
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAM5C,cAAc,SAAS,CAAC;AAMxB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,GAChB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,UAAU,GACX,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAMrC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EACV,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AAMnC,OAAO,EACL,SAAS,EACT,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Nella Core
|
|
4
|
+
*
|
|
5
|
+
* Reliability layer for coding agents.
|
|
6
|
+
*
|
|
7
|
+
* Core enforces behavioral contracts that prevent agents from:
|
|
8
|
+
* - Contradicting prior intent/decisions
|
|
9
|
+
* - Touching forbidden areas
|
|
10
|
+
* - Pretending tests ran when they didn't
|
|
11
|
+
* - Scope-creeping outside the declared plan
|
|
12
|
+
* - Proceeding when prerequisites are missing
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
28
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
29
|
+
};
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.cleanupTempWorkspace = exports.writeArtifacts = exports.createNellaDir = exports.getModifiedFiles = exports.getDiff = exports.applyChanges = exports.createTempWorkspace = exports.generateRunId = exports.RunLogger = exports.REFUSAL_RESPONSE_PATTERNS = exports.RISK_PATTERNS = exports.checkRefusalCorrectness = exports.checkPrerequisites = exports.detectRefusalInResponse = exports.detectRiskPatterns = exports.shouldRefuse = exports.calculateValidationIntegrity = exports.getValidationErrors = exports.runValidation = exports.runCommand = exports.checkScope = exports.countViolations = exports.getViolatedConstraints = exports.checkForbiddenPatterns = exports.checkFilesNotToModify = exports.checkConstraint = exports.checkConstraints = exports.validate = exports.check = exports.runTask = void 0;
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// Main API
|
|
34
|
+
// =============================================================================
|
|
35
|
+
var run_1 = require("./run");
|
|
36
|
+
Object.defineProperty(exports, "runTask", { enumerable: true, get: function () { return run_1.runTask; } });
|
|
37
|
+
Object.defineProperty(exports, "check", { enumerable: true, get: function () { return run_1.check; } });
|
|
38
|
+
Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return run_1.validate; } });
|
|
39
|
+
// =============================================================================
|
|
40
|
+
// Types
|
|
41
|
+
// =============================================================================
|
|
42
|
+
__exportStar(require("./types"), exports);
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// Validators
|
|
45
|
+
// =============================================================================
|
|
46
|
+
var constraint_checker_1 = require("./validators/constraint-checker");
|
|
47
|
+
Object.defineProperty(exports, "checkConstraints", { enumerable: true, get: function () { return constraint_checker_1.checkConstraints; } });
|
|
48
|
+
Object.defineProperty(exports, "checkConstraint", { enumerable: true, get: function () { return constraint_checker_1.checkConstraint; } });
|
|
49
|
+
Object.defineProperty(exports, "checkFilesNotToModify", { enumerable: true, get: function () { return constraint_checker_1.checkFilesNotToModify; } });
|
|
50
|
+
Object.defineProperty(exports, "checkForbiddenPatterns", { enumerable: true, get: function () { return constraint_checker_1.checkForbiddenPatterns; } });
|
|
51
|
+
Object.defineProperty(exports, "getViolatedConstraints", { enumerable: true, get: function () { return constraint_checker_1.getViolatedConstraints; } });
|
|
52
|
+
Object.defineProperty(exports, "countViolations", { enumerable: true, get: function () { return constraint_checker_1.countViolations; } });
|
|
53
|
+
var scope_checker_1 = require("./validators/scope-checker");
|
|
54
|
+
Object.defineProperty(exports, "checkScope", { enumerable: true, get: function () { return scope_checker_1.checkScope; } });
|
|
55
|
+
var command_runner_1 = require("./validators/command-runner");
|
|
56
|
+
Object.defineProperty(exports, "runCommand", { enumerable: true, get: function () { return command_runner_1.runCommand; } });
|
|
57
|
+
Object.defineProperty(exports, "runValidation", { enumerable: true, get: function () { return command_runner_1.runValidation; } });
|
|
58
|
+
Object.defineProperty(exports, "getValidationErrors", { enumerable: true, get: function () { return command_runner_1.getValidationErrors; } });
|
|
59
|
+
Object.defineProperty(exports, "calculateValidationIntegrity", { enumerable: true, get: function () { return command_runner_1.calculateValidationIntegrity; } });
|
|
60
|
+
// =============================================================================
|
|
61
|
+
// Safety
|
|
62
|
+
// =============================================================================
|
|
63
|
+
var refusal_detector_1 = require("./safety/refusal-detector");
|
|
64
|
+
Object.defineProperty(exports, "shouldRefuse", { enumerable: true, get: function () { return refusal_detector_1.shouldRefuse; } });
|
|
65
|
+
Object.defineProperty(exports, "detectRiskPatterns", { enumerable: true, get: function () { return refusal_detector_1.detectRiskPatterns; } });
|
|
66
|
+
Object.defineProperty(exports, "detectRefusalInResponse", { enumerable: true, get: function () { return refusal_detector_1.detectRefusalInResponse; } });
|
|
67
|
+
Object.defineProperty(exports, "checkPrerequisites", { enumerable: true, get: function () { return refusal_detector_1.checkPrerequisites; } });
|
|
68
|
+
Object.defineProperty(exports, "checkRefusalCorrectness", { enumerable: true, get: function () { return refusal_detector_1.checkRefusalCorrectness; } });
|
|
69
|
+
Object.defineProperty(exports, "RISK_PATTERNS", { enumerable: true, get: function () { return refusal_detector_1.RISK_PATTERNS; } });
|
|
70
|
+
Object.defineProperty(exports, "REFUSAL_RESPONSE_PATTERNS", { enumerable: true, get: function () { return refusal_detector_1.REFUSAL_RESPONSE_PATTERNS; } });
|
|
71
|
+
// =============================================================================
|
|
72
|
+
// Utilities
|
|
73
|
+
// =============================================================================
|
|
74
|
+
var logger_1 = require("./utils/logger");
|
|
75
|
+
Object.defineProperty(exports, "RunLogger", { enumerable: true, get: function () { return logger_1.RunLogger; } });
|
|
76
|
+
Object.defineProperty(exports, "generateRunId", { enumerable: true, get: function () { return logger_1.generateRunId; } });
|
|
77
|
+
var workspace_1 = require("./utils/workspace");
|
|
78
|
+
Object.defineProperty(exports, "createTempWorkspace", { enumerable: true, get: function () { return workspace_1.createTempWorkspace; } });
|
|
79
|
+
Object.defineProperty(exports, "applyChanges", { enumerable: true, get: function () { return workspace_1.applyChanges; } });
|
|
80
|
+
Object.defineProperty(exports, "getDiff", { enumerable: true, get: function () { return workspace_1.getDiff; } });
|
|
81
|
+
Object.defineProperty(exports, "getModifiedFiles", { enumerable: true, get: function () { return workspace_1.getModifiedFiles; } });
|
|
82
|
+
Object.defineProperty(exports, "createNellaDir", { enumerable: true, get: function () { return workspace_1.createNellaDir; } });
|
|
83
|
+
Object.defineProperty(exports, "writeArtifacts", { enumerable: true, get: function () { return workspace_1.writeArtifacts; } });
|
|
84
|
+
Object.defineProperty(exports, "cleanupTempWorkspace", { enumerable: true, get: function () { return workspace_1.cleanupTempWorkspace; } });
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;;;;;;;;;;;;;AAEH,gFAAgF;AAChF,WAAW;AACX,gFAAgF;AAEhF,6BAAiD;AAAxC,8FAAA,OAAO,OAAA;AAAE,4FAAA,KAAK,OAAA;AAAE,+FAAA,QAAQ,OAAA;AAGjC,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,0CAAwB;AAExB,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF,sEAOyC;AANvC,sHAAA,gBAAgB,OAAA;AAChB,qHAAA,eAAe,OAAA;AACf,2HAAA,qBAAqB,OAAA;AACrB,4HAAA,sBAAsB,OAAA;AACtB,4HAAA,sBAAsB,OAAA;AACtB,qHAAA,eAAe,OAAA;AAGjB,4DAEoC;AADlC,2GAAA,UAAU,OAAA;AAGZ,8DAKqC;AAJnC,4GAAA,UAAU,OAAA;AACV,+GAAA,aAAa,OAAA;AACb,qHAAA,mBAAmB,OAAA;AACnB,8HAAA,4BAA4B,OAAA;AAG9B,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,8DAQmC;AAPjC,gHAAA,YAAY,OAAA;AACZ,sHAAA,kBAAkB,OAAA;AAClB,2HAAA,uBAAuB,OAAA;AACvB,sHAAA,kBAAkB,OAAA;AAClB,2HAAA,uBAAuB,OAAA;AACvB,iHAAA,aAAa,OAAA;AACb,6HAAA,yBAAyB,OAAA;AAQ3B,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,yCAGwB;AAFtB,mGAAA,SAAS,OAAA;AACT,uGAAA,aAAa,OAAA;AAGf,+CAQ2B;AAPzB,gHAAA,mBAAmB,OAAA;AACnB,yGAAA,YAAY,OAAA;AACZ,oGAAA,OAAO,OAAA;AACP,6GAAA,gBAAgB,OAAA;AAChB,2GAAA,cAAc,OAAA;AACd,2GAAA,cAAc,OAAA;AACd,iHAAA,oBAAoB,OAAA"}
|
package/dist/run.d.ts
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Task
|
|
3
|
+
*
|
|
4
|
+
* Main entrypoint for Nella Core. Orchestrates:
|
|
5
|
+
* - Prerequisite checking
|
|
6
|
+
* - Refusal detection
|
|
7
|
+
* - Change application
|
|
8
|
+
* - Constraint validation
|
|
9
|
+
* - Command validation
|
|
10
|
+
* - Scope checking
|
|
11
|
+
* - Metrics calculation
|
|
12
|
+
* - Artifact generation
|
|
13
|
+
*/
|
|
14
|
+
import { Task, Changes, RunResult, Plan, ConstraintResult, RefusalResult, ValidationResult, ScopeResult } from "./types";
|
|
15
|
+
export interface RunTaskOptions {
|
|
16
|
+
/** Skip refusal check */
|
|
17
|
+
skipRefusalCheck?: boolean;
|
|
18
|
+
/** Skip prerequisite checks */
|
|
19
|
+
skipPrerequisites?: boolean;
|
|
20
|
+
/** Skip validation commands */
|
|
21
|
+
skipValidation?: boolean;
|
|
22
|
+
/** Custom timeout for validation commands (ms) */
|
|
23
|
+
validationTimeout?: number;
|
|
24
|
+
/** Don't create artifacts */
|
|
25
|
+
skipArtifacts?: boolean;
|
|
26
|
+
/** Pre-declared plan from agent */
|
|
27
|
+
plan?: Plan;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a task should be refused (pre-flight check)
|
|
31
|
+
*/
|
|
32
|
+
export declare function check(task: Task, workspacePath: string, options?: {
|
|
33
|
+
skipPrerequisites?: boolean;
|
|
34
|
+
}): RefusalResult;
|
|
35
|
+
/**
|
|
36
|
+
* Validate changes against constraints and run validation commands
|
|
37
|
+
*/
|
|
38
|
+
export declare function validate(task: Task, workspacePath: string, changes: Changes, options?: RunTaskOptions): Promise<{
|
|
39
|
+
constraints: ConstraintResult[];
|
|
40
|
+
validation: ValidationResult | null;
|
|
41
|
+
scope: ScopeResult;
|
|
42
|
+
passed: boolean;
|
|
43
|
+
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Run a complete task validation
|
|
46
|
+
*
|
|
47
|
+
* This is the main entrypoint for Nella Core. It:
|
|
48
|
+
* 1. Checks if the task should be refused
|
|
49
|
+
* 2. Applies changes to a temporary workspace
|
|
50
|
+
* 3. Validates constraints
|
|
51
|
+
* 4. Runs validation commands (test/lint/compile)
|
|
52
|
+
* 5. Checks for scope creep
|
|
53
|
+
* 6. Computes metrics
|
|
54
|
+
* 7. Writes artifacts
|
|
55
|
+
*
|
|
56
|
+
* @param repoPath - Path to the repository
|
|
57
|
+
* @param task - Task definition
|
|
58
|
+
* @param changes - Changes to validate (optional)
|
|
59
|
+
* @param options - Run options
|
|
60
|
+
* @returns Complete run result
|
|
61
|
+
*/
|
|
62
|
+
export declare function runTask(repoPath: string, task: Task, changes?: Changes, options?: RunTaskOptions): Promise<RunResult>;
|
|
63
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,IAAI,EACJ,OAAO,EACP,SAAS,EACT,IAAI,EAEJ,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,WAAW,EAEZ,MAAM,SAAS,CAAC;AAsCjB,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,+BAA+B;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,+BAA+B;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,6BAA6B;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,mCAAmC;IACnC,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAMD;;GAEG;AACH,wBAAgB,KAAK,CACnB,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5C,aAAa,CAKf;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC;IACT,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC,CA2CD;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,OAAO,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,SAAS,CAAC,CAkLpB"}
|
package/dist/run.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Run Task
|
|
4
|
+
*
|
|
5
|
+
* Main entrypoint for Nella Core. Orchestrates:
|
|
6
|
+
* - Prerequisite checking
|
|
7
|
+
* - Refusal detection
|
|
8
|
+
* - Change application
|
|
9
|
+
* - Constraint validation
|
|
10
|
+
* - Command validation
|
|
11
|
+
* - Scope checking
|
|
12
|
+
* - Metrics calculation
|
|
13
|
+
* - Artifact generation
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.check = check;
|
|
17
|
+
exports.validate = validate;
|
|
18
|
+
exports.runTask = runTask;
|
|
19
|
+
const constraint_checker_1 = require("./validators/constraint-checker");
|
|
20
|
+
const scope_checker_1 = require("./validators/scope-checker");
|
|
21
|
+
const command_runner_1 = require("./validators/command-runner");
|
|
22
|
+
const refusal_detector_1 = require("./safety/refusal-detector");
|
|
23
|
+
const logger_1 = require("./utils/logger");
|
|
24
|
+
const workspace_1 = require("./utils/workspace");
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// Individual Check Functions (for granular MCP tools)
|
|
27
|
+
// =============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* Check if a task should be refused (pre-flight check)
|
|
30
|
+
*/
|
|
31
|
+
function check(task, workspacePath, options = {}) {
|
|
32
|
+
return (0, refusal_detector_1.shouldRefuse)(task, workspacePath, {
|
|
33
|
+
skipPrerequisites: options.skipPrerequisites,
|
|
34
|
+
taskRefusalPatterns: task.refusalPatterns,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate changes against constraints and run validation commands
|
|
39
|
+
*/
|
|
40
|
+
async function validate(task, workspacePath, changes, options = {}) {
|
|
41
|
+
// Create temp workspace
|
|
42
|
+
const tempDir = (0, workspace_1.createTempWorkspace)(workspacePath);
|
|
43
|
+
try {
|
|
44
|
+
// Apply changes
|
|
45
|
+
(0, workspace_1.applyChanges)(tempDir, changes.files);
|
|
46
|
+
// Get diff
|
|
47
|
+
const diff = changes.diff ?? (0, workspace_1.getDiff)(tempDir);
|
|
48
|
+
const modifiedFiles = changes.files.map((f) => f.path) || (0, workspace_1.getModifiedFiles)(tempDir);
|
|
49
|
+
// Check constraints
|
|
50
|
+
const constraints = (0, constraint_checker_1.checkConstraints)(modifiedFiles, diff, task.constraints);
|
|
51
|
+
// Check scope
|
|
52
|
+
const scope = (0, scope_checker_1.checkScope)(modifiedFiles, task.expected);
|
|
53
|
+
// Run validation (unless skipped)
|
|
54
|
+
let validation = null;
|
|
55
|
+
if (!options.skipValidation && task.validation) {
|
|
56
|
+
validation = (0, command_runner_1.runValidation)(task.validation, tempDir, options.validationTimeout);
|
|
57
|
+
}
|
|
58
|
+
// Determine if passed
|
|
59
|
+
const constraintsPassed = constraints.every((c) => c.passed);
|
|
60
|
+
const validationPassed = validation === null || validation.allPassed;
|
|
61
|
+
const passed = constraintsPassed && validationPassed;
|
|
62
|
+
return {
|
|
63
|
+
constraints,
|
|
64
|
+
validation,
|
|
65
|
+
scope,
|
|
66
|
+
passed,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
(0, workspace_1.cleanupTempWorkspace)(tempDir);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// =============================================================================
|
|
74
|
+
// Main Entry Point
|
|
75
|
+
// =============================================================================
|
|
76
|
+
/**
|
|
77
|
+
* Run a complete task validation
|
|
78
|
+
*
|
|
79
|
+
* This is the main entrypoint for Nella Core. It:
|
|
80
|
+
* 1. Checks if the task should be refused
|
|
81
|
+
* 2. Applies changes to a temporary workspace
|
|
82
|
+
* 3. Validates constraints
|
|
83
|
+
* 4. Runs validation commands (test/lint/compile)
|
|
84
|
+
* 5. Checks for scope creep
|
|
85
|
+
* 6. Computes metrics
|
|
86
|
+
* 7. Writes artifacts
|
|
87
|
+
*
|
|
88
|
+
* @param repoPath - Path to the repository
|
|
89
|
+
* @param task - Task definition
|
|
90
|
+
* @param changes - Changes to validate (optional)
|
|
91
|
+
* @param options - Run options
|
|
92
|
+
* @returns Complete run result
|
|
93
|
+
*/
|
|
94
|
+
async function runTask(repoPath, task, changes, options = {}) {
|
|
95
|
+
const runId = (0, logger_1.generateRunId)();
|
|
96
|
+
const timestamp = new Date().toISOString();
|
|
97
|
+
const errors = [];
|
|
98
|
+
// Create run directory for artifacts
|
|
99
|
+
let runDir = null;
|
|
100
|
+
let logger = null;
|
|
101
|
+
if (!options.skipArtifacts) {
|
|
102
|
+
runDir = (0, workspace_1.createNellaDir)(repoPath, runId);
|
|
103
|
+
logger = new logger_1.RunLogger(runDir);
|
|
104
|
+
}
|
|
105
|
+
// Initialize result
|
|
106
|
+
let refusal = null;
|
|
107
|
+
let constraints = [];
|
|
108
|
+
let validation = null;
|
|
109
|
+
let scope = null;
|
|
110
|
+
let artifacts = null;
|
|
111
|
+
let passed = false;
|
|
112
|
+
try {
|
|
113
|
+
// Step 1: Refusal check
|
|
114
|
+
if (!options.skipRefusalCheck) {
|
|
115
|
+
refusal = check(task, repoPath, {
|
|
116
|
+
skipPrerequisites: options.skipPrerequisites,
|
|
117
|
+
});
|
|
118
|
+
if (refusal.shouldRefuse) {
|
|
119
|
+
logger?.logRefusal(refusal.reason, refusal.patternsMatched);
|
|
120
|
+
// Early return for refusal
|
|
121
|
+
const metrics = calculateMetrics([], null, null, task, true);
|
|
122
|
+
logger?.logMetrics(metrics);
|
|
123
|
+
if (runDir) {
|
|
124
|
+
artifacts = (0, workspace_1.writeArtifacts)(runDir, "", metrics);
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
runId,
|
|
128
|
+
timestamp,
|
|
129
|
+
taskId: task.id,
|
|
130
|
+
plan: options.plan ?? null,
|
|
131
|
+
constraints: [],
|
|
132
|
+
refusal,
|
|
133
|
+
validation: null,
|
|
134
|
+
scope: null,
|
|
135
|
+
metrics,
|
|
136
|
+
passed: false,
|
|
137
|
+
artifacts,
|
|
138
|
+
errors,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Step 2: If no changes provided, we're just doing a check
|
|
143
|
+
if (!changes) {
|
|
144
|
+
const metrics = calculateMetrics([], null, null, task, false);
|
|
145
|
+
return {
|
|
146
|
+
runId,
|
|
147
|
+
timestamp,
|
|
148
|
+
taskId: task.id,
|
|
149
|
+
plan: options.plan ?? null,
|
|
150
|
+
constraints: [],
|
|
151
|
+
refusal,
|
|
152
|
+
validation: null,
|
|
153
|
+
scope: null,
|
|
154
|
+
metrics,
|
|
155
|
+
passed: true,
|
|
156
|
+
artifacts: null,
|
|
157
|
+
errors,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// Step 3: Validate changes
|
|
161
|
+
logger?.logPlan(changes.files.map((f) => f.path), options.plan?.summary ?? "Changes provided");
|
|
162
|
+
const tempDir = (0, workspace_1.createTempWorkspace)(repoPath);
|
|
163
|
+
try {
|
|
164
|
+
// Apply changes to temp workspace
|
|
165
|
+
const modifiedFiles = (0, workspace_1.applyChanges)(tempDir, changes.files);
|
|
166
|
+
// Get diff
|
|
167
|
+
const diff = changes.diff ?? (0, workspace_1.getDiff)(tempDir);
|
|
168
|
+
// Check constraints
|
|
169
|
+
constraints = (0, constraint_checker_1.checkConstraints)(modifiedFiles, diff, task.constraints);
|
|
170
|
+
for (const c of constraints) {
|
|
171
|
+
logger?.logConstraintCheck(c.id, c.passed, c.violationDetails);
|
|
172
|
+
}
|
|
173
|
+
// Check scope
|
|
174
|
+
scope = (0, scope_checker_1.checkScope)(modifiedFiles, task.expected);
|
|
175
|
+
logger?.logScopeCheck(scope.extraFiles, scope.missingFiles, scope.scopeCreepRatio);
|
|
176
|
+
// Run validation commands
|
|
177
|
+
if (!options.skipValidation && task.validation) {
|
|
178
|
+
validation = (0, command_runner_1.runValidation)(task.validation, tempDir, options.validationTimeout);
|
|
179
|
+
if (validation.test) {
|
|
180
|
+
logger?.logValidation("test", validation.test.success, validation.test.exitCode);
|
|
181
|
+
}
|
|
182
|
+
if (validation.lint) {
|
|
183
|
+
logger?.logValidation("lint", validation.lint.success, validation.lint.exitCode);
|
|
184
|
+
}
|
|
185
|
+
if (validation.compile) {
|
|
186
|
+
logger?.logValidation("compile", validation.compile.success, validation.compile.exitCode);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Determine overall pass
|
|
190
|
+
const constraintsPassed = constraints.every((c) => c.passed);
|
|
191
|
+
const validationPassed = validation === null || validation.allPassed;
|
|
192
|
+
passed = constraintsPassed && validationPassed;
|
|
193
|
+
// Calculate metrics
|
|
194
|
+
const metrics = calculateMetrics(constraints, validation, scope, task, false);
|
|
195
|
+
logger?.logMetrics(metrics);
|
|
196
|
+
// Write artifacts
|
|
197
|
+
if (runDir) {
|
|
198
|
+
artifacts = (0, workspace_1.writeArtifacts)(runDir, diff, metrics);
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
runId,
|
|
202
|
+
timestamp,
|
|
203
|
+
taskId: task.id,
|
|
204
|
+
plan: options.plan ?? null,
|
|
205
|
+
constraints,
|
|
206
|
+
refusal,
|
|
207
|
+
validation,
|
|
208
|
+
scope,
|
|
209
|
+
metrics,
|
|
210
|
+
passed,
|
|
211
|
+
artifacts,
|
|
212
|
+
errors,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
(0, workspace_1.cleanupTempWorkspace)(tempDir);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
const error = e instanceof Error ? e.message : String(e);
|
|
221
|
+
errors.push(error);
|
|
222
|
+
logger?.logError(error);
|
|
223
|
+
const metrics = calculateMetrics(constraints, validation, scope, task, false);
|
|
224
|
+
return {
|
|
225
|
+
runId,
|
|
226
|
+
timestamp,
|
|
227
|
+
taskId: task.id,
|
|
228
|
+
plan: options.plan ?? null,
|
|
229
|
+
constraints,
|
|
230
|
+
refusal,
|
|
231
|
+
validation,
|
|
232
|
+
scope,
|
|
233
|
+
metrics,
|
|
234
|
+
passed: false,
|
|
235
|
+
artifacts,
|
|
236
|
+
errors,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// =============================================================================
|
|
241
|
+
// Metrics Calculation
|
|
242
|
+
// =============================================================================
|
|
243
|
+
function calculateMetrics(constraints, validation, scope, task, refused) {
|
|
244
|
+
const scopeCreep = scope?.scopeCreepRatio ?? 0;
|
|
245
|
+
const constraintViolations = (0, constraint_checker_1.countViolations)(constraints);
|
|
246
|
+
const validationIntegrity = validation
|
|
247
|
+
? (0, command_runner_1.calculateValidationIntegrity)(validation)
|
|
248
|
+
: 1;
|
|
249
|
+
const refusalCorrectness = task.refusalExpected !== undefined
|
|
250
|
+
? (0, refusal_detector_1.checkRefusalCorrectness)(task, refused)
|
|
251
|
+
: null;
|
|
252
|
+
return {
|
|
253
|
+
scopeCreep,
|
|
254
|
+
constraintViolations,
|
|
255
|
+
validationIntegrity,
|
|
256
|
+
refusalCorrectness,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=run.js.map
|
package/dist/run.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/safety/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Safety - Re-exports
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
__exportStar(require("./refusal-detector"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/safety/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,qDAAmC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refusal Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects when a task should be refused based on:
|
|
5
|
+
* - Risk patterns in the prompt
|
|
6
|
+
* - Missing prerequisites
|
|
7
|
+
* - Impossible constraints
|
|
8
|
+
*/
|
|
9
|
+
import { Task, RefusalResult } from "../types";
|
|
10
|
+
/**
|
|
11
|
+
* Patterns that indicate risky requests
|
|
12
|
+
*/
|
|
13
|
+
export declare const RISK_PATTERNS: RegExp[];
|
|
14
|
+
/**
|
|
15
|
+
* Patterns that indicate an agent is refusing
|
|
16
|
+
*/
|
|
17
|
+
export declare const REFUSAL_RESPONSE_PATTERNS: RegExp[];
|
|
18
|
+
export interface PrerequisiteCheck {
|
|
19
|
+
name: string;
|
|
20
|
+
passed: boolean;
|
|
21
|
+
message: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Run prerequisite checks for a workspace
|
|
25
|
+
*/
|
|
26
|
+
export declare function checkPrerequisites(workspacePath: string): PrerequisiteCheck[];
|
|
27
|
+
/**
|
|
28
|
+
* Check if a prompt contains risk patterns
|
|
29
|
+
*/
|
|
30
|
+
export declare function detectRiskPatterns(prompt: string): string[];
|
|
31
|
+
/**
|
|
32
|
+
* Check if an agent response indicates refusal
|
|
33
|
+
*/
|
|
34
|
+
export declare function detectRefusalInResponse(response: string): boolean;
|
|
35
|
+
export interface RefusalCheckOptions {
|
|
36
|
+
/** Skip prerequisite checks */
|
|
37
|
+
skipPrerequisites?: boolean;
|
|
38
|
+
/** Additional risk patterns to check */
|
|
39
|
+
additionalPatterns?: RegExp[];
|
|
40
|
+
/** Patterns from task definition */
|
|
41
|
+
taskRefusalPatterns?: string[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Determine if a task should be refused
|
|
45
|
+
*
|
|
46
|
+
* @param task - Task to evaluate
|
|
47
|
+
* @param workspacePath - Path to workspace
|
|
48
|
+
* @param options - Check options
|
|
49
|
+
* @returns Refusal result with reason and confidence
|
|
50
|
+
*/
|
|
51
|
+
export declare function shouldRefuse(task: Task, workspacePath: string, options?: RefusalCheckOptions): RefusalResult;
|
|
52
|
+
/**
|
|
53
|
+
* Check if a task expects refusal and whether refusal was correct
|
|
54
|
+
*
|
|
55
|
+
* @param task - Task definition
|
|
56
|
+
* @param agentRefused - Whether the agent refused
|
|
57
|
+
* @returns true if correct, false if incorrect, null if not a refusal task
|
|
58
|
+
*/
|
|
59
|
+
export declare function checkRefusalCorrectness(task: Task, agentRefused: boolean): boolean | null;
|
|
60
|
+
//# sourceMappingURL=refusal-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusal-detector.d.ts","sourceRoot":"","sources":["../../src/safety/refusal-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAM/C;;GAEG;AACH,eAAO,MAAM,aAAa,UAoCzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,UAgBrC,CAAC;AAMF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AA6BD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAwB7E;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAU3D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEjE;AAMD,MAAM,WAAW,mBAAmB;IAClC,+BAA+B;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,wCAAwC;IACxC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE9B,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,mBAAwB,GAChC,aAAa,CAuDf;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,OAAO,GACpB,OAAO,GAAG,IAAI,CAQhB"}
|