@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
package/dist/intent/index.d.ts
CHANGED
|
@@ -151,11 +151,26 @@ export declare class MockIntentService implements IIntentService {
|
|
|
151
151
|
*/
|
|
152
152
|
export declare class IntentService extends MockIntentService {
|
|
153
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Set the intent service implementation to use at runtime.
|
|
156
|
+
* Call this during application bootstrap with a real backend.
|
|
157
|
+
*/
|
|
158
|
+
export declare function setIntentService(service: IIntentService): void;
|
|
159
|
+
/**
|
|
160
|
+
* Get the configured intent service.
|
|
161
|
+
* Throws if no real backend has been provided via setIntentService().
|
|
162
|
+
*/
|
|
163
|
+
export declare function getIntentService(): IIntentService;
|
|
154
164
|
/**
|
|
155
165
|
* Create a new intent service instance
|
|
156
166
|
*
|
|
157
|
-
*
|
|
158
|
-
|
|
167
|
+
* Throws if no real backend is provided. For tests, use createMockIntentService().
|
|
168
|
+
*/
|
|
169
|
+
export declare function createIntentService(service?: IIntentService): IIntentService;
|
|
170
|
+
/**
|
|
171
|
+
* Create a mock intent service for testing only.
|
|
159
172
|
*/
|
|
160
|
-
export declare function
|
|
173
|
+
export declare function createMockIntentService(): MockIntentService;
|
|
174
|
+
export { PersistentIntentService } from './persistent-intent-service.js';
|
|
175
|
+
export type { PersistentIntentServiceConfig } from './persistent-intent-service.js';
|
|
161
176
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/intent/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/intent/index.ts"],"names":[],"mappings":"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"}
|
package/dist/intent/index.js
CHANGED
|
@@ -155,15 +155,46 @@ export class MockIntentService {
|
|
|
155
155
|
*/
|
|
156
156
|
export class IntentService extends MockIntentService {
|
|
157
157
|
}
|
|
158
|
+
// =============================================================================
|
|
159
|
+
// SERVICE FACTORY & INJECTION
|
|
160
|
+
// =============================================================================
|
|
161
|
+
let intentService = null;
|
|
162
|
+
/**
|
|
163
|
+
* Set the intent service implementation to use at runtime.
|
|
164
|
+
* Call this during application bootstrap with a real backend.
|
|
165
|
+
*/
|
|
166
|
+
export function setIntentService(service) {
|
|
167
|
+
intentService = service;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get the configured intent service.
|
|
171
|
+
* Throws if no real backend has been provided via setIntentService().
|
|
172
|
+
*/
|
|
173
|
+
export function getIntentService() {
|
|
174
|
+
if (!intentService) {
|
|
175
|
+
throw new Error('No intent service backend configured. Pass a real IntentService implementation or see docs for setup.');
|
|
176
|
+
}
|
|
177
|
+
return intentService;
|
|
178
|
+
}
|
|
158
179
|
/**
|
|
159
180
|
* Create a new intent service instance
|
|
160
181
|
*
|
|
161
|
-
*
|
|
162
|
-
* IIntentService for production use.
|
|
182
|
+
* Throws if no real backend is provided. For tests, use createMockIntentService().
|
|
163
183
|
*/
|
|
164
|
-
export function createIntentService() {
|
|
165
|
-
|
|
166
|
-
'
|
|
167
|
-
|
|
184
|
+
export function createIntentService(service) {
|
|
185
|
+
if (!service) {
|
|
186
|
+
throw new Error('No intent service backend configured. Pass a real IntentService implementation or see docs for setup.');
|
|
187
|
+
}
|
|
188
|
+
return service;
|
|
168
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Create a mock intent service for testing only.
|
|
192
|
+
*/
|
|
193
|
+
export function createMockIntentService() {
|
|
194
|
+
return new MockIntentService();
|
|
195
|
+
}
|
|
196
|
+
// =============================================================================
|
|
197
|
+
// PRODUCTION IMPLEMENTATION
|
|
198
|
+
// =============================================================================
|
|
199
|
+
export { PersistentIntentService } from './persistent-intent-service.js';
|
|
169
200
|
//# sourceMappingURL=index.js.map
|
package/dist/intent/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/intent/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/intent/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent Intent Service
|
|
3
|
+
*
|
|
4
|
+
* Production-quality intent service that provides:
|
|
5
|
+
* - Input validation via Zod schemas
|
|
6
|
+
* - Automatic expiration of stale intents
|
|
7
|
+
* - State machine enforcement for status transitions
|
|
8
|
+
* - Correlation ID tracking for distributed tracing
|
|
9
|
+
* - Tenant isolation
|
|
10
|
+
*
|
|
11
|
+
* Uses an in-memory store by default. For durable persistence, subclass
|
|
12
|
+
* and override the storage methods, or use the Supabase-backed variant.
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
import type { Intent, ID, IntentStatus } from '../common/types.js';
|
|
17
|
+
import type { IIntentService, IntentSubmission, SubmitOptions } from './index.js';
|
|
18
|
+
export interface PersistentIntentServiceConfig {
|
|
19
|
+
/** Default expiration time for intents without explicit expiresIn (ms). Default: 1 hour */
|
|
20
|
+
defaultExpirationMs?: number;
|
|
21
|
+
/** How often to sweep expired intents (ms). Default: 60 seconds. 0 to disable. */
|
|
22
|
+
expirationSweepIntervalMs?: number;
|
|
23
|
+
/** Maximum intents per entity per tenant. Default: 1000 */
|
|
24
|
+
maxIntentsPerEntity?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Production-quality intent service with validation, state machine,
|
|
28
|
+
* expiration, and tenant isolation.
|
|
29
|
+
*/
|
|
30
|
+
export declare class PersistentIntentService implements IIntentService {
|
|
31
|
+
private intents;
|
|
32
|
+
private entityIndex;
|
|
33
|
+
private config;
|
|
34
|
+
private sweepTimer;
|
|
35
|
+
constructor(config?: PersistentIntentServiceConfig);
|
|
36
|
+
/**
|
|
37
|
+
* Submit a new intent with full validation.
|
|
38
|
+
*/
|
|
39
|
+
submit(submission: IntentSubmission, options: SubmitOptions): Promise<Intent>;
|
|
40
|
+
/**
|
|
41
|
+
* Get an intent by ID with tenant isolation.
|
|
42
|
+
*/
|
|
43
|
+
get(id: ID, tenantId: ID): Promise<Intent | undefined>;
|
|
44
|
+
/**
|
|
45
|
+
* Update intent status with state machine enforcement.
|
|
46
|
+
*/
|
|
47
|
+
updateStatus(id: ID, tenantId: ID, status: IntentStatus): Promise<Intent | undefined>;
|
|
48
|
+
/**
|
|
49
|
+
* List intents for an entity with tenant isolation.
|
|
50
|
+
*/
|
|
51
|
+
listByEntity(entityId: ID, tenantId: ID): Promise<Intent[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Get count of active intents.
|
|
54
|
+
*/
|
|
55
|
+
count(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Shut down the service and clean up timers.
|
|
58
|
+
*/
|
|
59
|
+
close(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Clear all intents (for testing).
|
|
62
|
+
*/
|
|
63
|
+
clear(): void;
|
|
64
|
+
private isExpired;
|
|
65
|
+
private expireIntent;
|
|
66
|
+
private sweepExpired;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=persistent-intent-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistent-intent-service.d.ts","sourceRoot":"","sources":["../../src/intent/persistent-intent-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA2DlF,MAAM,WAAW,6BAA6B;IAC5C,2FAA2F;IAC3F,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAQD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,UAAU,CAA+C;gBAErD,MAAM,CAAC,EAAE,6BAA6B;IAelD;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAuEnF;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAe5D;;OAEG;IACG,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAiC3F;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBjE;;OAEG;IACH,KAAK,IAAI,MAAM;IAIf;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,SAAS;YAKH,YAAY;IAQ1B,OAAO,CAAC,YAAY;CAqBrB"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent Intent Service
|
|
3
|
+
*
|
|
4
|
+
* Production-quality intent service that provides:
|
|
5
|
+
* - Input validation via Zod schemas
|
|
6
|
+
* - Automatic expiration of stale intents
|
|
7
|
+
* - State machine enforcement for status transitions
|
|
8
|
+
* - Correlation ID tracking for distributed tracing
|
|
9
|
+
* - Tenant isolation
|
|
10
|
+
*
|
|
11
|
+
* Uses an in-memory store by default. For durable persistence, subclass
|
|
12
|
+
* and override the storage methods, or use the Supabase-backed variant.
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
import { createLogger } from '../common/logger.js';
|
|
17
|
+
const logger = createLogger({ component: 'persistent-intent-service' });
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// STATE MACHINE
|
|
20
|
+
// =============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Valid status transitions for the intent lifecycle.
|
|
23
|
+
* Any transition not listed here is rejected.
|
|
24
|
+
*/
|
|
25
|
+
const VALID_TRANSITIONS = {
|
|
26
|
+
pending: ['evaluating', 'cancelled'],
|
|
27
|
+
evaluating: ['approved', 'denied', 'escalated', 'failed'],
|
|
28
|
+
approved: ['executing', 'cancelled'],
|
|
29
|
+
denied: [],
|
|
30
|
+
escalated: ['approved', 'denied', 'cancelled'],
|
|
31
|
+
executing: ['completed', 'failed'],
|
|
32
|
+
completed: [],
|
|
33
|
+
failed: ['pending'], // allow retry
|
|
34
|
+
cancelled: [],
|
|
35
|
+
};
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// VALIDATION
|
|
38
|
+
// =============================================================================
|
|
39
|
+
function validateSubmission(submission) {
|
|
40
|
+
const errors = [];
|
|
41
|
+
if (!submission.entityId || typeof submission.entityId !== 'string') {
|
|
42
|
+
errors.push('entityId is required and must be a non-empty string');
|
|
43
|
+
}
|
|
44
|
+
if (!submission.goal || typeof submission.goal !== 'string') {
|
|
45
|
+
errors.push('goal is required and must be a non-empty string');
|
|
46
|
+
}
|
|
47
|
+
if (submission.goal && submission.goal.length > 10_000) {
|
|
48
|
+
errors.push('goal must be 10,000 characters or fewer');
|
|
49
|
+
}
|
|
50
|
+
if (submission.context !== undefined && (typeof submission.context !== 'object' || submission.context === null)) {
|
|
51
|
+
errors.push('context must be a plain object');
|
|
52
|
+
}
|
|
53
|
+
if (submission.expiresIn !== undefined) {
|
|
54
|
+
if (typeof submission.expiresIn !== 'number' || submission.expiresIn <= 0) {
|
|
55
|
+
errors.push('expiresIn must be a positive number (milliseconds)');
|
|
56
|
+
}
|
|
57
|
+
if (submission.expiresIn > 86_400_000) {
|
|
58
|
+
errors.push('expiresIn cannot exceed 24 hours (86400000ms)');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return errors;
|
|
62
|
+
}
|
|
63
|
+
const DEFAULT_CONFIG = {
|
|
64
|
+
defaultExpirationMs: 3_600_000,
|
|
65
|
+
expirationSweepIntervalMs: 60_000,
|
|
66
|
+
maxIntentsPerEntity: 1_000,
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Production-quality intent service with validation, state machine,
|
|
70
|
+
* expiration, and tenant isolation.
|
|
71
|
+
*/
|
|
72
|
+
export class PersistentIntentService {
|
|
73
|
+
intents = new Map();
|
|
74
|
+
entityIndex = new Map(); // "tenantId:entityId" → intent IDs
|
|
75
|
+
config;
|
|
76
|
+
sweepTimer = null;
|
|
77
|
+
constructor(config) {
|
|
78
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
79
|
+
if (this.config.expirationSweepIntervalMs > 0) {
|
|
80
|
+
this.sweepTimer = setInterval(() => this.sweepExpired(), this.config.expirationSweepIntervalMs);
|
|
81
|
+
// Don't prevent Node.js from exiting
|
|
82
|
+
if (this.sweepTimer && typeof this.sweepTimer === 'object' && 'unref' in this.sweepTimer) {
|
|
83
|
+
this.sweepTimer.unref();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Submit a new intent with full validation.
|
|
89
|
+
*/
|
|
90
|
+
async submit(submission, options) {
|
|
91
|
+
// Validate input
|
|
92
|
+
const errors = validateSubmission(submission);
|
|
93
|
+
if (errors.length > 0) {
|
|
94
|
+
throw new Error(`Invalid intent submission: ${errors.join('; ')}`);
|
|
95
|
+
}
|
|
96
|
+
if (!options.tenantId) {
|
|
97
|
+
throw new Error('tenantId is required in SubmitOptions');
|
|
98
|
+
}
|
|
99
|
+
// Check per-entity limit
|
|
100
|
+
const indexKey = `${options.tenantId}:${submission.entityId}`;
|
|
101
|
+
const existingIds = this.entityIndex.get(indexKey);
|
|
102
|
+
if (existingIds && existingIds.size >= this.config.maxIntentsPerEntity) {
|
|
103
|
+
throw new Error(`Entity '${submission.entityId}' has reached the maximum of ${this.config.maxIntentsPerEntity} active intents`);
|
|
104
|
+
}
|
|
105
|
+
const now = new Date().toISOString();
|
|
106
|
+
const correlationId = submission.correlationId ?? crypto.randomUUID();
|
|
107
|
+
const expiresAt = submission.expiresIn
|
|
108
|
+
? new Date(Date.now() + submission.expiresIn).toISOString()
|
|
109
|
+
: new Date(Date.now() + this.config.defaultExpirationMs).toISOString();
|
|
110
|
+
const intent = {
|
|
111
|
+
id: crypto.randomUUID(),
|
|
112
|
+
tenantId: options.tenantId,
|
|
113
|
+
entityId: submission.entityId,
|
|
114
|
+
goal: submission.goal,
|
|
115
|
+
context: submission.context ?? {},
|
|
116
|
+
metadata: submission.metadata ?? {},
|
|
117
|
+
status: 'pending',
|
|
118
|
+
createdAt: now,
|
|
119
|
+
updatedAt: now,
|
|
120
|
+
trustSnapshot: options.trustSnapshot ?? null,
|
|
121
|
+
trustLevel: options.trustLevel ?? null,
|
|
122
|
+
correlationId,
|
|
123
|
+
actionType: submission.actionType ?? null,
|
|
124
|
+
resourceScope: submission.resourceScope ?? null,
|
|
125
|
+
dataSensitivity: submission.dataSensitivity ?? null,
|
|
126
|
+
reversibility: submission.reversibility ?? null,
|
|
127
|
+
expiresAt,
|
|
128
|
+
source: submission.source ?? null,
|
|
129
|
+
};
|
|
130
|
+
// Store
|
|
131
|
+
this.intents.set(intent.id, intent);
|
|
132
|
+
// Update entity index
|
|
133
|
+
if (!this.entityIndex.has(indexKey)) {
|
|
134
|
+
this.entityIndex.set(indexKey, new Set());
|
|
135
|
+
}
|
|
136
|
+
this.entityIndex.get(indexKey).add(intent.id);
|
|
137
|
+
logger.info({
|
|
138
|
+
intentId: intent.id,
|
|
139
|
+
entityId: intent.entityId,
|
|
140
|
+
tenantId: options.tenantId,
|
|
141
|
+
goal: intent.goal.slice(0, 100),
|
|
142
|
+
correlationId,
|
|
143
|
+
actionType: intent.actionType,
|
|
144
|
+
}, 'Intent submitted');
|
|
145
|
+
return intent;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get an intent by ID with tenant isolation.
|
|
149
|
+
*/
|
|
150
|
+
async get(id, tenantId) {
|
|
151
|
+
const intent = this.intents.get(id);
|
|
152
|
+
if (!intent || intent.tenantId !== tenantId) {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
// Check expiration
|
|
156
|
+
if (this.isExpired(intent)) {
|
|
157
|
+
await this.expireIntent(intent);
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
return intent;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Update intent status with state machine enforcement.
|
|
164
|
+
*/
|
|
165
|
+
async updateStatus(id, tenantId, status) {
|
|
166
|
+
const intent = this.intents.get(id);
|
|
167
|
+
if (!intent || intent.tenantId !== tenantId) {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
// Validate transition
|
|
171
|
+
const allowed = VALID_TRANSITIONS[intent.status];
|
|
172
|
+
if (!allowed || !allowed.includes(status)) {
|
|
173
|
+
throw new Error(`Invalid status transition: '${intent.status}' → '${status}'. ` +
|
|
174
|
+
`Allowed transitions from '${intent.status}': [${allowed?.join(', ') ?? 'none'}]`);
|
|
175
|
+
}
|
|
176
|
+
const previousStatus = intent.status;
|
|
177
|
+
intent.status = status;
|
|
178
|
+
intent.updatedAt = new Date().toISOString();
|
|
179
|
+
// Clean up terminal intents from entity index
|
|
180
|
+
if (status === 'completed' || status === 'cancelled' || status === 'denied') {
|
|
181
|
+
const indexKey = `${tenantId}:${intent.entityId}`;
|
|
182
|
+
this.entityIndex.get(indexKey)?.delete(id);
|
|
183
|
+
}
|
|
184
|
+
logger.info({ intentId: id, from: previousStatus, to: status }, 'Intent status updated');
|
|
185
|
+
return intent;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* List intents for an entity with tenant isolation.
|
|
189
|
+
*/
|
|
190
|
+
async listByEntity(entityId, tenantId) {
|
|
191
|
+
const indexKey = `${tenantId}:${entityId}`;
|
|
192
|
+
const ids = this.entityIndex.get(indexKey);
|
|
193
|
+
if (!ids || ids.size === 0)
|
|
194
|
+
return [];
|
|
195
|
+
const results = [];
|
|
196
|
+
for (const id of ids) {
|
|
197
|
+
const intent = this.intents.get(id);
|
|
198
|
+
if (intent && !this.isExpired(intent)) {
|
|
199
|
+
results.push(intent);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Sort by creation time (newest first)
|
|
203
|
+
return results.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get count of active intents.
|
|
207
|
+
*/
|
|
208
|
+
count() {
|
|
209
|
+
return this.intents.size;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Shut down the service and clean up timers.
|
|
213
|
+
*/
|
|
214
|
+
close() {
|
|
215
|
+
if (this.sweepTimer) {
|
|
216
|
+
clearInterval(this.sweepTimer);
|
|
217
|
+
this.sweepTimer = null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Clear all intents (for testing).
|
|
222
|
+
*/
|
|
223
|
+
clear() {
|
|
224
|
+
this.intents.clear();
|
|
225
|
+
this.entityIndex.clear();
|
|
226
|
+
}
|
|
227
|
+
// ===========================================================================
|
|
228
|
+
// Private Helpers
|
|
229
|
+
// ===========================================================================
|
|
230
|
+
isExpired(intent) {
|
|
231
|
+
if (!intent.expiresAt)
|
|
232
|
+
return false;
|
|
233
|
+
return new Date(intent.expiresAt).getTime() < Date.now();
|
|
234
|
+
}
|
|
235
|
+
async expireIntent(intent) {
|
|
236
|
+
if (intent.status !== 'completed' && intent.status !== 'cancelled' && intent.status !== 'denied') {
|
|
237
|
+
intent.status = 'cancelled';
|
|
238
|
+
intent.updatedAt = new Date().toISOString();
|
|
239
|
+
logger.debug({ intentId: intent.id }, 'Intent expired');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
sweepExpired() {
|
|
243
|
+
let swept = 0;
|
|
244
|
+
for (const [id, intent] of this.intents) {
|
|
245
|
+
if (this.isExpired(intent)) {
|
|
246
|
+
// Remove terminal intents entirely, expire active ones
|
|
247
|
+
const isTerminal = ['completed', 'cancelled', 'denied', 'failed'].includes(intent.status);
|
|
248
|
+
if (isTerminal) {
|
|
249
|
+
this.intents.delete(id);
|
|
250
|
+
const indexKey = `${intent.tenantId}:${intent.entityId}`;
|
|
251
|
+
this.entityIndex.get(indexKey)?.delete(id);
|
|
252
|
+
swept++;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
this.expireIntent(intent);
|
|
256
|
+
swept++;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (swept > 0) {
|
|
261
|
+
logger.debug({ swept }, 'Expired intents swept');
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=persistent-intent-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistent-intent-service.js","sourceRoot":"","sources":["../../src/intent/persistent-intent-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
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 type { Intent, ID, IntentStatus } from '../common/types.js';
|
|
19
|
+
import type { IIntentService, IntentSubmission, SubmitOptions } from './index.js';
|
|
20
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
21
|
+
/**
|
|
22
|
+
* Configuration for the Supabase intent repository.
|
|
23
|
+
*/
|
|
24
|
+
export interface SupabaseIntentRepositoryConfig {
|
|
25
|
+
/** Supabase client instance (caller must provide) */
|
|
26
|
+
client: SupabaseClient;
|
|
27
|
+
/** Table name to use. Default: 'intents' */
|
|
28
|
+
tableName?: string;
|
|
29
|
+
/** Database schema to use (for multi-schema Supabase setups). Default: 'public' */
|
|
30
|
+
schema?: string;
|
|
31
|
+
/** Default expiration time for intents without explicit expiresIn (ms). Default: 1 hour */
|
|
32
|
+
defaultExpirationMs?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Supabase/Postgres-backed intent service.
|
|
36
|
+
*
|
|
37
|
+
* Implements the full IIntentService interface with durable persistence,
|
|
38
|
+
* input validation, state machine enforcement, and tenant isolation.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* import { createClient } from '@supabase/supabase-js';
|
|
43
|
+
* import { createSupabaseIntentRepository } from '@vorionsys/atsf-core/intent/supabase-intent-repository';
|
|
44
|
+
*
|
|
45
|
+
* const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
|
|
46
|
+
* const intentService = createSupabaseIntentRepository({ client: supabase });
|
|
47
|
+
*
|
|
48
|
+
* const intent = await intentService.submit(
|
|
49
|
+
* { entityId: 'agent-1', goal: 'Send email', context: {} },
|
|
50
|
+
* { tenantId: 'tenant-abc' }
|
|
51
|
+
* );
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare class SupabaseIntentRepository implements IIntentService {
|
|
55
|
+
private readonly client;
|
|
56
|
+
private readonly tableName;
|
|
57
|
+
private readonly schema;
|
|
58
|
+
private readonly defaultExpirationMs;
|
|
59
|
+
constructor(config: SupabaseIntentRepositoryConfig);
|
|
60
|
+
private table;
|
|
61
|
+
/**
|
|
62
|
+
* Submit a new intent with full validation and persist to Supabase.
|
|
63
|
+
*/
|
|
64
|
+
submit(submission: IntentSubmission, options: SubmitOptions): Promise<Intent>;
|
|
65
|
+
/**
|
|
66
|
+
* Retrieve an intent by ID with tenant isolation.
|
|
67
|
+
* Returns undefined if not found or if the intent belongs to a different tenant.
|
|
68
|
+
*/
|
|
69
|
+
get(id: ID, tenantId: ID): Promise<Intent | undefined>;
|
|
70
|
+
/**
|
|
71
|
+
* Update the status of an intent with state machine enforcement.
|
|
72
|
+
* Returns the updated intent, or undefined if not found / wrong tenant.
|
|
73
|
+
* Throws if the requested transition is invalid.
|
|
74
|
+
*/
|
|
75
|
+
updateStatus(id: ID, tenantId: ID, status: IntentStatus): Promise<Intent | undefined>;
|
|
76
|
+
/**
|
|
77
|
+
* List all intents for a given entity within a tenant.
|
|
78
|
+
* Results are sorted by creation time (newest first).
|
|
79
|
+
* Expired intents are excluded.
|
|
80
|
+
*/
|
|
81
|
+
listByEntity(entityId: ID, tenantId: ID): Promise<Intent[]>;
|
|
82
|
+
/**
|
|
83
|
+
* Check if an intent has passed its expiration time.
|
|
84
|
+
*/
|
|
85
|
+
private isExpired;
|
|
86
|
+
/**
|
|
87
|
+
* Mark an expired, non-terminal intent as cancelled in the database.
|
|
88
|
+
*/
|
|
89
|
+
private expireIntent;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a new SupabaseIntentRepository instance.
|
|
93
|
+
*
|
|
94
|
+
* This factory provides a convenient way to instantiate the repository
|
|
95
|
+
* without directly importing the class, useful for dependency injection
|
|
96
|
+
* and testing.
|
|
97
|
+
*
|
|
98
|
+
* @param config - Repository configuration including the Supabase client
|
|
99
|
+
* @returns A configured SupabaseIntentRepository implementing IIntentService
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* import { createClient } from '@supabase/supabase-js';
|
|
104
|
+
* import { createSupabaseIntentRepository } from '@vorionsys/atsf-core/intent/supabase-intent-repository';
|
|
105
|
+
*
|
|
106
|
+
* const supabase = createClient(
|
|
107
|
+
* process.env.SUPABASE_URL!,
|
|
108
|
+
* process.env.SUPABASE_SERVICE_KEY!
|
|
109
|
+
* );
|
|
110
|
+
*
|
|
111
|
+
* const intentService = createSupabaseIntentRepository({
|
|
112
|
+
* client: supabase,
|
|
113
|
+
* tableName: 'intents', // default
|
|
114
|
+
* schema: 'public', // default
|
|
115
|
+
* defaultExpirationMs: 3600000, // 1 hour default
|
|
116
|
+
* });
|
|
117
|
+
*
|
|
118
|
+
* // Wire it into the service locator
|
|
119
|
+
* import { setIntentService } from '@vorionsys/atsf-core';
|
|
120
|
+
* setIntentService(intentService);
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export declare function createSupabaseIntentRepository(config: SupabaseIntentRepositoryConfig): SupabaseIntentRepository;
|
|
124
|
+
//# sourceMappingURL=supabase-intent-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-intent-repository.d.ts","sourceRoot":"","sources":["../../src/intent/supabase-intent-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMlF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA+F5D;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,qDAAqD;IACrD,MAAM,EAAE,cAAc,CAAC;IACvB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAoED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,wBAAyB,YAAW,cAAc;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;gBAEjC,MAAM,EAAE,8BAA8B;IAoBlD,OAAO,CAAC,KAAK;IAQb;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IA0EnF;;;OAGG;IACG,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAkC5D;;;;OAIG;IACG,YAAY,CAChB,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,EAAE,EACZ,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA6D9B;;;;OAIG;IACG,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoCjE;;OAEG;IACH,OAAO,CAAC,SAAS;IAKjB;;OAEG;YACW,YAAY;CAoB3B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,8BAA8B,GACrC,wBAAwB,CAE1B"}
|