apcore-js 0.18.0 → 0.20.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 +112 -9
- package/dist/acl-handlers.d.ts +14 -0
- package/dist/acl-handlers.d.ts.map +1 -1
- package/dist/acl-handlers.js +37 -4
- package/dist/acl-handlers.js.map +1 -1
- package/dist/acl.d.ts +22 -1
- package/dist/acl.d.ts.map +1 -1
- package/dist/acl.js +90 -34
- package/dist/acl.js.map +1 -1
- package/dist/async-task.d.ts +70 -16
- package/dist/async-task.d.ts.map +1 -1
- package/dist/async-task.js +212 -72
- package/dist/async-task.js.map +1 -1
- package/dist/bindings.d.ts.map +1 -1
- package/dist/bindings.js +113 -11
- package/dist/bindings.js.map +1 -1
- package/dist/builtin-steps.d.ts +33 -8
- package/dist/builtin-steps.d.ts.map +1 -1
- package/dist/builtin-steps.js +119 -47
- package/dist/builtin-steps.js.map +1 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +163 -33
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +34 -7
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +108 -40
- package/dist/context.js.map +1 -1
- package/dist/decorator.d.ts +3 -0
- package/dist/decorator.d.ts.map +1 -1
- package/dist/decorator.js +3 -0
- package/dist/decorator.js.map +1 -1
- package/dist/errors.d.ts +88 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +231 -56
- package/dist/errors.js.map +1 -1
- package/dist/events/circuit-breaker.d.ts +45 -0
- package/dist/events/circuit-breaker.d.ts.map +1 -0
- package/dist/events/circuit-breaker.js +115 -0
- package/dist/events/circuit-breaker.js.map +1 -0
- package/dist/events/emitter.d.ts +24 -1
- package/dist/events/emitter.d.ts.map +1 -1
- package/dist/events/emitter.js +86 -12
- package/dist/events/emitter.js.map +1 -1
- package/dist/events/index.d.ts +4 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +3 -2
- package/dist/events/index.js.map +1 -1
- package/dist/events/subscribers.d.ts +33 -1
- package/dist/events/subscribers.d.ts.map +1 -1
- package/dist/events/subscribers.js +124 -1
- package/dist/events/subscribers.js.map +1 -1
- package/dist/executor.d.ts +14 -3
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +155 -48
- package/dist/executor.js.map +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/index.d.ts +47 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -18
- package/dist/index.js.map +1 -1
- package/dist/middleware/base.d.ts +25 -3
- package/dist/middleware/base.d.ts.map +1 -1
- package/dist/middleware/base.js +24 -0
- package/dist/middleware/base.js.map +1 -1
- package/dist/middleware/circuit-breaker.d.ts +54 -0
- package/dist/middleware/circuit-breaker.d.ts.map +1 -0
- package/dist/middleware/circuit-breaker.js +168 -0
- package/dist/middleware/circuit-breaker.js.map +1 -0
- package/dist/middleware/context-namespace.d.ts +30 -0
- package/dist/middleware/context-namespace.d.ts.map +1 -0
- package/dist/middleware/context-namespace.js +38 -0
- package/dist/middleware/context-namespace.js.map +1 -0
- package/dist/middleware/index.d.ts +8 -2
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +5 -2
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/logging.d.ts +6 -0
- package/dist/middleware/logging.d.ts.map +1 -1
- package/dist/middleware/logging.js +13 -3
- package/dist/middleware/logging.js.map +1 -1
- package/dist/middleware/manager.d.ts +11 -4
- package/dist/middleware/manager.d.ts.map +1 -1
- package/dist/middleware/manager.js +26 -9
- package/dist/middleware/manager.js.map +1 -1
- package/dist/middleware/platform-notify.d.ts +8 -4
- package/dist/middleware/platform-notify.d.ts.map +1 -1
- package/dist/middleware/platform-notify.js +15 -7
- package/dist/middleware/platform-notify.js.map +1 -1
- package/dist/middleware/retry.d.ts +16 -7
- package/dist/middleware/retry.d.ts.map +1 -1
- package/dist/middleware/retry.js +21 -15
- package/dist/middleware/retry.js.map +1 -1
- package/dist/middleware/tracing.d.ts +50 -0
- package/dist/middleware/tracing.d.ts.map +1 -0
- package/dist/middleware/tracing.js +89 -0
- package/dist/middleware/tracing.js.map +1 -0
- package/dist/observability/batch-span-processor.d.ts +48 -0
- package/dist/observability/batch-span-processor.d.ts.map +1 -0
- package/dist/observability/batch-span-processor.js +89 -0
- package/dist/observability/batch-span-processor.js.map +1 -0
- package/dist/observability/context-logger.d.ts +54 -1
- package/dist/observability/context-logger.d.ts.map +1 -1
- package/dist/observability/context-logger.js +287 -10
- package/dist/observability/context-logger.js.map +1 -1
- package/dist/observability/error-history.d.ts +36 -7
- package/dist/observability/error-history.d.ts.map +1 -1
- package/dist/observability/error-history.js +169 -50
- package/dist/observability/error-history.js.map +1 -1
- package/dist/observability/index.d.ts +16 -5
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +8 -3
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/metrics-utils.d.ts.map +1 -1
- package/dist/observability/metrics-utils.js +3 -5
- package/dist/observability/metrics-utils.js.map +1 -1
- package/dist/observability/metrics.d.ts +15 -1
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/metrics.js +37 -3
- package/dist/observability/metrics.js.map +1 -1
- package/dist/observability/prometheus-exporter.d.ts +37 -0
- package/dist/observability/prometheus-exporter.d.ts.map +1 -0
- package/dist/observability/prometheus-exporter.js +135 -0
- package/dist/observability/prometheus-exporter.js.map +1 -0
- package/dist/observability/storage.d.ts +43 -0
- package/dist/observability/storage.d.ts.map +1 -0
- package/dist/observability/storage.js +58 -0
- package/dist/observability/storage.js.map +1 -0
- package/dist/observability/store.d.ts +29 -0
- package/dist/observability/store.d.ts.map +1 -0
- package/dist/observability/store.js +36 -0
- package/dist/observability/store.js.map +1 -0
- package/dist/observability/tracing.d.ts +2 -0
- package/dist/observability/tracing.d.ts.map +1 -1
- package/dist/observability/tracing.js +12 -2
- package/dist/observability/tracing.js.map +1 -1
- package/dist/observability/usage-exporter.d.ts +58 -0
- package/dist/observability/usage-exporter.d.ts.map +1 -0
- package/dist/observability/usage-exporter.js +86 -0
- package/dist/observability/usage-exporter.js.map +1 -0
- package/dist/observability/usage.d.ts +18 -1
- package/dist/observability/usage.d.ts.map +1 -1
- package/dist/observability/usage.js +35 -4
- package/dist/observability/usage.js.map +1 -1
- package/dist/pipeline-config.d.ts +24 -7
- package/dist/pipeline-config.d.ts.map +1 -1
- package/dist/pipeline-config.js +113 -19
- package/dist/pipeline-config.js.map +1 -1
- package/dist/pipeline.d.ts +123 -2
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +249 -50
- package/dist/pipeline.js.map +1 -1
- package/dist/registry/conflicts.d.ts +2 -2
- package/dist/registry/conflicts.d.ts.map +1 -1
- package/dist/registry/conflicts.js +10 -11
- package/dist/registry/conflicts.js.map +1 -1
- package/dist/registry/dependencies.d.ts +1 -1
- package/dist/registry/dependencies.d.ts.map +1 -1
- package/dist/registry/dependencies.js +69 -20
- package/dist/registry/dependencies.js.map +1 -1
- package/dist/registry/index.d.ts +2 -0
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +1 -0
- package/dist/registry/index.js.map +1 -1
- package/dist/registry/multi-class.d.ts +57 -0
- package/dist/registry/multi-class.d.ts.map +1 -0
- package/dist/registry/multi-class.js +120 -0
- package/dist/registry/multi-class.js.map +1 -0
- package/dist/registry/registry.d.ts +99 -4
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +291 -33
- package/dist/registry/registry.js.map +1 -1
- package/dist/registry/scanner.d.ts.map +1 -1
- package/dist/registry/scanner.js +6 -0
- package/dist/registry/scanner.js.map +1 -1
- package/dist/registry/version.d.ts +1 -0
- package/dist/registry/version.d.ts.map +1 -1
- package/dist/registry/version.js +33 -4
- package/dist/registry/version.js.map +1 -1
- package/dist/schema/constants.d.ts +9 -0
- package/dist/schema/constants.d.ts.map +1 -0
- package/dist/schema/constants.js +9 -0
- package/dist/schema/constants.js.map +1 -0
- package/dist/schema/extractor.d.ts +69 -0
- package/dist/schema/extractor.d.ts.map +1 -0
- package/dist/schema/extractor.js +142 -0
- package/dist/schema/extractor.js.map +1 -0
- package/dist/schema/index.d.ts +3 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +2 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/loader.d.ts +27 -3
- package/dist/schema/loader.d.ts.map +1 -1
- package/dist/schema/loader.js +137 -32
- package/dist/schema/loader.js.map +1 -1
- package/dist/schema/ref-resolver.d.ts.map +1 -1
- package/dist/schema/ref-resolver.js +10 -1
- package/dist/schema/ref-resolver.js.map +1 -1
- package/dist/schema/types.d.ts +4 -0
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js.map +1 -1
- package/dist/schema/validator.d.ts +9 -0
- package/dist/schema/validator.d.ts.map +1 -1
- package/dist/schema/validator.js +153 -4
- package/dist/schema/validator.js.map +1 -1
- package/dist/sys-modules/audit.d.ts +50 -0
- package/dist/sys-modules/audit.d.ts.map +1 -0
- package/dist/sys-modules/audit.js +89 -0
- package/dist/sys-modules/audit.js.map +1 -0
- package/dist/sys-modules/control.d.ts +32 -4
- package/dist/sys-modules/control.d.ts.map +1 -1
- package/dist/sys-modules/control.js +197 -23
- package/dist/sys-modules/control.js.map +1 -1
- package/dist/sys-modules/index.d.ts +7 -2
- package/dist/sys-modules/index.d.ts.map +1 -1
- package/dist/sys-modules/index.js +3 -1
- package/dist/sys-modules/index.js.map +1 -1
- package/dist/sys-modules/overrides.d.ts +58 -0
- package/dist/sys-modules/overrides.d.ts.map +1 -0
- package/dist/sys-modules/overrides.js +106 -0
- package/dist/sys-modules/overrides.js.map +1 -0
- package/dist/sys-modules/registration.d.ts +18 -1
- package/dist/sys-modules/registration.d.ts.map +1 -1
- package/dist/sys-modules/registration.js +115 -11
- package/dist/sys-modules/registration.js.map +1 -1
- package/dist/sys-modules/toggle.d.ts +7 -2
- package/dist/sys-modules/toggle.d.ts.map +1 -1
- package/dist/sys-modules/toggle.js +61 -5
- package/dist/sys-modules/toggle.js.map +1 -1
- package/dist/trace-context.d.ts +47 -9
- package/dist/trace-context.d.ts.map +1 -1
- package/dist/trace-context.js +139 -16
- package/dist/trace-context.js.map +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* System control modules -- runtime config update and hot-reload.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as yaml from 'js-yaml';
|
|
6
|
+
import { ConfigError, InvalidInputError, ModuleNotFoundError, ReloadFailedError, ModuleReloadConflictError } from '../errors.js';
|
|
5
7
|
import { createEvent } from '../events/emitter.js';
|
|
8
|
+
import { buildAuditEntry, extractAuditIdentity } from './audit.js';
|
|
9
|
+
import { matchPattern } from '../utils/pattern.js';
|
|
6
10
|
const RESTRICTED_KEYS = new Set(['sys_modules.enabled']);
|
|
7
11
|
const SENSITIVE_SEGMENTS = ['token', 'secret', 'key', 'password', 'auth', 'credential'];
|
|
8
12
|
/** Match exact segments or underscore-compound segments (api_key, auth_token). */
|
|
@@ -33,12 +37,19 @@ export class UpdateConfigModule {
|
|
|
33
37
|
};
|
|
34
38
|
_config;
|
|
35
39
|
_emitter;
|
|
36
|
-
|
|
40
|
+
_auditStore;
|
|
41
|
+
_overridesPath;
|
|
42
|
+
_overridesStore;
|
|
43
|
+
constructor(config, eventEmitter, options) {
|
|
37
44
|
this._config = config;
|
|
38
45
|
this._emitter = eventEmitter;
|
|
46
|
+
this._auditStore = options?.auditStore ?? null;
|
|
47
|
+
this._overridesPath = options?.overridesPath ?? null;
|
|
48
|
+
this._overridesStore = options?.overridesStore ?? null;
|
|
39
49
|
}
|
|
40
|
-
execute(inputs,
|
|
50
|
+
execute(inputs, context) {
|
|
41
51
|
const { key, value, reason } = this._validateInputs(inputs);
|
|
52
|
+
const ctx = context;
|
|
42
53
|
if (RESTRICTED_KEYS.has(key)) {
|
|
43
54
|
throw new ConfigError(`Configuration key '${key}' cannot be changed at runtime`);
|
|
44
55
|
}
|
|
@@ -47,12 +58,84 @@ export class UpdateConfigModule {
|
|
|
47
58
|
const isSensitive = isSensitiveKey(key);
|
|
48
59
|
const safeOld = isSensitive ? '***' : oldValue;
|
|
49
60
|
const safeNew = isSensitive ? '***' : value;
|
|
50
|
-
this.
|
|
51
|
-
key,
|
|
52
|
-
}
|
|
61
|
+
if (this._overridesPath !== null) {
|
|
62
|
+
this._persistOverride(key, value);
|
|
63
|
+
}
|
|
64
|
+
if (this._overridesStore !== null) {
|
|
65
|
+
this._persistOverrideToStore(key, value);
|
|
66
|
+
}
|
|
67
|
+
const entry = buildAuditEntry('update_config', 'system.control.update_config', ctx, { before: safeOld, after: safeNew });
|
|
68
|
+
if (this._auditStore !== null) {
|
|
69
|
+
this._auditStore.append(entry);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.warn(`[apcore:audit] update_config key=${key} actor=${entry.actorId} reason=${reason}`);
|
|
73
|
+
}
|
|
74
|
+
// Issue #45.2: Audit events carry requester identity so subscribers can
|
|
75
|
+
// attribute the change. caller_id defaults to "@external" when absent.
|
|
76
|
+
// When identity is null the field is OMITTED from the payload (not
|
|
77
|
+
// emitted as null).
|
|
78
|
+
const { caller_id, identity } = extractAuditIdentity(ctx);
|
|
79
|
+
const updatedPayload = {
|
|
80
|
+
key, old_value: safeOld, new_value: safeNew, caller_id,
|
|
81
|
+
};
|
|
82
|
+
if (identity !== null)
|
|
83
|
+
updatedPayload['identity'] = identity;
|
|
84
|
+
this._emitter.emit(createEvent('apcore.config.updated', 'system.control.update_config', 'info', updatedPayload));
|
|
53
85
|
console.warn(`[apcore:control] Config updated: key=${key} old_value=${safeOld} new_value=${safeNew} reason=${reason}`);
|
|
54
86
|
return { success: true, key, old_value: safeOld, new_value: safeNew };
|
|
55
87
|
}
|
|
88
|
+
_persistOverrideToStore(key, value) {
|
|
89
|
+
try {
|
|
90
|
+
const store = this._overridesStore;
|
|
91
|
+
const loaded = store.load();
|
|
92
|
+
if (loaded !== null && typeof loaded.then === 'function') {
|
|
93
|
+
// Async store — fire-and-forget the read-modify-write so execute() stays sync.
|
|
94
|
+
loaded
|
|
95
|
+
.then((existing) => {
|
|
96
|
+
existing[key] = value;
|
|
97
|
+
return store.save(existing);
|
|
98
|
+
})
|
|
99
|
+
.catch((err) => {
|
|
100
|
+
console.warn(`[apcore:control] Failed to persist override for key '${key}' via OverridesStore:`, err);
|
|
101
|
+
});
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const existing = loaded;
|
|
105
|
+
existing[key] = value;
|
|
106
|
+
const saveResult = store.save(existing);
|
|
107
|
+
if (saveResult !== undefined && typeof saveResult.then === 'function') {
|
|
108
|
+
saveResult.catch((err) => {
|
|
109
|
+
console.warn(`[apcore:control] Failed to persist override for key '${key}' via OverridesStore:`, err);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
console.warn(`[apcore:control] Failed to persist override for key '${key}' via OverridesStore:`, err);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
_persistOverride(key, value) {
|
|
118
|
+
let overrides = {};
|
|
119
|
+
if (fs.existsSync(this._overridesPath)) {
|
|
120
|
+
try {
|
|
121
|
+
const content = fs.readFileSync(this._overridesPath, 'utf-8');
|
|
122
|
+
const parsed = yaml.load(content);
|
|
123
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
124
|
+
overrides = parsed;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Start fresh if parse fails
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
overrides[key] = value;
|
|
132
|
+
try {
|
|
133
|
+
fs.writeFileSync(this._overridesPath, yaml.dump(overrides), 'utf-8');
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
console.warn(`[apcore:control] Failed to persist override for key '${key}':`, err);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
56
139
|
_validateInputs(inputs) {
|
|
57
140
|
const key = inputs['key'];
|
|
58
141
|
if (typeof key !== 'string' || !key) {
|
|
@@ -73,37 +156,48 @@ export class ReloadModule {
|
|
|
73
156
|
inputSchema = {
|
|
74
157
|
type: 'object',
|
|
75
158
|
properties: {
|
|
76
|
-
module_id: { type: 'string', description: 'ID of the module to reload' },
|
|
159
|
+
module_id: { type: 'string', description: 'ID of the module to reload (mutually exclusive with path_filter)' },
|
|
160
|
+
path_filter: { type: 'string', description: 'Glob pattern to bulk-reload matching modules (mutually exclusive with module_id)' },
|
|
161
|
+
reload_dependents: { type: 'boolean', description: 'When true, also reload modules that depend on matched modules' },
|
|
77
162
|
reason: { type: 'string', description: 'Audit reason for the reload' },
|
|
78
163
|
},
|
|
79
|
-
required: ['
|
|
164
|
+
required: ['reason'],
|
|
80
165
|
};
|
|
81
166
|
outputSchema = {
|
|
82
167
|
type: 'object',
|
|
83
168
|
properties: {
|
|
84
169
|
success: { type: 'boolean', description: 'Whether the reload succeeded' },
|
|
85
|
-
module_id: { type: 'string', description: 'ID of the reloaded module' },
|
|
170
|
+
module_id: { type: 'string', description: 'ID of the reloaded module (single-module mode)' },
|
|
171
|
+
reloaded_modules: { type: 'array', description: 'IDs of reloaded modules (path_filter mode)' },
|
|
86
172
|
previous_version: { type: 'string', description: 'Version before reload' },
|
|
87
173
|
new_version: { type: 'string', description: 'Version after reload' },
|
|
88
174
|
reload_duration_ms: { type: 'number', description: 'Reload duration in milliseconds' },
|
|
89
175
|
},
|
|
90
|
-
required: ['success'
|
|
176
|
+
required: ['success'],
|
|
91
177
|
};
|
|
92
178
|
_registry;
|
|
93
179
|
_emitter;
|
|
94
|
-
|
|
180
|
+
_auditStore;
|
|
181
|
+
constructor(registry, eventEmitter, auditStore) {
|
|
95
182
|
this._registry = registry;
|
|
96
183
|
this._emitter = eventEmitter;
|
|
184
|
+
this._auditStore = auditStore ?? null;
|
|
97
185
|
}
|
|
98
|
-
async execute(inputs,
|
|
99
|
-
const { moduleId, reason } = this._validateInputs(inputs);
|
|
186
|
+
async execute(inputs, context) {
|
|
187
|
+
const { moduleId, pathFilter, reason } = this._validateInputs(inputs);
|
|
188
|
+
const ctx = context;
|
|
189
|
+
if (pathFilter !== undefined) {
|
|
190
|
+
return this._reloadWithPathFilter(pathFilter, reason, ctx);
|
|
191
|
+
}
|
|
192
|
+
return this._reloadSingleModule(moduleId, reason, ctx);
|
|
193
|
+
}
|
|
194
|
+
async _reloadSingleModule(moduleId, reason, ctx) {
|
|
100
195
|
const existing = this._registry.get(moduleId);
|
|
101
196
|
if (existing === null) {
|
|
102
197
|
throw new ModuleNotFoundError(moduleId);
|
|
103
198
|
}
|
|
104
199
|
const existingObj = existing;
|
|
105
200
|
const previousVersion = String(existingObj['version'] ?? '1.0.0');
|
|
106
|
-
// Capture suspend state from old module (if onSuspend is defined)
|
|
107
201
|
let suspendedState = null;
|
|
108
202
|
if (typeof existingObj['onSuspend'] === 'function') {
|
|
109
203
|
try {
|
|
@@ -114,22 +208,19 @@ export class ReloadModule {
|
|
|
114
208
|
}
|
|
115
209
|
}
|
|
116
210
|
const start = performance.now();
|
|
117
|
-
this._registry.
|
|
211
|
+
await this._registry.safeUnregister(moduleId);
|
|
118
212
|
try {
|
|
119
213
|
await this._registry.discover();
|
|
120
214
|
}
|
|
121
215
|
catch (err) {
|
|
122
|
-
// Restore original module on discover failure
|
|
123
216
|
this._registry.registerInternal(moduleId, existing);
|
|
124
217
|
throw new ReloadFailedError(moduleId, String(err));
|
|
125
218
|
}
|
|
126
219
|
const reloaded = this._registry.get(moduleId);
|
|
127
220
|
if (reloaded === null) {
|
|
128
|
-
// Restore original module if not found after re-discovery
|
|
129
221
|
this._registry.registerInternal(moduleId, existing);
|
|
130
222
|
throw new ReloadFailedError(moduleId, `Module '${moduleId}' was not found after re-discovery`);
|
|
131
223
|
}
|
|
132
|
-
// Resume state on new module (if state was captured and onResume is defined)
|
|
133
224
|
const reloadedObj = reloaded;
|
|
134
225
|
if (suspendedState !== null && typeof reloadedObj['onResume'] === 'function') {
|
|
135
226
|
try {
|
|
@@ -141,10 +232,24 @@ export class ReloadModule {
|
|
|
141
232
|
}
|
|
142
233
|
const elapsedMs = performance.now() - start;
|
|
143
234
|
const newVersion = String(reloadedObj['version'] ?? '1.0.0');
|
|
144
|
-
|
|
235
|
+
const entry = buildAuditEntry('reload_module', moduleId, ctx, { before: previousVersion, after: newVersion });
|
|
236
|
+
if (this._auditStore !== null) {
|
|
237
|
+
this._auditStore.append(entry);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
console.warn(`[apcore:audit] reload_module ${moduleId} actor=${entry.actorId} reason=${reason}`);
|
|
241
|
+
}
|
|
242
|
+
// Issue #45.2: include requester identity in reload audit event payload.
|
|
243
|
+
const { caller_id, identity } = extractAuditIdentity(ctx);
|
|
244
|
+
const reloadedPayload = {
|
|
245
|
+
module_id: moduleId,
|
|
145
246
|
previous_version: previousVersion,
|
|
146
247
|
new_version: newVersion,
|
|
147
|
-
|
|
248
|
+
caller_id,
|
|
249
|
+
};
|
|
250
|
+
if (identity !== null)
|
|
251
|
+
reloadedPayload['identity'] = identity;
|
|
252
|
+
this._emitter.emit(createEvent('apcore.module.reloaded', moduleId, 'info', reloadedPayload));
|
|
148
253
|
console.warn(`[apcore:control] Module reloaded: module_id=${moduleId} previous_version=${previousVersion} new_version=${newVersion} reason=${reason}`);
|
|
149
254
|
return {
|
|
150
255
|
success: true,
|
|
@@ -154,16 +259,85 @@ export class ReloadModule {
|
|
|
154
259
|
reload_duration_ms: elapsedMs,
|
|
155
260
|
};
|
|
156
261
|
}
|
|
262
|
+
async _reloadWithPathFilter(pathFilter, reason, ctx) {
|
|
263
|
+
const allIds = this._registry.list();
|
|
264
|
+
const matchingIds = allIds.filter((id) => matchPattern(pathFilter, id)).sort();
|
|
265
|
+
// Capture existing modules and versions before unregistering
|
|
266
|
+
const existingModules = new Map();
|
|
267
|
+
const previousVersions = new Map();
|
|
268
|
+
for (const id of matchingIds) {
|
|
269
|
+
const mod = this._registry.get(id);
|
|
270
|
+
if (mod !== null) {
|
|
271
|
+
existingModules.set(id, mod);
|
|
272
|
+
previousVersions.set(id, String(mod['version'] ?? '1.0.0'));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Unregister all matching modules
|
|
276
|
+
for (const id of matchingIds) {
|
|
277
|
+
await this._registry.safeUnregister(id);
|
|
278
|
+
}
|
|
279
|
+
// Re-discover
|
|
280
|
+
try {
|
|
281
|
+
await this._registry.discover();
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
for (const [id, mod] of existingModules) {
|
|
285
|
+
this._registry.registerInternal(id, mod);
|
|
286
|
+
}
|
|
287
|
+
throw new ReloadFailedError(pathFilter, String(err));
|
|
288
|
+
}
|
|
289
|
+
// Collect successfully reloaded modules
|
|
290
|
+
const reloadedModules = [];
|
|
291
|
+
for (const id of matchingIds) {
|
|
292
|
+
const reloaded = this._registry.get(id);
|
|
293
|
+
if (reloaded === null) {
|
|
294
|
+
const orig = existingModules.get(id);
|
|
295
|
+
if (orig !== undefined) {
|
|
296
|
+
this._registry.registerInternal(id, orig);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
reloadedModules.push(id);
|
|
301
|
+
const entry = buildAuditEntry('reload_module', id, ctx, {
|
|
302
|
+
before: previousVersions.get(id) ?? '1.0.0',
|
|
303
|
+
after: String(reloaded['version'] ?? '1.0.0'),
|
|
304
|
+
});
|
|
305
|
+
if (this._auditStore !== null) {
|
|
306
|
+
this._auditStore.append(entry);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
console.warn(`[apcore:control] Bulk reload: path_filter=${pathFilter} reloaded=${reloadedModules.length} reason=${reason}`);
|
|
311
|
+
return { success: true, reloaded_modules: reloadedModules };
|
|
312
|
+
}
|
|
157
313
|
_validateInputs(inputs) {
|
|
158
314
|
const moduleId = inputs['module_id'];
|
|
159
|
-
|
|
160
|
-
|
|
315
|
+
const pathFilter = inputs['path_filter'];
|
|
316
|
+
if (moduleId !== undefined && pathFilter !== undefined) {
|
|
317
|
+
throw new ModuleReloadConflictError();
|
|
318
|
+
}
|
|
319
|
+
if (moduleId === undefined && pathFilter === undefined) {
|
|
320
|
+
throw new InvalidInputError("either 'module_id' or 'path_filter' is required");
|
|
321
|
+
}
|
|
322
|
+
if (moduleId !== undefined) {
|
|
323
|
+
if (typeof moduleId !== 'string' || !moduleId) {
|
|
324
|
+
throw new InvalidInputError("'module_id' is required and must be a non-empty string");
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (pathFilter !== undefined) {
|
|
328
|
+
if (typeof pathFilter !== 'string' || !pathFilter) {
|
|
329
|
+
throw new InvalidInputError("'path_filter' must be a non-empty string");
|
|
330
|
+
}
|
|
161
331
|
}
|
|
162
332
|
const reason = inputs['reason'];
|
|
163
333
|
if (typeof reason !== 'string' || !reason) {
|
|
164
334
|
throw new InvalidInputError("'reason' is required and must be a non-empty string");
|
|
165
335
|
}
|
|
166
|
-
return {
|
|
336
|
+
return {
|
|
337
|
+
moduleId: moduleId,
|
|
338
|
+
pathFilter: pathFilter,
|
|
339
|
+
reason,
|
|
340
|
+
};
|
|
167
341
|
}
|
|
168
342
|
}
|
|
169
343
|
//# sourceMappingURL=control.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/sys-modules/control.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/sys-modules/control.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,12 @@ export { ToggleState, ToggleFeatureModule, DEFAULT_TOGGLE_STATE, isModuleDisable
|
|
|
2
2
|
export { HealthSummaryModule, HealthModule, classifyHealthStatus } from './health.js';
|
|
3
3
|
export { ManifestModule, ManifestFullModule } from './manifest.js';
|
|
4
4
|
export { UpdateConfigModule, ReloadModule } from './control.js';
|
|
5
|
+
export type { UpdateConfigOptions } from './control.js';
|
|
5
6
|
export { UsageSummaryModule, UsageModule } from './usage.js';
|
|
6
|
-
export { registerSysModules, registerSubscriberType, unregisterSubscriberType, resetSubscriberRegistry } from './registration.js';
|
|
7
|
-
export type { SysModulesContext } from './registration.js';
|
|
7
|
+
export { registerSysModules, registerSubscriberType, unregisterSubscriberType, resetSubscriberRegistry, createSubscriberFromConfig } from './registration.js';
|
|
8
|
+
export type { SysModulesContext, RegisterSysModulesOptions } from './registration.js';
|
|
9
|
+
export { InMemoryAuditStore, buildAuditEntry, extractAuditIdentity } from './audit.js';
|
|
10
|
+
export type { AuditEntry, AuditStore, AuditFilter, AuditAction } from './audit.js';
|
|
11
|
+
export { FileOverridesStore, InMemoryOverridesStore } from './overrides.js';
|
|
12
|
+
export type { OverridesStore } from './overrides.js';
|
|
8
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sys-modules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC5H,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sys-modules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC5H,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC9J,YAAY,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvF,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -3,5 +3,7 @@ export { HealthSummaryModule, HealthModule, classifyHealthStatus } from './healt
|
|
|
3
3
|
export { ManifestModule, ManifestFullModule } from './manifest.js';
|
|
4
4
|
export { UpdateConfigModule, ReloadModule } from './control.js';
|
|
5
5
|
export { UsageSummaryModule, UsageModule } from './usage.js';
|
|
6
|
-
export { registerSysModules, registerSubscriberType, unregisterSubscriberType, resetSubscriberRegistry } from './registration.js';
|
|
6
|
+
export { registerSysModules, registerSubscriberType, unregisterSubscriberType, resetSubscriberRegistry, createSubscriberFromConfig } from './registration.js';
|
|
7
|
+
export { InMemoryAuditStore, buildAuditEntry, extractAuditIdentity } from './audit.js';
|
|
8
|
+
export { FileOverridesStore, InMemoryOverridesStore } from './overrides.js';
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sys-modules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC5H,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sys-modules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC5H,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE9J,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvF,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent runtime override store (Issue #45.1).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the Python `_load_overrides` / `_write_overrides` flow and the
|
|
5
|
+
* Rust `load_overrides` / `write_override` helpers, but exposed as a
|
|
6
|
+
* pluggable interface so embeddings (tests, multi-tenant deployments,
|
|
7
|
+
* remote config services) can swap the storage layer without forking
|
|
8
|
+
* `registerSysModules` or `UpdateConfigModule`.
|
|
9
|
+
*
|
|
10
|
+
* Each override is a flat `key → value` mapping where `key` is the
|
|
11
|
+
* dot-path config key (e.g. `"app.timeout"` or `"toggle.module.id"`).
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Pluggable persistence for runtime config & toggle overrides.
|
|
15
|
+
*
|
|
16
|
+
* Implementations must be safe to call from multiple call sites in sequence;
|
|
17
|
+
* the `FileOverridesStore` reference implementation uses an atomic
|
|
18
|
+
* tempfile + rename to prevent partial-write corruption.
|
|
19
|
+
*/
|
|
20
|
+
export interface OverridesStore {
|
|
21
|
+
/**
|
|
22
|
+
* Load all overrides from the backing store. Returns `{}` if empty/missing.
|
|
23
|
+
*
|
|
24
|
+
* Implementations may return synchronously or asynchronously — async stores
|
|
25
|
+
* (e.g. remote config services) cannot be applied at startup by the
|
|
26
|
+
* synchronous `registerSysModules`, so prefer sync stores there or
|
|
27
|
+
* pre-load and pass results into `Config` directly.
|
|
28
|
+
*/
|
|
29
|
+
load(): Promise<Record<string, unknown>> | Record<string, unknown>;
|
|
30
|
+
/** Replace the entire override set with the given mapping. */
|
|
31
|
+
save(overrides: Record<string, unknown>): Promise<void> | void;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* In-memory store, intended primarily for tests and embeddings that do not
|
|
35
|
+
* require disk persistence.
|
|
36
|
+
*/
|
|
37
|
+
export declare class InMemoryOverridesStore implements OverridesStore {
|
|
38
|
+
private _data;
|
|
39
|
+
constructor(initial?: Record<string, unknown>);
|
|
40
|
+
load(): Record<string, unknown>;
|
|
41
|
+
save(overrides: Record<string, unknown>): void;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* YAML-file-backed override store with atomic write semantics.
|
|
45
|
+
*
|
|
46
|
+
* Each `save()` writes to a sibling tempfile and `fs.renameSync`-es it into
|
|
47
|
+
* place so an interrupted process cannot leave a half-written overrides file
|
|
48
|
+
* behind (matches Python's `os.replace` and Rust's `std::fs::rename` flow).
|
|
49
|
+
*/
|
|
50
|
+
export declare class FileOverridesStore implements OverridesStore {
|
|
51
|
+
private readonly _path;
|
|
52
|
+
constructor(filePath: string);
|
|
53
|
+
/** Path of the underlying YAML file. */
|
|
54
|
+
get path(): string;
|
|
55
|
+
load(): Record<string, unknown>;
|
|
56
|
+
save(overrides: Record<string, unknown>): void;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=overrides.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overrides.d.ts","sourceRoot":"","sources":["../../src/sys-modules/overrides.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;OAOG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnE,8DAA8D;IAC9D,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAChE;AAED;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,KAAK,CAA0B;gBAE3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI7C,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI/B,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAG/C;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,QAAQ,EAAE,MAAM;IAI5B,wCAAwC;IACxC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAuB/B,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CA8B/C"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent runtime override store (Issue #45.1).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the Python `_load_overrides` / `_write_overrides` flow and the
|
|
5
|
+
* Rust `load_overrides` / `write_override` helpers, but exposed as a
|
|
6
|
+
* pluggable interface so embeddings (tests, multi-tenant deployments,
|
|
7
|
+
* remote config services) can swap the storage layer without forking
|
|
8
|
+
* `registerSysModules` or `UpdateConfigModule`.
|
|
9
|
+
*
|
|
10
|
+
* Each override is a flat `key → value` mapping where `key` is the
|
|
11
|
+
* dot-path config key (e.g. `"app.timeout"` or `"toggle.module.id"`).
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import * as yaml from 'js-yaml';
|
|
16
|
+
/**
|
|
17
|
+
* In-memory store, intended primarily for tests and embeddings that do not
|
|
18
|
+
* require disk persistence.
|
|
19
|
+
*/
|
|
20
|
+
export class InMemoryOverridesStore {
|
|
21
|
+
_data;
|
|
22
|
+
constructor(initial) {
|
|
23
|
+
this._data = initial !== undefined ? { ...initial } : {};
|
|
24
|
+
}
|
|
25
|
+
load() {
|
|
26
|
+
return { ...this._data };
|
|
27
|
+
}
|
|
28
|
+
save(overrides) {
|
|
29
|
+
this._data = { ...overrides };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* YAML-file-backed override store with atomic write semantics.
|
|
34
|
+
*
|
|
35
|
+
* Each `save()` writes to a sibling tempfile and `fs.renameSync`-es it into
|
|
36
|
+
* place so an interrupted process cannot leave a half-written overrides file
|
|
37
|
+
* behind (matches Python's `os.replace` and Rust's `std::fs::rename` flow).
|
|
38
|
+
*/
|
|
39
|
+
export class FileOverridesStore {
|
|
40
|
+
_path;
|
|
41
|
+
constructor(filePath) {
|
|
42
|
+
this._path = filePath;
|
|
43
|
+
}
|
|
44
|
+
/** Path of the underlying YAML file. */
|
|
45
|
+
get path() {
|
|
46
|
+
return this._path;
|
|
47
|
+
}
|
|
48
|
+
load() {
|
|
49
|
+
if (!fs.existsSync(this._path))
|
|
50
|
+
return {};
|
|
51
|
+
let raw;
|
|
52
|
+
try {
|
|
53
|
+
raw = fs.readFileSync(this._path, 'utf-8');
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.warn(`[apcore:overrides] Failed to read overrides file '${this._path}':`, err);
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
if (raw.length === 0)
|
|
60
|
+
return {};
|
|
61
|
+
try {
|
|
62
|
+
const parsed = yaml.load(raw);
|
|
63
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
64
|
+
return { ...parsed };
|
|
65
|
+
}
|
|
66
|
+
console.warn(`[apcore:overrides] Overrides file '${this._path}' root is not a mapping; skipping`);
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
console.warn(`[apcore:overrides] Overrides file '${this._path}' is not valid YAML; skipping`, err);
|
|
71
|
+
return {};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
save(overrides) {
|
|
75
|
+
const dir = path.dirname(this._path) || '.';
|
|
76
|
+
try {
|
|
77
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
console.error(`[apcore:overrides] Failed to create parent directory '${dir}':`, err);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Sort keys for stable on-disk layout.
|
|
84
|
+
const ordered = {};
|
|
85
|
+
for (const key of Object.keys(overrides).sort()) {
|
|
86
|
+
ordered[key] = overrides[key];
|
|
87
|
+
}
|
|
88
|
+
const yamlText = yaml.dump(ordered, { sortKeys: true });
|
|
89
|
+
const base = path.basename(this._path);
|
|
90
|
+
const tmp = path.join(dir, `.${base}.${process.pid}.${Date.now()}.tmp`);
|
|
91
|
+
try {
|
|
92
|
+
fs.writeFileSync(tmp, yamlText, 'utf-8');
|
|
93
|
+
fs.renameSync(tmp, this._path);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
console.error(`[apcore:overrides] Failed to write overrides file '${this._path}':`, err);
|
|
97
|
+
try {
|
|
98
|
+
fs.unlinkSync(tmp);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
/* ignore */
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=overrides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/sys-modules/overrides.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ import type { Registry } from '../registry/registry.js';
|
|
|
5
5
|
import type { Executor } from '../executor.js';
|
|
6
6
|
import type { Config } from '../config.js';
|
|
7
7
|
import type { MetricsCollector } from '../observability/metrics.js';
|
|
8
|
+
import type { AuditStore } from './audit.js';
|
|
9
|
+
import type { OverridesStore } from './overrides.js';
|
|
8
10
|
import { ErrorHistory } from '../observability/error-history.js';
|
|
9
11
|
import { ErrorHistoryMiddleware } from '../middleware/error-history.js';
|
|
10
12
|
import { UsageCollector, UsageMiddleware } from '../observability/usage.js';
|
|
@@ -12,9 +14,17 @@ import type { EventSubscriber } from '../events/emitter.js';
|
|
|
12
14
|
import { EventEmitter } from '../events/emitter.js';
|
|
13
15
|
import { PlatformNotifyMiddleware } from '../middleware/platform-notify.js';
|
|
14
16
|
type SubscriberFactory = (config: Record<string, unknown>) => EventSubscriber;
|
|
17
|
+
/** Register a custom subscriber type for config-driven instantiation. */
|
|
15
18
|
export declare function registerSubscriberType(typeName: string, factory: SubscriberFactory): void;
|
|
19
|
+
/** Remove a previously registered subscriber type. */
|
|
16
20
|
export declare function unregisterSubscriberType(typeName: string): void;
|
|
21
|
+
/** Reset the registry to built-in types only. Intended for test teardown. */
|
|
17
22
|
export declare function resetSubscriberRegistry(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Instantiate a single subscriber from a config object.
|
|
25
|
+
* The `type` field selects the factory; all other fields are passed as config.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createSubscriberFromConfig(config: Record<string, unknown>): EventSubscriber;
|
|
18
28
|
/**
|
|
19
29
|
* Instantiate subscribers from config and subscribe them to the emitter.
|
|
20
30
|
*/
|
|
@@ -27,9 +37,16 @@ export interface SysModulesContext {
|
|
|
27
37
|
eventEmitter?: EventEmitter;
|
|
28
38
|
platformNotifyMiddleware?: PlatformNotifyMiddleware;
|
|
29
39
|
}
|
|
40
|
+
export interface RegisterSysModulesOptions {
|
|
41
|
+
failOnError?: boolean;
|
|
42
|
+
overridesPath?: string;
|
|
43
|
+
/** Pluggable persistent override store (Issue #45.1). */
|
|
44
|
+
overridesStore?: OverridesStore;
|
|
45
|
+
auditStore?: AuditStore;
|
|
46
|
+
}
|
|
30
47
|
/**
|
|
31
48
|
* Auto-register all sys.* modules and middleware based on config.
|
|
32
49
|
*/
|
|
33
|
-
export declare function registerSysModules(registry: Registry, executor: Executor, config: Config, metricsCollector?: MetricsCollector | null): SysModulesContext;
|
|
50
|
+
export declare function registerSysModules(registry: Registry, executor: Executor, config: Config, metricsCollector?: MetricsCollector | null, options?: RegisterSysModulesOptions): SysModulesContext;
|
|
34
51
|
export {};
|
|
35
52
|
//# sourceMappingURL=registration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/sys-modules/registration.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/sys-modules/registration.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAkB,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AA+C5E,KAAK,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,eAAe,CAAC;AAyD9E,yEAAyE;AACzE,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,GACzB,IAAI,CAEN;AAED,sDAAsD;AACtD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAK/D;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAU3F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,EAC1B,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAW,GAC5C,IAAI,CAwBN;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;CACrD;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,EAC1C,OAAO,CAAC,EAAE,yBAAyB,GAClC,iBAAiB,CAmJnB"}
|