pi-harness-runtime 0.9.25 → 0.10.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/CHANGELOG.md +27 -7
- package/README.md +51 -51
- package/harness/auto-compact.ts +1 -1
- package/harness/autonomous-review.ts +88 -0
- package/harness/context-compact-orchestrator.ts +23 -23
- package/harness/context-window-manager.ts +5 -5
- package/harness/continue-prompt.ts +3 -3
- package/harness/e2e/minimax-quota-scraper.ts +1 -1
- package/harness/forked-summarizer.ts +4 -4
- package/harness/herdr-agents.ts +91 -0
- package/harness/index.ts +5 -5
- package/harness/loop-code-agent.ts +284 -0
- package/harness/loop-controller.ts +201 -0
- package/harness/loop-review-agent.ts +295 -0
- package/harness/loop-runtime.ts +10 -10
- package/harness/loop-types.ts +118 -0
- package/harness/notification-events.ts +3 -3
- package/harness/output-limit-handler.ts +1 -1
- package/harness/partial-recovery.ts +3 -3
- package/harness/session-memory.ts +5 -5
- package/index.ts +46 -32
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/a2a-adapter/src/types.ts +5 -5
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/dist/inbox.d.ts +3 -3
- package/packages/autonomous-runtime/dist/inbox.js +12 -12
- package/packages/autonomous-runtime/dist/lease.js +14 -14
- package/packages/autonomous-runtime/dist/types.js +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/autonomous-runtime/src/inbox.ts +12 -12
- package/packages/autonomous-runtime/src/lease.ts +15 -15
- package/packages/autonomous-runtime/src/types.ts +13 -13
- package/packages/autonomous-runtime/tsconfig.tsbuildinfo +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/dist/types.js +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/capability-registry/src/types.ts +5 -5
- package/packages/checkpoint/README.md +6 -6
- package/packages/checkpoint/dist/differ.js +2 -2
- package/packages/checkpoint/dist/engine.js +3 -3
- package/packages/checkpoint/dist/index.js +5 -5
- package/packages/checkpoint/dist/storage.js +3 -3
- package/packages/checkpoint/dist/types.js +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/checkpoint/src/differ.ts +2 -2
- package/packages/checkpoint/src/engine.ts +3 -3
- package/packages/checkpoint/src/index.ts +5 -5
- package/packages/checkpoint/src/storage.ts +3 -3
- package/packages/checkpoint/src/types.ts +10 -10
- package/packages/checkpoint/tsconfig.tsbuildinfo +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/dist/src/clipboard.d.ts.map +1 -1
- package/packages/clipboard/dist/src/clipboard.js +15 -7
- package/packages/clipboard/dist/src/clipboard.js.map +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard/src/clipboard.ts +16 -9
- package/packages/code-generation/README.md +13 -13
- package/packages/code-generation/dist/faker.js +4 -4
- package/packages/code-generation/dist/generator.js +3 -3
- package/packages/code-generation/dist/index.js +3 -3
- package/packages/code-generation/dist/templates/registry.js +1 -1
- package/packages/code-generation/dist/types.js +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-generation/src/faker.ts +5 -5
- package/packages/code-generation/src/generator.ts +4 -4
- package/packages/code-generation/src/index.ts +3 -3
- package/packages/code-generation/src/templates/registry.ts +1 -1
- package/packages/code-generation/src/types.ts +10 -10
- package/packages/code-generation/tsconfig.tsbuildinfo +1 -1
- package/packages/code-review/README.md +13 -13
- package/packages/code-review/dist/engine.js +3 -3
- package/packages/code-review/dist/index.js +3 -3
- package/packages/code-review/dist/types.js +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/code-review/src/engine.ts +3 -3
- package/packages/code-review/src/index.ts +3 -3
- package/packages/code-review/src/types.ts +10 -10
- package/packages/code-review/tsconfig.tsbuildinfo +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/context-compiler/dist/compiler.js +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-compiler/src/compiler.ts +1 -1
- package/packages/context-compiler/src/types.ts +11 -11
- package/packages/context-compiler/test/context-compiler.test.ts +11 -11
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/README.md +27 -27
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/cost-optimizer/src/types.ts +5 -5
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/dist/analyzer.js +7 -7
- package/packages/django-plugin/package.json +1 -1
- package/packages/django-plugin/src/analyzer.ts +7 -7
- package/packages/doc-generator/package.json +1 -1
- package/packages/evaluation-engine/dist/engine.js +9 -9
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-engine/src/engine.ts +9 -9
- package/packages/evaluation-engine/src/types.ts +3 -3
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/dist/src/herdr-bus.d.ts +121 -0
- package/packages/event-bus/dist/src/herdr-bus.d.ts.map +1 -0
- package/packages/event-bus/dist/src/herdr-bus.js +322 -0
- package/packages/event-bus/dist/src/herdr-bus.js.map +1 -0
- package/packages/event-bus/dist/src/index.d.ts +2 -0
- package/packages/event-bus/dist/src/index.d.ts.map +1 -1
- package/packages/event-bus/dist/src/index.js +1 -0
- package/packages/event-bus/dist/src/index.js.map +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-bus/src/herdr-bus.ts +525 -0
- package/packages/event-bus/src/index.ts +29 -0
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/dist/replay.js +7 -7
- package/packages/experience-replay/package.json +1 -1
- package/packages/experience-replay/src/replay.ts +7 -7
- package/packages/experience-replay/src/types.ts +5 -5
- package/packages/feedback-collector/package.json +1 -1
- package/packages/framework-detector/README.md +18 -18
- package/packages/framework-detector/dist/detector.js +3 -3
- package/packages/framework-detector/dist/index.js +3 -3
- package/packages/framework-detector/dist/signatures/registry.js +24 -24
- package/packages/framework-detector/dist/types.js +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-detector/src/detector.ts +3 -3
- package/packages/framework-detector/src/index.ts +3 -3
- package/packages/framework-detector/src/signatures/registry.ts +24 -24
- package/packages/framework-detector/src/types.ts +7 -7
- package/packages/framework-detector/tsconfig.tsbuildinfo +1 -1
- package/packages/framework-plugin-sdk/README.md +23 -23
- package/packages/framework-plugin-sdk/dist/index.js +2 -2
- package/packages/framework-plugin-sdk/dist/manager.js +3 -3
- package/packages/framework-plugin-sdk/dist/types.js +2 -2
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/framework-plugin-sdk/src/index.ts +2 -2
- package/packages/framework-plugin-sdk/src/manager.ts +3 -3
- package/packages/framework-plugin-sdk/src/types.ts +10 -10
- package/packages/framework-plugin-sdk/tsconfig.tsbuildinfo +1 -1
- package/packages/frappe-plugin/dist/analyzer.js +8 -8
- package/packages/frappe-plugin/dist/types.js +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/frappe-plugin/src/analyzer.ts +8 -8
- package/packages/frappe-plugin/src/types.ts +10 -10
- package/packages/generic-web-plugin/dist/analyzer.js +5 -5
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/generic-web-plugin/src/analyzer.ts +5 -5
- package/packages/health-monitor/package.json +1 -1
- package/packages/health-monitor/src/monitor.ts +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/laravel-plugin/dist/analyzer.js +11 -11
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/laravel-plugin/src/analyzer.ts +11 -11
- package/packages/learning-engine/dist/engine.js +5 -5
- package/packages/learning-engine/dist/types.js +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/learning-engine/src/engine.ts +5 -5
- package/packages/learning-engine/src/types.ts +6 -6
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/dist/engine.js +8 -8
- package/packages/memory-engine/dist/types.js +2 -2
- package/packages/memory-engine/package.json +1 -1
- package/packages/memory-engine/src/engine.ts +8 -8
- package/packages/memory-engine/src/types.ts +9 -9
- package/packages/model-registry/package.json +1 -1
- package/packages/model-registry/src/types.ts +4 -4
- package/packages/nextjs-plugin/dist/analyzer.js +9 -9
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/nextjs-plugin/src/analyzer.ts +9 -9
- package/packages/notification/dist/notification-center.js +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/notification/src/notification-center.ts +1 -1
- package/packages/observability/dist/alerts.js +2 -2
- package/packages/observability/dist/health.js +4 -4
- package/packages/observability/dist/index.js +6 -6
- package/packages/observability/dist/logger.js +7 -7
- package/packages/observability/dist/metrics.js +11 -11
- package/packages/observability/dist/tracer.js +3 -3
- package/packages/observability/dist/types.js +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/observability/src/alerts.ts +2 -2
- package/packages/observability/src/health.ts +4 -4
- package/packages/observability/src/index.ts +6 -6
- package/packages/observability/src/logger.ts +7 -7
- package/packages/observability/src/metrics.ts +11 -11
- package/packages/observability/src/tracer.ts +3 -3
- package/packages/observability/src/types.ts +7 -7
- package/packages/observability/test/observability.test.ts +4 -4
- package/packages/observability/tsconfig.tsbuildinfo +1 -1
- package/packages/performance-optimizer/dist/optimizer.js +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/performance-optimizer/src/optimizer.ts +1 -1
- package/packages/performance-optimizer/src/types.ts +4 -4
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/dist/analyzer.js +4 -4
- package/packages/project-analyzer/dist/index.js +8 -8
- package/packages/project-analyzer/dist/signals.js +3 -3
- package/packages/project-analyzer/dist/types.js +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-analyzer/src/analyzer.ts +4 -4
- package/packages/project-analyzer/src/index.ts +9 -9
- package/packages/project-analyzer/src/signals.ts +4 -4
- package/packages/project-analyzer/src/types.ts +15 -15
- package/packages/project-analyzer/test/index.test.ts +17 -17
- package/packages/project-analyzer/tsconfig.tsbuildinfo +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/dist/section-builder.js +1 -1
- package/packages/prompt-compiler/dist/types.js +3 -3
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-compiler/src/section-builder.ts +1 -1
- package/packages/prompt-compiler/src/types.ts +12 -12
- package/packages/prompt-compiler/test/prompt-compiler.test.ts +12 -12
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/dist/builder.js +1 -1
- package/packages/provider-adapter-sdk/dist/index.js +5 -5
- package/packages/provider-adapter-sdk/dist/registry.js +1 -1
- package/packages/provider-adapter-sdk/dist/tester.js +1 -1
- package/packages/provider-adapter-sdk/dist/types.js +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-adapter-sdk/src/builder.ts +1 -1
- package/packages/provider-adapter-sdk/src/index.ts +6 -6
- package/packages/provider-adapter-sdk/src/registry.ts +1 -1
- package/packages/provider-adapter-sdk/src/tester.ts +1 -1
- package/packages/provider-adapter-sdk/src/types.ts +5 -5
- package/packages/provider-adapter-sdk/tsconfig.tsbuildinfo +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-router/src/types.ts +4 -4
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/dist/deepagents-adapter.js +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/providers/src/deepagents-adapter.ts +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/dist/analyzer.js +7 -7
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/react-vite-plugin/src/analyzer.ts +7 -7
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/dist/compiler.js +17 -17
- package/packages/requirement-compiler/dist/types.js +2 -2
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/requirement-compiler/src/compiler.ts +17 -17
- package/packages/requirement-compiler/src/types.ts +21 -21
- package/packages/requirement-compiler/test/requirement-compiler.test.ts +17 -17
- package/packages/runtime/dist/command-executor.js +1 -1
- package/packages/runtime/dist/local-runtime-agent.js +1 -1
- package/packages/runtime/dist/policy-engine.js +1 -1
- package/packages/runtime/dist/runtime-api.js +1 -1
- package/packages/runtime/dist/workspace-manager.js +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/runtime/src/command-executor.ts +1 -1
- package/packages/runtime/src/local-runtime-agent.ts +1 -1
- package/packages/runtime/src/policy-engine.ts +1 -1
- package/packages/runtime/src/runtime-api.ts +1 -1
- package/packages/runtime/src/workspace-manager.ts +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/README.md +18 -18
- package/packages/session/dist/history.js +3 -3
- package/packages/session/dist/index.js +5 -5
- package/packages/session/dist/manager.js +3 -3
- package/packages/session/dist/policy.js +2 -2
- package/packages/session/dist/store.js +2 -2
- package/packages/session/dist/types.js +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session/src/history.ts +3 -3
- package/packages/session/src/index.ts +5 -5
- package/packages/session/src/manager.ts +3 -3
- package/packages/session/src/policy.ts +4 -4
- package/packages/session/src/store.ts +3 -3
- package/packages/session/src/types.ts +10 -10
- package/packages/session/tsconfig.tsbuildinfo +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skill-registry/src/types.ts +4 -4
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/dist/compiler.js +7 -7
- package/packages/task-compiler/dist/decompose.js +11 -11
- package/packages/task-compiler/dist/file-scope.js +6 -6
- package/packages/task-compiler/dist/graph.js +6 -6
- package/packages/task-compiler/dist/index.js +2 -2
- package/packages/task-compiler/dist/types.js +5 -5
- package/packages/task-compiler/dist/validate.js +2 -2
- package/packages/task-compiler/dist/verification.js +2 -2
- package/packages/task-compiler/package.json +1 -1
- package/packages/task-compiler/src/command-policy.ts +1 -1
- package/packages/task-compiler/src/compiler.ts +7 -7
- package/packages/task-compiler/src/decompose.ts +11 -11
- package/packages/task-compiler/src/file-scope.ts +6 -6
- package/packages/task-compiler/src/graph.ts +6 -6
- package/packages/task-compiler/src/index.ts +3 -3
- package/packages/task-compiler/src/types.ts +14 -14
- package/packages/task-compiler/src/validate.ts +2 -2
- package/packages/task-compiler/src/verification.ts +2 -2
- package/packages/task-compiler/test/task-compiler.test.ts +10 -10
- package/packages/test-data-generator/README.md +13 -13
- package/packages/test-data-generator/dist/faker-adapter.js +4 -4
- package/packages/test-data-generator/dist/generator.js +3 -3
- package/packages/test-data-generator/dist/index.js +3 -3
- package/packages/test-data-generator/dist/types.js +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-data-generator/src/faker-adapter.ts +4 -4
- package/packages/test-data-generator/src/generator.ts +3 -3
- package/packages/test-data-generator/src/index.ts +3 -3
- package/packages/test-data-generator/src/types.ts +9 -9
- package/packages/test-data-generator/tsconfig.tsbuildinfo +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/types/src/agent-worker-types.ts +5 -5
- package/packages/types/src/runtime-types.ts +12 -12
- package/packages/types/tsconfig.tsbuildinfo +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/renderer.ts +7 -7
- package/skills/harness-runtime/SKILL.md +15 -15
|
@@ -18,24 +18,24 @@ export async function compileRequirement(raw, deps) {
|
|
|
18
18
|
...deps,
|
|
19
19
|
};
|
|
20
20
|
const clock = deps?.clock ?? (() => new Date());
|
|
21
|
-
//
|
|
21
|
+
// --- Pre-flight validation ------------------------------------------------
|
|
22
22
|
if (!raw.text.trim() && !raw.title?.trim()) {
|
|
23
23
|
throw new RequirementCompileError(RequirementCompileErrorCodes.EMPTY_REQUIREMENT, `Requirement ${raw.id} has no text or title.`, { requirementId: raw.id });
|
|
24
24
|
}
|
|
25
|
-
//
|
|
25
|
+
// --- Step 1: Extract statements -----------------------------------------
|
|
26
26
|
const extractor = deps?.extractor ?? { extract: extractStatements };
|
|
27
27
|
const extractionResult = extractor.extract(raw);
|
|
28
|
-
//
|
|
28
|
+
// --- Step 2: Classify statements --------------------------------------
|
|
29
29
|
const classifier = deps?.classifier ?? { classify: classifyStatements };
|
|
30
30
|
const classification = classifier.classify(extractionResult.statements, config);
|
|
31
|
-
//
|
|
31
|
+
// --- Step 3: Build goals -------------------------------------------------
|
|
32
32
|
const goals = classification.goals.map((stmt, i) => ({
|
|
33
33
|
id: `goal-${i + 1}`,
|
|
34
34
|
description: stmt.originalText,
|
|
35
35
|
sourceRefs: [stmt.sourceRef],
|
|
36
36
|
priority: undefined,
|
|
37
37
|
}));
|
|
38
|
-
//
|
|
38
|
+
// --- Step 4: Build constraints --------------------------------------------
|
|
39
39
|
const constraints = classification.constraints.map((stmt, i) => ({
|
|
40
40
|
id: `constraint-${i + 1}`,
|
|
41
41
|
description: stmt.originalText,
|
|
@@ -43,7 +43,7 @@ export async function compileRequirement(raw, deps) {
|
|
|
43
43
|
sourceRefs: [stmt.sourceRef],
|
|
44
44
|
blocking: true,
|
|
45
45
|
}));
|
|
46
|
-
//
|
|
46
|
+
// --- Step 5: Build preferences -------------------------------------------
|
|
47
47
|
const preferenceConstraints = classification.preferences.map((stmt, i) => ({
|
|
48
48
|
id: `pref-constraint-${i + 1}`,
|
|
49
49
|
description: stmt.originalText,
|
|
@@ -51,12 +51,12 @@ export async function compileRequirement(raw, deps) {
|
|
|
51
51
|
sourceRefs: [stmt.sourceRef],
|
|
52
52
|
blocking: false,
|
|
53
53
|
}));
|
|
54
|
-
//
|
|
54
|
+
// --- Step 6: Detect ambiguities -------------------------------------------
|
|
55
55
|
const ambiguityDetector = deps?.ambiguityDetector ?? {
|
|
56
56
|
detect: detectAmbiguities,
|
|
57
57
|
};
|
|
58
58
|
const ambiguities = ambiguityDetector.detect(classification, config);
|
|
59
|
-
//
|
|
59
|
+
// --- Step 7: Normalize acceptance criteria --------------------------------
|
|
60
60
|
const acceptanceNormalizer = deps?.acceptanceNormalizer ?? {
|
|
61
61
|
normalize: normalizeAcceptanceCriteria,
|
|
62
62
|
};
|
|
@@ -74,17 +74,17 @@ export async function compileRequirement(raw, deps) {
|
|
|
74
74
|
automatable: false,
|
|
75
75
|
}));
|
|
76
76
|
}
|
|
77
|
-
//
|
|
77
|
+
// --- Step 8: Detect risks -------------------------------------------------
|
|
78
78
|
const riskDetector = deps?.riskDetector ?? { detect: detectRisks };
|
|
79
79
|
const riskTags = riskDetector.detect(classification);
|
|
80
|
-
//
|
|
80
|
+
// --- Step 9: Extract terminology ------------------------------------------
|
|
81
81
|
const terminology = classification.terminologyMentions.map((stmt) => ({
|
|
82
82
|
term: stmt.originalText,
|
|
83
83
|
definition: stmt.normalizedText,
|
|
84
84
|
language: /[ก-๙]/.test(stmt.originalText) ? "th" : "en",
|
|
85
85
|
sourceRef: stmt.sourceRef,
|
|
86
86
|
}));
|
|
87
|
-
//
|
|
87
|
+
// --- Step 10: Identify actors ----------------------------------------------
|
|
88
88
|
const actors = [];
|
|
89
89
|
const actorNames = new Set();
|
|
90
90
|
// Scan all meaningful statements for actor mentions
|
|
@@ -143,7 +143,7 @@ export async function compileRequirement(raw, deps) {
|
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
|
-
//
|
|
146
|
+
// --- Step 11: Identify non-goals ------------------------------------------
|
|
147
147
|
const nonGoals = [];
|
|
148
148
|
for (const stmt of classification.constraints) {
|
|
149
149
|
// Explicit "will not" or "should not" statements in non-goal context
|
|
@@ -152,7 +152,7 @@ export async function compileRequirement(raw, deps) {
|
|
|
152
152
|
nonGoals.push(stmt.originalText);
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
|
-
//
|
|
155
|
+
// --- Step 12: Build workflows ---------------------------------------------
|
|
156
156
|
const workflows = [];
|
|
157
157
|
// Group consecutive statements into workflows heuristically
|
|
158
158
|
const goalStatements = [
|
|
@@ -170,7 +170,7 @@ export async function compileRequirement(raw, deps) {
|
|
|
170
170
|
sourceRefs: goalStatements.flatMap((s) => [s.sourceRef]),
|
|
171
171
|
});
|
|
172
172
|
}
|
|
173
|
-
//
|
|
173
|
+
// --- Step 13: Determine status --------------------------------------------
|
|
174
174
|
let status = "ready";
|
|
175
175
|
const blockingAmbiguities = ambiguities.filter((a) => a.blocking);
|
|
176
176
|
if (blockingAmbiguities.length > 0 &&
|
|
@@ -196,13 +196,13 @@ export async function compileRequirement(raw, deps) {
|
|
|
196
196
|
(!raw.text.trim() || isVague)) {
|
|
197
197
|
throw new RequirementCompileError(RequirementCompileErrorCodes.EMPTY_REQUIREMENT, `Requirement ${raw.id} contains no identifiable goals or constraints.`, { requirementId: raw.id });
|
|
198
198
|
}
|
|
199
|
-
//
|
|
199
|
+
// --- Step 14: Build source references ------------------------------------
|
|
200
200
|
const sourceRefs = extractionResult.statements.map((s) => s.sourceRef);
|
|
201
|
-
//
|
|
201
|
+
// --- Step 15: Assemble problem statement ---------------------------------
|
|
202
202
|
const problemStatement = goals.length > 0
|
|
203
203
|
? goals.map((g) => g.description).join("; ")
|
|
204
204
|
: (raw.title ?? raw.text.slice(0, 200));
|
|
205
|
-
//
|
|
205
|
+
// --- Step 16: Build final compiled requirement ----------------------------
|
|
206
206
|
const compiled = {
|
|
207
207
|
id: raw.id,
|
|
208
208
|
title: raw.title ?? problemStatement.slice(0, 80),
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Type definitions for raw and compiled requirements.
|
|
5
5
|
*/
|
|
6
|
-
//
|
|
6
|
+
// --- SDK Version ------------------------------------------------------------
|
|
7
7
|
export const SDK_VERSION = "1.0.0";
|
|
8
8
|
export const DEFAULT_COMPILER_CONFIG = {
|
|
9
9
|
projectLanguage: "en",
|
|
@@ -101,7 +101,7 @@ export const DEFAULT_COMPILER_CONFIG = {
|
|
|
101
101
|
"ควร",
|
|
102
102
|
],
|
|
103
103
|
};
|
|
104
|
-
//
|
|
104
|
+
// --- Compiler Errors ------------------------------------------------------
|
|
105
105
|
/**
|
|
106
106
|
* Error codes for requirement compilation failures.
|
|
107
107
|
* Use this enum-like object for programmatic error checking.
|
|
@@ -34,7 +34,7 @@ export async function compileRequirement(
|
|
|
34
34
|
|
|
35
35
|
const clock = deps?.clock ?? (() => new Date());
|
|
36
36
|
|
|
37
|
-
//
|
|
37
|
+
// --- Pre-flight validation ------------------------------------------------
|
|
38
38
|
|
|
39
39
|
if (!raw.text.trim() && !raw.title?.trim()) {
|
|
40
40
|
throw new RequirementCompileError(
|
|
@@ -44,12 +44,12 @@ export async function compileRequirement(
|
|
|
44
44
|
);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
//
|
|
47
|
+
// --- Step 1: Extract statements -----------------------------------------
|
|
48
48
|
|
|
49
49
|
const extractor = deps?.extractor ?? { extract: extractStatements };
|
|
50
50
|
const extractionResult = extractor.extract(raw);
|
|
51
51
|
|
|
52
|
-
//
|
|
52
|
+
// --- Step 2: Classify statements --------------------------------------
|
|
53
53
|
|
|
54
54
|
const classifier = deps?.classifier ?? { classify: classifyStatements };
|
|
55
55
|
const classification: ClassificationResult = classifier.classify(
|
|
@@ -57,7 +57,7 @@ export async function compileRequirement(
|
|
|
57
57
|
config,
|
|
58
58
|
);
|
|
59
59
|
|
|
60
|
-
//
|
|
60
|
+
// --- Step 3: Build goals -------------------------------------------------
|
|
61
61
|
|
|
62
62
|
const goals = classification.goals.map((stmt, i) => ({
|
|
63
63
|
id: `goal-${i + 1}`,
|
|
@@ -66,7 +66,7 @@ export async function compileRequirement(
|
|
|
66
66
|
priority: undefined as "high" | "medium" | "low" | undefined,
|
|
67
67
|
}));
|
|
68
68
|
|
|
69
|
-
//
|
|
69
|
+
// --- Step 4: Build constraints --------------------------------------------
|
|
70
70
|
|
|
71
71
|
const constraints = classification.constraints.map((stmt, i) => ({
|
|
72
72
|
id: `constraint-${i + 1}`,
|
|
@@ -76,7 +76,7 @@ export async function compileRequirement(
|
|
|
76
76
|
blocking: true,
|
|
77
77
|
}));
|
|
78
78
|
|
|
79
|
-
//
|
|
79
|
+
// --- Step 5: Build preferences -------------------------------------------
|
|
80
80
|
|
|
81
81
|
const preferenceConstraints = classification.preferences.map((stmt, i) => ({
|
|
82
82
|
id: `pref-constraint-${i + 1}`,
|
|
@@ -86,14 +86,14 @@ export async function compileRequirement(
|
|
|
86
86
|
blocking: false,
|
|
87
87
|
}));
|
|
88
88
|
|
|
89
|
-
//
|
|
89
|
+
// --- Step 6: Detect ambiguities -------------------------------------------
|
|
90
90
|
|
|
91
91
|
const ambiguityDetector = deps?.ambiguityDetector ?? {
|
|
92
92
|
detect: detectAmbiguities,
|
|
93
93
|
};
|
|
94
94
|
const ambiguities = ambiguityDetector.detect(classification, config);
|
|
95
95
|
|
|
96
|
-
//
|
|
96
|
+
// --- Step 7: Normalize acceptance criteria --------------------------------
|
|
97
97
|
|
|
98
98
|
const acceptanceNormalizer = deps?.acceptanceNormalizer ?? {
|
|
99
99
|
normalize: normalizeAcceptanceCriteria,
|
|
@@ -116,12 +116,12 @@ export async function compileRequirement(
|
|
|
116
116
|
}));
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
//
|
|
119
|
+
// --- Step 8: Detect risks -------------------------------------------------
|
|
120
120
|
|
|
121
121
|
const riskDetector = deps?.riskDetector ?? { detect: detectRisks };
|
|
122
122
|
const riskTags = riskDetector.detect(classification);
|
|
123
123
|
|
|
124
|
-
//
|
|
124
|
+
// --- Step 9: Extract terminology ------------------------------------------
|
|
125
125
|
|
|
126
126
|
const terminology = classification.terminologyMentions.map((stmt) => ({
|
|
127
127
|
term: stmt.originalText,
|
|
@@ -130,7 +130,7 @@ export async function compileRequirement(
|
|
|
130
130
|
sourceRef: stmt.sourceRef,
|
|
131
131
|
}));
|
|
132
132
|
|
|
133
|
-
//
|
|
133
|
+
// --- Step 10: Identify actors ----------------------------------------------
|
|
134
134
|
|
|
135
135
|
const actors: CompiledRequirement["actors"] = [];
|
|
136
136
|
const actorNames = new Set<string>();
|
|
@@ -208,7 +208,7 @@ export async function compileRequirement(
|
|
|
208
208
|
}
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
-
//
|
|
211
|
+
// --- Step 11: Identify non-goals ------------------------------------------
|
|
212
212
|
|
|
213
213
|
const nonGoals: string[] = [];
|
|
214
214
|
for (const stmt of classification.constraints) {
|
|
@@ -221,7 +221,7 @@ export async function compileRequirement(
|
|
|
221
221
|
}
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
//
|
|
224
|
+
// --- Step 12: Build workflows ---------------------------------------------
|
|
225
225
|
|
|
226
226
|
const workflows: CompiledRequirement["workflows"] = [];
|
|
227
227
|
// Group consecutive statements into workflows heuristically
|
|
@@ -241,7 +241,7 @@ export async function compileRequirement(
|
|
|
241
241
|
});
|
|
242
242
|
}
|
|
243
243
|
|
|
244
|
-
//
|
|
244
|
+
// --- Step 13: Determine status --------------------------------------------
|
|
245
245
|
|
|
246
246
|
let status: CompiledRequirement["status"] = "ready";
|
|
247
247
|
|
|
@@ -287,18 +287,18 @@ export async function compileRequirement(
|
|
|
287
287
|
);
|
|
288
288
|
}
|
|
289
289
|
|
|
290
|
-
//
|
|
290
|
+
// --- Step 14: Build source references ------------------------------------
|
|
291
291
|
|
|
292
292
|
const sourceRefs = extractionResult.statements.map((s) => s.sourceRef);
|
|
293
293
|
|
|
294
|
-
//
|
|
294
|
+
// --- Step 15: Assemble problem statement ---------------------------------
|
|
295
295
|
|
|
296
296
|
const problemStatement =
|
|
297
297
|
goals.length > 0
|
|
298
298
|
? goals.map((g) => g.description).join("; ")
|
|
299
299
|
: (raw.title ?? raw.text.slice(0, 200));
|
|
300
300
|
|
|
301
|
-
//
|
|
301
|
+
// --- Step 16: Build final compiled requirement ----------------------------
|
|
302
302
|
|
|
303
303
|
const compiled: CompiledRequirement = {
|
|
304
304
|
id: raw.id,
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* Type definitions for raw and compiled requirements.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
//
|
|
7
|
+
// --- SDK Version ------------------------------------------------------------
|
|
8
8
|
|
|
9
9
|
export const SDK_VERSION = "1.0.0";
|
|
10
10
|
|
|
11
|
-
//
|
|
11
|
+
// --- Source Reference -----------------------------------------------------
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Reference to a source location in the original requirement.
|
|
@@ -26,7 +26,7 @@ export interface SourceReference {
|
|
|
26
26
|
text: string;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
//
|
|
29
|
+
// --- Attachment ------------------------------------------------------------
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* Reference to an attached file (screenshot, document, etc.).
|
|
@@ -42,7 +42,7 @@ export interface AttachmentReference {
|
|
|
42
42
|
description?: string;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
//
|
|
45
|
+
// --- Raw Requirement (Input) ---------------------------------------------
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* Raw requirement as submitted by a user or received from an API.
|
|
@@ -64,7 +64,7 @@ export interface RawRequirement {
|
|
|
64
64
|
submittedAt: string;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
//
|
|
67
|
+
// --- Statement Types ------------------------------------------------------
|
|
68
68
|
|
|
69
69
|
/**
|
|
70
70
|
* Kinds of statements extracted from raw requirement text.
|
|
@@ -109,7 +109,7 @@ export interface ExtractedStatement {
|
|
|
109
109
|
userMarkedMandatory?: boolean;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
//
|
|
112
|
+
// --- Goals ----------------------------------------------------------------
|
|
113
113
|
|
|
114
114
|
/**
|
|
115
115
|
* A goal extracted from the requirement.
|
|
@@ -125,7 +125,7 @@ export interface RequirementGoal {
|
|
|
125
125
|
priority?: "high" | "medium" | "low";
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
//
|
|
128
|
+
// --- Constraints ----------------------------------------------------------
|
|
129
129
|
|
|
130
130
|
/**
|
|
131
131
|
* A constraint that the solution must satisfy.
|
|
@@ -145,7 +145,7 @@ export interface RequirementConstraint {
|
|
|
145
145
|
blocking: boolean;
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
//
|
|
148
|
+
// --- Actors ---------------------------------------------------------------
|
|
149
149
|
|
|
150
150
|
/**
|
|
151
151
|
* An actor (user role, system, service) identified in the requirement.
|
|
@@ -161,7 +161,7 @@ export interface RequirementActor {
|
|
|
161
161
|
sourceRefs: SourceReference[];
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
//
|
|
164
|
+
// --- Workflows ------------------------------------------------------------
|
|
165
165
|
|
|
166
166
|
/**
|
|
167
167
|
* A workflow or use case described in the requirement.
|
|
@@ -183,7 +183,7 @@ export interface RequirementWorkflow {
|
|
|
183
183
|
sourceRefs: SourceReference[];
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
-
//
|
|
186
|
+
// --- Acceptance Criteria -------------------------------------------------
|
|
187
187
|
|
|
188
188
|
/**
|
|
189
189
|
* Normalized acceptance criterion using Given/When/Then format.
|
|
@@ -205,7 +205,7 @@ export interface AcceptanceCriterion {
|
|
|
205
205
|
originalText?: string;
|
|
206
206
|
}
|
|
207
207
|
|
|
208
|
-
//
|
|
208
|
+
// --- Ambiguities ----------------------------------------------------------
|
|
209
209
|
|
|
210
210
|
/**
|
|
211
211
|
* An ambiguous area in the requirement that needs clarification.
|
|
@@ -231,7 +231,7 @@ export interface RequirementAmbiguity {
|
|
|
231
231
|
| "unknown";
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
-
//
|
|
234
|
+
// --- Assumptions ---------------------------------------------------------
|
|
235
235
|
|
|
236
236
|
/**
|
|
237
237
|
* An assumption that was made to fill a gap.
|
|
@@ -247,7 +247,7 @@ export interface RequirementAssumption {
|
|
|
247
247
|
reversible: boolean;
|
|
248
248
|
}
|
|
249
249
|
|
|
250
|
-
//
|
|
250
|
+
// --- Terminology -----------------------------------------------------------
|
|
251
251
|
|
|
252
252
|
/**
|
|
253
253
|
* Domain terminology mapping.
|
|
@@ -263,7 +263,7 @@ export interface TerminologyEntry {
|
|
|
263
263
|
sourceRef?: SourceReference;
|
|
264
264
|
}
|
|
265
265
|
|
|
266
|
-
//
|
|
266
|
+
// --- Risk Tags ------------------------------------------------------------
|
|
267
267
|
|
|
268
268
|
/**
|
|
269
269
|
* Risk areas that require additional review.
|
|
@@ -289,7 +289,7 @@ export interface RiskTag {
|
|
|
289
289
|
description: string;
|
|
290
290
|
}
|
|
291
291
|
|
|
292
|
-
//
|
|
292
|
+
// --- Compilation Status ---------------------------------------------------
|
|
293
293
|
|
|
294
294
|
/**
|
|
295
295
|
* Status of a compiled requirement.
|
|
@@ -302,7 +302,7 @@ export type RequirementStatus =
|
|
|
302
302
|
/** Rejected (empty, impossible, or policy violation) */
|
|
303
303
|
| "rejected";
|
|
304
304
|
|
|
305
|
-
//
|
|
305
|
+
// --- Compiled Requirement (Output) ----------------------------------------
|
|
306
306
|
|
|
307
307
|
/**
|
|
308
308
|
* Fully compiled requirement with validated structure.
|
|
@@ -344,7 +344,7 @@ export interface CompiledRequirement {
|
|
|
344
344
|
compiledAt: string;
|
|
345
345
|
}
|
|
346
346
|
|
|
347
|
-
//
|
|
347
|
+
// --- Extraction Result ----------------------------------------------------
|
|
348
348
|
|
|
349
349
|
/**
|
|
350
350
|
* Result of statement extraction from raw text.
|
|
@@ -356,7 +356,7 @@ export interface ExtractionResult {
|
|
|
356
356
|
lines: string[];
|
|
357
357
|
}
|
|
358
358
|
|
|
359
|
-
//
|
|
359
|
+
// --- Classification Result -------------------------------------------------
|
|
360
360
|
|
|
361
361
|
/**
|
|
362
362
|
* Result of statement classification.
|
|
@@ -384,7 +384,7 @@ export interface ClassificationResult {
|
|
|
384
384
|
unknown: ExtractedStatement[];
|
|
385
385
|
}
|
|
386
386
|
|
|
387
|
-
//
|
|
387
|
+
// --- Compiler Configuration ------------------------------------------------
|
|
388
388
|
|
|
389
389
|
/**
|
|
390
390
|
* Configuration for the Requirement Compiler.
|
|
@@ -517,7 +517,7 @@ export const DEFAULT_COMPILER_CONFIG: RequirementCompilerConfig = {
|
|
|
517
517
|
],
|
|
518
518
|
};
|
|
519
519
|
|
|
520
|
-
//
|
|
520
|
+
// --- Compiler Dependencies -------------------------------------------------
|
|
521
521
|
|
|
522
522
|
/**
|
|
523
523
|
* Dependencies injected into the compiler.
|
|
@@ -564,7 +564,7 @@ export interface AcceptanceNormalizer {
|
|
|
564
564
|
normalize(statements: ExtractedStatement[]): AcceptanceCriterion[];
|
|
565
565
|
}
|
|
566
566
|
|
|
567
|
-
//
|
|
567
|
+
// --- Compiler Errors ------------------------------------------------------
|
|
568
568
|
|
|
569
569
|
/**
|
|
570
570
|
* Error codes for requirement compilation failures.
|
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
} from "../src/index.js";
|
|
27
27
|
import type { RawRequirement, ExtractedStatement } from "../src/types.js";
|
|
28
28
|
|
|
29
|
-
//
|
|
29
|
+
// --- Test utilities ------------------------------------------------------
|
|
30
30
|
|
|
31
31
|
function makeRaw(
|
|
32
32
|
text: string,
|
|
@@ -47,7 +47,7 @@ async function compile(text: string, overrides?: Partial<RawRequirement>) {
|
|
|
47
47
|
return compileRequirement(makeRaw(text, overrides));
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
//
|
|
50
|
+
// --- Test 1: Explicit requirement remains explicit ---------------------
|
|
51
51
|
|
|
52
52
|
describe("Explicit requirement remains explicit", () => {
|
|
53
53
|
it("goal statement becomes a goal", async () => {
|
|
@@ -71,7 +71,7 @@ describe("Explicit requirement remains explicit", () => {
|
|
|
71
71
|
});
|
|
72
72
|
});
|
|
73
73
|
|
|
74
|
-
//
|
|
74
|
+
// --- Test 2: Preference is NOT promoted to mandatory -------------------
|
|
75
75
|
|
|
76
76
|
describe("Preference is not promoted to mandatory", () => {
|
|
77
77
|
it("preference becomes non-blocking constraint", async () => {
|
|
@@ -95,7 +95,7 @@ describe("Preference is not promoted to mandatory", () => {
|
|
|
95
95
|
});
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
-
//
|
|
98
|
+
// --- Test 3: Contradictory statements create ambiguity -----------------
|
|
99
99
|
|
|
100
100
|
describe("Contradictory statements create ambiguity", () => {
|
|
101
101
|
it("opposing must/must not creates contradiction ambiguity", async () => {
|
|
@@ -159,7 +159,7 @@ describe("Contradictory statements create ambiguity", () => {
|
|
|
159
159
|
});
|
|
160
160
|
});
|
|
161
161
|
|
|
162
|
-
//
|
|
162
|
+
// --- Test 4: Acceptance criteria normalize to Given/When/Then -----------
|
|
163
163
|
|
|
164
164
|
describe("Acceptance criteria normalize to Given/When/Then", () => {
|
|
165
165
|
it("Given/When/Then statement parses correctly", () => {
|
|
@@ -236,7 +236,7 @@ describe("Acceptance criteria normalize to Given/When/Then", () => {
|
|
|
236
236
|
});
|
|
237
237
|
});
|
|
238
238
|
|
|
239
|
-
//
|
|
239
|
+
// --- Test 5: Thai terminology preserved in glossary --------------------
|
|
240
240
|
|
|
241
241
|
describe("Thai terminology remains in glossary", () => {
|
|
242
242
|
it("Thai term is preserved in terminology", async () => {
|
|
@@ -267,7 +267,7 @@ describe("Thai terminology remains in glossary", () => {
|
|
|
267
267
|
});
|
|
268
268
|
});
|
|
269
269
|
|
|
270
|
-
//
|
|
270
|
+
// --- Test 6: Financial requirement receives risk tag ------------------
|
|
271
271
|
|
|
272
272
|
describe("Financial requirement receives risk tag", () => {
|
|
273
273
|
it("payment keyword triggers financial risk", async () => {
|
|
@@ -300,7 +300,7 @@ describe("Financial requirement receives risk tag", () => {
|
|
|
300
300
|
});
|
|
301
301
|
});
|
|
302
302
|
|
|
303
|
-
//
|
|
303
|
+
// --- Test 7: Empty requirement is rejected ---------------------------
|
|
304
304
|
|
|
305
305
|
describe("Empty requirement is rejected", () => {
|
|
306
306
|
it("rejects empty text requirement", async () => {
|
|
@@ -345,7 +345,7 @@ describe("Empty requirement is rejected", () => {
|
|
|
345
345
|
});
|
|
346
346
|
});
|
|
347
347
|
|
|
348
|
-
//
|
|
348
|
+
// --- Test 8: Source references remain traceable -------------------------
|
|
349
349
|
|
|
350
350
|
describe("Source references remain traceable", () => {
|
|
351
351
|
it("every goal has a source reference", async () => {
|
|
@@ -408,7 +408,7 @@ describe("Source references remain traceable", () => {
|
|
|
408
408
|
});
|
|
409
409
|
});
|
|
410
410
|
|
|
411
|
-
//
|
|
411
|
+
// --- Extractor tests -----------------------------------------------------
|
|
412
412
|
|
|
413
413
|
describe("Statement extraction", () => {
|
|
414
414
|
it("extracts numbered list items", () => {
|
|
@@ -433,7 +433,7 @@ describe("Statement extraction", () => {
|
|
|
433
433
|
});
|
|
434
434
|
});
|
|
435
435
|
|
|
436
|
-
//
|
|
436
|
+
// --- Classifier tests ---------------------------------------------------
|
|
437
437
|
|
|
438
438
|
describe("Statement classification", () => {
|
|
439
439
|
it("classifies must statements as explicit_behavior", () => {
|
|
@@ -492,7 +492,7 @@ describe("Statement classification", () => {
|
|
|
492
492
|
});
|
|
493
493
|
});
|
|
494
494
|
|
|
495
|
-
//
|
|
495
|
+
// --- Risk detection tests ------------------------------------------------
|
|
496
496
|
|
|
497
497
|
describe("Risk detection", () => {
|
|
498
498
|
it("detects destructive operation risk", async () => {
|
|
@@ -527,7 +527,7 @@ describe("Risk detection", () => {
|
|
|
527
527
|
});
|
|
528
528
|
});
|
|
529
529
|
|
|
530
|
-
//
|
|
530
|
+
// --- Ambiguity detection tests -------------------------------------------
|
|
531
531
|
|
|
532
532
|
describe("Ambiguity detection", () => {
|
|
533
533
|
it("detects vague terms", () => {
|
|
@@ -646,7 +646,7 @@ describe("Ambiguity detection", () => {
|
|
|
646
646
|
});
|
|
647
647
|
});
|
|
648
648
|
|
|
649
|
-
//
|
|
649
|
+
// --- Workflow tests ------------------------------------------------------
|
|
650
650
|
|
|
651
651
|
describe("Workflow extraction", () => {
|
|
652
652
|
it("groups multiple goals into a workflow", async () => {
|
|
@@ -661,7 +661,7 @@ describe("Workflow extraction", () => {
|
|
|
661
661
|
});
|
|
662
662
|
});
|
|
663
663
|
|
|
664
|
-
//
|
|
664
|
+
// --- Actor extraction tests ---------------------------------------------
|
|
665
665
|
|
|
666
666
|
describe("Actor extraction", () => {
|
|
667
667
|
it("extracts actors from statements", async () => {
|
|
@@ -677,7 +677,7 @@ describe("Actor extraction", () => {
|
|
|
677
677
|
});
|
|
678
678
|
});
|
|
679
679
|
|
|
680
|
-
//
|
|
680
|
+
// --- Error handling tests ----------------------------------------------
|
|
681
681
|
|
|
682
682
|
describe("Error handling", () => {
|
|
683
683
|
it("RequirementCompileError has correct properties", () => {
|
|
@@ -712,7 +712,7 @@ describe("Error handling", () => {
|
|
|
712
712
|
});
|
|
713
713
|
});
|
|
714
714
|
|
|
715
|
-
//
|
|
715
|
+
// --- Multilingual tests -------------------------------------------------
|
|
716
716
|
|
|
717
717
|
describe("Multilingual handling", () => {
|
|
718
718
|
it("preserves Thai business terms", async () => {
|
|
@@ -346,7 +346,7 @@ export class CommandExecutor extends EventEmitter {
|
|
|
346
346
|
getPolicy() {
|
|
347
347
|
return { ...this.policy };
|
|
348
348
|
}
|
|
349
|
-
//
|
|
349
|
+
// --- Private Methods ------------------------------------------------
|
|
350
350
|
waitForExit(_proc) {
|
|
351
351
|
// Note: This method is for synchronous execution.
|
|
352
352
|
// For async execution, use execAsync() which properly handles events.
|
|
@@ -161,7 +161,7 @@ export class LocalRuntimeAgent extends EventEmitter {
|
|
|
161
161
|
getAuthSessions() {
|
|
162
162
|
return Array.from(this.authSessions.values());
|
|
163
163
|
}
|
|
164
|
-
//
|
|
164
|
+
// --- Private Methods ------------------------------------------------
|
|
165
165
|
async handleRequest(req, res) {
|
|
166
166
|
const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
|
|
167
167
|
const path = url.pathname;
|
|
@@ -364,7 +364,7 @@ export class PolicyEngine extends EventEmitter {
|
|
|
364
364
|
return false;
|
|
365
365
|
}
|
|
366
366
|
}
|
|
367
|
-
//
|
|
367
|
+
// --- Private Methods ------------------------------------------------
|
|
368
368
|
matchesPolicy(context, policy) {
|
|
369
369
|
const condition = policy.condition;
|
|
370
370
|
// Check subject
|