apcore-js 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -1
- package/dist/acl.d.ts +18 -1
- package/dist/acl.d.ts.map +1 -1
- package/dist/acl.js +46 -5
- package/dist/acl.js.map +1 -1
- package/dist/config.d.ts +34 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +251 -9
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +5 -4
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +6 -4
- package/dist/context.js.map +1 -1
- package/dist/error-code-registry.d.ts +26 -0
- package/dist/error-code-registry.d.ts.map +1 -0
- package/dist/error-code-registry.js +91 -0
- package/dist/error-code-registry.js.map +1 -0
- package/dist/errors.d.ts +2 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +5 -3
- package/dist/errors.js.map +1 -1
- package/dist/executor.d.ts +10 -1
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +52 -42
- package/dist/executor.js.map +1 -1
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +1 -0
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/manager.d.ts +1 -0
- package/dist/middleware/manager.d.ts.map +1 -1
- package/dist/middleware/manager.js +1 -0
- package/dist/middleware/manager.js.map +1 -1
- package/dist/middleware/retry.d.ts +31 -0
- package/dist/middleware/retry.d.ts.map +1 -0
- package/dist/middleware/retry.js +67 -0
- package/dist/middleware/retry.js.map +1 -0
- package/dist/registry/registry.d.ts +49 -0
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +122 -0
- package/dist/registry/registry.js.map +1 -1
- package/dist/schema/exporter.d.ts.map +1 -1
- package/dist/schema/exporter.js +1 -0
- package/dist/schema/exporter.js.map +1 -1
- package/dist/utils/call-chain.d.ts +23 -0
- package/dist/utils/call-chain.d.ts.map +1 -0
- package/dist/utils/call-chain.js +50 -0
- package/dist/utils/call-chain.js.map +1 -0
- package/dist/utils/error-propagation.d.ts +18 -0
- package/dist/utils/error-propagation.d.ts.map +1 -0
- package/dist/utils/error-propagation.js +35 -0
- package/dist/utils/error-propagation.js.map +1 -0
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/normalize.d.ts +18 -0
- package/dist/utils/normalize.d.ts.map +1 -0
- package/dist/utils/normalize.js +61 -0
- package/dist/utils/normalize.js.map +1 -0
- package/dist/utils/pattern.d.ts +15 -0
- package/dist/utils/pattern.d.ts.map +1 -1
- package/dist/utils/pattern.js +31 -0
- package/dist/utils/pattern.js.map +1 -1
- package/dist/version.d.ts +27 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +104 -0
- package/dist/version.js.map +1 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../src/schema/exporter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,aAAa,EAAyB,MAAM,YAAY,CAAC;AAElE,MAAM,OAAO,cAAc;IACzB,MAAM,CACJ,SAA2B,EAC3B,OAAsB,EACtB,WAAsC,EACtC,QAAiC,EACjC,IAAoB;QAEpB,IAAI,OAAO,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,OAAO,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,OAAO,KAAK,aAAa,CAAC,SAAS,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,SAAS,CACP,SAA2B,EAC3B,WAAsC,EACtC,IAAoB;QAEpB,OAAO;YACL,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC,QAAQ;YAChC,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,WAAW,EAAE;gBACX,YAAY,EAAE,WAAW,EAAE,QAAQ,IAAI,KAAK;gBAC5C,eAAe,EAAE,WAAW,EAAE,WAAW,IAAI,KAAK;gBAClD,cAAc,EAAE,WAAW,EAAE,UAAU,IAAI,KAAK;gBAChD,aAAa,EAAE,WAAW,EAAE,SAAS,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../src/schema/exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call chain safety guard (Algorithm A20).
|
|
3
|
+
*/
|
|
4
|
+
export declare const DEFAULT_MAX_CALL_DEPTH = 32;
|
|
5
|
+
export declare const DEFAULT_MAX_MODULE_REPEAT = 3;
|
|
6
|
+
/**
|
|
7
|
+
* Validate call chain safety (Algorithm A20).
|
|
8
|
+
*
|
|
9
|
+
* Performs three checks in order:
|
|
10
|
+
* 1. Depth limit -- call chain length must not exceed maxCallDepth.
|
|
11
|
+
* 2. Circular detection -- strict cycles of length >= 2 (A->B->A).
|
|
12
|
+
* 3. Frequency throttle -- moduleId must not appear more than maxModuleRepeat times.
|
|
13
|
+
*
|
|
14
|
+
* @param moduleId - The module about to be called.
|
|
15
|
+
* @param callChain - Current call chain (should already include moduleId at the end).
|
|
16
|
+
* @param maxCallDepth - Maximum allowed chain length.
|
|
17
|
+
* @param maxModuleRepeat - Maximum times a module may appear in the chain.
|
|
18
|
+
* @throws {CallDepthExceededError} Chain too deep.
|
|
19
|
+
* @throws {CircularCallError} Circular call detected.
|
|
20
|
+
* @throws {CallFrequencyExceededError} Module called too many times.
|
|
21
|
+
*/
|
|
22
|
+
export declare function guardCallChain(moduleId: string, callChain: readonly string[], maxCallDepth?: number, maxModuleRepeat?: number): void;
|
|
23
|
+
//# sourceMappingURL=call-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-chain.d.ts","sourceRoot":"","sources":["../../src/utils/call-chain.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,YAAY,GAAE,MAA+B,EAC7C,eAAe,GAAE,MAAkC,GAClD,IAAI,CA8BN"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call chain safety guard (Algorithm A20).
|
|
3
|
+
*/
|
|
4
|
+
import { CallDepthExceededError, CallFrequencyExceededError, CircularCallError, } from '../errors.js';
|
|
5
|
+
export const DEFAULT_MAX_CALL_DEPTH = 32;
|
|
6
|
+
export const DEFAULT_MAX_MODULE_REPEAT = 3;
|
|
7
|
+
/**
|
|
8
|
+
* Validate call chain safety (Algorithm A20).
|
|
9
|
+
*
|
|
10
|
+
* Performs three checks in order:
|
|
11
|
+
* 1. Depth limit -- call chain length must not exceed maxCallDepth.
|
|
12
|
+
* 2. Circular detection -- strict cycles of length >= 2 (A->B->A).
|
|
13
|
+
* 3. Frequency throttle -- moduleId must not appear more than maxModuleRepeat times.
|
|
14
|
+
*
|
|
15
|
+
* @param moduleId - The module about to be called.
|
|
16
|
+
* @param callChain - Current call chain (should already include moduleId at the end).
|
|
17
|
+
* @param maxCallDepth - Maximum allowed chain length.
|
|
18
|
+
* @param maxModuleRepeat - Maximum times a module may appear in the chain.
|
|
19
|
+
* @throws {CallDepthExceededError} Chain too deep.
|
|
20
|
+
* @throws {CircularCallError} Circular call detected.
|
|
21
|
+
* @throws {CallFrequencyExceededError} Module called too many times.
|
|
22
|
+
*/
|
|
23
|
+
export function guardCallChain(moduleId, callChain, maxCallDepth = DEFAULT_MAX_CALL_DEPTH, maxModuleRepeat = DEFAULT_MAX_MODULE_REPEAT) {
|
|
24
|
+
if (maxCallDepth < 1) {
|
|
25
|
+
throw new Error(`maxCallDepth must be >= 1, got ${maxCallDepth}`);
|
|
26
|
+
}
|
|
27
|
+
if (maxModuleRepeat < 1) {
|
|
28
|
+
throw new Error(`maxModuleRepeat must be >= 1, got ${maxModuleRepeat}`);
|
|
29
|
+
}
|
|
30
|
+
const chain = [...callChain];
|
|
31
|
+
// 1. Depth check
|
|
32
|
+
if (chain.length > maxCallDepth) {
|
|
33
|
+
throw new CallDepthExceededError(chain.length, maxCallDepth, chain);
|
|
34
|
+
}
|
|
35
|
+
// 2. Circular detection (strict cycles of length >= 2)
|
|
36
|
+
const priorChain = chain.slice(0, -1);
|
|
37
|
+
const lastIdx = priorChain.lastIndexOf(moduleId);
|
|
38
|
+
if (lastIdx !== -1) {
|
|
39
|
+
const subsequence = priorChain.slice(lastIdx + 1);
|
|
40
|
+
if (subsequence.length > 0) {
|
|
41
|
+
throw new CircularCallError(moduleId, chain);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// 3. Frequency check
|
|
45
|
+
const count = chain.filter((id) => id === moduleId).length;
|
|
46
|
+
if (count > maxModuleRepeat) {
|
|
47
|
+
throw new CallFrequencyExceededError(moduleId, count, maxModuleRepeat, chain);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=call-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-chain.js","sourceRoot":"","sources":["../../src/utils/call-chain.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,SAA4B,EAC5B,eAAuB,sBAAsB,EAC7C,kBAA0B,yBAAyB;IAEnD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,qCAAqC,eAAe,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAE7B,iBAAiB;IACjB,IAAI,KAAK,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAED,uDAAuD;IACvD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC3D,IAAI,KAAK,GAAG,eAAe,EAAE,CAAC;QAC5B,MAAM,IAAI,0BAA0B,CAAC,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error propagation (Algorithm A11).
|
|
3
|
+
*/
|
|
4
|
+
import type { Context } from '../context.js';
|
|
5
|
+
import { ModuleError } from '../errors.js';
|
|
6
|
+
/**
|
|
7
|
+
* Wrap a raw error into a standardized ModuleError (Algorithm A11).
|
|
8
|
+
*
|
|
9
|
+
* If the error is already a ModuleError, enriches it with trace context.
|
|
10
|
+
* Otherwise wraps it as a ModuleExecuteError.
|
|
11
|
+
*
|
|
12
|
+
* @param error - The raw error.
|
|
13
|
+
* @param moduleId - Module ID where the error occurred.
|
|
14
|
+
* @param context - Current execution context.
|
|
15
|
+
* @returns A ModuleError with traceId, moduleId, and callChain attached.
|
|
16
|
+
*/
|
|
17
|
+
export declare function propagateError(error: Error, moduleId: string, context: Context): ModuleError;
|
|
18
|
+
//# sourceMappingURL=error-propagation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-propagation.d.ts","sourceRoot":"","sources":["../../src/utils/error-propagation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAsB,MAAM,cAAc,CAAC;AAE/D;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,WAAW,CAuB5F"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error propagation (Algorithm A11).
|
|
3
|
+
*/
|
|
4
|
+
import { ModuleError, ModuleExecuteError } from '../errors.js';
|
|
5
|
+
/**
|
|
6
|
+
* Wrap a raw error into a standardized ModuleError (Algorithm A11).
|
|
7
|
+
*
|
|
8
|
+
* If the error is already a ModuleError, enriches it with trace context.
|
|
9
|
+
* Otherwise wraps it as a ModuleExecuteError.
|
|
10
|
+
*
|
|
11
|
+
* @param error - The raw error.
|
|
12
|
+
* @param moduleId - Module ID where the error occurred.
|
|
13
|
+
* @param context - Current execution context.
|
|
14
|
+
* @returns A ModuleError with traceId, moduleId, and callChain attached.
|
|
15
|
+
*/
|
|
16
|
+
export function propagateError(error, moduleId, context) {
|
|
17
|
+
if (error instanceof ModuleError) {
|
|
18
|
+
// Already a ModuleError -- enrich with context if missing
|
|
19
|
+
if (error.traceId === undefined) {
|
|
20
|
+
error.traceId = context.traceId;
|
|
21
|
+
}
|
|
22
|
+
if (!('module_id' in error.details)) {
|
|
23
|
+
error.details['module_id'] = moduleId;
|
|
24
|
+
}
|
|
25
|
+
if (!('call_chain' in error.details)) {
|
|
26
|
+
error.details['call_chain'] = [...context.callChain];
|
|
27
|
+
}
|
|
28
|
+
return error;
|
|
29
|
+
}
|
|
30
|
+
// Wrap raw error as ModuleExecuteError
|
|
31
|
+
const wrapped = new ModuleExecuteError(moduleId, `Module '${moduleId}' raised ${error.constructor.name}: ${error.message}`, { cause: error });
|
|
32
|
+
wrapped.details['call_chain'] = [...context.callChain];
|
|
33
|
+
return wrapped;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=error-propagation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-propagation.js","sourceRoot":"","sources":["../../src/utils/error-propagation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE/D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,QAAgB,EAAE,OAAgB;IAC7E,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,0DAA0D;QAC1D,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,KAA6B,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uCAAuC;IACvC,MAAM,OAAO,GAAG,IAAI,kBAAkB,CACpC,QAAQ,EACR,WAAW,QAAQ,YAAY,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,EACzE,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
export { matchPattern } from './pattern.js';
|
|
1
|
+
export { matchPattern, calculateSpecificity } from './pattern.js';
|
|
2
|
+
export { normalizeToCanonicalId } from './normalize.js';
|
|
3
|
+
export { guardCallChain, DEFAULT_MAX_CALL_DEPTH, DEFAULT_MAX_MODULE_REPEAT } from './call-chain.js';
|
|
4
|
+
export { propagateError } from './error-propagation.js';
|
|
2
5
|
export declare function deepCopy<T>(obj: T): T;
|
|
3
6
|
/**
|
|
4
7
|
* Generate a random hex string of the given byte length.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMxD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAErC;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAYpD"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
export { matchPattern } from './pattern.js';
|
|
1
|
+
export { matchPattern, calculateSpecificity } from './pattern.js';
|
|
2
|
+
export { normalizeToCanonicalId } from './normalize.js';
|
|
3
|
+
export { guardCallChain, DEFAULT_MAX_CALL_DEPTH, DEFAULT_MAX_MODULE_REPEAT } from './call-chain.js';
|
|
4
|
+
export { propagateError } from './error-propagation.js';
|
|
2
5
|
// Lazy-load node:crypto for environments without globalThis.crypto (Node.js < 19)
|
|
3
6
|
let _nodeCrypto;
|
|
4
7
|
try {
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,kFAAkF;AAClF,IAAI,WAAqD,CAAC;AAC1D,IAAI,CAAC;IAAC,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;AAEtF,MAAM,UAAU,QAAQ,CAAI,GAAM;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,UAAkB;IAC1C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,IAAI,WAAW,EAAE,SAAS,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC;QACN,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,yEAAyE;QACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-language module ID normalization (Algorithm A02).
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Convert a language-local module ID to Canonical ID format (Algorithm A02).
|
|
6
|
+
*
|
|
7
|
+
* Steps:
|
|
8
|
+
* 1. Split by language-specific separator.
|
|
9
|
+
* 2. Normalize each segment from PascalCase/camelCase to snake_case.
|
|
10
|
+
* 3. Join with "." and validate against Canonical ID EBNF.
|
|
11
|
+
*
|
|
12
|
+
* @param localId - Language-local format ID (e.g. "executor::validator::DbParams").
|
|
13
|
+
* @param language - Source language ("python" | "rust" | "go" | "java" | "typescript").
|
|
14
|
+
* @returns Dot-separated snake_case Canonical ID.
|
|
15
|
+
* @throws {Error} If language is unsupported or the result is not a valid Canonical ID.
|
|
16
|
+
*/
|
|
17
|
+
export declare function normalizeToCanonicalId(localId: string, language: string): string;
|
|
18
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkCH;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuBhF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-language module ID normalization (Algorithm A02).
|
|
3
|
+
*/
|
|
4
|
+
const SEPARATORS = {
|
|
5
|
+
python: '.',
|
|
6
|
+
rust: '::',
|
|
7
|
+
go: '.',
|
|
8
|
+
java: '.',
|
|
9
|
+
typescript: '.',
|
|
10
|
+
};
|
|
11
|
+
const SUPPORTED_LANGUAGES = new Set(Object.keys(SEPARATORS));
|
|
12
|
+
/**
|
|
13
|
+
* Regex for splitting PascalCase / camelCase into words.
|
|
14
|
+
* Handles transitions like: "Http" | "JSON" | "Parser" | "v2".
|
|
15
|
+
*/
|
|
16
|
+
const CASE_BOUNDARY = /(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/g;
|
|
17
|
+
/** Canonical ID format from PROTOCOL_SPEC section 2.7 EBNF grammar. */
|
|
18
|
+
const CANONICAL_ID_RE = /^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)*$/;
|
|
19
|
+
function toSnakeCase(segment) {
|
|
20
|
+
if (!segment)
|
|
21
|
+
return segment;
|
|
22
|
+
// If already snake_case (all lowercase + underscores), return as-is.
|
|
23
|
+
if (segment === segment.toLowerCase() && /^[a-z_]\w*$/.test(segment)) {
|
|
24
|
+
return segment;
|
|
25
|
+
}
|
|
26
|
+
// Split at case boundaries, join with underscore, lowercase.
|
|
27
|
+
const words = segment.split(CASE_BOUNDARY).filter(Boolean);
|
|
28
|
+
return words.map((w) => w.toLowerCase()).join('_');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Convert a language-local module ID to Canonical ID format (Algorithm A02).
|
|
32
|
+
*
|
|
33
|
+
* Steps:
|
|
34
|
+
* 1. Split by language-specific separator.
|
|
35
|
+
* 2. Normalize each segment from PascalCase/camelCase to snake_case.
|
|
36
|
+
* 3. Join with "." and validate against Canonical ID EBNF.
|
|
37
|
+
*
|
|
38
|
+
* @param localId - Language-local format ID (e.g. "executor::validator::DbParams").
|
|
39
|
+
* @param language - Source language ("python" | "rust" | "go" | "java" | "typescript").
|
|
40
|
+
* @returns Dot-separated snake_case Canonical ID.
|
|
41
|
+
* @throws {Error} If language is unsupported or the result is not a valid Canonical ID.
|
|
42
|
+
*/
|
|
43
|
+
export function normalizeToCanonicalId(localId, language) {
|
|
44
|
+
if (!localId) {
|
|
45
|
+
throw new Error('localId must be a non-empty string');
|
|
46
|
+
}
|
|
47
|
+
if (!SUPPORTED_LANGUAGES.has(language)) {
|
|
48
|
+
const supported = [...SUPPORTED_LANGUAGES].sort().join(', ');
|
|
49
|
+
throw new Error(`Unsupported language '${language}'. Must be one of: ${supported}`);
|
|
50
|
+
}
|
|
51
|
+
const separator = SEPARATORS[language];
|
|
52
|
+
const segments = localId.split(separator);
|
|
53
|
+
const normalized = segments.map(toSnakeCase);
|
|
54
|
+
const canonicalId = normalized.join('.');
|
|
55
|
+
if (!CANONICAL_ID_RE.test(canonicalId)) {
|
|
56
|
+
throw new Error(`Normalized ID '${canonicalId}' (from '${localId}', language='${language}') ` +
|
|
57
|
+
'does not conform to Canonical ID grammar');
|
|
58
|
+
}
|
|
59
|
+
return canonicalId;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,IAAI;IACV,EAAE,EAAE,GAAG;IACP,IAAI,EAAE,GAAG;IACT,UAAU,EAAE,GAAG;CAChB,CAAC;AAEF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAE7D;;;GAGG;AACH,MAAM,aAAa,GAAG,kDAAkD,CAAC;AAEzE,uEAAuE;AACvE,MAAM,eAAe,GAAG,uCAAuC,CAAC;AAEhE,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAE7B,qEAAqE;IACrE,IAAI,OAAO,KAAK,OAAO,CAAC,WAAW,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,6DAA6D;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,QAAgB;IACtE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,sBAAsB,SAAS,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,kBAAkB,WAAW,YAAY,OAAO,gBAAgB,QAAQ,KAAK;YAC7E,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
package/dist/utils/pattern.d.ts
CHANGED
|
@@ -2,4 +2,19 @@
|
|
|
2
2
|
* Wildcard pattern matching for module IDs (Algorithm A08).
|
|
3
3
|
*/
|
|
4
4
|
export declare function matchPattern(pattern: string, moduleId: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Calculate the specificity score of an ACL pattern (Algorithm A10).
|
|
7
|
+
*
|
|
8
|
+
* Higher scores indicate more specific patterns. Scoring per segment:
|
|
9
|
+
* - "*" (pure wildcard) -> 0
|
|
10
|
+
* - Segment containing "*" (partial wildcard) -> +1
|
|
11
|
+
* - Exact segment (no wildcard) -> +2
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* calculateSpecificity("*") // 0
|
|
15
|
+
* calculateSpecificity("api.*") // 2
|
|
16
|
+
* calculateSpecificity("api.handler.*") // 4
|
|
17
|
+
* calculateSpecificity("api.handler.task_submit") // 6
|
|
18
|
+
*/
|
|
19
|
+
export declare function calculateSpecificity(pattern: string): number;
|
|
5
20
|
//# sourceMappingURL=pattern.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/utils/pattern.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAyBvE"}
|
|
1
|
+
{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/utils/pattern.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAyBvE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAc5D"}
|
package/dist/utils/pattern.js
CHANGED
|
@@ -28,4 +28,35 @@ export function matchPattern(pattern, moduleId) {
|
|
|
28
28
|
}
|
|
29
29
|
return true;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculate the specificity score of an ACL pattern (Algorithm A10).
|
|
33
|
+
*
|
|
34
|
+
* Higher scores indicate more specific patterns. Scoring per segment:
|
|
35
|
+
* - "*" (pure wildcard) -> 0
|
|
36
|
+
* - Segment containing "*" (partial wildcard) -> +1
|
|
37
|
+
* - Exact segment (no wildcard) -> +2
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* calculateSpecificity("*") // 0
|
|
41
|
+
* calculateSpecificity("api.*") // 2
|
|
42
|
+
* calculateSpecificity("api.handler.*") // 4
|
|
43
|
+
* calculateSpecificity("api.handler.task_submit") // 6
|
|
44
|
+
*/
|
|
45
|
+
export function calculateSpecificity(pattern) {
|
|
46
|
+
if (pattern === '*')
|
|
47
|
+
return 0;
|
|
48
|
+
let score = 0;
|
|
49
|
+
for (const segment of pattern.split('.')) {
|
|
50
|
+
if (segment === '*') {
|
|
51
|
+
// +0
|
|
52
|
+
}
|
|
53
|
+
else if (segment.includes('*')) {
|
|
54
|
+
score += 1;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
score += 2;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return score;
|
|
61
|
+
}
|
|
31
62
|
//# sourceMappingURL=pattern.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/utils/pattern.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAAgB;IAC5D,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,KAAK,QAAQ,CAAC;IAExD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACpD,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,GAAG,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACtE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/utils/pattern.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAAgB;IAC5D,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,KAAK,QAAQ,CAAC;IAExD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACpD,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,GAAG,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACtE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC;IAE9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK;QACP,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version negotiation (Algorithm A14).
|
|
3
|
+
*/
|
|
4
|
+
import { ModuleError } from './errors.js';
|
|
5
|
+
import type { ErrorOptions } from './errors.js';
|
|
6
|
+
export declare class VersionIncompatibleError extends ModuleError {
|
|
7
|
+
static readonly DEFAULT_RETRYABLE: boolean | null;
|
|
8
|
+
constructor(declared: string, sdk: string, reason: string, options?: ErrorOptions);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Negotiate the effective version between declared and SDK versions (Algorithm A14).
|
|
12
|
+
*
|
|
13
|
+
* Steps:
|
|
14
|
+
* 1. Parse both versions as semver.
|
|
15
|
+
* 2. Major mismatch -> error.
|
|
16
|
+
* 3. Declared minor > SDK minor -> error (SDK too old).
|
|
17
|
+
* 4. Declared minor < SDK minor by >2 -> deprecation warning.
|
|
18
|
+
* 5. Same minor -> effective = max(declared, sdk).
|
|
19
|
+
*
|
|
20
|
+
* @param declaredVersion - Version declared in configuration or schema.
|
|
21
|
+
* @param sdkVersion - Maximum version supported by the current SDK.
|
|
22
|
+
* @returns The effective version string.
|
|
23
|
+
* @throws {VersionIncompatibleError} When versions are incompatible.
|
|
24
|
+
* @throws {Error} When a version string is not valid semver.
|
|
25
|
+
*/
|
|
26
|
+
export declare function negotiateVersion(declaredVersion: string, sdkVersion: string): string;
|
|
27
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiEhD,qBAAa,wBAAyB,SAAQ,WAAW;IACvD,gBAAyB,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAS;gBAEvD,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAclF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CA4BpF"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version negotiation (Algorithm A14).
|
|
3
|
+
*/
|
|
4
|
+
import { ModuleError } from './errors.js';
|
|
5
|
+
/** Regex for parsing semver strings (major.minor.patch with optional pre-release). */
|
|
6
|
+
const SEMVER_RE = /^(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<pre>[0-9A-Za-z\-]+(?:\.[0-9A-Za-z\-]+)*))?$/;
|
|
7
|
+
/** Deprecation warning threshold. */
|
|
8
|
+
const DEPRECATION_THRESHOLD = 2;
|
|
9
|
+
function parseSemver(version) {
|
|
10
|
+
const m = SEMVER_RE.exec(version.trim());
|
|
11
|
+
if (!m || !m.groups) {
|
|
12
|
+
throw new Error(`Invalid semantic version: '${version}'`);
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
major: parseInt(m.groups['major'], 10),
|
|
16
|
+
minor: parseInt(m.groups['minor'], 10),
|
|
17
|
+
patch: parseInt(m.groups['patch'], 10),
|
|
18
|
+
pre: m.groups['pre'] ?? null,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function sortKey(v) {
|
|
22
|
+
if (v.pre === null) {
|
|
23
|
+
return [v.major, v.minor, v.patch, 1, []];
|
|
24
|
+
}
|
|
25
|
+
const parts = [];
|
|
26
|
+
for (const ident of v.pre.split('.')) {
|
|
27
|
+
if (/^\d+$/.test(ident)) {
|
|
28
|
+
parts.push([0, parseInt(ident, 10), '']);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
parts.push([1, 0, ident]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return [v.major, v.minor, v.patch, 0, parts];
|
|
35
|
+
}
|
|
36
|
+
function compareSortKeys(a, b) {
|
|
37
|
+
for (let i = 0; i < 4; i++) {
|
|
38
|
+
if (a[i] !== b[i])
|
|
39
|
+
return a[i] - b[i];
|
|
40
|
+
}
|
|
41
|
+
const ap = a[4];
|
|
42
|
+
const bp = b[4];
|
|
43
|
+
const len = Math.min(ap.length, bp.length);
|
|
44
|
+
for (let i = 0; i < len; i++) {
|
|
45
|
+
if (ap[i][0] !== bp[i][0])
|
|
46
|
+
return ap[i][0] - bp[i][0];
|
|
47
|
+
if (ap[i][1] !== bp[i][1])
|
|
48
|
+
return ap[i][1] - bp[i][1];
|
|
49
|
+
if (ap[i][2] !== bp[i][2])
|
|
50
|
+
return ap[i][2] < bp[i][2] ? -1 : 1;
|
|
51
|
+
}
|
|
52
|
+
return ap.length - bp.length;
|
|
53
|
+
}
|
|
54
|
+
function semverToString(v) {
|
|
55
|
+
const base = `${v.major}.${v.minor}.${v.patch}`;
|
|
56
|
+
return v.pre ? `${base}-${v.pre}` : base;
|
|
57
|
+
}
|
|
58
|
+
export class VersionIncompatibleError extends ModuleError {
|
|
59
|
+
static DEFAULT_RETRYABLE = false;
|
|
60
|
+
constructor(declared, sdk, reason, options) {
|
|
61
|
+
super('VERSION_INCOMPATIBLE', `Version incompatible: declared=${declared}, sdk=${sdk} — ${reason}`, { declaredVersion: declared, sdkVersion: sdk, reason }, options?.cause, options?.traceId, options?.retryable, options?.aiGuidance, options?.userFixable, options?.suggestion);
|
|
62
|
+
this.name = 'VersionIncompatibleError';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Negotiate the effective version between declared and SDK versions (Algorithm A14).
|
|
67
|
+
*
|
|
68
|
+
* Steps:
|
|
69
|
+
* 1. Parse both versions as semver.
|
|
70
|
+
* 2. Major mismatch -> error.
|
|
71
|
+
* 3. Declared minor > SDK minor -> error (SDK too old).
|
|
72
|
+
* 4. Declared minor < SDK minor by >2 -> deprecation warning.
|
|
73
|
+
* 5. Same minor -> effective = max(declared, sdk).
|
|
74
|
+
*
|
|
75
|
+
* @param declaredVersion - Version declared in configuration or schema.
|
|
76
|
+
* @param sdkVersion - Maximum version supported by the current SDK.
|
|
77
|
+
* @returns The effective version string.
|
|
78
|
+
* @throws {VersionIncompatibleError} When versions are incompatible.
|
|
79
|
+
* @throws {Error} When a version string is not valid semver.
|
|
80
|
+
*/
|
|
81
|
+
export function negotiateVersion(declaredVersion, sdkVersion) {
|
|
82
|
+
const declared = parseSemver(declaredVersion);
|
|
83
|
+
const sdk = parseSemver(sdkVersion);
|
|
84
|
+
// Major version mismatch
|
|
85
|
+
if (declared.major !== sdk.major) {
|
|
86
|
+
throw new VersionIncompatibleError(declaredVersion, sdkVersion, 'Major version mismatch');
|
|
87
|
+
}
|
|
88
|
+
// Declared minor > SDK minor -> SDK too old
|
|
89
|
+
if (declared.minor > sdk.minor) {
|
|
90
|
+
throw new VersionIncompatibleError(declaredVersion, sdkVersion, 'SDK version too low, please upgrade');
|
|
91
|
+
}
|
|
92
|
+
// Declared minor < SDK minor
|
|
93
|
+
if (declared.minor < sdk.minor) {
|
|
94
|
+
const gap = sdk.minor - declared.minor;
|
|
95
|
+
if (gap > DEPRECATION_THRESHOLD) {
|
|
96
|
+
console.warn(`[apcore:version] Declared version ${declaredVersion} is ${gap} minor versions behind SDK ${sdkVersion} — consider upgrading your configuration`);
|
|
97
|
+
}
|
|
98
|
+
return declaredVersion; // Backward compatibility mode
|
|
99
|
+
}
|
|
100
|
+
// Same minor -> effective = max(declared, sdk)
|
|
101
|
+
const cmp = compareSortKeys(sortKey(declared), sortKey(sdk));
|
|
102
|
+
return cmp >= 0 ? semverToString(declared) : semverToString(sdk);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apcore-js",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "AI-Perceivable Core — schema-driven module development framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"type": "git",
|
|
32
32
|
"url": "https://github.com/aipartnerup/apcore-typescript.git"
|
|
33
33
|
},
|
|
34
|
-
"homepage": "https://
|
|
34
|
+
"homepage": "https://aipartnerup.com",
|
|
35
35
|
"bugs": {
|
|
36
36
|
"url": "https://github.com/aipartnerup/apcore-typescript/issues"
|
|
37
37
|
},
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"@types/node": "^20.0.0",
|
|
62
62
|
"@types/js-yaml": "^4.0.9",
|
|
63
63
|
"@types/uuid": "^9.0.0",
|
|
64
|
-
"apdev-js": "^0.
|
|
64
|
+
"apdev-js": "^0.2.0",
|
|
65
65
|
"vitest": "^2.0.0",
|
|
66
66
|
"@vitest/coverage-v8": "^2.0.0"
|
|
67
67
|
}
|