@vorionsys/atsf-core 0.2.2 → 0.2.4
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 +3 -3
- package/README.md +77 -11
- package/dist/api/server.d.ts +4 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +3 -3
- package/dist/api/server.js.map +1 -1
- package/dist/basis/parser.d.ts +14 -14
- package/dist/common/adapters.d.ts +16 -9
- package/dist/common/adapters.d.ts.map +1 -1
- package/dist/common/adapters.js +69 -58
- package/dist/common/adapters.js.map +1 -1
- package/dist/common/config.d.ts +4 -3
- package/dist/common/config.d.ts.map +1 -1
- package/dist/common/config.js +2 -2
- package/dist/common/config.js.map +1 -1
- package/dist/common/types.d.ts +3 -3
- package/dist/crewai/callback.d.ts +91 -0
- package/dist/crewai/callback.d.ts.map +1 -0
- package/dist/crewai/callback.js +271 -0
- package/dist/crewai/callback.js.map +1 -0
- package/dist/crewai/executor.d.ts +226 -0
- package/dist/crewai/executor.d.ts.map +1 -0
- package/dist/crewai/executor.js +822 -0
- package/dist/crewai/executor.js.map +1 -0
- package/dist/crewai/index.d.ts +12 -0
- package/dist/crewai/index.d.ts.map +1 -0
- package/dist/crewai/index.js +12 -0
- package/dist/crewai/index.js.map +1 -0
- package/dist/crewai/tools.d.ts +21 -0
- package/dist/crewai/tools.d.ts.map +1 -0
- package/dist/crewai/tools.js +163 -0
- package/dist/crewai/tools.js.map +1 -0
- package/dist/crewai/types.d.ts +202 -0
- package/dist/crewai/types.d.ts.map +1 -0
- package/dist/crewai/types.js +9 -0
- package/dist/crewai/types.js.map +1 -0
- package/dist/enforce/index.d.ts +50 -2
- package/dist/enforce/index.d.ts.map +1 -1
- package/dist/enforce/index.js +73 -4
- package/dist/enforce/index.js.map +1 -1
- package/dist/enforce/trust-aware-enforcement-service.d.ts +121 -0
- package/dist/enforce/trust-aware-enforcement-service.d.ts.map +1 -0
- package/dist/enforce/trust-aware-enforcement-service.js +583 -0
- package/dist/enforce/trust-aware-enforcement-service.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/intent/index.d.ts +18 -3
- package/dist/intent/index.d.ts.map +1 -1
- package/dist/intent/index.js +37 -6
- package/dist/intent/index.js.map +1 -1
- package/dist/intent/persistent-intent-service.d.ts +68 -0
- package/dist/intent/persistent-intent-service.d.ts.map +1 -0
- package/dist/intent/persistent-intent-service.js +265 -0
- package/dist/intent/persistent-intent-service.js.map +1 -0
- package/dist/intent/supabase-intent-repository.d.ts +124 -0
- package/dist/intent/supabase-intent-repository.d.ts.map +1 -0
- package/dist/intent/supabase-intent-repository.js +404 -0
- package/dist/intent/supabase-intent-repository.js.map +1 -0
- package/dist/langchain/tools.d.ts.map +1 -1
- package/dist/langchain/tools.js +1 -3
- package/dist/langchain/tools.js.map +1 -1
- package/dist/layers/implementations/L0-request-format.d.ts +37 -0
- package/dist/layers/implementations/L0-request-format.d.ts.map +1 -0
- package/dist/layers/implementations/L0-request-format.js +216 -0
- package/dist/layers/implementations/L0-request-format.js.map +1 -0
- package/dist/layers/implementations/L1-input-size.d.ts +36 -0
- package/dist/layers/implementations/L1-input-size.d.ts.map +1 -0
- package/dist/layers/implementations/L1-input-size.js +150 -0
- package/dist/layers/implementations/L1-input-size.js.map +1 -0
- package/dist/layers/implementations/L2-charset-sanitizer.d.ts +28 -0
- package/dist/layers/implementations/L2-charset-sanitizer.d.ts.map +1 -0
- package/dist/layers/implementations/L2-charset-sanitizer.js +220 -0
- package/dist/layers/implementations/L2-charset-sanitizer.js.map +1 -0
- package/dist/layers/implementations/L3-schema-conformance.d.ts +47 -0
- package/dist/layers/implementations/L3-schema-conformance.d.ts.map +1 -0
- package/dist/layers/implementations/L3-schema-conformance.js +258 -0
- package/dist/layers/implementations/L3-schema-conformance.js.map +1 -0
- package/dist/layers/implementations/L4-injection-detector.d.ts +47 -0
- package/dist/layers/implementations/L4-injection-detector.d.ts.map +1 -0
- package/dist/layers/implementations/L4-injection-detector.js +256 -0
- package/dist/layers/implementations/L4-injection-detector.js.map +1 -0
- package/dist/layers/implementations/L5-rate-limiter.d.ts +51 -0
- package/dist/layers/implementations/L5-rate-limiter.d.ts.map +1 -0
- package/dist/layers/implementations/L5-rate-limiter.js +183 -0
- package/dist/layers/implementations/L5-rate-limiter.js.map +1 -0
- package/dist/layers/implementations/index.d.ts +16 -0
- package/dist/layers/implementations/index.d.ts.map +1 -0
- package/dist/layers/implementations/index.js +16 -0
- package/dist/layers/implementations/index.js.map +1 -0
- package/dist/persistence/sqlite.d.ts.map +1 -1
- package/dist/persistence/sqlite.js +4 -3
- package/dist/persistence/sqlite.js.map +1 -1
- package/dist/persistence/supabase.js +2 -2
- package/dist/persistence/supabase.js.map +1 -1
- package/dist/phase6/ceiling.js +5 -5
- package/dist/phase6/ceiling.js.map +1 -1
- package/dist/phase6/context.js +6 -6
- package/dist/phase6/context.js.map +1 -1
- package/dist/phase6/index.d.ts +1 -1
- package/dist/phase6/index.js +1 -1
- package/dist/phase6/role-gates.js +2 -2
- package/dist/phase6/role-gates.js.map +1 -1
- package/dist/phase6/types.d.ts +31 -30
- package/dist/phase6/types.d.ts.map +1 -1
- package/dist/phase6/types.js +17 -12
- package/dist/phase6/types.js.map +1 -1
- package/dist/phase6/weight-presets/canonical.d.ts +2 -2
- package/dist/phase6/weight-presets/canonical.js +2 -2
- package/dist/phase6/weight-presets/index.d.ts +1 -1
- package/dist/phase6/weight-presets/index.js +1 -1
- package/dist/phase6/weight-presets/merger.d.ts +1 -1
- package/dist/phase6/weight-presets/merger.js +1 -1
- package/dist/proof/merkle.d.ts +21 -0
- package/dist/proof/merkle.d.ts.map +1 -1
- package/dist/proof/merkle.js +92 -7
- package/dist/proof/merkle.js.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/kernel.d.ts +11 -9
- package/dist/trust-engine/ceiling-enforcement/kernel.d.ts.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/kernel.js +25 -19
- package/dist/trust-engine/ceiling-enforcement/kernel.js.map +1 -1
- package/dist/trust-engine/decay-profiles.d.ts +37 -136
- package/dist/trust-engine/decay-profiles.d.ts.map +1 -1
- package/dist/trust-engine/decay-profiles.js +68 -178
- package/dist/trust-engine/decay-profiles.js.map +1 -1
- package/dist/trust-engine/index.d.ts +96 -63
- package/dist/trust-engine/index.d.ts.map +1 -1
- package/dist/trust-engine/index.js +183 -112
- package/dist/trust-engine/index.js.map +1 -1
- package/dist/trust-engine/phase6-types.d.ts +10 -3
- package/dist/trust-engine/phase6-types.d.ts.map +1 -1
- package/dist/trust-engine/phase6-types.js +19 -13
- package/dist/trust-engine/phase6-types.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase/Postgres Persistence Adapter for Intent Service
|
|
3
|
+
*
|
|
4
|
+
* Production-quality intent service backed by Supabase (PostgreSQL). Provides:
|
|
5
|
+
* - Full IIntentService interface implementation
|
|
6
|
+
* - Input validation (same rules as PersistentIntentService)
|
|
7
|
+
* - State machine enforcement for status transitions
|
|
8
|
+
* - Tenant isolation via tenantId column (and optional RLS)
|
|
9
|
+
* - Configurable table name and schema for multi-schema deployments
|
|
10
|
+
* - Correlation ID tracking for distributed tracing
|
|
11
|
+
* - Type-only import of @supabase/supabase-js to avoid hard dependency
|
|
12
|
+
*
|
|
13
|
+
* Requires the migration in ./migrations/001_create_intents_table.sql to be
|
|
14
|
+
* applied before use.
|
|
15
|
+
*
|
|
16
|
+
* @packageDocumentation
|
|
17
|
+
*/
|
|
18
|
+
import { createLogger } from '../common/logger.js';
|
|
19
|
+
const logger = createLogger({ component: 'supabase-intent-repository' });
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// STATE MACHINE
|
|
22
|
+
// =============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Valid status transitions for the intent lifecycle.
|
|
25
|
+
* Mirrors PersistentIntentService exactly.
|
|
26
|
+
*/
|
|
27
|
+
const VALID_TRANSITIONS = {
|
|
28
|
+
pending: ['evaluating', 'cancelled'],
|
|
29
|
+
evaluating: ['approved', 'denied', 'escalated', 'failed'],
|
|
30
|
+
approved: ['executing', 'cancelled'],
|
|
31
|
+
denied: [],
|
|
32
|
+
escalated: ['approved', 'denied', 'cancelled'],
|
|
33
|
+
executing: ['completed', 'failed'],
|
|
34
|
+
completed: [],
|
|
35
|
+
failed: ['pending'], // allow retry
|
|
36
|
+
cancelled: [],
|
|
37
|
+
};
|
|
38
|
+
// =============================================================================
|
|
39
|
+
// VALIDATION
|
|
40
|
+
// =============================================================================
|
|
41
|
+
/**
|
|
42
|
+
* Validate an IntentSubmission. Returns an array of error messages (empty = valid).
|
|
43
|
+
* Mirrors PersistentIntentService validation logic exactly.
|
|
44
|
+
*/
|
|
45
|
+
function validateSubmission(submission) {
|
|
46
|
+
const errors = [];
|
|
47
|
+
if (!submission.entityId || typeof submission.entityId !== 'string') {
|
|
48
|
+
errors.push('entityId is required and must be a non-empty string');
|
|
49
|
+
}
|
|
50
|
+
if (!submission.goal || typeof submission.goal !== 'string') {
|
|
51
|
+
errors.push('goal is required and must be a non-empty string');
|
|
52
|
+
}
|
|
53
|
+
if (submission.goal && submission.goal.length > 10_000) {
|
|
54
|
+
errors.push('goal must be 10,000 characters or fewer');
|
|
55
|
+
}
|
|
56
|
+
if (submission.context !== undefined &&
|
|
57
|
+
(typeof submission.context !== 'object' || submission.context === null)) {
|
|
58
|
+
errors.push('context must be a plain object');
|
|
59
|
+
}
|
|
60
|
+
if (submission.expiresIn !== undefined) {
|
|
61
|
+
if (typeof submission.expiresIn !== 'number' || submission.expiresIn <= 0) {
|
|
62
|
+
errors.push('expiresIn must be a positive number (milliseconds)');
|
|
63
|
+
}
|
|
64
|
+
if (submission.expiresIn > 86_400_000) {
|
|
65
|
+
errors.push('expiresIn cannot exceed 24 hours (86400000ms)');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return errors;
|
|
69
|
+
}
|
|
70
|
+
const CONFIG_DEFAULTS = {
|
|
71
|
+
tableName: 'intents',
|
|
72
|
+
schema: 'public',
|
|
73
|
+
defaultExpirationMs: 3_600_000,
|
|
74
|
+
};
|
|
75
|
+
// =============================================================================
|
|
76
|
+
// MAPPING HELPERS
|
|
77
|
+
// =============================================================================
|
|
78
|
+
/**
|
|
79
|
+
* Convert a database row (snake_case) to an Intent domain object (camelCase).
|
|
80
|
+
*/
|
|
81
|
+
function rowToIntent(row) {
|
|
82
|
+
return {
|
|
83
|
+
id: row.id,
|
|
84
|
+
tenantId: row.tenant_id,
|
|
85
|
+
entityId: row.entity_id,
|
|
86
|
+
goal: row.goal,
|
|
87
|
+
context: row.context,
|
|
88
|
+
metadata: row.metadata,
|
|
89
|
+
status: row.status,
|
|
90
|
+
createdAt: row.created_at,
|
|
91
|
+
updatedAt: row.updated_at,
|
|
92
|
+
trustSnapshot: row.trust_snapshot,
|
|
93
|
+
trustLevel: row.trust_level,
|
|
94
|
+
correlationId: row.correlation_id,
|
|
95
|
+
actionType: row.action_type,
|
|
96
|
+
resourceScope: row.resource_scope,
|
|
97
|
+
dataSensitivity: row.data_sensitivity,
|
|
98
|
+
reversibility: row.reversibility,
|
|
99
|
+
expiresAt: row.expires_at,
|
|
100
|
+
source: row.source,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Convert an Intent domain object to a database row for insertion.
|
|
105
|
+
*/
|
|
106
|
+
function intentToRow(intent) {
|
|
107
|
+
return {
|
|
108
|
+
id: intent.id,
|
|
109
|
+
tenant_id: intent.tenantId ?? '',
|
|
110
|
+
entity_id: intent.entityId,
|
|
111
|
+
goal: intent.goal,
|
|
112
|
+
context: intent.context,
|
|
113
|
+
metadata: intent.metadata,
|
|
114
|
+
status: intent.status,
|
|
115
|
+
created_at: intent.createdAt,
|
|
116
|
+
updated_at: intent.updatedAt,
|
|
117
|
+
trust_snapshot: intent.trustSnapshot ?? null,
|
|
118
|
+
trust_level: intent.trustLevel ?? null,
|
|
119
|
+
correlation_id: intent.correlationId ?? crypto.randomUUID(),
|
|
120
|
+
action_type: intent.actionType ?? null,
|
|
121
|
+
resource_scope: intent.resourceScope ?? null,
|
|
122
|
+
data_sensitivity: intent.dataSensitivity ?? null,
|
|
123
|
+
reversibility: intent.reversibility ?? null,
|
|
124
|
+
expires_at: intent.expiresAt ?? null,
|
|
125
|
+
source: intent.source ?? null,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// =============================================================================
|
|
129
|
+
// SUPABASE INTENT REPOSITORY
|
|
130
|
+
// =============================================================================
|
|
131
|
+
/**
|
|
132
|
+
* Supabase/Postgres-backed intent service.
|
|
133
|
+
*
|
|
134
|
+
* Implements the full IIntentService interface with durable persistence,
|
|
135
|
+
* input validation, state machine enforcement, and tenant isolation.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* import { createClient } from '@supabase/supabase-js';
|
|
140
|
+
* import { createSupabaseIntentRepository } from '@vorionsys/atsf-core/intent/supabase-intent-repository';
|
|
141
|
+
*
|
|
142
|
+
* const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
|
|
143
|
+
* const intentService = createSupabaseIntentRepository({ client: supabase });
|
|
144
|
+
*
|
|
145
|
+
* const intent = await intentService.submit(
|
|
146
|
+
* { entityId: 'agent-1', goal: 'Send email', context: {} },
|
|
147
|
+
* { tenantId: 'tenant-abc' }
|
|
148
|
+
* );
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
export class SupabaseIntentRepository {
|
|
152
|
+
client;
|
|
153
|
+
tableName;
|
|
154
|
+
schema;
|
|
155
|
+
defaultExpirationMs;
|
|
156
|
+
constructor(config) {
|
|
157
|
+
if (!config.client) {
|
|
158
|
+
throw new Error('SupabaseIntentRepository requires a SupabaseClient instance');
|
|
159
|
+
}
|
|
160
|
+
this.client = config.client;
|
|
161
|
+
this.tableName = config.tableName ?? CONFIG_DEFAULTS.tableName;
|
|
162
|
+
this.schema = config.schema ?? CONFIG_DEFAULTS.schema;
|
|
163
|
+
this.defaultExpirationMs = config.defaultExpirationMs ?? CONFIG_DEFAULTS.defaultExpirationMs;
|
|
164
|
+
logger.info({ tableName: this.tableName, schema: this.schema }, 'SupabaseIntentRepository initialized');
|
|
165
|
+
}
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
// Private: get a schema-scoped query builder for the intents table
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
table() {
|
|
170
|
+
return this.client.schema(this.schema).from(this.tableName);
|
|
171
|
+
}
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
// IIntentService.submit
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
/**
|
|
176
|
+
* Submit a new intent with full validation and persist to Supabase.
|
|
177
|
+
*/
|
|
178
|
+
async submit(submission, options) {
|
|
179
|
+
// Validate input
|
|
180
|
+
const errors = validateSubmission(submission);
|
|
181
|
+
if (errors.length > 0) {
|
|
182
|
+
throw new Error(`Invalid intent submission: ${errors.join('; ')}`);
|
|
183
|
+
}
|
|
184
|
+
if (!options.tenantId) {
|
|
185
|
+
throw new Error('tenantId is required in SubmitOptions');
|
|
186
|
+
}
|
|
187
|
+
const now = new Date().toISOString();
|
|
188
|
+
const correlationId = submission.correlationId ?? crypto.randomUUID();
|
|
189
|
+
const expiresAt = submission.expiresIn
|
|
190
|
+
? new Date(Date.now() + submission.expiresIn).toISOString()
|
|
191
|
+
: new Date(Date.now() + this.defaultExpirationMs).toISOString();
|
|
192
|
+
const intent = {
|
|
193
|
+
id: crypto.randomUUID(),
|
|
194
|
+
tenantId: options.tenantId,
|
|
195
|
+
entityId: submission.entityId,
|
|
196
|
+
goal: submission.goal,
|
|
197
|
+
context: submission.context ?? {},
|
|
198
|
+
metadata: submission.metadata ?? {},
|
|
199
|
+
status: 'pending',
|
|
200
|
+
createdAt: now,
|
|
201
|
+
updatedAt: now,
|
|
202
|
+
trustSnapshot: options.trustSnapshot ?? null,
|
|
203
|
+
trustLevel: options.trustLevel ?? null,
|
|
204
|
+
correlationId,
|
|
205
|
+
actionType: submission.actionType ?? null,
|
|
206
|
+
resourceScope: submission.resourceScope ?? null,
|
|
207
|
+
dataSensitivity: submission.dataSensitivity ?? null,
|
|
208
|
+
reversibility: submission.reversibility ?? null,
|
|
209
|
+
expiresAt,
|
|
210
|
+
source: submission.source ?? null,
|
|
211
|
+
};
|
|
212
|
+
const row = intentToRow(intent);
|
|
213
|
+
const { data, error } = await this.table()
|
|
214
|
+
.insert(row)
|
|
215
|
+
.select()
|
|
216
|
+
.single();
|
|
217
|
+
if (error) {
|
|
218
|
+
logger.error({ error: error.message, code: error.code, intentId: intent.id }, 'Failed to insert intent into Supabase');
|
|
219
|
+
throw new Error(`Failed to persist intent: ${error.message}`);
|
|
220
|
+
}
|
|
221
|
+
const persisted = rowToIntent(data);
|
|
222
|
+
logger.info({
|
|
223
|
+
intentId: persisted.id,
|
|
224
|
+
entityId: persisted.entityId,
|
|
225
|
+
tenantId: options.tenantId,
|
|
226
|
+
goal: persisted.goal.slice(0, 100),
|
|
227
|
+
correlationId,
|
|
228
|
+
actionType: persisted.actionType,
|
|
229
|
+
}, 'Intent submitted');
|
|
230
|
+
return persisted;
|
|
231
|
+
}
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
// IIntentService.get
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
/**
|
|
236
|
+
* Retrieve an intent by ID with tenant isolation.
|
|
237
|
+
* Returns undefined if not found or if the intent belongs to a different tenant.
|
|
238
|
+
*/
|
|
239
|
+
async get(id, tenantId) {
|
|
240
|
+
const { data, error } = await this.table()
|
|
241
|
+
.select('*')
|
|
242
|
+
.eq('id', id)
|
|
243
|
+
.eq('tenant_id', tenantId)
|
|
244
|
+
.maybeSingle();
|
|
245
|
+
if (error) {
|
|
246
|
+
logger.error({ error: error.message, code: error.code, intentId: id }, 'Failed to fetch intent from Supabase');
|
|
247
|
+
throw new Error(`Failed to fetch intent: ${error.message}`);
|
|
248
|
+
}
|
|
249
|
+
if (!data) {
|
|
250
|
+
return undefined;
|
|
251
|
+
}
|
|
252
|
+
const intent = rowToIntent(data);
|
|
253
|
+
// Check expiration: if expired and not yet terminal, auto-cancel
|
|
254
|
+
if (this.isExpired(intent)) {
|
|
255
|
+
await this.expireIntent(intent);
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
return intent;
|
|
259
|
+
}
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
// IIntentService.updateStatus
|
|
262
|
+
// ---------------------------------------------------------------------------
|
|
263
|
+
/**
|
|
264
|
+
* Update the status of an intent with state machine enforcement.
|
|
265
|
+
* Returns the updated intent, or undefined if not found / wrong tenant.
|
|
266
|
+
* Throws if the requested transition is invalid.
|
|
267
|
+
*/
|
|
268
|
+
async updateStatus(id, tenantId, status) {
|
|
269
|
+
// First, fetch the current intent to validate the transition
|
|
270
|
+
const { data: currentData, error: fetchError } = await this.table()
|
|
271
|
+
.select('*')
|
|
272
|
+
.eq('id', id)
|
|
273
|
+
.eq('tenant_id', tenantId)
|
|
274
|
+
.maybeSingle();
|
|
275
|
+
if (fetchError) {
|
|
276
|
+
logger.error({ error: fetchError.message, code: fetchError.code, intentId: id }, 'Failed to fetch intent for status update');
|
|
277
|
+
throw new Error(`Failed to fetch intent for status update: ${fetchError.message}`);
|
|
278
|
+
}
|
|
279
|
+
if (!currentData) {
|
|
280
|
+
return undefined;
|
|
281
|
+
}
|
|
282
|
+
const currentIntent = rowToIntent(currentData);
|
|
283
|
+
// Validate transition against the state machine
|
|
284
|
+
const allowed = VALID_TRANSITIONS[currentIntent.status];
|
|
285
|
+
if (!allowed || !allowed.includes(status)) {
|
|
286
|
+
throw new Error(`Invalid status transition: '${currentIntent.status}' -> '${status}'. ` +
|
|
287
|
+
`Allowed transitions from '${currentIntent.status}': [${allowed?.join(', ') ?? 'none'}]`);
|
|
288
|
+
}
|
|
289
|
+
// Perform the update
|
|
290
|
+
const { data: updatedData, error: updateError } = await this.table()
|
|
291
|
+
.update({ status, updated_at: new Date().toISOString() })
|
|
292
|
+
.eq('id', id)
|
|
293
|
+
.eq('tenant_id', tenantId)
|
|
294
|
+
.select()
|
|
295
|
+
.single();
|
|
296
|
+
if (updateError) {
|
|
297
|
+
logger.error({ error: updateError.message, code: updateError.code, intentId: id }, 'Failed to update intent status in Supabase');
|
|
298
|
+
throw new Error(`Failed to update intent status: ${updateError.message}`);
|
|
299
|
+
}
|
|
300
|
+
const updated = rowToIntent(updatedData);
|
|
301
|
+
logger.info({ intentId: id, from: currentIntent.status, to: status }, 'Intent status updated');
|
|
302
|
+
return updated;
|
|
303
|
+
}
|
|
304
|
+
// ---------------------------------------------------------------------------
|
|
305
|
+
// IIntentService.listByEntity
|
|
306
|
+
// ---------------------------------------------------------------------------
|
|
307
|
+
/**
|
|
308
|
+
* List all intents for a given entity within a tenant.
|
|
309
|
+
* Results are sorted by creation time (newest first).
|
|
310
|
+
* Expired intents are excluded.
|
|
311
|
+
*/
|
|
312
|
+
async listByEntity(entityId, tenantId) {
|
|
313
|
+
const { data, error } = await this.table()
|
|
314
|
+
.select('*')
|
|
315
|
+
.eq('entity_id', entityId)
|
|
316
|
+
.eq('tenant_id', tenantId)
|
|
317
|
+
.order('created_at', { ascending: false });
|
|
318
|
+
if (error) {
|
|
319
|
+
logger.error({ error: error.message, code: error.code, entityId, tenantId }, 'Failed to list intents from Supabase');
|
|
320
|
+
throw new Error(`Failed to list intents: ${error.message}`);
|
|
321
|
+
}
|
|
322
|
+
if (!data || data.length === 0) {
|
|
323
|
+
return [];
|
|
324
|
+
}
|
|
325
|
+
const now = Date.now();
|
|
326
|
+
const results = [];
|
|
327
|
+
for (const row of data) {
|
|
328
|
+
const intent = rowToIntent(row);
|
|
329
|
+
if (!this.isExpired(intent, now)) {
|
|
330
|
+
results.push(intent);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return results;
|
|
334
|
+
}
|
|
335
|
+
// ===========================================================================
|
|
336
|
+
// Private Helpers
|
|
337
|
+
// ===========================================================================
|
|
338
|
+
/**
|
|
339
|
+
* Check if an intent has passed its expiration time.
|
|
340
|
+
*/
|
|
341
|
+
isExpired(intent, now) {
|
|
342
|
+
if (!intent.expiresAt)
|
|
343
|
+
return false;
|
|
344
|
+
return new Date(intent.expiresAt).getTime() < (now ?? Date.now());
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Mark an expired, non-terminal intent as cancelled in the database.
|
|
348
|
+
*/
|
|
349
|
+
async expireIntent(intent) {
|
|
350
|
+
const terminalStatuses = ['completed', 'cancelled', 'denied'];
|
|
351
|
+
if (terminalStatuses.includes(intent.status)) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
const { error } = await this.table()
|
|
355
|
+
.update({ status: 'cancelled', updated_at: new Date().toISOString() })
|
|
356
|
+
.eq('id', intent.id)
|
|
357
|
+
.eq('tenant_id', intent.tenantId ?? '');
|
|
358
|
+
if (error) {
|
|
359
|
+
logger.warn({ error: error.message, intentId: intent.id }, 'Failed to auto-cancel expired intent');
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
logger.debug({ intentId: intent.id }, 'Intent expired and auto-cancelled');
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// =============================================================================
|
|
367
|
+
// FACTORY FUNCTION
|
|
368
|
+
// =============================================================================
|
|
369
|
+
/**
|
|
370
|
+
* Create a new SupabaseIntentRepository instance.
|
|
371
|
+
*
|
|
372
|
+
* This factory provides a convenient way to instantiate the repository
|
|
373
|
+
* without directly importing the class, useful for dependency injection
|
|
374
|
+
* and testing.
|
|
375
|
+
*
|
|
376
|
+
* @param config - Repository configuration including the Supabase client
|
|
377
|
+
* @returns A configured SupabaseIntentRepository implementing IIntentService
|
|
378
|
+
*
|
|
379
|
+
* @example
|
|
380
|
+
* ```typescript
|
|
381
|
+
* import { createClient } from '@supabase/supabase-js';
|
|
382
|
+
* import { createSupabaseIntentRepository } from '@vorionsys/atsf-core/intent/supabase-intent-repository';
|
|
383
|
+
*
|
|
384
|
+
* const supabase = createClient(
|
|
385
|
+
* process.env.SUPABASE_URL!,
|
|
386
|
+
* process.env.SUPABASE_SERVICE_KEY!
|
|
387
|
+
* );
|
|
388
|
+
*
|
|
389
|
+
* const intentService = createSupabaseIntentRepository({
|
|
390
|
+
* client: supabase,
|
|
391
|
+
* tableName: 'intents', // default
|
|
392
|
+
* schema: 'public', // default
|
|
393
|
+
* defaultExpirationMs: 3600000, // 1 hour default
|
|
394
|
+
* });
|
|
395
|
+
*
|
|
396
|
+
* // Wire it into the service locator
|
|
397
|
+
* import { setIntentService } from '@vorionsys/atsf-core';
|
|
398
|
+
* setIntentService(intentService);
|
|
399
|
+
* ```
|
|
400
|
+
*/
|
|
401
|
+
export function createSupabaseIntentRepository(config) {
|
|
402
|
+
return new SupabaseIntentRepository(config);
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=supabase-intent-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-intent-repository.js","sourceRoot":"","sources":["../../src/intent/supabase-intent-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUnD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC,CAAC;AAEzE,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,iBAAiB,GAAyC;IAC9D,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,UAAU,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC;IACzD,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;IACpC,MAAM,EAAE,EAAE;IACV,SAAS,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC;IAC9C,SAAS,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;IAClC,SAAS,EAAE,EAAE;IACb,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,cAAc;IACnC,SAAS,EAAE,EAAE;CACd,CAAC;AAEF,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,kBAAkB,CAAC,UAA4B;IACtD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,OAAO,UAAU,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IACD,IACE,UAAU,CAAC,OAAO,KAAK,SAAS;QAChC,CAAC,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC,OAAO,KAAK,IAAI,CAAC,EACvE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,IAAI,UAAU,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAC1E,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,UAAU,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAiDD,MAAM,eAAe,GAAG;IACtB,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,QAAQ;IAChB,mBAAmB,EAAE,SAAS;CACtB,CAAC;AAEX,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;GAEG;AACH,SAAS,WAAW,CAAC,GAAc;IACjC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,eAAe,EAAE,GAAG,CAAC,gBAAgB;QACrC,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;QAChC,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,SAAS;QAC5B,UAAU,EAAE,MAAM,CAAC,SAAS;QAC5B,cAAc,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;QAC5C,WAAW,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;QACtC,cAAc,EAAE,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,UAAU,EAAE;QAC3D,WAAW,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;QACtC,cAAc,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;QAC5C,gBAAgB,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;QAChD,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;QAC3C,UAAU,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;QACpC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;KAC9B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,6BAA6B;AAC7B,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,wBAAwB;IAClB,MAAM,CAAiB;IACvB,SAAS,CAAS;IAClB,MAAM,CAAS;IACf,mBAAmB,CAAS;IAE7C,YAAY,MAAsC;QAChD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,eAAe,CAAC,SAAS,CAAC;QAC/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC;QACtD,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,IAAI,eAAe,CAAC,mBAAmB,CAAC;QAE7F,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAClD,sCAAsC,CACvC,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,mEAAmE;IACnE,8EAA8E;IAEtE,KAAK;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,8EAA8E;IAC9E,wBAAwB;IACxB,8EAA8E;IAE9E;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,UAA4B,EAAE,OAAsB;QAC/D,iBAAiB;QACjB,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtE,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS;YACpC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;YAC3D,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC;QAElE,MAAM,MAAM,GAAW;YACrB,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;YACvB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,EAAE;YACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,EAAE;YACnC,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;YAC5C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;YACtC,aAAa;YACb,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,IAAI;YACzC,aAAa,EAAE,UAAU,CAAC,aAAa,IAAI,IAAI;YAC/C,eAAe,EAAE,UAAU,CAAC,eAAe,IAAI,IAAI;YACnD,aAAa,EAAE,UAAU,CAAC,aAAa,IAAI,IAAI;YAC/C,SAAS;YACT,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,IAAI;SAClC,CAAC;QAEF,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;aACvC,MAAM,CAAC,GAAG,CAAC;aACX,MAAM,EAAE;aACR,MAAM,EAAE,CAAC;QAEZ,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,EAC/D,uCAAuC,CACxC,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,IAAiB,CAAC,CAAC;QAEjD,MAAM,CAAC,IAAI,CACT;YACE,QAAQ,EAAE,SAAS,CAAC,EAAE;YACtB,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAClC,aAAa;YACb,UAAU,EAAE,SAAS,CAAC,UAAU;SACjC,EACD,kBAAkB,CACnB,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,8EAA8E;IAC9E,qBAAqB;IACrB,8EAA8E;IAE9E;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,EAAM,EAAE,QAAY;QAC5B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;aACvC,MAAM,CAAC,GAAG,CAAC;aACX,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;aACZ,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;aACzB,WAAW,EAAE,CAAC;QAEjB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EACxD,sCAAsC,CACvC,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAiB,CAAC,CAAC;QAE9C,iEAAiE;QACjE,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8EAA8E;IAC9E,8BAA8B;IAC9B,8EAA8E;IAE9E;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAChB,EAAM,EACN,QAAY,EACZ,MAAoB;QAEpB,6DAA6D;QAC7D,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;aAChE,MAAM,CAAC,GAAG,CAAC;aACX,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;aACZ,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;aACzB,WAAW,EAAE,CAAC;QAEjB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAClE,0CAA0C,CAC3C,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,6CAA6C,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,aAAa,GAAG,WAAW,CAAC,WAAwB,CAAC,CAAC;QAE5D,gDAAgD;QAChD,MAAM,OAAO,GAAG,iBAAiB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,+BAA+B,aAAa,CAAC,MAAM,SAAS,MAAM,KAAK;gBACrE,6BAA6B,aAAa,CAAC,MAAM,OAAO,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAC3F,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;aACjE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;aACxD,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;aACZ,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;aACzB,MAAM,EAAE;aACR,MAAM,EAAE,CAAC;QAEZ,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EACpE,4CAA4C,CAC7C,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,mCAAmC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,WAAwB,CAAC,CAAC;QAEtD,MAAM,CAAC,IAAI,CACT,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EACxD,uBAAuB,CACxB,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,8EAA8E;IAC9E,8BAA8B;IAC9B,8EAA8E;IAE9E;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,QAAY,EAAE,QAAY;QAC3C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;aACvC,MAAM,CAAC,GAAG,CAAC;aACX,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;aACzB,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;aACzB,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAC9D,sCAAsC,CACvC,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,KAAK,MAAM,GAAG,IAAI,IAAmB,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;OAEG;IACK,SAAS,CAAC,MAAc,EAAE,GAAY;QAC5C,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,MAAc;QACvC,MAAM,gBAAgB,GAAmB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC9E,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;aACjC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;aACrE,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;aACnB,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAE1C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,EAC7C,sCAAsC,CACvC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,mCAAmC,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;CACF;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,8BAA8B,CAC5C,MAAsC;IAEtC,OAAO,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/langchain/tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,MAAM,GACd,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/langchain/tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,MAAM,GACd,mBAAmB,EAAE,CA8IvB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,WAAW,GACvB,mBAAmB,CA0BrB"}
|
package/dist/langchain/tools.js
CHANGED
|
@@ -29,8 +29,7 @@ export function createTrustTools(trustEngine, agentId) {
|
|
|
29
29
|
level: record.level,
|
|
30
30
|
levelName: TRUST_LEVEL_NAMES[record.level],
|
|
31
31
|
components: record.components,
|
|
32
|
-
|
|
33
|
-
acceleratedDecay: trustEngine.isAcceleratedDecayActive(agentId),
|
|
32
|
+
recentSuccesses: record.recentSuccesses.length,
|
|
34
33
|
});
|
|
35
34
|
},
|
|
36
35
|
},
|
|
@@ -130,7 +129,6 @@ export function createTrustTools(trustEngine, agentId) {
|
|
|
130
129
|
recorded: true,
|
|
131
130
|
newScore: record?.score,
|
|
132
131
|
newLevel: record?.level,
|
|
133
|
-
acceleratedDecay: trustEngine.isAcceleratedDecayActive(agentId),
|
|
134
132
|
message: 'Task failure recorded. Your trust score may have decreased. ' +
|
|
135
133
|
'Honest reporting is valued in the trust system.',
|
|
136
134
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/langchain/tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAY/E;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAwB,EACxB,OAAe;IAEf,OAAO;QACL;YACE,IAAI,EAAE,gBAAgB;YACtB,WAAW,EACT,+EAA+E;gBAC/E,uFAAuF;YACzF,IAAI,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;gBAC7B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACnD,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,IAAI,CAAC,SAAS,CAAC;wBACpB,KAAK,EAAE,wBAAwB;wBAC/B,OAAO;qBACR,CAAC,CAAC;gBACL,CAAC;gBAED,OAAO,IAAI,CAAC,SAAS,CAAC;oBACpB,OAAO;oBACP,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC1C,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/langchain/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L0 — Request Format Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates that incoming requests conform to the expected structural format
|
|
5
|
+
* before any deeper analysis. Rejects malformed payloads, missing required
|
|
6
|
+
* fields, and structurally invalid inputs at the perimeter.
|
|
7
|
+
*
|
|
8
|
+
* Tier: input_validation
|
|
9
|
+
* Primary threat: prompt_injection
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { BaseSecurityLayer } from '../index.js';
|
|
14
|
+
import type { LayerInput, LayerExecutionResult } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* L0 Request Format Validator
|
|
17
|
+
*
|
|
18
|
+
* First line of defense — ensures every request has the correct shape
|
|
19
|
+
* before any downstream processing.
|
|
20
|
+
*/
|
|
21
|
+
export declare class L0RequestFormatValidator extends BaseSecurityLayer {
|
|
22
|
+
constructor();
|
|
23
|
+
execute(input: LayerInput): Promise<LayerExecutionResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Measure nesting depth of an object, with early bail-out.
|
|
26
|
+
*/
|
|
27
|
+
private measureDepth;
|
|
28
|
+
/**
|
|
29
|
+
* Count total keys across all levels of an object.
|
|
30
|
+
*/
|
|
31
|
+
private countKeys;
|
|
32
|
+
/**
|
|
33
|
+
* Detect prototype pollution attempts (__proto__, constructor, prototype).
|
|
34
|
+
*/
|
|
35
|
+
private detectPrototypePollution;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=L0-request-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"L0-request-format.d.ts","sourceRoot":"","sources":["../../../src/layers/implementations/L0-request-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAA6B,MAAM,aAAa,CAAC;AAW/F;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,iBAAiB;;IAiBvD,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAuI/D;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAmBjC"}
|