apcore-js 0.7.0 → 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 +12 -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 +4 -4
package/README.md
CHANGED
|
@@ -15,10 +15,16 @@ apcore provides a unified task orchestration framework with schema validation, a
|
|
|
15
15
|
- **Registry system** — File-based module discovery with metadata, dependencies, and topological ordering
|
|
16
16
|
- **Binding loader** — YAML-based module registration for no-code integration
|
|
17
17
|
- **Access control (ACL)** — Pattern-based rules with identity types, roles, and call-depth conditions
|
|
18
|
+
- **Approval system** — Pluggable approval gate in the executor pipeline with sync and async (polling) flows, built-in handlers, and tracing integration
|
|
18
19
|
- **Middleware** — Onion-model middleware with before/after/onError hooks and error recovery
|
|
19
20
|
- **Observability** — Tracing (spans + exporters), metrics (counters + histograms + Prometheus export), structured logging with redaction
|
|
20
21
|
- **Schema export** — JSON/YAML schema export with strict and compact modes
|
|
21
22
|
|
|
23
|
+
## Documentation
|
|
24
|
+
|
|
25
|
+
For full documentation, including Quick Start guides for both Python and TypeScript, visit:
|
|
26
|
+
**[https://aipartnerup.github.io/apcore/getting-started.html](https://aipartnerup.github.io/apcore/getting-started.html)**
|
|
27
|
+
|
|
22
28
|
## Requirements
|
|
23
29
|
|
|
24
30
|
- Node.js >= 18.0.0
|
|
@@ -63,10 +69,15 @@ src/
|
|
|
63
69
|
context.ts # Execution context and identity
|
|
64
70
|
config.ts # Dot-path configuration accessor
|
|
65
71
|
acl.ts # Access control with pattern matching
|
|
72
|
+
approval.ts # Pluggable approval gate (handlers, request/result types)
|
|
73
|
+
async-task.ts # Async task manager
|
|
74
|
+
cancel.ts # Cancellation token support
|
|
66
75
|
decorator.ts # FunctionModule class and helpers
|
|
67
76
|
bindings.ts # YAML binding loader
|
|
68
|
-
errors.ts # Error hierarchy (
|
|
77
|
+
errors.ts # Error hierarchy (30+ typed errors)
|
|
78
|
+
extensions.ts # Extension manager
|
|
69
79
|
module.ts # Module types and annotations
|
|
80
|
+
trace-context.ts # W3C trace context (inject/extract)
|
|
70
81
|
middleware/
|
|
71
82
|
base.ts # Middleware base class
|
|
72
83
|
manager.ts # MiddlewareManager (onion model)
|
package/dist/acl.d.ts
CHANGED
|
@@ -9,14 +9,31 @@ export interface ACLRule {
|
|
|
9
9
|
description: string;
|
|
10
10
|
conditions?: Record<string, unknown> | null;
|
|
11
11
|
}
|
|
12
|
+
/** Structured record of an ACL check decision. */
|
|
13
|
+
export interface AuditEntry {
|
|
14
|
+
readonly timestamp: string;
|
|
15
|
+
readonly callerId: string;
|
|
16
|
+
readonly targetId: string;
|
|
17
|
+
readonly decision: string;
|
|
18
|
+
readonly reason: string;
|
|
19
|
+
readonly matchedRule: string | null;
|
|
20
|
+
readonly matchedRuleIndex: number | null;
|
|
21
|
+
readonly identityType: string | null;
|
|
22
|
+
readonly roles: readonly string[];
|
|
23
|
+
readonly callDepth: number | null;
|
|
24
|
+
readonly traceId: string | null;
|
|
25
|
+
}
|
|
26
|
+
export type AuditLogger = (entry: AuditEntry) => void;
|
|
12
27
|
export declare class ACL {
|
|
13
28
|
private _rules;
|
|
14
29
|
private _defaultEffect;
|
|
15
30
|
private _yamlPath;
|
|
31
|
+
private _auditLogger;
|
|
16
32
|
debug: boolean;
|
|
17
|
-
constructor(rules: ACLRule[], defaultEffect?: string);
|
|
33
|
+
constructor(rules: ACLRule[], defaultEffect?: string, auditLogger?: AuditLogger | null);
|
|
18
34
|
static load(yamlPath: string): ACL;
|
|
19
35
|
check(callerId: string | null, targetId: string, context?: Context | null): boolean;
|
|
36
|
+
private _buildAuditEntry;
|
|
20
37
|
private _matchPattern;
|
|
21
38
|
private _matchesRule;
|
|
22
39
|
private _checkConditions;
|
package/dist/acl.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acl.d.ts","sourceRoot":"","sources":["../src/acl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7C;
|
|
1
|
+
{"version":3,"file":"acl.d.ts","sourceRoot":"","sources":["../src/acl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7C;AAED,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAsCtD,qBAAa,GAAG;IACd,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,YAAY,CAA4B;IAChD,KAAK,EAAE,OAAO,CAAS;gBAEX,KAAK,EAAE,OAAO,EAAE,EAAE,aAAa,GAAE,MAAe,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAS9F,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG;IAqClC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO;IA6BnF,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAI5B,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO;IAczD,MAAM,IAAI,IAAI;CASf"}
|
package/dist/acl.js
CHANGED
|
@@ -44,13 +44,15 @@ export class ACL {
|
|
|
44
44
|
_rules;
|
|
45
45
|
_defaultEffect;
|
|
46
46
|
_yamlPath = null;
|
|
47
|
+
_auditLogger = null;
|
|
47
48
|
debug = false;
|
|
48
|
-
constructor(rules, defaultEffect = 'deny') {
|
|
49
|
+
constructor(rules, defaultEffect = 'deny', auditLogger) {
|
|
49
50
|
if (defaultEffect !== 'allow' && defaultEffect !== 'deny') {
|
|
50
51
|
throw new ACLRuleError(`Invalid default_effect '${defaultEffect}', must be 'allow' or 'deny'`);
|
|
51
52
|
}
|
|
52
53
|
this._rules = [...rules];
|
|
53
54
|
this._defaultEffect = defaultEffect;
|
|
55
|
+
this._auditLogger = auditLogger ?? null;
|
|
54
56
|
}
|
|
55
57
|
static load(yamlPath) {
|
|
56
58
|
const { existsSync, readFileSync } = _nodeFs;
|
|
@@ -86,12 +88,50 @@ export class ACL {
|
|
|
86
88
|
}
|
|
87
89
|
check(callerId, targetId, context) {
|
|
88
90
|
const effectiveCaller = callerId === null ? '@external' : callerId;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
const ctx = context ?? null;
|
|
92
|
+
for (let idx = 0; idx < this._rules.length; idx++) {
|
|
93
|
+
const rule = this._rules[idx];
|
|
94
|
+
if (this._matchesRule(rule, effectiveCaller, targetId, ctx)) {
|
|
95
|
+
const decision = rule.effect === 'allow';
|
|
96
|
+
if (this._auditLogger) {
|
|
97
|
+
this._auditLogger(this._buildAuditEntry(effectiveCaller, targetId, decision ? 'allow' : 'deny', 'rule_match', rule, idx, ctx));
|
|
98
|
+
}
|
|
99
|
+
return decision;
|
|
92
100
|
}
|
|
93
101
|
}
|
|
94
|
-
|
|
102
|
+
const defaultDecision = this._defaultEffect === 'allow';
|
|
103
|
+
if (this._auditLogger) {
|
|
104
|
+
const reason = this._rules.length === 0 ? 'no_rules' : 'default_effect';
|
|
105
|
+
this._auditLogger(this._buildAuditEntry(effectiveCaller, targetId, defaultDecision ? 'allow' : 'deny', reason, null, null, ctx));
|
|
106
|
+
}
|
|
107
|
+
return defaultDecision;
|
|
108
|
+
}
|
|
109
|
+
_buildAuditEntry(callerId, targetId, decision, reason, matchedRule, matchedRuleIndex, context) {
|
|
110
|
+
let identityType = null;
|
|
111
|
+
let roles = [];
|
|
112
|
+
let callDepth = null;
|
|
113
|
+
let traceId = null;
|
|
114
|
+
if (context !== null) {
|
|
115
|
+
traceId = context.traceId;
|
|
116
|
+
callDepth = context.callChain.length;
|
|
117
|
+
if (context.identity !== null) {
|
|
118
|
+
identityType = context.identity.type;
|
|
119
|
+
roles = context.identity.roles;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
timestamp: new Date().toISOString(),
|
|
124
|
+
callerId,
|
|
125
|
+
targetId,
|
|
126
|
+
decision,
|
|
127
|
+
reason,
|
|
128
|
+
matchedRule: matchedRule?.description ?? null,
|
|
129
|
+
matchedRuleIndex,
|
|
130
|
+
identityType,
|
|
131
|
+
roles,
|
|
132
|
+
callDepth,
|
|
133
|
+
traceId,
|
|
134
|
+
};
|
|
95
135
|
}
|
|
96
136
|
_matchPattern(pattern, value, context) {
|
|
97
137
|
if (pattern === '@external')
|
|
@@ -170,6 +210,7 @@ export class ACL {
|
|
|
170
210
|
const reloaded = ACL.load(this._yamlPath);
|
|
171
211
|
this._rules = reloaded._rules;
|
|
172
212
|
this._defaultEffect = reloaded._defaultEffect;
|
|
213
|
+
// Preserve auditLogger — reload only refreshes rules and default effect
|
|
173
214
|
}
|
|
174
215
|
}
|
|
175
216
|
//# sourceMappingURL=acl.js.map
|
package/dist/acl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acl.js","sourceRoot":"","sources":["../src/acl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,+DAA+D;AAC/D,IAAI,OAAO,GAAoC,IAAI,CAAC;AACpD,IAAI,CAAC;IAAC,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"acl.js","sourceRoot":"","sources":["../src/acl.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,9 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Configuration
|
|
2
|
+
* Configuration loading, validation, and environment variable overrides (Algorithm A12).
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Configuration system with YAML loading, env overrides, and validation.
|
|
6
|
+
*
|
|
7
|
+
* Merge priority (highest wins): environment variables > config file > defaults.
|
|
8
|
+
*
|
|
9
|
+
* Backward compatible: `new Config(data)` still works for in-memory configuration.
|
|
3
10
|
*/
|
|
4
11
|
export declare class Config {
|
|
5
12
|
private _data;
|
|
13
|
+
private _yamlPath;
|
|
6
14
|
constructor(data?: Record<string, unknown>);
|
|
15
|
+
/**
|
|
16
|
+
* Load configuration from a YAML file with env overrides.
|
|
17
|
+
*/
|
|
18
|
+
static load(yamlPath: string, options?: {
|
|
19
|
+
validate?: boolean;
|
|
20
|
+
}): Config;
|
|
21
|
+
/** Create a Config from default values with env overrides applied. */
|
|
22
|
+
static fromDefaults(): Config;
|
|
23
|
+
/** Get a configuration value by dot-path key. */
|
|
7
24
|
get(key: string, defaultValue?: unknown): unknown;
|
|
25
|
+
/** Set a configuration value by dot-path key. */
|
|
26
|
+
set(key: string, value: unknown): void;
|
|
27
|
+
/** Return a deep copy of the raw config data. */
|
|
28
|
+
get data(): Record<string, unknown>;
|
|
29
|
+
/**
|
|
30
|
+
* Validate the configuration per Algorithm A12.
|
|
31
|
+
*
|
|
32
|
+
* Checks required fields, type constraints, and semantic rules.
|
|
33
|
+
* Collects all errors before raising.
|
|
34
|
+
*/
|
|
35
|
+
validate(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Re-read configuration from the original YAML file.
|
|
38
|
+
* Only works if the Config was created via Config.load().
|
|
39
|
+
*/
|
|
40
|
+
reload(): void;
|
|
8
41
|
}
|
|
9
42
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsKH;;;;;;GAMG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,SAAS,CAAuB;gBAE5B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI1C;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM;IAoCvE,sEAAsE;IACtE,MAAM,CAAC,YAAY,IAAI,MAAM;IAK7B,iDAAiD;IACjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO;IAIjD,iDAAiD;IACjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAItC,iDAAiD;IACjD,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAElC;IAED;;;;;OAKG;IACH,QAAQ,IAAI,IAAI;IA2BhB;;;OAGG;IACH,MAAM,IAAI,IAAI;CAOf"}
|
package/dist/config.js
CHANGED
|
@@ -1,23 +1,265 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Configuration
|
|
2
|
+
* Configuration loading, validation, and environment variable overrides (Algorithm A12).
|
|
3
|
+
*/
|
|
4
|
+
import yaml from 'js-yaml';
|
|
5
|
+
import { ConfigError, ConfigNotFoundError } from './errors.js';
|
|
6
|
+
// Lazy-load Node.js built-in modules for browser compatibility
|
|
7
|
+
let _nodeFs = null;
|
|
8
|
+
try {
|
|
9
|
+
_nodeFs = await import('node:fs');
|
|
10
|
+
}
|
|
11
|
+
catch { /* browser environment */ }
|
|
12
|
+
let _nodeProcess = null;
|
|
13
|
+
try {
|
|
14
|
+
_nodeProcess = await import('node:process');
|
|
15
|
+
}
|
|
16
|
+
catch { /* browser environment */ }
|
|
17
|
+
/** Environment variable prefix for overrides. */
|
|
18
|
+
const ENV_PREFIX = 'APCORE_';
|
|
19
|
+
/** Required configuration fields (dot-paths). */
|
|
20
|
+
const REQUIRED_FIELDS = [
|
|
21
|
+
'version',
|
|
22
|
+
'extensions.root',
|
|
23
|
+
'schema.root',
|
|
24
|
+
'acl.root',
|
|
25
|
+
'acl.default_effect',
|
|
26
|
+
'project.name',
|
|
27
|
+
];
|
|
28
|
+
/** Field constraints: field -> [validator, errorMessage]. */
|
|
29
|
+
const CONSTRAINTS = {
|
|
30
|
+
'acl.default_effect': [
|
|
31
|
+
(v) => v === 'allow' || v === 'deny',
|
|
32
|
+
"must be 'allow' or 'deny'",
|
|
33
|
+
],
|
|
34
|
+
'observability.tracing.sampling_rate': [
|
|
35
|
+
(v) => typeof v === 'number' && v >= 0.0 && v <= 1.0,
|
|
36
|
+
'must be a number in [0.0, 1.0]',
|
|
37
|
+
],
|
|
38
|
+
'extensions.max_depth': [
|
|
39
|
+
(v) => typeof v === 'number' && Number.isInteger(v) && v >= 1 && v <= 16,
|
|
40
|
+
'must be an integer in [1, 16]',
|
|
41
|
+
],
|
|
42
|
+
'executor.default_timeout': [
|
|
43
|
+
(v) => typeof v === 'number' && Number.isInteger(v) && v >= 0,
|
|
44
|
+
'must be a non-negative integer (milliseconds)',
|
|
45
|
+
],
|
|
46
|
+
'executor.global_timeout': [
|
|
47
|
+
(v) => typeof v === 'number' && Number.isInteger(v) && v >= 0,
|
|
48
|
+
'must be a non-negative integer (milliseconds)',
|
|
49
|
+
],
|
|
50
|
+
'executor.max_call_depth': [
|
|
51
|
+
(v) => typeof v === 'number' && Number.isInteger(v) && v >= 1,
|
|
52
|
+
'must be a positive integer',
|
|
53
|
+
],
|
|
54
|
+
'executor.max_module_repeat': [
|
|
55
|
+
(v) => typeof v === 'number' && Number.isInteger(v) && v >= 1,
|
|
56
|
+
'must be a positive integer',
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
/** Default configuration values. */
|
|
60
|
+
const DEFAULTS = {
|
|
61
|
+
version: '0.8.0',
|
|
62
|
+
extensions: {
|
|
63
|
+
root: './extensions',
|
|
64
|
+
auto_discover: true,
|
|
65
|
+
max_depth: 8,
|
|
66
|
+
follow_symlinks: false,
|
|
67
|
+
},
|
|
68
|
+
schema: {
|
|
69
|
+
root: './schemas',
|
|
70
|
+
strategy: 'yaml_first',
|
|
71
|
+
max_ref_depth: 32,
|
|
72
|
+
},
|
|
73
|
+
acl: {
|
|
74
|
+
root: './acl',
|
|
75
|
+
default_effect: 'deny',
|
|
76
|
+
},
|
|
77
|
+
executor: {
|
|
78
|
+
default_timeout: 30000,
|
|
79
|
+
global_timeout: 60000,
|
|
80
|
+
max_call_depth: 32,
|
|
81
|
+
max_module_repeat: 3,
|
|
82
|
+
},
|
|
83
|
+
observability: {
|
|
84
|
+
tracing: {
|
|
85
|
+
enabled: false,
|
|
86
|
+
sampling_rate: 1.0,
|
|
87
|
+
},
|
|
88
|
+
metrics: {
|
|
89
|
+
enabled: false,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
project: {
|
|
93
|
+
name: 'apcore',
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
function deepMergeDicts(base, override) {
|
|
97
|
+
const result = { ...base };
|
|
98
|
+
for (const [key, value] of Object.entries(override)) {
|
|
99
|
+
if (key in result &&
|
|
100
|
+
typeof result[key] === 'object' && result[key] !== null && !Array.isArray(result[key]) &&
|
|
101
|
+
typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
102
|
+
result[key] = deepMergeDicts(result[key], value);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
result[key] = value;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
function getNested(data, dotPath, defaultValue) {
|
|
111
|
+
const parts = dotPath.split('.');
|
|
112
|
+
let current = data;
|
|
113
|
+
for (const part of parts) {
|
|
114
|
+
if (current !== null && typeof current === 'object' && part in current) {
|
|
115
|
+
current = current[part];
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
return defaultValue;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return current;
|
|
122
|
+
}
|
|
123
|
+
function setNested(data, dotPath, value) {
|
|
124
|
+
const parts = dotPath.split('.');
|
|
125
|
+
let current = data;
|
|
126
|
+
for (const part of parts.slice(0, -1)) {
|
|
127
|
+
if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {
|
|
128
|
+
current[part] = {};
|
|
129
|
+
}
|
|
130
|
+
current = current[part];
|
|
131
|
+
}
|
|
132
|
+
current[parts[parts.length - 1]] = value;
|
|
133
|
+
}
|
|
134
|
+
function coerceEnvValue(value) {
|
|
135
|
+
if (value.toLowerCase() === 'true')
|
|
136
|
+
return true;
|
|
137
|
+
if (value.toLowerCase() === 'false')
|
|
138
|
+
return false;
|
|
139
|
+
const asInt = parseInt(value, 10);
|
|
140
|
+
if (!isNaN(asInt) && String(asInt) === value)
|
|
141
|
+
return asInt;
|
|
142
|
+
const asFloat = parseFloat(value);
|
|
143
|
+
if (!isNaN(asFloat) && String(asFloat) === value)
|
|
144
|
+
return asFloat;
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
function applyEnvOverrides(data) {
|
|
148
|
+
const result = JSON.parse(JSON.stringify(data));
|
|
149
|
+
const env = _nodeProcess?.env ?? {};
|
|
150
|
+
for (const [envKey, envValue] of Object.entries(env)) {
|
|
151
|
+
if (!envKey.startsWith(ENV_PREFIX) || envValue === undefined)
|
|
152
|
+
continue;
|
|
153
|
+
const suffix = envKey.slice(ENV_PREFIX.length);
|
|
154
|
+
if (!suffix)
|
|
155
|
+
continue;
|
|
156
|
+
// Convert: single _ -> . (separator), double __ -> literal _
|
|
157
|
+
const dotPath = suffix.toLowerCase().replace(/__/g, '\x00').replace(/_/g, '.').replace(/\x00/g, '_');
|
|
158
|
+
setNested(result, dotPath, coerceEnvValue(envValue));
|
|
159
|
+
}
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Configuration system with YAML loading, env overrides, and validation.
|
|
164
|
+
*
|
|
165
|
+
* Merge priority (highest wins): environment variables > config file > defaults.
|
|
166
|
+
*
|
|
167
|
+
* Backward compatible: `new Config(data)` still works for in-memory configuration.
|
|
3
168
|
*/
|
|
4
169
|
export class Config {
|
|
5
170
|
_data;
|
|
171
|
+
_yamlPath = null;
|
|
6
172
|
constructor(data) {
|
|
7
173
|
this._data = data ?? {};
|
|
8
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Load configuration from a YAML file with env overrides.
|
|
177
|
+
*/
|
|
178
|
+
static load(yamlPath, options) {
|
|
179
|
+
const { existsSync, readFileSync } = _nodeFs;
|
|
180
|
+
if (!existsSync(yamlPath)) {
|
|
181
|
+
throw new ConfigNotFoundError(yamlPath);
|
|
182
|
+
}
|
|
183
|
+
let fileData;
|
|
184
|
+
try {
|
|
185
|
+
const content = readFileSync(yamlPath, 'utf-8');
|
|
186
|
+
fileData = yaml.load(content);
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
if (e instanceof ConfigNotFoundError)
|
|
190
|
+
throw e;
|
|
191
|
+
throw new ConfigError(`Invalid YAML in ${yamlPath}: ${e}`);
|
|
192
|
+
}
|
|
193
|
+
if (fileData === null || fileData === undefined) {
|
|
194
|
+
fileData = {};
|
|
195
|
+
}
|
|
196
|
+
if (typeof fileData !== 'object' || Array.isArray(fileData)) {
|
|
197
|
+
throw new ConfigError(`Config file must be a mapping, got ${typeof fileData}`);
|
|
198
|
+
}
|
|
199
|
+
// Merge: defaults < file < env
|
|
200
|
+
let merged = deepMergeDicts(DEFAULTS, fileData);
|
|
201
|
+
merged = applyEnvOverrides(merged);
|
|
202
|
+
const config = new Config(merged);
|
|
203
|
+
config._yamlPath = yamlPath;
|
|
204
|
+
if (options?.validate !== false) {
|
|
205
|
+
config.validate();
|
|
206
|
+
}
|
|
207
|
+
return config;
|
|
208
|
+
}
|
|
209
|
+
/** Create a Config from default values with env overrides applied. */
|
|
210
|
+
static fromDefaults() {
|
|
211
|
+
const data = applyEnvOverrides({ ...DEFAULTS });
|
|
212
|
+
return new Config(data);
|
|
213
|
+
}
|
|
214
|
+
/** Get a configuration value by dot-path key. */
|
|
9
215
|
get(key, defaultValue) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
216
|
+
return getNested(this._data, key, defaultValue);
|
|
217
|
+
}
|
|
218
|
+
/** Set a configuration value by dot-path key. */
|
|
219
|
+
set(key, value) {
|
|
220
|
+
setNested(this._data, key, value);
|
|
221
|
+
}
|
|
222
|
+
/** Return a deep copy of the raw config data. */
|
|
223
|
+
get data() {
|
|
224
|
+
return JSON.parse(JSON.stringify(this._data));
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Validate the configuration per Algorithm A12.
|
|
228
|
+
*
|
|
229
|
+
* Checks required fields, type constraints, and semantic rules.
|
|
230
|
+
* Collects all errors before raising.
|
|
231
|
+
*/
|
|
232
|
+
validate() {
|
|
233
|
+
const errors = [];
|
|
234
|
+
// 1. Required field check
|
|
235
|
+
for (const field of REQUIRED_FIELDS) {
|
|
236
|
+
const value = getNested(this._data, field);
|
|
237
|
+
if (value === undefined || value === null) {
|
|
238
|
+
errors.push(`Missing required field: '${field}'`);
|
|
15
239
|
}
|
|
16
|
-
|
|
17
|
-
|
|
240
|
+
}
|
|
241
|
+
// 2. Constraint validation
|
|
242
|
+
for (const [field, [checkFn, errMsg]] of Object.entries(CONSTRAINTS)) {
|
|
243
|
+
const value = getNested(this._data, field);
|
|
244
|
+
if (value !== undefined && value !== null && !checkFn(value)) {
|
|
245
|
+
errors.push(`Invalid value for '${field}': ${errMsg} (got ${JSON.stringify(value)})`);
|
|
18
246
|
}
|
|
19
247
|
}
|
|
20
|
-
|
|
248
|
+
if (errors.length > 0) {
|
|
249
|
+
throw new ConfigError(`Configuration validation failed (${errors.length} error(s)):\n` +
|
|
250
|
+
errors.map((e) => ` - ${e}`).join('\n'));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Re-read configuration from the original YAML file.
|
|
255
|
+
* Only works if the Config was created via Config.load().
|
|
256
|
+
*/
|
|
257
|
+
reload() {
|
|
258
|
+
if (this._yamlPath === null) {
|
|
259
|
+
throw new ConfigError('Cannot reload: Config was not loaded from a YAML file');
|
|
260
|
+
}
|
|
261
|
+
const reloaded = Config.load(this._yamlPath);
|
|
262
|
+
this._data = reloaded._data;
|
|
21
263
|
}
|
|
22
264
|
}
|
|
23
265
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,MAAM;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/context.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export interface Identity {
|
|
|
10
10
|
readonly attrs: Readonly<Record<string, unknown>>;
|
|
11
11
|
}
|
|
12
12
|
export declare function createIdentity(id: string, type?: string, roles?: string[], attrs?: Record<string, unknown>): Identity;
|
|
13
|
-
export declare class Context {
|
|
13
|
+
export declare class Context<T = null> {
|
|
14
14
|
readonly traceId: string;
|
|
15
15
|
readonly callerId: string | null;
|
|
16
16
|
readonly callChain: readonly string[];
|
|
@@ -18,8 +18,9 @@ export declare class Context {
|
|
|
18
18
|
readonly identity: Identity | null;
|
|
19
19
|
redactedInputs: Record<string, unknown> | null;
|
|
20
20
|
readonly data: Record<string, unknown>;
|
|
21
|
+
readonly services: T;
|
|
21
22
|
readonly cancelToken: CancelToken | null;
|
|
22
|
-
constructor(traceId: string, callerId?: string | null, callChain?: string[], executor?: unknown, identity?: Identity | null, redactedInputs?: Record<string, unknown> | null, data?: Record<string, unknown>, cancelToken?: CancelToken | null);
|
|
23
|
+
constructor(traceId: string, callerId?: string | null, callChain?: string[], executor?: unknown, identity?: Identity | null, redactedInputs?: Record<string, unknown> | null, data?: Record<string, unknown>, cancelToken?: CancelToken | null, services?: T);
|
|
23
24
|
/**
|
|
24
25
|
* Create a new top-level Context with a generated UUID v4 traceId.
|
|
25
26
|
*
|
|
@@ -27,7 +28,7 @@ export declare class Context {
|
|
|
27
28
|
* converted to UUID format (8-4-4-4-12) and used instead of generating
|
|
28
29
|
* a new one.
|
|
29
30
|
*/
|
|
30
|
-
static create(executor?: unknown, identity?: Identity | null, data?: Record<string, unknown>, traceParent?: TraceParent | null): Context
|
|
31
|
+
static create<S = null>(executor?: unknown, identity?: Identity | null, data?: Record<string, unknown>, traceParent?: TraceParent | null, services?: S): Context<S>;
|
|
31
32
|
toJSON(): Record<string, unknown>;
|
|
32
33
|
static fromJSON(data: Record<string, unknown>, executor?: unknown): Context;
|
|
33
34
|
get logger(): {
|
|
@@ -36,7 +37,7 @@ export declare class Context {
|
|
|
36
37
|
warn: (...args: unknown[]) => void;
|
|
37
38
|
error: (...args: unknown[]) => void;
|
|
38
39
|
};
|
|
39
|
-
child(targetModuleId: string): Context
|
|
40
|
+
child(targetModuleId: string): Context<T>;
|
|
40
41
|
}
|
|
41
42
|
/**
|
|
42
43
|
* Interface for creating Context from framework-specific requests.
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAe,EACrB,KAAK,GAAE,MAAM,EAAO,EACpB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAClC,QAAQ,CAEV;AAED,qBAAa,OAAO;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/context.js
CHANGED
|
@@ -10,8 +10,9 @@ export class Context {
|
|
|
10
10
|
identity;
|
|
11
11
|
redactedInputs;
|
|
12
12
|
data;
|
|
13
|
+
services;
|
|
13
14
|
cancelToken;
|
|
14
|
-
constructor(traceId, callerId = null, callChain = [], executor = null, identity = null, redactedInputs = null, data = {}, cancelToken = null) {
|
|
15
|
+
constructor(traceId, callerId = null, callChain = [], executor = null, identity = null, redactedInputs = null, data = {}, cancelToken = null, services = null) {
|
|
15
16
|
this.traceId = traceId;
|
|
16
17
|
this.callerId = callerId;
|
|
17
18
|
this.callChain = Object.freeze([...callChain]);
|
|
@@ -19,6 +20,7 @@ export class Context {
|
|
|
19
20
|
this.identity = identity;
|
|
20
21
|
this.redactedInputs = redactedInputs;
|
|
21
22
|
this.data = data;
|
|
23
|
+
this.services = services;
|
|
22
24
|
this.cancelToken = cancelToken;
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
@@ -28,7 +30,7 @@ export class Context {
|
|
|
28
30
|
* converted to UUID format (8-4-4-4-12) and used instead of generating
|
|
29
31
|
* a new one.
|
|
30
32
|
*/
|
|
31
|
-
static create(executor = null, identity = null, data, traceParent) {
|
|
33
|
+
static create(executor = null, identity = null, data, traceParent, services) {
|
|
32
34
|
let traceId;
|
|
33
35
|
if (traceParent) {
|
|
34
36
|
const h = traceParent.traceId;
|
|
@@ -37,7 +39,7 @@ export class Context {
|
|
|
37
39
|
else {
|
|
38
40
|
traceId = uuidv4();
|
|
39
41
|
}
|
|
40
|
-
return new Context(traceId, null, [], executor, identity, null, data ?? {});
|
|
42
|
+
return new Context(traceId, null, [], executor, identity, null, data ?? {}, null, services ?? null);
|
|
41
43
|
}
|
|
42
44
|
toJSON() {
|
|
43
45
|
const publicData = {};
|
|
@@ -81,7 +83,7 @@ export class Context {
|
|
|
81
83
|
}
|
|
82
84
|
child(targetModuleId) {
|
|
83
85
|
return new Context(this.traceId, this.callChain.length > 0 ? this.callChain[this.callChain.length - 1] : null, [...this.callChain, targetModuleId], this.executor, this.identity, null, this.data, // shared reference
|
|
84
|
-
this.cancelToken);
|
|
86
|
+
this.cancelToken, this.services);
|
|
85
87
|
}
|
|
86
88
|
}
|
|
87
89
|
//# sourceMappingURL=context.js.map
|