@backendkit-labs/agent-enterprise 0.3.2 → 0.4.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 +2 -0
- package/dist/__tests__/integration/EventPublisher.integration.test.d.ts +2 -0
- package/dist/__tests__/integration/EventPublisher.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/EventPublisher.integration.test.js +122 -0
- package/dist/__tests__/integration/EventPublisher.integration.test.js.map +1 -0
- package/dist/__tests__/unit/ComplianceGate.test.d.ts +2 -0
- package/dist/__tests__/unit/ComplianceGate.test.d.ts.map +1 -0
- package/dist/__tests__/unit/ComplianceGate.test.js +271 -0
- package/dist/__tests__/unit/ComplianceGate.test.js.map +1 -0
- package/dist/__tests__/unit/EventPublisher.test.d.ts +2 -0
- package/dist/__tests__/unit/EventPublisher.test.d.ts.map +1 -0
- package/dist/__tests__/unit/EventPublisher.test.js +160 -0
- package/dist/__tests__/unit/EventPublisher.test.js.map +1 -0
- package/dist/__tests__/unit/FlowLoader.test.d.ts +2 -0
- package/dist/__tests__/unit/FlowLoader.test.d.ts.map +1 -0
- package/dist/__tests__/unit/FlowLoader.test.js +283 -0
- package/dist/__tests__/unit/FlowLoader.test.js.map +1 -0
- package/dist/__tests__/unit/FlowRunner.test.d.ts +2 -0
- package/dist/__tests__/unit/FlowRunner.test.d.ts.map +1 -0
- package/dist/__tests__/unit/FlowRunner.test.js +386 -0
- package/dist/__tests__/unit/FlowRunner.test.js.map +1 -0
- package/dist/__tests__/unit/PolicySeeder.test.d.ts +2 -0
- package/dist/__tests__/unit/PolicySeeder.test.d.ts.map +1 -0
- package/dist/__tests__/unit/PolicySeeder.test.js +146 -0
- package/dist/__tests__/unit/PolicySeeder.test.js.map +1 -0
- package/dist/__tests__/unit/ProfilePolicies.test.d.ts +2 -0
- package/dist/__tests__/unit/ProfilePolicies.test.d.ts.map +1 -0
- package/dist/__tests__/unit/ProfilePolicies.test.js +70 -0
- package/dist/__tests__/unit/ProfilePolicies.test.js.map +1 -0
- package/dist/__tests__/unit/ReconciliationSweeper.test.d.ts +2 -0
- package/dist/__tests__/unit/ReconciliationSweeper.test.d.ts.map +1 -0
- package/dist/__tests__/unit/ReconciliationSweeper.test.js +235 -0
- package/dist/__tests__/unit/ReconciliationSweeper.test.js.map +1 -0
- package/dist/__tests__/unit/n8nTriggerTool.test.d.ts +2 -0
- package/dist/__tests__/unit/n8nTriggerTool.test.d.ts.map +1 -0
- package/dist/__tests__/unit/n8nTriggerTool.test.js +103 -0
- package/dist/__tests__/unit/n8nTriggerTool.test.js.map +1 -0
- package/dist/events/EventPublisher.d.ts +47 -0
- package/dist/events/EventPublisher.d.ts.map +1 -0
- package/dist/events/EventPublisher.js +75 -0
- package/dist/events/EventPublisher.js.map +1 -0
- package/dist/events/ReconciliationSweeper.d.ts +37 -0
- package/dist/events/ReconciliationSweeper.d.ts.map +1 -0
- package/dist/events/ReconciliationSweeper.js +151 -0
- package/dist/events/ReconciliationSweeper.js.map +1 -0
- package/dist/events/index.d.ts +6 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +8 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +48 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +3 -0
- package/dist/events/types.js.map +1 -0
- package/dist/factory.d.ts +6 -0
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +11 -5
- package/dist/factory.js.map +1 -1
- package/dist/flow/ComplianceGate.d.ts +90 -0
- package/dist/flow/ComplianceGate.d.ts.map +1 -0
- package/dist/flow/ComplianceGate.js +214 -0
- package/dist/flow/ComplianceGate.js.map +1 -0
- package/dist/flow/FlowLoader.d.ts +22 -0
- package/dist/flow/FlowLoader.d.ts.map +1 -0
- package/dist/flow/FlowLoader.js +170 -0
- package/dist/flow/FlowLoader.js.map +1 -0
- package/dist/flow/FlowRunner.d.ts +73 -0
- package/dist/flow/FlowRunner.d.ts.map +1 -0
- package/dist/flow/FlowRunner.js +162 -0
- package/dist/flow/FlowRunner.js.map +1 -0
- package/dist/flow/index.d.ts +8 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +21 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/flow/types.d.ts +306 -0
- package/dist/flow/types.d.ts.map +1 -0
- package/dist/flow/types.js +63 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/index.d.ts +3 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +6 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/n8nTriggerTool.d.ts +12 -0
- package/dist/integrations/n8nTriggerTool.d.ts.map +1 -0
- package/dist/integrations/n8nTriggerTool.js +45 -0
- package/dist/integrations/n8nTriggerTool.js.map +1 -0
- package/dist/policies/PolicySeeder.d.ts +31 -0
- package/dist/policies/PolicySeeder.d.ts.map +1 -0
- package/dist/policies/PolicySeeder.js +270 -0
- package/dist/policies/PolicySeeder.js.map +1 -0
- package/dist/policies/index.d.ts +3 -0
- package/dist/policies/index.d.ts.map +1 -0
- package/dist/policies/index.js +6 -0
- package/dist/policies/index.js.map +1 -0
- package/dist/profiles/constants.d.ts +4 -0
- package/dist/profiles/constants.d.ts.map +1 -1
- package/dist/profiles/constants.js +4 -0
- package/dist/profiles/constants.js.map +1 -1
- package/dist/profiles/finance.d.ts.map +1 -1
- package/dist/profiles/finance.js +7 -8
- package/dist/profiles/finance.js.map +1 -1
- package/dist/profiles/general.d.ts.map +1 -1
- package/dist/profiles/general.js +1 -0
- package/dist/profiles/general.js.map +1 -1
- package/dist/profiles/hr.d.ts.map +1 -1
- package/dist/profiles/hr.js +6 -8
- package/dist/profiles/hr.js.map +1 -1
- package/dist/profiles/ops.d.ts.map +1 -1
- package/dist/profiles/ops.js +6 -10
- package/dist/profiles/ops.js.map +1 -1
- package/dist/profiles/sales.d.ts.map +1 -1
- package/dist/profiles/sales.js +3 -1
- package/dist/profiles/sales.js.map +1 -1
- package/dist/profiles/support.d.ts.map +1 -1
- package/dist/profiles/support.js +2 -4
- package/dist/profiles/support.js.map +1 -1
- package/dist/rag/OllamaEmbedder.d.ts +6 -0
- package/dist/rag/OllamaEmbedder.d.ts.map +1 -1
- package/dist/rag/OllamaEmbedder.js +75 -16
- package/dist/rag/OllamaEmbedder.js.map +1 -1
- package/dist/rag/VaultWriter.d.ts +3 -0
- package/dist/rag/VaultWriter.d.ts.map +1 -1
- package/dist/rag/VaultWriter.js +63 -17
- package/dist/rag/VaultWriter.js.map +1 -1
- package/dist/reflection/EnterpriseReflection.d.ts +108 -0
- package/dist/reflection/EnterpriseReflection.d.ts.map +1 -0
- package/dist/reflection/EnterpriseReflection.js +296 -0
- package/dist/reflection/EnterpriseReflection.js.map +1 -0
- package/dist/reflection/GateReflectionBridge.d.ts +21 -0
- package/dist/reflection/GateReflectionBridge.d.ts.map +1 -0
- package/dist/reflection/GateReflectionBridge.js +120 -0
- package/dist/reflection/GateReflectionBridge.js.map +1 -0
- package/dist/reflection/domains.d.ts +6 -0
- package/dist/reflection/domains.d.ts.map +1 -0
- package/dist/reflection/domains.js +176 -0
- package/dist/reflection/domains.js.map +1 -0
- package/dist/reflection/index.d.ts +6 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/dist/reflection/index.js +11 -0
- package/dist/reflection/index.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ReconciliationSweeper = void 0;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* Compares published events (vault /eventos/) against audit notes (vault /auditoria/).
|
|
41
|
+
*
|
|
42
|
+
* Each event note written by EventPublisher contains a table row:
|
|
43
|
+
* | ID | `<event-uuid>` |
|
|
44
|
+
*
|
|
45
|
+
* The sweeper extracts these IDs and checks if the text appears anywhere in
|
|
46
|
+
* the /auditoria/ subtree. Events without a matching audit note are "orphaned".
|
|
47
|
+
*
|
|
48
|
+
* This detects consistency gaps without an outbox transaction, using the vault
|
|
49
|
+
* as the source of truth (ADR-1).
|
|
50
|
+
*/
|
|
51
|
+
class ReconciliationSweeper {
|
|
52
|
+
vaultPath;
|
|
53
|
+
eventsFolder;
|
|
54
|
+
auditFolder;
|
|
55
|
+
constructor(opts) {
|
|
56
|
+
this.vaultPath = opts.vaultPath;
|
|
57
|
+
this.eventsFolder = opts.eventsFolder ?? 'eventos';
|
|
58
|
+
this.auditFolder = opts.auditFolder ?? 'auditoria';
|
|
59
|
+
}
|
|
60
|
+
async sweep() {
|
|
61
|
+
const eventNotes = await this.readEventNotes();
|
|
62
|
+
const auditContent = await this.readAuditContent();
|
|
63
|
+
const orphaned = [];
|
|
64
|
+
let matched = 0;
|
|
65
|
+
for (const note of eventNotes) {
|
|
66
|
+
if (auditContent.includes(note.eventId)) {
|
|
67
|
+
matched++;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
orphaned.push(note);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
checked: eventNotes.length,
|
|
75
|
+
matched,
|
|
76
|
+
orphaned,
|
|
77
|
+
sweptAt: new Date().toISOString(),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// ── Private ───────────────────────────────────────────────────────────────
|
|
81
|
+
async readEventNotes() {
|
|
82
|
+
const dir = path.join(this.vaultPath, this.eventsFolder);
|
|
83
|
+
let files;
|
|
84
|
+
try {
|
|
85
|
+
const entries = await fs.readdir(dir);
|
|
86
|
+
files = entries.filter(f => f.endsWith('.md'));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
const notes = [];
|
|
92
|
+
for (const file of files) {
|
|
93
|
+
const filePath = path.join(dir, file);
|
|
94
|
+
try {
|
|
95
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
96
|
+
const eventId = this.extractTableField(content, 'ID');
|
|
97
|
+
if (!eventId)
|
|
98
|
+
continue;
|
|
99
|
+
notes.push({
|
|
100
|
+
eventId,
|
|
101
|
+
type: this.extractTableField(content, 'Type') ?? 'unknown',
|
|
102
|
+
occurredAt: this.extractTableField(content, 'Occurred') ?? '',
|
|
103
|
+
source: this.extractTableField(content, 'Source') ?? '',
|
|
104
|
+
notePath: filePath,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch { /* skip unreadable files */ }
|
|
108
|
+
}
|
|
109
|
+
return notes;
|
|
110
|
+
}
|
|
111
|
+
async readAuditContent() {
|
|
112
|
+
const dir = path.join(this.vaultPath, this.auditFolder);
|
|
113
|
+
const chunks = [];
|
|
114
|
+
try {
|
|
115
|
+
await this.collectContent(dir, chunks);
|
|
116
|
+
}
|
|
117
|
+
catch { /* audit folder may not exist yet */ }
|
|
118
|
+
return chunks.join('\n');
|
|
119
|
+
}
|
|
120
|
+
async collectContent(dir, acc) {
|
|
121
|
+
let entries;
|
|
122
|
+
try {
|
|
123
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
for (const entry of entries) {
|
|
129
|
+
const full = path.join(dir, entry.name);
|
|
130
|
+
if (entry.isDirectory()) {
|
|
131
|
+
await this.collectContent(full, acc);
|
|
132
|
+
}
|
|
133
|
+
else if (entry.name.endsWith('.md')) {
|
|
134
|
+
try {
|
|
135
|
+
acc.push(await fs.readFile(full, 'utf-8'));
|
|
136
|
+
}
|
|
137
|
+
catch { /* skip */ }
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Extracts a value from a Markdown table row of the form:
|
|
143
|
+
* | FieldName | `value` | or | FieldName | value |
|
|
144
|
+
*/
|
|
145
|
+
extractTableField(content, field) {
|
|
146
|
+
const re = new RegExp(`\\|\\s*${field}\\s*\\|\\s*\`?([^|\`\\n]+?)\`?\\s*\\|`, 'im');
|
|
147
|
+
return content.match(re)?.[1]?.trim();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
exports.ReconciliationSweeper = ReconciliationSweeper;
|
|
151
|
+
//# sourceMappingURL=ReconciliationSweeper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReconciliationSweeper.js","sourceRoot":"","sources":["../../src/events/ReconciliationSweeper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { EventPublisher } from './EventPublisher';
|
|
2
|
+
export type { QueueLike, EventPublisherOptions } from './EventPublisher';
|
|
3
|
+
export { ReconciliationSweeper } from './ReconciliationSweeper';
|
|
4
|
+
export type { ReconciliationSweeperOptions } from './ReconciliationSweeper';
|
|
5
|
+
export type { EventEnvelope, EventSchema, PublishOptions, OrphanedEvent, ReconciliationReport, } from './types';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAE5E,YAAY,EACR,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,oBAAoB,GACvB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReconciliationSweeper = exports.EventPublisher = void 0;
|
|
4
|
+
var EventPublisher_1 = require("./EventPublisher");
|
|
5
|
+
Object.defineProperty(exports, "EventPublisher", { enumerable: true, get: function () { return EventPublisher_1.EventPublisher; } });
|
|
6
|
+
var ReconciliationSweeper_1 = require("./ReconciliationSweeper");
|
|
7
|
+
Object.defineProperty(exports, "ReconciliationSweeper", { enumerable: true, get: function () { return ReconciliationSweeper_1.ReconciliationSweeper; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":";;;AAAA,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AAGvB,iEAAgE;AAAvD,8HAAA,qBAAqB,OAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { z } from '@backendkit-labs/agent-core';
|
|
2
|
+
/** Typed wrapper around every published event. */
|
|
3
|
+
export interface EventEnvelope<T = unknown> {
|
|
4
|
+
id: string;
|
|
5
|
+
type: string;
|
|
6
|
+
occurredAt: string;
|
|
7
|
+
source: string;
|
|
8
|
+
version: number;
|
|
9
|
+
payload: T;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Declares a named, versioned event type.
|
|
13
|
+
* The Zod schema is used to validate every payload before publishing.
|
|
14
|
+
*/
|
|
15
|
+
export interface EventSchema<T = unknown> {
|
|
16
|
+
type: string;
|
|
17
|
+
version: number;
|
|
18
|
+
schema: z.ZodType<T>;
|
|
19
|
+
}
|
|
20
|
+
export interface PublishOptions {
|
|
21
|
+
/** Number of attempts before the job is moved to failed. Default: 3 */
|
|
22
|
+
attempts?: number;
|
|
23
|
+
/** Exponential backoff base delay in ms. Default: 1000 */
|
|
24
|
+
backoffDelay?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Override the BullMQ job ID (defaults to envelope.id).
|
|
27
|
+
* Useful for idempotent publishes.
|
|
28
|
+
*/
|
|
29
|
+
jobId?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface OrphanedEvent {
|
|
32
|
+
eventId: string;
|
|
33
|
+
type: string;
|
|
34
|
+
occurredAt: string;
|
|
35
|
+
source: string;
|
|
36
|
+
/** Absolute path of the /eventos/ note. */
|
|
37
|
+
notePath: string;
|
|
38
|
+
}
|
|
39
|
+
export interface ReconciliationReport {
|
|
40
|
+
/** Total event notes read from /eventos/. */
|
|
41
|
+
checked: number;
|
|
42
|
+
/** Events that have a corresponding audit note. */
|
|
43
|
+
matched: number;
|
|
44
|
+
/** Events without any matching audit note. */
|
|
45
|
+
orphaned: OrphanedEvent[];
|
|
46
|
+
sweptAt: string;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,6BAA6B,CAAC;AAIhD,kDAAkD;AAClD,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,CAAC;CACd;AAID;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CACxB;AAID,MAAM,WAAW,cAAc;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACjC,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":""}
|
package/dist/factory.d.ts
CHANGED
|
@@ -18,6 +18,12 @@ export interface EnterpriseSetupOptions {
|
|
|
18
18
|
extraProfiles?: AgentProfile[];
|
|
19
19
|
/** Max iterations per engine run. Default: 20. */
|
|
20
20
|
maxIterations?: number;
|
|
21
|
+
/**
|
|
22
|
+
* n8n webhook URL. When provided, registers the `n8n_trigger` tool so agents
|
|
23
|
+
* with it in their allowedTools (e.g. the General agent) can fire n8n workflows.
|
|
24
|
+
* Falls back to N8N_WEBHOOK_URL env var if omitted.
|
|
25
|
+
*/
|
|
26
|
+
n8nWebhookUrl?: string;
|
|
21
27
|
}
|
|
22
28
|
export interface EnterpriseSetup {
|
|
23
29
|
/** Call once at startup to index all vault folders. */
|
package/dist/factory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,WAAW,EAGX,gBAAgB,EAInB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,WAAW,EAGX,gBAAgB,EAInB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAY1D,MAAM,WAAW,sBAAsB;IACnC,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,sEAAsE;IACtE,SAAS,EAAE,gBAAgB,CAAC;IAC5B,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,iFAAiF;IACjF,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,KAAK,WAAW,CAAC;CAC3E;AAcD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,eAAe,CAqGnF"}
|
package/dist/factory.js
CHANGED
|
@@ -41,13 +41,14 @@ const ObsidianRAGProvider_1 = require("./rag/ObsidianRAGProvider");
|
|
|
41
41
|
const VaultWriter_1 = require("./rag/VaultWriter");
|
|
42
42
|
const SimpleEmbedder_1 = require("./rag/SimpleEmbedder");
|
|
43
43
|
const profiles_1 = require("./profiles");
|
|
44
|
+
const integrations_1 = require("./integrations");
|
|
44
45
|
// ── Department RAG config ─────────────────────────────────────────────────────
|
|
45
46
|
const DEPT_CONFIGS = [
|
|
46
|
-
{ toolName: profiles_1.ENTERPRISE_TOOLS.SEARCH_SUPPORT, folders: [profiles_1.VAULT_FOLDERS.SUPPORT, profiles_1.VAULT_FOLDERS.GENERAL] },
|
|
47
|
-
{ toolName: profiles_1.ENTERPRISE_TOOLS.SEARCH_HR, folders: [profiles_1.VAULT_FOLDERS.HR, profiles_1.VAULT_FOLDERS.GENERAL] },
|
|
48
|
-
{ toolName: profiles_1.ENTERPRISE_TOOLS.SEARCH_SALES, folders: [profiles_1.VAULT_FOLDERS.SALES, profiles_1.VAULT_FOLDERS.GENERAL] },
|
|
49
|
-
{ toolName: profiles_1.ENTERPRISE_TOOLS.SEARCH_FINANCE, folders: [profiles_1.VAULT_FOLDERS.FINANCE, profiles_1.VAULT_FOLDERS.GENERAL] },
|
|
50
|
-
{ toolName: profiles_1.ENTERPRISE_TOOLS.SEARCH_OPS, folders: [profiles_1.VAULT_FOLDERS.OPS, profiles_1.VAULT_FOLDERS.GENERAL] },
|
|
47
|
+
{ toolName: profiles_1.ENTERPRISE_TOOLS.SEARCH_SUPPORT, folders: [profiles_1.VAULT_FOLDERS.SUPPORT, profiles_1.VAULT_FOLDERS.GENERAL, profiles_1.VAULT_FOLDERS.POLICIES] },
|
|
48
|
+
{ toolName: profiles_1.ENTERPRISE_TOOLS.SEARCH_HR, folders: [profiles_1.VAULT_FOLDERS.HR, profiles_1.VAULT_FOLDERS.GENERAL, profiles_1.VAULT_FOLDERS.POLICIES] },
|
|
49
|
+
{ toolName: profiles_1.ENTERPRISE_TOOLS.SEARCH_SALES, folders: [profiles_1.VAULT_FOLDERS.SALES, profiles_1.VAULT_FOLDERS.GENERAL, profiles_1.VAULT_FOLDERS.POLICIES] },
|
|
50
|
+
{ toolName: profiles_1.ENTERPRISE_TOOLS.SEARCH_FINANCE, folders: [profiles_1.VAULT_FOLDERS.FINANCE, profiles_1.VAULT_FOLDERS.GENERAL, profiles_1.VAULT_FOLDERS.POLICIES] },
|
|
51
|
+
{ toolName: profiles_1.ENTERPRISE_TOOLS.SEARCH_OPS, folders: [profiles_1.VAULT_FOLDERS.OPS, profiles_1.VAULT_FOLDERS.GENERAL, profiles_1.VAULT_FOLDERS.POLICIES] },
|
|
51
52
|
];
|
|
52
53
|
// ── Factory ────────────────────────────────────────────────────────────────────
|
|
53
54
|
/**
|
|
@@ -115,6 +116,11 @@ function createEnterpriseSetup(opts) {
|
|
|
115
116
|
}
|
|
116
117
|
// Write to vault
|
|
117
118
|
tools.register(writer.createTool('general'));
|
|
119
|
+
// n8n integration (opt-in — only when a webhook URL is configured)
|
|
120
|
+
const n8nUrl = opts.n8nWebhookUrl ?? process.env.N8N_WEBHOOK_URL;
|
|
121
|
+
if (n8nUrl) {
|
|
122
|
+
tools.register((0, integrations_1.createN8nTriggerTool)({ webhookUrl: n8nUrl }));
|
|
123
|
+
}
|
|
118
124
|
// Agents
|
|
119
125
|
const agents = new agent_core_1.AgentRegistry();
|
|
120
126
|
const profiles = [...profiles_1.ALL_ENTERPRISE_PROFILES, ...(opts.extraProfiles ?? [])];
|
package/dist/factory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ComplianceGate — verifiable compliance with evaluator/executor separation.
|
|
3
|
+
*
|
|
4
|
+
* Fixes the 4 gaps of the design-agent model (ADR-3):
|
|
5
|
+
* 1. Evaluator MUST differ from the executor (runtime enforcement)
|
|
6
|
+
* 2. Every criterion evaluated individually with required evidence when configured
|
|
7
|
+
* 3. Every state mutation appends to an immutable log — no silent bypasses
|
|
8
|
+
* 4. Record persisted to vault (/auditoria/{flow}/{run}/) — versionable + RAG-consultable
|
|
9
|
+
*/
|
|
10
|
+
export interface GateCriterion {
|
|
11
|
+
id: string;
|
|
12
|
+
description: string;
|
|
13
|
+
/**
|
|
14
|
+
* Enterprise domain this criterion belongs to (e.g. 'legal', 'rrhh').
|
|
15
|
+
* Used by GateReflectionBridge to file incidents in the correct domain catalog.
|
|
16
|
+
*/
|
|
17
|
+
domain?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Explicit failureType from ENTERPRISE_DOMAINS.
|
|
20
|
+
* When set, incidents are filed deterministically without keyword matching.
|
|
21
|
+
*/
|
|
22
|
+
failureType?: string;
|
|
23
|
+
passed?: boolean;
|
|
24
|
+
evidence?: string;
|
|
25
|
+
evaluatedBy?: string;
|
|
26
|
+
evaluatedAt?: string;
|
|
27
|
+
}
|
|
28
|
+
export type GateLogEvent = 'criterion_evaluated' | 'criterion_rejected' | 'self_evaluation_attempt' | 'missing_evidence_attempt' | 'gate_rejected';
|
|
29
|
+
export interface GateLogEntry {
|
|
30
|
+
at: string;
|
|
31
|
+
event: GateLogEvent;
|
|
32
|
+
criterionId?: string;
|
|
33
|
+
evaluatorId?: string;
|
|
34
|
+
detail?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface GateRecord {
|
|
37
|
+
stepId: string;
|
|
38
|
+
flowId: string;
|
|
39
|
+
runId: string;
|
|
40
|
+
executor: string;
|
|
41
|
+
criteria: GateCriterion[];
|
|
42
|
+
verdict: 'passed' | 'failed' | 'pending';
|
|
43
|
+
log: GateLogEntry[];
|
|
44
|
+
}
|
|
45
|
+
export interface ComplianceGateOptions {
|
|
46
|
+
stepId: string;
|
|
47
|
+
flowId: string;
|
|
48
|
+
runId: string;
|
|
49
|
+
/** Agent that executed the step — cannot also be the evaluator. */
|
|
50
|
+
executor: string;
|
|
51
|
+
/** Criterion descriptions from the YAML gate.criteria array. */
|
|
52
|
+
criteria: string[];
|
|
53
|
+
evidenceMode: 'required' | 'optional';
|
|
54
|
+
}
|
|
55
|
+
export declare class ComplianceGateError extends Error {
|
|
56
|
+
constructor(message: string);
|
|
57
|
+
}
|
|
58
|
+
export declare class ComplianceGate {
|
|
59
|
+
private readonly _record;
|
|
60
|
+
private readonly evidenceMode;
|
|
61
|
+
constructor(opts: ComplianceGateOptions);
|
|
62
|
+
/**
|
|
63
|
+
* Evaluates a single criterion by index.
|
|
64
|
+
*
|
|
65
|
+
* Throws `ComplianceGateError` when:
|
|
66
|
+
* - `evaluatorId` equals the executor (self-evaluation)
|
|
67
|
+
* - `passed` is true but evidence is missing and `evidenceMode` is 'required'
|
|
68
|
+
*
|
|
69
|
+
* A failed attempt is ALWAYS appended to the log before throwing,
|
|
70
|
+
* so there is no path to bypass the gate silently.
|
|
71
|
+
*/
|
|
72
|
+
evaluateCriterion(index: number, evaluatorId: string, passed: boolean, evidence?: string): void;
|
|
73
|
+
/**
|
|
74
|
+
* Rejects the entire gate immediately (e.g. evaluator found a blocking issue
|
|
75
|
+
* before checking individual criteria). Evaluator ≠ executor is still enforced.
|
|
76
|
+
*/
|
|
77
|
+
reject(evaluatorId: string, reason?: string): void;
|
|
78
|
+
/** Returns an immutable snapshot of the current gate state. */
|
|
79
|
+
getRecord(): GateRecord;
|
|
80
|
+
get verdict(): 'passed' | 'failed' | 'pending';
|
|
81
|
+
/**
|
|
82
|
+
* Persists the gate record to the vault under
|
|
83
|
+
* `/auditoria/{flowId}/{runId}/gate-{stepId}.md`.
|
|
84
|
+
* Returns the absolute file path written.
|
|
85
|
+
*/
|
|
86
|
+
persist(vaultPath: string): Promise<string>;
|
|
87
|
+
private computeVerdict;
|
|
88
|
+
private appendLog;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=ComplianceGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComplianceGate.d.ts","sourceRoot":"","sources":["../../src/flow/ComplianceGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,YAAY,GAClB,qBAAqB,GACrB,oBAAoB,GACpB,yBAAyB,GACzB,0BAA0B,GAC1B,eAAe,CAAC;AAEtB,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,GAAG,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,UAAU,GAAG,UAAU,CAAC;CACzC;AAID,qBAAa,mBAAoB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI9B;AAID,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;gBAE3C,IAAI,EAAE,qBAAqB;IAgBvC;;;;;;;;;OASG;IACH,iBAAiB,CACb,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,EACf,QAAQ,CAAC,EAAE,MAAM,GAClB,IAAI;IA6CP;;;OAGG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAmBlD,+DAA+D;IAC/D,SAAS,IAAI,UAAU;IAQvB,IAAI,OAAO,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAE7C;IAED;;;;OAIG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwDjD,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,SAAS;CAGpB"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ComplianceGate — verifiable compliance with evaluator/executor separation.
|
|
4
|
+
*
|
|
5
|
+
* Fixes the 4 gaps of the design-agent model (ADR-3):
|
|
6
|
+
* 1. Evaluator MUST differ from the executor (runtime enforcement)
|
|
7
|
+
* 2. Every criterion evaluated individually with required evidence when configured
|
|
8
|
+
* 3. Every state mutation appends to an immutable log — no silent bypasses
|
|
9
|
+
* 4. Record persisted to vault (/auditoria/{flow}/{run}/) — versionable + RAG-consultable
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.ComplianceGate = exports.ComplianceGateError = void 0;
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const VaultWriter_1 = require("../rag/VaultWriter");
|
|
48
|
+
// ── Error ─────────────────────────────────────────────────────────────────────
|
|
49
|
+
class ComplianceGateError extends Error {
|
|
50
|
+
constructor(message) {
|
|
51
|
+
super(message);
|
|
52
|
+
this.name = 'ComplianceGateError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.ComplianceGateError = ComplianceGateError;
|
|
56
|
+
// ── ComplianceGate ────────────────────────────────────────────────────────────
|
|
57
|
+
class ComplianceGate {
|
|
58
|
+
_record;
|
|
59
|
+
evidenceMode;
|
|
60
|
+
constructor(opts) {
|
|
61
|
+
this.evidenceMode = opts.evidenceMode;
|
|
62
|
+
this._record = {
|
|
63
|
+
stepId: opts.stepId,
|
|
64
|
+
flowId: opts.flowId,
|
|
65
|
+
runId: opts.runId,
|
|
66
|
+
executor: opts.executor,
|
|
67
|
+
criteria: opts.criteria.map((desc, i) => ({
|
|
68
|
+
id: `c${i}`,
|
|
69
|
+
description: desc,
|
|
70
|
+
})),
|
|
71
|
+
verdict: 'pending',
|
|
72
|
+
log: [],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Evaluates a single criterion by index.
|
|
77
|
+
*
|
|
78
|
+
* Throws `ComplianceGateError` when:
|
|
79
|
+
* - `evaluatorId` equals the executor (self-evaluation)
|
|
80
|
+
* - `passed` is true but evidence is missing and `evidenceMode` is 'required'
|
|
81
|
+
*
|
|
82
|
+
* A failed attempt is ALWAYS appended to the log before throwing,
|
|
83
|
+
* so there is no path to bypass the gate silently.
|
|
84
|
+
*/
|
|
85
|
+
evaluateCriterion(index, evaluatorId, passed, evidence) {
|
|
86
|
+
if (evaluatorId === this._record.executor) {
|
|
87
|
+
this.appendLog({
|
|
88
|
+
event: 'self_evaluation_attempt',
|
|
89
|
+
criterionId: `c${index}`,
|
|
90
|
+
evaluatorId,
|
|
91
|
+
detail: `executor "${this._record.executor}" cannot evaluate their own step`,
|
|
92
|
+
});
|
|
93
|
+
throw new ComplianceGateError(`evaluator "${evaluatorId}" is the same as the executor — self-evaluation is not allowed`);
|
|
94
|
+
}
|
|
95
|
+
if (passed && this.evidenceMode === 'required' && !evidence?.trim()) {
|
|
96
|
+
this.appendLog({
|
|
97
|
+
event: 'missing_evidence_attempt',
|
|
98
|
+
criterionId: `c${index}`,
|
|
99
|
+
evaluatorId,
|
|
100
|
+
detail: 'evidence required but not provided',
|
|
101
|
+
});
|
|
102
|
+
throw new ComplianceGateError(`criterion c${index} requires evidence but none was provided`);
|
|
103
|
+
}
|
|
104
|
+
const criterion = this._record.criteria[index];
|
|
105
|
+
if (!criterion) {
|
|
106
|
+
throw new ComplianceGateError(`criterion index ${index} out of range`);
|
|
107
|
+
}
|
|
108
|
+
criterion.passed = passed;
|
|
109
|
+
criterion.evidence = evidence;
|
|
110
|
+
criterion.evaluatedBy = evaluatorId;
|
|
111
|
+
criterion.evaluatedAt = new Date().toISOString();
|
|
112
|
+
this.appendLog({
|
|
113
|
+
event: passed ? 'criterion_evaluated' : 'criterion_rejected',
|
|
114
|
+
criterionId: criterion.id,
|
|
115
|
+
evaluatorId,
|
|
116
|
+
detail: passed ? (evidence ?? undefined) : 'criterion marked as failed',
|
|
117
|
+
});
|
|
118
|
+
this._record.verdict = this.computeVerdict();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Rejects the entire gate immediately (e.g. evaluator found a blocking issue
|
|
122
|
+
* before checking individual criteria). Evaluator ≠ executor is still enforced.
|
|
123
|
+
*/
|
|
124
|
+
reject(evaluatorId, reason) {
|
|
125
|
+
if (evaluatorId === this._record.executor) {
|
|
126
|
+
this.appendLog({
|
|
127
|
+
event: 'self_evaluation_attempt',
|
|
128
|
+
evaluatorId,
|
|
129
|
+
detail: 'attempted self-rejection',
|
|
130
|
+
});
|
|
131
|
+
throw new ComplianceGateError(`evaluator "${evaluatorId}" cannot reject their own step`);
|
|
132
|
+
}
|
|
133
|
+
this._record.verdict = 'failed';
|
|
134
|
+
this.appendLog({
|
|
135
|
+
event: 'gate_rejected',
|
|
136
|
+
evaluatorId,
|
|
137
|
+
detail: reason,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/** Returns an immutable snapshot of the current gate state. */
|
|
141
|
+
getRecord() {
|
|
142
|
+
return {
|
|
143
|
+
...this._record,
|
|
144
|
+
criteria: this._record.criteria.map(c => ({ ...c })),
|
|
145
|
+
log: this._record.log.map(e => ({ ...e })),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
get verdict() {
|
|
149
|
+
return this._record.verdict;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Persists the gate record to the vault under
|
|
153
|
+
* `/auditoria/{flowId}/{runId}/gate-{stepId}.md`.
|
|
154
|
+
* Returns the absolute file path written.
|
|
155
|
+
*/
|
|
156
|
+
async persist(vaultPath) {
|
|
157
|
+
const record = this.getRecord();
|
|
158
|
+
const rows = record.criteria.map(c => `| ${c.id} | ${c.description} | ${c.passed ?? '—'} | ${c.evaluatedBy ?? '—'} | ${c.evidence ?? '—'} |`);
|
|
159
|
+
const logRows = record.log.map(e => `| ${e.at} | ${e.event} | ${e.criterionId ?? '—'} | ${e.evaluatorId ?? '—'} | ${e.detail ?? '—'} |`);
|
|
160
|
+
const content = [
|
|
161
|
+
`## Gate — ${record.stepId}`,
|
|
162
|
+
'',
|
|
163
|
+
'| Field | Value |',
|
|
164
|
+
'|-------|-------|',
|
|
165
|
+
`| Flow | \`${record.flowId}\` |`,
|
|
166
|
+
`| Step | \`${record.stepId}\` |`,
|
|
167
|
+
`| Run | \`${record.runId}\` |`,
|
|
168
|
+
`| Executor | \`${record.executor}\` |`,
|
|
169
|
+
`| Verdict | **${record.verdict}** |`,
|
|
170
|
+
'',
|
|
171
|
+
'### Criteria',
|
|
172
|
+
'',
|
|
173
|
+
'| ID | Description | Passed | Evaluator | Evidence |',
|
|
174
|
+
'|----|-------------|--------|-----------|----------|',
|
|
175
|
+
...rows,
|
|
176
|
+
'',
|
|
177
|
+
'### Audit Log',
|
|
178
|
+
'',
|
|
179
|
+
'| At | Event | Criterion | Evaluator | Detail |',
|
|
180
|
+
'|----|-------|-----------|-----------|--------|',
|
|
181
|
+
...logRows,
|
|
182
|
+
].join('\n');
|
|
183
|
+
const writer = new VaultWriter_1.VaultWriter({
|
|
184
|
+
vaultPath,
|
|
185
|
+
agentFolder: path.join('auditoria', record.flowId, record.runId),
|
|
186
|
+
});
|
|
187
|
+
return writer.writeNote({
|
|
188
|
+
title: `Gate: ${record.flowId}/${record.stepId} (${record.runId})`,
|
|
189
|
+
content,
|
|
190
|
+
agentId: 'compliance-gate',
|
|
191
|
+
tags: [
|
|
192
|
+
'auditoria',
|
|
193
|
+
`flow/${record.flowId}`,
|
|
194
|
+
`step/${record.stepId}`,
|
|
195
|
+
`verdict/${record.verdict}`,
|
|
196
|
+
],
|
|
197
|
+
description: `Compliance gate — verdict: ${record.verdict}`,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
// ── Private ───────────────────────────────────────────────────────────────
|
|
201
|
+
computeVerdict() {
|
|
202
|
+
const criteria = this._record.criteria;
|
|
203
|
+
if (criteria.some(c => c.passed === false))
|
|
204
|
+
return 'failed';
|
|
205
|
+
if (criteria.every(c => c.passed === true))
|
|
206
|
+
return 'passed';
|
|
207
|
+
return 'pending';
|
|
208
|
+
}
|
|
209
|
+
appendLog(entry) {
|
|
210
|
+
this._record.log.push({ at: new Date().toISOString(), ...entry });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.ComplianceGate = ComplianceGate;
|
|
214
|
+
//# sourceMappingURL=ComplianceGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComplianceGate.js","sourceRoot":"","sources":["../../src/flow/ComplianceGate.ts"],"names":[],"mappings":"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"}
|