@devflow-tools/provider-runtime 0.18.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 shilongfeicool
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # @devflow-tools/provider-runtime
2
+
3
+ Shared execution boundary for optional semantic, Memory, Knowledge, embedding, and reranking providers.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @devflow-tools/provider-runtime
9
+ ```
10
+
11
+ The runtime preserves `ready`, `empty_valid`, `invalid`, `unavailable`, `timeout`, and `cancelled` as distinct outcomes. It applies bounded timeouts, abort propagation, reentrancy protection, cooldown after provider failures, validation before receipt finalization, and privacy-safe execution receipts.
12
+
13
+ This package owns no task semantics, lifecycle transitions, retrieval eligibility, action authorization, persistence, or terminal decisions. Providers return untrusted values; the owning domain validates and compiles them.
14
+
15
+ ```ts
16
+ import { ProviderExecutionEnvelope } from '@devflow-tools/provider-runtime';
17
+
18
+ const envelope = new ProviderExecutionEnvelope();
19
+ const result = await envelope.run({
20
+ requestHash: 'sha256:request',
21
+ providerId: 'host-sampling',
22
+ providerVersion: '1',
23
+ capability: 'semantic_claims',
24
+ scopeKey: 'project/session/turn',
25
+ timeoutMs: 3_000,
26
+ execute: async signal => {
27
+ const proposals = await provider.sample(signal);
28
+ return {
29
+ status: proposals.length > 0 ? 'ready' : 'empty_valid',
30
+ value: proposals,
31
+ proposalCount: proposals.length,
32
+ };
33
+ },
34
+ });
35
+ ```
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=embedding-response-validator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-response-validator.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/embedding-response-validator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { validateEmbeddingBatch } from '../embedding-response-validator.js';
3
+ describe('validateEmbeddingBatch', () => {
4
+ it('orders indexed responses and validates profile, count and vectors', () => {
5
+ const vectors = validateEmbeddingBatch({
6
+ response: [
7
+ { index: 1, vector: new Float32Array([0, 1]) },
8
+ { index: 0, vector: new Float32Array([1, 0]) },
9
+ ],
10
+ expectedCount: 2, expectedDimension: 2,
11
+ expectedProfileHash: 'profile:1', responseProfileHash: 'profile:1',
12
+ });
13
+ expect(vectors.map(vector => [...vector])).toEqual([[1, 0], [0, 1]]);
14
+ expect(() => validateEmbeddingBatch({
15
+ response: [new Float32Array([1, 0])], expectedCount: 2, expectedDimension: 2,
16
+ })).toThrow('embedding_batch_count_mismatch');
17
+ expect(() => validateEmbeddingBatch({
18
+ response: [{ index: 0, vector: new Float32Array([1, 0]) }, { index: 0, vector: new Float32Array([0, 1]) }],
19
+ expectedCount: 2, expectedDimension: 2,
20
+ })).toThrow('embedding_batch_index_duplicate');
21
+ expect(() => validateEmbeddingBatch({
22
+ response: [new Float32Array([1, Number.NaN])], expectedCount: 1, expectedDimension: 2,
23
+ })).toThrow('embedding_vector_non_finite');
24
+ expect(() => validateEmbeddingBatch({
25
+ response: [new Float32Array([1])], expectedCount: 1, expectedDimension: 2,
26
+ })).toThrow('embedding_vector_dimension_mismatch');
27
+ expect(() => validateEmbeddingBatch({
28
+ response: [], expectedCount: 0, expectedDimension: 2,
29
+ expectedProfileHash: 'profile:1', responseProfileHash: 'profile:2',
30
+ })).toThrow('embedding_profile_mismatch');
31
+ });
32
+ it('rejects incomplete indexes and empty vectors with stable codes', () => {
33
+ expect(() => validateEmbeddingBatch({
34
+ response: [{ index: 0, vector: new Float32Array([1, 0]) }],
35
+ expectedCount: 2,
36
+ expectedDimension: 2,
37
+ })).toThrow('embedding_batch_index_missing');
38
+ expect(() => validateEmbeddingBatch({
39
+ response: [{ index: 2, vector: new Float32Array([1, 0]) }],
40
+ expectedCount: 1,
41
+ expectedDimension: 2,
42
+ })).toThrow('embedding_batch_index_invalid');
43
+ expect(() => validateEmbeddingBatch({
44
+ response: [new Float32Array()],
45
+ expectedCount: 1,
46
+ expectedDimension: 2,
47
+ })).toThrow('embedding_vector_empty');
48
+ });
49
+ });
50
+ //# sourceMappingURL=embedding-response-validator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-response-validator.test.js","sourceRoot":"","sources":["../../src/__tests__/embedding-response-validator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider-execution-envelope.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-execution-envelope.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/provider-execution-envelope.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { ProviderExecutionEnvelope, } from '../provider-execution-envelope.js';
3
+ const base = {
4
+ requestHash: 'request-hash',
5
+ providerId: 'test-provider',
6
+ providerVersion: '1',
7
+ capability: 'semantic_claims',
8
+ scopeKey: 'project/session/turn',
9
+ timeoutMs: 100,
10
+ };
11
+ describe('ProviderExecutionEnvelope', () => {
12
+ it('finalizes a validated ready receipt', async () => {
13
+ const result = await new ProviderExecutionEnvelope().run({
14
+ ...base,
15
+ execute: async () => ({ status: 'ready', value: ['one', 'two'], proposalCount: 2 }),
16
+ validate: value => ({ value: value.slice(0, 1), acceptedCount: 1, rejectedCount: 1,
17
+ reasonCodes: ['claim_rejected'] }),
18
+ });
19
+ expect(result.status).toBe('ready');
20
+ expect(result.value).toEqual(['one']);
21
+ expect(result.receipt).toMatchObject({ proposalCount: 2, acceptedCount: 1, rejectedCount: 1,
22
+ reasonCodes: ['claim_rejected'] });
23
+ });
24
+ it('preserves a valid empty result', async () => {
25
+ const result = await new ProviderExecutionEnvelope().run({
26
+ ...base,
27
+ execute: async () => ({ status: 'empty_valid', value: [], proposalCount: 0 }),
28
+ });
29
+ expect(result.status).toBe('empty_valid');
30
+ expect(result.receipt).toMatchObject({ proposalCount: 0, acceptedCount: 0, rejectedCount: 0 });
31
+ });
32
+ it('aborts and records a timeout', async () => {
33
+ let aborted = false;
34
+ const result = await new ProviderExecutionEnvelope({ cooldownMs: 1 }).run({
35
+ ...base,
36
+ timeoutMs: 10,
37
+ execute: signal => new Promise(resolve => {
38
+ signal.addEventListener('abort', () => {
39
+ aborted = true;
40
+ resolve({ status: 'unavailable', proposalCount: 0 });
41
+ }, { once: true });
42
+ }),
43
+ });
44
+ expect(result.status).toBe('timeout');
45
+ expect(result.receipt.reasonCodes).toEqual(['provider_timeout']);
46
+ expect(aborted).toBe(true);
47
+ });
48
+ it('rejects a concurrent execution for the same capability and scope', async () => {
49
+ let release;
50
+ const envelope = new ProviderExecutionEnvelope();
51
+ const first = envelope.run({
52
+ ...base,
53
+ execute: () => new Promise(resolve => {
54
+ release = () => resolve({ status: 'empty_valid', proposalCount: 0 });
55
+ }),
56
+ });
57
+ await Promise.resolve();
58
+ const second = await envelope.run({
59
+ ...base,
60
+ execute: async () => ({ status: 'empty_valid', proposalCount: 0 }),
61
+ });
62
+ expect(second.status).toBe('unavailable');
63
+ expect(second.receipt.reasonCodes).toEqual(['provider_reentrant']);
64
+ release();
65
+ await first;
66
+ });
67
+ it('opens a bounded cooldown after provider unavailability', async () => {
68
+ const envelope = new ProviderExecutionEnvelope({ cooldownMs: 10_000 });
69
+ const first = await envelope.run({
70
+ ...base,
71
+ execute: async () => ({ status: 'unavailable', proposalCount: 0,
72
+ reasonCodes: ['host_unavailable'] }),
73
+ });
74
+ const execute = vi.fn(async () => ({ status: 'empty_valid', proposalCount: 0 }));
75
+ const second = await envelope.run({ ...base, execute });
76
+ expect(first.status).toBe('unavailable');
77
+ expect(second.status).toBe('unavailable');
78
+ expect(second.receipt.reasonCodes).toEqual(['provider_unavailable_cooldown']);
79
+ expect(execute).not.toHaveBeenCalled();
80
+ });
81
+ it('does not let observer failure alter the provider result', async () => {
82
+ const envelope = new ProviderExecutionEnvelope({ observer: { record: () => {
83
+ throw new Error('sink unavailable');
84
+ } } });
85
+ const result = await envelope.run({
86
+ ...base,
87
+ execute: async () => ({ status: 'ready', value: ['one'], proposalCount: 1 }),
88
+ });
89
+ expect(result.status).toBe('ready');
90
+ expect(result.value).toEqual(['one']);
91
+ });
92
+ });
93
+ //# sourceMappingURL=provider-execution-envelope.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-execution-envelope.test.js","sourceRoot":"","sources":["../../src/__tests__/provider-execution-envelope.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type EmbeddingBatchResponseV1, type EmbeddingProviderContract, type EmbeddingPurpose } from '@devflow-tools/sdk';
2
+ /**
3
+ * Provider-facing embedding batch response. Providers may return vectors in
4
+ * request order or attach an explicit input index to each vector.
5
+ */
6
+ export type EmbeddingBatchResponse = EmbeddingBatchResponseV1;
7
+ export interface ValidateEmbeddingBatchInput {
8
+ response: unknown;
9
+ expectedCount: number;
10
+ expectedDimension: number;
11
+ expectedProfileHash?: string;
12
+ responseProfileHash?: string;
13
+ }
14
+ /** Stable error codes emitted by the embedding boundary. */
15
+ export type EmbeddingValidationErrorCode = 'embedding_batch_count_mismatch' | 'embedding_batch_index_invalid' | 'embedding_batch_index_duplicate' | 'embedding_batch_index_missing' | 'embedding_vector_invalid' | 'embedding_vector_empty' | 'embedding_vector_non_finite' | 'embedding_vector_dimension_mismatch' | 'embedding_profile_mismatch';
16
+ export declare class EmbeddingBatchValidationError extends Error {
17
+ readonly code: EmbeddingValidationErrorCode;
18
+ constructor(code: EmbeddingValidationErrorCode, detail?: string);
19
+ }
20
+ /**
21
+ * Validate and canonicalize an embedding provider response.
22
+ *
23
+ * The returned array is always ordered by input position and contains only
24
+ * finite Float32Arrays with the requested dimension. No caller should need to
25
+ * perform a second, partial validation before persisting or scoring vectors.
26
+ */
27
+ export declare function validateEmbeddingBatch(input: ValidateEmbeddingBatchInput): Float32Array[];
28
+ export declare function requestValidatedEmbeddingBatch(input: {
29
+ provider: EmbeddingProviderContract;
30
+ purpose: EmbeddingPurpose;
31
+ texts: string[];
32
+ }): Promise<Float32Array[]>;
33
+ export declare function requestValidatedEmbedding(input: {
34
+ provider: EmbeddingProviderContract;
35
+ purpose: EmbeddingPurpose;
36
+ text: string;
37
+ }): Promise<Float32Array>;
38
+ //# sourceMappingURL=embedding-response-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-response-validator.d.ts","sourceRoot":"","sources":["../src/embedding-response-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAE9D,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,4DAA4D;AAC5D,MAAM,MAAM,4BAA4B,GACpC,gCAAgC,GAChC,+BAA+B,GAC/B,iCAAiC,GACjC,+BAA+B,GAC/B,0BAA0B,GAC1B,wBAAwB,GACxB,6BAA6B,GAC7B,qCAAqC,GACrC,4BAA4B,CAAC;AAEjC,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;gBAEhC,IAAI,EAAE,4BAA4B,EAAE,MAAM,CAAC,EAAE,MAAM;CAKhE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,YAAY,EAAE,CA6CzF;AAED,wBAAsB,8BAA8B,CAAC,KAAK,EAAE;IAC1D,QAAQ,EAAE,yBAAyB,CAAC;IACpC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAY1B;AAED,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,QAAQ,EAAE,yBAAyB,CAAC;IACpC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,YAAY,CAAC,CAWxB"}
@@ -0,0 +1,110 @@
1
+ export class EmbeddingBatchValidationError extends Error {
2
+ code;
3
+ constructor(code, detail) {
4
+ super(detail ? `${code}: ${detail}` : code);
5
+ this.name = 'EmbeddingBatchValidationError';
6
+ this.code = code;
7
+ }
8
+ }
9
+ /**
10
+ * Validate and canonicalize an embedding provider response.
11
+ *
12
+ * The returned array is always ordered by input position and contains only
13
+ * finite Float32Arrays with the requested dimension. No caller should need to
14
+ * perform a second, partial validation before persisting or scoring vectors.
15
+ */
16
+ export function validateEmbeddingBatch(input) {
17
+ const { response, expectedCount, expectedDimension, expectedProfileHash, responseProfileHash, } = input;
18
+ if (expectedProfileHash !== undefined && responseProfileHash !== expectedProfileHash) {
19
+ throw new EmbeddingBatchValidationError('embedding_profile_mismatch', `expected ${expectedProfileHash}, received ${responseProfileHash ?? 'missing'}`);
20
+ }
21
+ if (!Number.isSafeInteger(expectedCount) || expectedCount < 0
22
+ || !Number.isSafeInteger(expectedDimension) || expectedDimension <= 0) {
23
+ throw new EmbeddingBatchValidationError('embedding_vector_dimension_mismatch');
24
+ }
25
+ if (!Array.isArray(response)) {
26
+ throw new EmbeddingBatchValidationError('embedding_batch_count_mismatch');
27
+ }
28
+ const indexed = response.length > 0 && response.every(isIndexedEmbedding);
29
+ const ordered = response.length === 0 || response.every(value => value instanceof Float32Array);
30
+ if (!indexed && !ordered) {
31
+ throw new EmbeddingBatchValidationError('embedding_vector_invalid');
32
+ }
33
+ let vectors;
34
+ if (indexed) {
35
+ vectors = orderIndexedEmbeddings(response, expectedCount);
36
+ }
37
+ else {
38
+ if (response.length !== expectedCount) {
39
+ throw new EmbeddingBatchValidationError('embedding_batch_count_mismatch', `expected ${expectedCount}, received ${response.length}`);
40
+ }
41
+ vectors = response;
42
+ }
43
+ vectors.forEach((vector, index) => validateVector(vector, index, expectedDimension));
44
+ return vectors.slice();
45
+ }
46
+ export async function requestValidatedEmbeddingBatch(input) {
47
+ if (input.texts.length === 0)
48
+ return [];
49
+ const expectedProfile = input.provider.getCapability(input.purpose).profile;
50
+ const response = await input.provider.embedBatch(input.texts);
51
+ const responseProfile = input.provider.getCapability(input.purpose).profile;
52
+ return validateEmbeddingBatch({
53
+ response,
54
+ expectedCount: input.texts.length,
55
+ expectedDimension: expectedProfile.dimension,
56
+ expectedProfileHash: expectedProfile.profileHash,
57
+ responseProfileHash: responseProfile.profileHash,
58
+ });
59
+ }
60
+ export async function requestValidatedEmbedding(input) {
61
+ const expectedProfile = input.provider.getCapability(input.purpose).profile;
62
+ const response = await input.provider.embed(input.text);
63
+ const responseProfile = input.provider.getCapability(input.purpose).profile;
64
+ return validateEmbeddingBatch({
65
+ response: [response],
66
+ expectedCount: 1,
67
+ expectedDimension: expectedProfile.dimension,
68
+ expectedProfileHash: expectedProfile.profileHash,
69
+ responseProfileHash: responseProfile.profileHash,
70
+ })[0];
71
+ }
72
+ function isIndexedEmbedding(value) {
73
+ if (!value || typeof value !== 'object')
74
+ return false;
75
+ const candidate = value;
76
+ return typeof candidate.index === 'number' && candidate.vector instanceof Float32Array;
77
+ }
78
+ function orderIndexedEmbeddings(response, expectedCount) {
79
+ const ordered = new Array(expectedCount);
80
+ for (const item of response) {
81
+ if (!Number.isSafeInteger(item.index) || item.index < 0 || item.index >= expectedCount) {
82
+ throw new EmbeddingBatchValidationError('embedding_batch_index_invalid', `index ${String(item.index)} is outside [0, ${expectedCount})`);
83
+ }
84
+ if (ordered[item.index] !== undefined) {
85
+ throw new EmbeddingBatchValidationError('embedding_batch_index_duplicate', `index ${item.index}`);
86
+ }
87
+ ordered[item.index] = item.vector;
88
+ }
89
+ for (let index = 0; index < ordered.length; index += 1) {
90
+ if (ordered[index] === undefined) {
91
+ throw new EmbeddingBatchValidationError('embedding_batch_index_missing');
92
+ }
93
+ }
94
+ return ordered;
95
+ }
96
+ function validateVector(vector, index, expectedDimension) {
97
+ if (!(vector instanceof Float32Array)) {
98
+ throw new EmbeddingBatchValidationError('embedding_vector_invalid', `vector ${index}`);
99
+ }
100
+ if (vector.length === 0) {
101
+ throw new EmbeddingBatchValidationError('embedding_vector_empty', `vector ${index}`);
102
+ }
103
+ if (vector.length !== expectedDimension) {
104
+ throw new EmbeddingBatchValidationError('embedding_vector_dimension_mismatch', `vector ${index} has ${vector.length}; expected ${expectedDimension}`);
105
+ }
106
+ if (vector.some(value => !Number.isFinite(value))) {
107
+ throw new EmbeddingBatchValidationError('embedding_vector_non_finite', `vector ${index}`);
108
+ }
109
+ }
110
+ //# sourceMappingURL=embedding-response-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-response-validator.js","sourceRoot":"","sources":["../src/embedding-response-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './provider-execution-envelope.js';
2
+ export * from './embedding-response-validator.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './provider-execution-envelope.js';
2
+ export * from './embedding-response-validator.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { type ProviderCapability, type ProviderExecutionReceiptV1, type ProviderExecutionStatus } from '@devflow-tools/sdk';
2
+ export interface ProviderExecutionObserver {
3
+ record(receipt: ProviderExecutionReceiptV1): void;
4
+ }
5
+ export interface ProviderExecutionValue<T> {
6
+ status: 'ready' | 'empty_valid' | 'invalid' | 'unavailable';
7
+ value?: T;
8
+ proposalCount: number;
9
+ reasonCodes?: string[];
10
+ }
11
+ export interface ProviderValidationResult<T> {
12
+ value: T;
13
+ acceptedCount: number;
14
+ rejectedCount: number;
15
+ reasonCodes: string[];
16
+ }
17
+ export interface ProviderRunInput<T> {
18
+ requestHash: string;
19
+ providerId: string;
20
+ providerVersion: string;
21
+ capability: ProviderCapability;
22
+ scopeKey: string;
23
+ timeoutMs: number;
24
+ signal?: AbortSignal;
25
+ execute(signal: AbortSignal): Promise<ProviderExecutionValue<T>>;
26
+ validate?(value: T): ProviderValidationResult<T>;
27
+ }
28
+ export interface ProviderRunResult<T> {
29
+ status: ProviderExecutionStatus;
30
+ value?: T;
31
+ receipt: ProviderExecutionReceiptV1;
32
+ }
33
+ export interface ProviderExecutionEnvelopeOptions {
34
+ cooldownMs?: number;
35
+ maxCooldownEntries?: number;
36
+ observer?: ProviderExecutionObserver;
37
+ now?: () => number;
38
+ }
39
+ export declare class ProviderExecutionEnvelope {
40
+ private readonly active;
41
+ private readonly cooldowns;
42
+ private readonly cooldownMs;
43
+ private readonly maxCooldownEntries;
44
+ private readonly observer?;
45
+ private readonly now;
46
+ private sequence;
47
+ constructor(options?: ProviderExecutionEnvelopeOptions);
48
+ run<T>(input: ProviderRunInput<T>): Promise<ProviderRunResult<T>>;
49
+ private finish;
50
+ private openCooldown;
51
+ private pruneCooldowns;
52
+ }
53
+ //# sourceMappingURL=provider-execution-envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-execution-envelope.d.ts","sourceRoot":"","sources":["../src/provider-execution-envelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,MAAM,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,aAAa,CAAC;IAC5D,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB,CAAC,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC;IACT,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,OAAO,EAAE,0BAA0B,CAAC;CACrC;AAED,MAAM,WAAW,gCAAgC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAUD,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAK;gBAET,OAAO,GAAE,gCAAqC;IAOpD,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAgFvE,OAAO,CAAC,MAAM;IAwCd,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,cAAc;CAKvB"}
@@ -0,0 +1,179 @@
1
+ import { stableRuntimeHash, } from '@devflow-tools/sdk';
2
+ class ProviderTimeoutError extends Error {
3
+ }
4
+ class ProviderCancelledError extends Error {
5
+ }
6
+ export class ProviderExecutionEnvelope {
7
+ active = new Set();
8
+ cooldowns = new Map();
9
+ cooldownMs;
10
+ maxCooldownEntries;
11
+ observer;
12
+ now;
13
+ sequence = 0;
14
+ constructor(options = {}) {
15
+ this.cooldownMs = positiveInteger(options.cooldownMs, 5_000);
16
+ this.maxCooldownEntries = positiveInteger(options.maxCooldownEntries, 1_000);
17
+ this.observer = options.observer;
18
+ this.now = options.now ?? Date.now;
19
+ }
20
+ async run(input) {
21
+ assertInput(input);
22
+ const startedAt = this.now();
23
+ const executionId = `provider-execution:${stableRuntimeHash({
24
+ requestHash: input.requestHash,
25
+ providerId: input.providerId,
26
+ providerVersion: input.providerVersion,
27
+ capability: input.capability,
28
+ scopeKey: input.scopeKey,
29
+ startedAt,
30
+ sequence: this.sequence++,
31
+ }).slice(0, 32)}`;
32
+ const key = `${input.capability}\0${input.scopeKey}`;
33
+ this.pruneCooldowns(startedAt);
34
+ if (input.signal?.aborted) {
35
+ return this.finish(input, executionId, startedAt, 'cancelled', 0, 0, 0, ['provider_cancelled']);
36
+ }
37
+ const cooldown = this.cooldowns.get(key);
38
+ if (cooldown && cooldown.retryAt > startedAt) {
39
+ return this.finish(input, executionId, startedAt, 'unavailable', 0, 0, 0, [cooldown.reasonCode]);
40
+ }
41
+ if (this.active.has(key)) {
42
+ return this.finish(input, executionId, startedAt, 'unavailable', 0, 0, 0, ['provider_reentrant']);
43
+ }
44
+ this.active.add(key);
45
+ try {
46
+ const output = await executeBounded(input);
47
+ const baseReasons = stableReasons(output.reasonCodes ?? []);
48
+ if (output.status !== 'ready') {
49
+ if (output.status === 'invalid' || output.status === 'unavailable') {
50
+ this.openCooldown(key, output.status === 'invalid' ? 'provider_invalid_cooldown' : 'provider_unavailable_cooldown');
51
+ }
52
+ return this.finish(input, executionId, startedAt, output.status, output.proposalCount, 0, output.status === 'empty_valid' ? 0 : output.proposalCount, baseReasons);
53
+ }
54
+ if (output.value === undefined) {
55
+ this.openCooldown(key, 'provider_invalid_cooldown');
56
+ return this.finish(input, executionId, startedAt, 'invalid', output.proposalCount, 0, output.proposalCount, [...baseReasons, 'provider_value_missing']);
57
+ }
58
+ if (!input.validate) {
59
+ return this.finish(input, executionId, startedAt, 'ready', output.proposalCount, output.proposalCount, 0, baseReasons, output.value);
60
+ }
61
+ try {
62
+ const validated = input.validate(output.value);
63
+ assertValidationCounts(validated, output.proposalCount);
64
+ return this.finish(input, executionId, startedAt, 'ready', output.proposalCount, validated.acceptedCount, validated.rejectedCount, [...baseReasons, ...validated.reasonCodes], validated.value);
65
+ }
66
+ catch {
67
+ this.openCooldown(key, 'provider_invalid_cooldown');
68
+ return this.finish(input, executionId, startedAt, 'invalid', output.proposalCount, 0, output.proposalCount, [...baseReasons, 'provider_validation_failed']);
69
+ }
70
+ }
71
+ catch (error) {
72
+ if (error instanceof ProviderTimeoutError) {
73
+ this.openCooldown(key, 'provider_timeout_cooldown');
74
+ return this.finish(input, executionId, startedAt, 'timeout', 0, 0, 0, ['provider_timeout']);
75
+ }
76
+ if (error instanceof ProviderCancelledError) {
77
+ return this.finish(input, executionId, startedAt, 'cancelled', 0, 0, 0, ['provider_cancelled']);
78
+ }
79
+ this.openCooldown(key, 'provider_unavailable_cooldown');
80
+ return this.finish(input, executionId, startedAt, 'unavailable', 0, 0, 0, ['provider_exception']);
81
+ }
82
+ finally {
83
+ this.active.delete(key);
84
+ }
85
+ }
86
+ finish(input, executionId, startedAt, status, proposalCount, acceptedCount, rejectedCount, reasonCodes, value) {
87
+ const completedAt = this.now();
88
+ const body = {
89
+ schemaVersion: 'provider-execution-receipt.v1',
90
+ receiptId: `provider-execution-receipt:${stableRuntimeHash(executionId).slice(0, 32)}`,
91
+ executionId,
92
+ requestHash: input.requestHash,
93
+ providerId: input.providerId,
94
+ providerVersion: input.providerVersion,
95
+ capability: input.capability,
96
+ status,
97
+ proposalCount,
98
+ acceptedCount,
99
+ rejectedCount,
100
+ reasonCodes: stableReasons(reasonCodes),
101
+ latencyMs: Math.max(0, completedAt - startedAt),
102
+ createdAt: completedAt,
103
+ };
104
+ const receipt = Object.freeze({
105
+ ...body,
106
+ receiptHash: stableRuntimeHash(body),
107
+ });
108
+ try {
109
+ this.observer?.record(receipt);
110
+ }
111
+ catch {
112
+ // Observability cannot change provider or domain semantics.
113
+ }
114
+ return { status, ...(value === undefined ? {} : { value }), receipt };
115
+ }
116
+ openCooldown(key, reasonCode) {
117
+ if (this.cooldowns.size >= this.maxCooldownEntries && !this.cooldowns.has(key)) {
118
+ const oldest = this.cooldowns.keys().next().value;
119
+ if (oldest !== undefined)
120
+ this.cooldowns.delete(oldest);
121
+ }
122
+ this.cooldowns.set(key, { retryAt: this.now() + this.cooldownMs, reasonCode });
123
+ }
124
+ pruneCooldowns(now) {
125
+ for (const [key, entry] of this.cooldowns) {
126
+ if (entry.retryAt <= now)
127
+ this.cooldowns.delete(key);
128
+ }
129
+ }
130
+ }
131
+ async function executeBounded(input) {
132
+ const controller = new AbortController();
133
+ let timeout;
134
+ let removeAbortListener;
135
+ const timeoutPromise = new Promise((_, reject) => {
136
+ timeout = setTimeout(() => {
137
+ reject(new ProviderTimeoutError());
138
+ controller.abort();
139
+ }, input.timeoutMs);
140
+ });
141
+ const cancellationPromise = new Promise((_, reject) => {
142
+ if (!input.signal)
143
+ return;
144
+ const cancelled = () => {
145
+ reject(new ProviderCancelledError());
146
+ controller.abort();
147
+ };
148
+ input.signal.addEventListener('abort', cancelled, { once: true });
149
+ removeAbortListener = () => input.signal?.removeEventListener('abort', cancelled);
150
+ });
151
+ try {
152
+ return await Promise.race([input.execute(controller.signal), timeoutPromise, cancellationPromise]);
153
+ }
154
+ finally {
155
+ if (timeout)
156
+ clearTimeout(timeout);
157
+ removeAbortListener?.();
158
+ }
159
+ }
160
+ function assertInput(input) {
161
+ if (!input.requestHash || !input.providerId || !input.providerVersion || !input.scopeKey
162
+ || !Number.isSafeInteger(input.timeoutMs) || input.timeoutMs <= 0) {
163
+ throw new Error('PROVIDER_EXECUTION_INPUT_INVALID');
164
+ }
165
+ }
166
+ function assertValidationCounts(result, proposalCount) {
167
+ if (!Number.isSafeInteger(result.acceptedCount) || result.acceptedCount < 0
168
+ || !Number.isSafeInteger(result.rejectedCount) || result.rejectedCount < 0
169
+ || result.acceptedCount + result.rejectedCount !== proposalCount) {
170
+ throw new Error('PROVIDER_VALIDATION_COUNTS_INVALID');
171
+ }
172
+ }
173
+ function positiveInteger(value, fallback) {
174
+ return Number.isSafeInteger(value) && value > 0 ? value : fallback;
175
+ }
176
+ function stableReasons(reasonCodes) {
177
+ return [...new Set(reasonCodes.filter(reason => /^[a-z][a-z0-9_]{1,63}$/u.test(reason)))].sort();
178
+ }
179
+ //# sourceMappingURL=provider-execution-envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-execution-envelope.js","sourceRoot":"","sources":["../src/provider-execution-envelope.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@devflow-tools/provider-runtime",
3
+ "version": "0.18.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "types": "./dist/index.d.ts"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "build": "tsc -b",
15
+ "test": "node ../../node_modules/.bin/vitest run",
16
+ "typecheck": "tsc --noEmit",
17
+ "clean": "rm -rf dist"
18
+ },
19
+ "dependencies": {
20
+ "@devflow-tools/sdk": "0.18.0"
21
+ },
22
+ "devDependencies": {
23
+ "typescript": "^5.5.0",
24
+ "vitest": "^2.0.0"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md"
29
+ ],
30
+ "description": "Bounded execution boundary for optional semantic and retrieval providers.",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/shilongfeicool/dev-flow.git"
35
+ },
36
+ "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
37
+ }