@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.
Files changed (62) hide show
  1. package/README.md +82 -0
  2. package/dist/index.d.ts +25 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +85 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/run.d.ts +63 -0
  7. package/dist/run.d.ts.map +1 -0
  8. package/dist/run.js +259 -0
  9. package/dist/run.js.map +1 -0
  10. package/dist/safety/index.d.ts +5 -0
  11. package/dist/safety/index.d.ts.map +1 -0
  12. package/dist/safety/index.js +21 -0
  13. package/dist/safety/index.js.map +1 -0
  14. package/dist/safety/refusal-detector.d.ts +60 -0
  15. package/dist/safety/refusal-detector.d.ts.map +1 -0
  16. package/dist/safety/refusal-detector.js +250 -0
  17. package/dist/safety/refusal-detector.js.map +1 -0
  18. package/dist/types/agent.d.ts +39 -0
  19. package/dist/types/agent.d.ts.map +1 -0
  20. package/dist/types/agent.js +8 -0
  21. package/dist/types/agent.js.map +1 -0
  22. package/dist/types/index.d.ts +7 -0
  23. package/dist/types/index.d.ts.map +1 -0
  24. package/dist/types/index.js +23 -0
  25. package/dist/types/index.js.map +1 -0
  26. package/dist/types/result.d.ts +166 -0
  27. package/dist/types/result.d.ts.map +1 -0
  28. package/dist/types/result.js +8 -0
  29. package/dist/types/result.js.map +1 -0
  30. package/dist/types/task.d.ts +105 -0
  31. package/dist/types/task.d.ts.map +1 -0
  32. package/dist/types/task.js +8 -0
  33. package/dist/types/task.js.map +1 -0
  34. package/dist/utils/index.d.ts +6 -0
  35. package/dist/utils/index.d.ts.map +1 -0
  36. package/dist/utils/index.js +22 -0
  37. package/dist/utils/index.js.map +1 -0
  38. package/dist/utils/logger.d.ts +56 -0
  39. package/dist/utils/logger.d.ts.map +1 -0
  40. package/dist/utils/logger.js +127 -0
  41. package/dist/utils/logger.js.map +1 -0
  42. package/dist/utils/workspace.d.ts +45 -0
  43. package/dist/utils/workspace.d.ts.map +1 -0
  44. package/dist/utils/workspace.js +199 -0
  45. package/dist/utils/workspace.js.map +1 -0
  46. package/dist/validators/command-runner.d.ts +33 -0
  47. package/dist/validators/command-runner.d.ts.map +1 -0
  48. package/dist/validators/command-runner.js +135 -0
  49. package/dist/validators/command-runner.js.map +1 -0
  50. package/dist/validators/constraint-checker.d.ts +37 -0
  51. package/dist/validators/constraint-checker.d.ts.map +1 -0
  52. package/dist/validators/constraint-checker.js +127 -0
  53. package/dist/validators/constraint-checker.js.map +1 -0
  54. package/dist/validators/index.d.ts +7 -0
  55. package/dist/validators/index.d.ts.map +1 -0
  56. package/dist/validators/index.js +23 -0
  57. package/dist/validators/index.js.map +1 -0
  58. package/dist/validators/scope-checker.d.ts +15 -0
  59. package/dist/validators/scope-checker.d.ts.map +1 -0
  60. package/dist/validators/scope-checker.js +64 -0
  61. package/dist/validators/scope-checker.js.map +1 -0
  62. 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
+
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Safety - Re-exports
3
+ */
4
+ export * from "./refusal-detector";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}