monora-ai 1.5.0 ā 1.7.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/dist/cli.js +64 -20
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -2
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +143 -46
- package/dist/reporting.js +54 -8
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +33 -17
- package/package.json +3 -1
- package/scripts/copy-files.js +10 -0
- package/scripts/postinstall.js +146 -0
package/dist/cli.js
CHANGED
|
@@ -42,6 +42,7 @@ const path = __importStar(require("path"));
|
|
|
42
42
|
const readline = __importStar(require("readline"));
|
|
43
43
|
const yaml = __importStar(require("js-yaml"));
|
|
44
44
|
const config_1 = require("./config");
|
|
45
|
+
const autodetect_1 = require("./autodetect");
|
|
45
46
|
const report_1 = require("./report");
|
|
46
47
|
const ai_act_report_1 = require("./ai_act_report");
|
|
47
48
|
const security_report_1 = require("./security_report");
|
|
@@ -195,19 +196,44 @@ async function runInitWizard(configPath, format, assumeYes, force) {
|
|
|
195
196
|
process.exit(1);
|
|
196
197
|
}
|
|
197
198
|
}
|
|
198
|
-
|
|
199
|
+
// Auto-detect project info
|
|
200
|
+
const detectedService = (0, autodetect_1.detectServiceName)() || path.basename(process.cwd()) || 'monora-app';
|
|
201
|
+
const detectedEnv = (0, autodetect_1.detectEnvironment)();
|
|
202
|
+
const detectedSdks = (0, autodetect_1.detectInstalledSdks)();
|
|
203
|
+
// Show auto-detection results
|
|
204
|
+
console.log('\n=== Monora Setup Wizard ===\n');
|
|
205
|
+
console.log('Auto-detected configuration:');
|
|
206
|
+
console.log(` Service name: ${detectedService}`);
|
|
207
|
+
console.log(` Environment: ${detectedEnv}`);
|
|
208
|
+
if (detectedSdks.length > 0) {
|
|
209
|
+
console.log(` AI SDKs: ${detectedSdks.join(', ')}`);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
console.log(' AI SDKs: (none detected)');
|
|
213
|
+
}
|
|
214
|
+
console.log('');
|
|
215
|
+
// Generate smart defaults based on detection
|
|
216
|
+
const smartAllowlist = detectedSdks.includes('openai') && detectedSdks.includes('anthropic')
|
|
217
|
+
? ['gpt-4*', 'gpt-4o*', 'claude-3-*']
|
|
218
|
+
: detectedSdks.includes('openai')
|
|
219
|
+
? ['gpt-4*', 'gpt-4o*', 'o1-*']
|
|
220
|
+
: detectedSdks.includes('anthropic')
|
|
221
|
+
? ['claude-3-*', 'claude-sonnet-4-*', 'claude-opus-4-*']
|
|
222
|
+
: [];
|
|
199
223
|
let answers;
|
|
200
224
|
if (assumeYes) {
|
|
225
|
+
// Smart defaults for --yes mode
|
|
201
226
|
answers = {
|
|
202
|
-
service_name:
|
|
203
|
-
environment:
|
|
204
|
-
stdout_sink:
|
|
205
|
-
file_sink:
|
|
227
|
+
service_name: detectedService,
|
|
228
|
+
environment: detectedEnv,
|
|
229
|
+
stdout_sink: detectedEnv === 'dev',
|
|
230
|
+
file_sink: true,
|
|
231
|
+
file_path: detectedEnv === 'production' ? './logs/monora_events.jsonl' : './monora_events.jsonl',
|
|
206
232
|
https_sink: false,
|
|
207
|
-
enable_policies:
|
|
208
|
-
allowlist:
|
|
233
|
+
enable_policies: smartAllowlist.length > 0,
|
|
234
|
+
allowlist: smartAllowlist,
|
|
209
235
|
denylist: [],
|
|
210
|
-
enable_instrumentation:
|
|
236
|
+
enable_instrumentation: detectedSdks.length > 0,
|
|
211
237
|
instrumentation_purpose: 'general',
|
|
212
238
|
enable_data_handling: false,
|
|
213
239
|
data_handling_mode: 'redact',
|
|
@@ -215,25 +241,29 @@ async function runInitWizard(configPath, format, assumeYes, force) {
|
|
|
215
241
|
queue_full_mode: 'warn',
|
|
216
242
|
queue_full_timeout_sec: null,
|
|
217
243
|
};
|
|
244
|
+
console.log('Using smart defaults based on auto-detection...\n');
|
|
218
245
|
}
|
|
219
246
|
else {
|
|
220
247
|
const rl = createInterface();
|
|
221
248
|
try {
|
|
222
249
|
answers = {
|
|
223
|
-
service_name: await ask(rl, 'Service name',
|
|
224
|
-
environment: await ask(rl, 'Environment (dev/staging/production)',
|
|
225
|
-
stdout_sink: await confirm(rl, 'Enable stdout sink?',
|
|
250
|
+
service_name: await ask(rl, 'Service name', detectedService),
|
|
251
|
+
environment: await ask(rl, 'Environment (dev/staging/production)', detectedEnv),
|
|
252
|
+
stdout_sink: await confirm(rl, 'Enable stdout sink?', detectedEnv === 'dev'),
|
|
226
253
|
file_sink: await confirm(rl, 'Enable file sink?', true),
|
|
227
254
|
https_sink: await confirm(rl, 'Enable HTTPS sink?', false),
|
|
228
|
-
enable_policies: await confirm(rl, 'Configure model allowlist
|
|
255
|
+
enable_policies: await confirm(rl, 'Configure model allowlist?', smartAllowlist.length > 0),
|
|
229
256
|
allowlist: [],
|
|
230
257
|
denylist: [],
|
|
231
|
-
enable_instrumentation: await confirm(rl, 'Enable auto-instrumentation?',
|
|
258
|
+
enable_instrumentation: await confirm(rl, 'Enable auto-instrumentation?', detectedSdks.length > 0),
|
|
232
259
|
enable_data_handling: await confirm(rl, 'Enable data redaction rules?', false),
|
|
233
260
|
queue_full_mode: await ask(rl, 'Queue overflow mode (warn/raise/block)', 'warn'),
|
|
234
261
|
};
|
|
235
262
|
if (answers.file_sink) {
|
|
236
|
-
|
|
263
|
+
const defaultPath = answers.environment === 'production'
|
|
264
|
+
? './logs/monora_events.jsonl'
|
|
265
|
+
: './monora_events.jsonl';
|
|
266
|
+
answers.file_path = await ask(rl, 'File sink path', defaultPath);
|
|
237
267
|
}
|
|
238
268
|
if (answers.https_sink) {
|
|
239
269
|
answers.https_endpoint = await ask(rl, 'HTTPS endpoint URL');
|
|
@@ -243,8 +273,11 @@ async function runInitWizard(configPath, format, assumeYes, force) {
|
|
|
243
273
|
}
|
|
244
274
|
}
|
|
245
275
|
if (answers.enable_policies) {
|
|
246
|
-
|
|
247
|
-
|
|
276
|
+
const defaultAllowlist = smartAllowlist.length > 0
|
|
277
|
+
? smartAllowlist.join(',')
|
|
278
|
+
: 'gpt-4*,claude-3-*';
|
|
279
|
+
answers.allowlist = parseList(await ask(rl, 'Allowlist patterns (comma-separated)', defaultAllowlist));
|
|
280
|
+
answers.denylist = parseList(await ask(rl, 'Denylist patterns (comma-separated)', ''));
|
|
248
281
|
}
|
|
249
282
|
if (answers.enable_instrumentation) {
|
|
250
283
|
answers.instrumentation_purpose = await ask(rl, 'Default purpose for instrumentation', 'general');
|
|
@@ -285,10 +318,21 @@ async function runInitWizard(configPath, format, assumeYes, force) {
|
|
|
285
318
|
? JSON.stringify(config, null, 2)
|
|
286
319
|
: yaml.dump(config, { sortKeys: false, noRefs: true });
|
|
287
320
|
fs.writeFileSync(configPath, output, 'utf-8');
|
|
288
|
-
console.log(
|
|
289
|
-
console.log('Next
|
|
290
|
-
console.log('
|
|
291
|
-
console.log('
|
|
321
|
+
console.log(`\nMonora config written to ${configPath}`);
|
|
322
|
+
console.log('\n=== Next Steps ===\n');
|
|
323
|
+
console.log('Option 1: Zero-config (recommended)');
|
|
324
|
+
console.log(' Just call init() - Monora auto-detects everything:');
|
|
325
|
+
console.log('');
|
|
326
|
+
console.log(" import { init } from 'monora-ai';");
|
|
327
|
+
console.log(' init();');
|
|
328
|
+
console.log('');
|
|
329
|
+
console.log('Option 2: Use generated config file');
|
|
330
|
+
console.log(` import { init } from 'monora-ai';`);
|
|
331
|
+
console.log(` init({ configPath: '${configPath}' });`);
|
|
332
|
+
console.log('');
|
|
333
|
+
if (detectedSdks.length > 0) {
|
|
334
|
+
console.log(`Detected SDKs (${detectedSdks.join(', ')}) will be auto-instrumented.`);
|
|
335
|
+
}
|
|
292
336
|
}
|
|
293
337
|
function parseInitOptions(args) {
|
|
294
338
|
const configPath = getFlagValue(args, '--path') || 'monora.yml';
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -234,9 +234,12 @@ function loadConfig(options) {
|
|
|
234
234
|
normalizeDataHandlingMode(config);
|
|
235
235
|
return config;
|
|
236
236
|
}
|
|
237
|
-
function loadConfigFile(configPath) {
|
|
237
|
+
function loadConfigFile(configPath, silent = false) {
|
|
238
238
|
if (!fs.existsSync(configPath)) {
|
|
239
|
-
|
|
239
|
+
if (!silent) {
|
|
240
|
+
console.warn(`Monora: Config file not found: ${configPath}. Using defaults.`);
|
|
241
|
+
}
|
|
242
|
+
return {};
|
|
240
243
|
}
|
|
241
244
|
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
242
245
|
if (configPath.endsWith('.json')) {
|
package/dist/report.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAIxC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAelE;
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAIxC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAelE;AAqJD,wBAAgB,WAAW,CACzB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAClC,QAAQ,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,GAClC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAkMrB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAEzE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAsD7E"}
|
package/dist/report.js
CHANGED
|
@@ -78,6 +78,99 @@ function coerceTokenCount(value) {
|
|
|
78
78
|
const numberValue = Number(value);
|
|
79
79
|
return Number.isFinite(numberValue) ? numberValue : null;
|
|
80
80
|
}
|
|
81
|
+
function resolvePolicyName(body) {
|
|
82
|
+
for (const key of ['policy_name', 'policy', 'policy_id', 'policyId']) {
|
|
83
|
+
const value = body[key];
|
|
84
|
+
if (value) {
|
|
85
|
+
const candidate = String(value).trim();
|
|
86
|
+
if (candidate) {
|
|
87
|
+
return candidate;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (body.policy && typeof body.policy === 'object') {
|
|
92
|
+
for (const key of ['name', 'id', 'policy_name']) {
|
|
93
|
+
const value = body.policy[key];
|
|
94
|
+
if (value) {
|
|
95
|
+
const candidate = String(value).trim();
|
|
96
|
+
if (candidate) {
|
|
97
|
+
return candidate;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (body.data_handling && typeof body.data_handling === 'object' && body.data_handling.action) {
|
|
103
|
+
return 'data_handling.block';
|
|
104
|
+
}
|
|
105
|
+
return 'UNKNOWN_POLICY';
|
|
106
|
+
}
|
|
107
|
+
function resolvePolicyMessage(body) {
|
|
108
|
+
if (body.message) {
|
|
109
|
+
const candidate = String(body.message).trim();
|
|
110
|
+
if (candidate) {
|
|
111
|
+
return candidate;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (body.data_handling && typeof body.data_handling === 'object') {
|
|
115
|
+
const rules = body.data_handling.rules;
|
|
116
|
+
if (Array.isArray(rules) && rules.length > 0) {
|
|
117
|
+
return `Sensitive data matched rules: ${rules.map(String).join(', ')}`;
|
|
118
|
+
}
|
|
119
|
+
if (body.data_handling.action) {
|
|
120
|
+
return `Data handling policy violation (${body.data_handling.action})`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return 'Policy violation recorded';
|
|
124
|
+
}
|
|
125
|
+
function normalizeUsage(usage) {
|
|
126
|
+
if (!usage || typeof usage !== 'object') {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
let prompt = coerceTokenCount(usage.prompt_tokens);
|
|
130
|
+
let completion = coerceTokenCount(usage.completion_tokens);
|
|
131
|
+
if (prompt === null) {
|
|
132
|
+
prompt = coerceTokenCount(usage.input_tokens);
|
|
133
|
+
}
|
|
134
|
+
if (completion === null) {
|
|
135
|
+
completion = coerceTokenCount(usage.output_tokens);
|
|
136
|
+
}
|
|
137
|
+
const total = coerceTokenCount(usage.total_tokens);
|
|
138
|
+
if (prompt === null && completion === null && total === null) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
const safePrompt = prompt ?? 0;
|
|
142
|
+
const safeCompletion = completion ?? 0;
|
|
143
|
+
const safeTotal = total ?? safePrompt + safeCompletion;
|
|
144
|
+
return { prompt: safePrompt, completion: safeCompletion, total: safeTotal };
|
|
145
|
+
}
|
|
146
|
+
function extractUsage(body) {
|
|
147
|
+
const response = body.response;
|
|
148
|
+
if (response && typeof response === 'object') {
|
|
149
|
+
const normalized = normalizeUsage(response.usage);
|
|
150
|
+
if (normalized) {
|
|
151
|
+
return normalized;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const usage = normalizeUsage(body.usage);
|
|
155
|
+
if (usage) {
|
|
156
|
+
return usage;
|
|
157
|
+
}
|
|
158
|
+
const tokenUsage = normalizeUsage(body.token_usage);
|
|
159
|
+
if (tokenUsage) {
|
|
160
|
+
return tokenUsage;
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
function classifyPolicyViolation(policyName) {
|
|
165
|
+
const lowered = policyName.toLowerCase();
|
|
166
|
+
if (lowered.includes('unknown_model')) {
|
|
167
|
+
return 'unknown';
|
|
168
|
+
}
|
|
169
|
+
if (['denylist', 'blocklist', 'forbidden'].some((token) => lowered.includes(token))) {
|
|
170
|
+
return 'forbidden';
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
81
174
|
function compilePatterns(patterns) {
|
|
82
175
|
return patterns.map((pattern) => {
|
|
83
176
|
const regexPattern = pattern
|
|
@@ -123,6 +216,31 @@ function buildReport(events, policies) {
|
|
|
123
216
|
const usedAllowlistPatterns = new Set();
|
|
124
217
|
const missingUsageModels = new Set();
|
|
125
218
|
let missingUsageEvents = 0;
|
|
219
|
+
for (const event of filteredEvents) {
|
|
220
|
+
const body = event && typeof event.body === 'object' && event.body
|
|
221
|
+
? event.body
|
|
222
|
+
: {};
|
|
223
|
+
if (body.status === 'policy_violation') {
|
|
224
|
+
const policyName = resolvePolicyName(body) || 'UNKNOWN_POLICY';
|
|
225
|
+
const message = resolvePolicyMessage(body) || 'Policy violation recorded';
|
|
226
|
+
violations.push({
|
|
227
|
+
timestamp: event.timestamp,
|
|
228
|
+
model: body.model,
|
|
229
|
+
policy: policyName,
|
|
230
|
+
message,
|
|
231
|
+
});
|
|
232
|
+
const model = normalizeModelName(body.model);
|
|
233
|
+
if (model) {
|
|
234
|
+
const classification = classifyPolicyViolation(policyName);
|
|
235
|
+
if (classification === 'forbidden') {
|
|
236
|
+
forbiddenModelsBlocked.add(model);
|
|
237
|
+
}
|
|
238
|
+
else if (classification === 'unknown') {
|
|
239
|
+
unknownModelsUsed.add(model);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
126
244
|
for (const event of filteredEvents) {
|
|
127
245
|
if (event.trace_id) {
|
|
128
246
|
traceIds.add(event.trace_id);
|
|
@@ -141,64 +259,39 @@ function buildReport(events, policies) {
|
|
|
141
259
|
byClassification[event.data_classification] =
|
|
142
260
|
(byClassification[event.data_classification] || 0) + 1;
|
|
143
261
|
}
|
|
144
|
-
const body = event.body
|
|
262
|
+
const body = event && typeof event.body === 'object' && event.body
|
|
263
|
+
? event.body
|
|
264
|
+
: {};
|
|
145
265
|
if (event.event_type === 'llm_call') {
|
|
146
266
|
const model = normalizeModelName(body.model);
|
|
147
|
-
|
|
267
|
+
const isBlocked = body.status === 'policy_violation';
|
|
268
|
+
if (model && !isBlocked) {
|
|
148
269
|
byModel[model] = (byModel[model] || 0) + 1;
|
|
149
270
|
modelsUsed.add(model);
|
|
150
271
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const total = coerceTokenCount(usage.total_tokens) ??
|
|
158
|
-
(coerceTokenCount(usage.prompt_tokens) !== null ||
|
|
159
|
-
coerceTokenCount(usage.completion_tokens) !== null
|
|
160
|
-
? prompt + completion
|
|
161
|
-
: null);
|
|
162
|
-
if (total === null && prompt === 0 && completion === 0) {
|
|
163
|
-
missingUsageEvents += 1;
|
|
164
|
-
if (model) {
|
|
165
|
-
missingUsageModels.add(model);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
tokenUsage.total_prompt_tokens += prompt;
|
|
170
|
-
tokenUsage.total_completion_tokens += completion;
|
|
171
|
-
tokenUsage.total_tokens += total ?? 0;
|
|
172
|
-
if (model) {
|
|
173
|
-
if (!tokenUsage.by_model[model]) {
|
|
174
|
-
tokenUsage.by_model[model] = { prompt: 0, completion: 0, total: 0 };
|
|
175
|
-
}
|
|
176
|
-
tokenUsage.by_model[model].prompt += prompt;
|
|
177
|
-
tokenUsage.by_model[model].completion += completion;
|
|
178
|
-
tokenUsage.by_model[model].total += total ?? 0;
|
|
179
|
-
}
|
|
272
|
+
if (!isBlocked) {
|
|
273
|
+
const usage = extractUsage(body);
|
|
274
|
+
if (!usage) {
|
|
275
|
+
missingUsageEvents += 1;
|
|
276
|
+
if (model) {
|
|
277
|
+
missingUsageModels.add(model);
|
|
180
278
|
}
|
|
181
279
|
}
|
|
182
280
|
else {
|
|
183
|
-
|
|
281
|
+
tokenUsage.total_prompt_tokens += usage.prompt;
|
|
282
|
+
tokenUsage.total_completion_tokens += usage.completion;
|
|
283
|
+
tokenUsage.total_tokens += usage.total;
|
|
184
284
|
if (model) {
|
|
185
|
-
|
|
285
|
+
if (!tokenUsage.by_model[model]) {
|
|
286
|
+
tokenUsage.by_model[model] = { prompt: 0, completion: 0, total: 0 };
|
|
287
|
+
}
|
|
288
|
+
tokenUsage.by_model[model].prompt += usage.prompt;
|
|
289
|
+
tokenUsage.by_model[model].completion += usage.completion;
|
|
290
|
+
tokenUsage.by_model[model].total += usage.total;
|
|
186
291
|
}
|
|
187
292
|
}
|
|
188
293
|
}
|
|
189
294
|
}
|
|
190
|
-
if (body.status === 'policy_violation') {
|
|
191
|
-
violations.push({
|
|
192
|
-
timestamp: event.timestamp,
|
|
193
|
-
model: body.model,
|
|
194
|
-
policy: body.policy_name,
|
|
195
|
-
message: body.message,
|
|
196
|
-
});
|
|
197
|
-
const model = normalizeModelName(body.model);
|
|
198
|
-
if (model) {
|
|
199
|
-
forbiddenModelsBlocked.add(model);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
295
|
if (body.error) {
|
|
203
296
|
errors.push({
|
|
204
297
|
timestamp: event.timestamp,
|
|
@@ -238,6 +331,9 @@ function buildReport(events, policies) {
|
|
|
238
331
|
allowedModelsUsed.add(model);
|
|
239
332
|
}
|
|
240
333
|
}
|
|
334
|
+
for (const model of modelsUsed) {
|
|
335
|
+
forbiddenModelsBlocked.delete(model);
|
|
336
|
+
}
|
|
241
337
|
for (const model of allowedModelsUsed) {
|
|
242
338
|
unknownModelsUsed.delete(model);
|
|
243
339
|
}
|
|
@@ -255,6 +351,7 @@ function buildReport(events, policies) {
|
|
|
255
351
|
start: timestamps.length ? new Date(Math.min(...timestamps.map((t) => t.getTime()))).toISOString() : null,
|
|
256
352
|
end: timestamps.length ? new Date(Math.max(...timestamps.map((t) => t.getTime()))).toISOString() : null,
|
|
257
353
|
};
|
|
354
|
+
const unknownModelsPayload = policies || unknownModelsUsed.size > 0 ? Array.from(unknownModelsUsed).sort() : [];
|
|
258
355
|
return {
|
|
259
356
|
total_events: filteredEvents.length,
|
|
260
357
|
traces: traceIds.size,
|
|
@@ -269,7 +366,7 @@ function buildReport(events, policies) {
|
|
|
269
366
|
model_compliance: {
|
|
270
367
|
allowed_models_used: Array.from(allowedModelsUsed).sort(),
|
|
271
368
|
forbidden_models_blocked: Array.from(forbiddenModelsBlocked).sort(),
|
|
272
|
-
unknown_models_used:
|
|
369
|
+
unknown_models_used: unknownModelsPayload,
|
|
273
370
|
unused_allowlist_patterns: unusedAllowlistPatterns.sort(),
|
|
274
371
|
},
|
|
275
372
|
};
|
package/dist/reporting.js
CHANGED
|
@@ -365,24 +365,67 @@ function verifyChainStatusWithProof(events, config) {
|
|
|
365
365
|
return ['failed', exc instanceof Error ? exc.message : String(exc), null];
|
|
366
366
|
}
|
|
367
367
|
}
|
|
368
|
+
const INVALID_IDENTIFIER_VALUES = new Set(['__main__.py', '__main__', 'unknown']);
|
|
369
|
+
function sanitizeIdentifier(value) {
|
|
370
|
+
if (value === null || value === undefined) {
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
const candidate = String(value).trim();
|
|
374
|
+
if (!candidate) {
|
|
375
|
+
return null;
|
|
376
|
+
}
|
|
377
|
+
const base = candidate.split(/[\\/]/).pop() || '';
|
|
378
|
+
if (!base) {
|
|
379
|
+
return null;
|
|
380
|
+
}
|
|
381
|
+
if (INVALID_IDENTIFIER_VALUES.has(base.toLowerCase())) {
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
return base;
|
|
385
|
+
}
|
|
386
|
+
function normalizeEnvironmentValue(value) {
|
|
387
|
+
if (typeof value !== 'string') {
|
|
388
|
+
return 'dev';
|
|
389
|
+
}
|
|
390
|
+
const normalized = value.trim();
|
|
391
|
+
if (!normalized) {
|
|
392
|
+
return 'dev';
|
|
393
|
+
}
|
|
394
|
+
if (normalized.toLowerCase() === 'development') {
|
|
395
|
+
return 'dev';
|
|
396
|
+
}
|
|
397
|
+
return normalized;
|
|
398
|
+
}
|
|
368
399
|
function resolveProjectName(config) {
|
|
369
|
-
const projectName = process.env.MONORA_PROJECT_NAME ||
|
|
370
|
-
process.env.PROJECT_NAME ||
|
|
371
|
-
config?.defaults?.service_name ||
|
|
400
|
+
const projectName = sanitizeIdentifier(process.env.MONORA_PROJECT_NAME) ||
|
|
401
|
+
sanitizeIdentifier(process.env.PROJECT_NAME) ||
|
|
402
|
+
sanitizeIdentifier(config?.defaults?.service_name) ||
|
|
372
403
|
'monora';
|
|
373
|
-
if (
|
|
404
|
+
if (projectName === 'monora') {
|
|
374
405
|
console.error('Monora: project name missing; defaulting to "monora"');
|
|
375
|
-
return 'monora';
|
|
376
406
|
}
|
|
377
407
|
return projectName;
|
|
378
408
|
}
|
|
379
409
|
function resolveEnvironment(config) {
|
|
380
|
-
|
|
410
|
+
const rawEnv = config?.defaults?.environment || process.env.MONORA_ENV || 'dev';
|
|
411
|
+
return normalizeEnvironmentValue(rawEnv);
|
|
381
412
|
}
|
|
382
413
|
function shouldRedactHost(config) {
|
|
383
414
|
const reporting = config?.reporting || {};
|
|
384
415
|
return reporting.redact_host !== false;
|
|
385
416
|
}
|
|
417
|
+
function applyTrustProofOverrides(events, environment) {
|
|
418
|
+
return events.map((event) => {
|
|
419
|
+
if (!event || typeof event !== 'object') {
|
|
420
|
+
return event;
|
|
421
|
+
}
|
|
422
|
+
const currentEnv = event.environment;
|
|
423
|
+
if (!currentEnv || normalizeEnvironmentValue(currentEnv) !== environment) {
|
|
424
|
+
return { ...event, environment };
|
|
425
|
+
}
|
|
426
|
+
return event;
|
|
427
|
+
});
|
|
428
|
+
}
|
|
386
429
|
function redactEventHosts(events, prefix) {
|
|
387
430
|
const mapping = new Map();
|
|
388
431
|
return events.map((event) => {
|
|
@@ -405,7 +448,11 @@ function redactEventHosts(events, prefix) {
|
|
|
405
448
|
function buildTrustProofBundle(traceId, report, events, chainProof, artifacts, config) {
|
|
406
449
|
const redactHosts = shouldRedactHost(config);
|
|
407
450
|
const redactionPrefix = 'host-sha256:';
|
|
408
|
-
const
|
|
451
|
+
const environment = resolveEnvironment(config);
|
|
452
|
+
const normalizedEvents = applyTrustProofOverrides(events, environment);
|
|
453
|
+
const sanitizedEvents = redactHosts
|
|
454
|
+
? redactEventHosts(normalizedEvents, redactionPrefix)
|
|
455
|
+
: normalizedEvents;
|
|
409
456
|
// Compute events digest
|
|
410
457
|
const eventsDigestHash = (0, verify_1.computeEventsDigest)(sanitizedEvents);
|
|
411
458
|
// Build artifact list for bundle
|
|
@@ -422,7 +469,6 @@ function buildTrustProofBundle(traceId, report, events, chainProof, artifacts, c
|
|
|
422
469
|
}
|
|
423
470
|
// Get project name from config
|
|
424
471
|
const projectName = resolveProjectName(config);
|
|
425
|
-
const environment = resolveEnvironment(config);
|
|
426
472
|
// Build the bundle
|
|
427
473
|
const reportBytes = (0, attestation_1.serializeReport)(report);
|
|
428
474
|
let bundle = (0, attestation_1.buildAttestationBundle)(report, reportBytes, undefined, {
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAmB,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAA6C,MAAM,iBAAiB,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAGL,YAAY,EACZ,UAAU,EACV,UAAU,EACX,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -63,30 +63,46 @@ function init(options) {
|
|
|
63
63
|
state.dispatcher.close();
|
|
64
64
|
state = null;
|
|
65
65
|
}
|
|
66
|
+
// Auto-detect environment and service info
|
|
67
|
+
const autoConfig = (0, autodetect_1.autoDetectConfig)();
|
|
68
|
+
const detectedEnv = autoConfig.defaults?.environment || 'dev';
|
|
66
69
|
// Determine effective preset
|
|
67
70
|
let effectivePreset = preset;
|
|
68
71
|
if (effectivePreset === undefined || effectivePreset === 'auto') {
|
|
69
|
-
|
|
70
|
-
effectivePreset = (0, autodetect_1.selectPresetForEnvironment)(env);
|
|
72
|
+
effectivePreset = (0, autodetect_1.selectPresetForEnvironment)(detectedEnv);
|
|
71
73
|
}
|
|
72
|
-
// Build config
|
|
74
|
+
// Build config - always use auto-detection as base
|
|
73
75
|
let config;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
serviceName,
|
|
81
|
-
sink,
|
|
82
|
-
policies,
|
|
83
|
-
configPath,
|
|
84
|
-
configDict: mergedDict,
|
|
85
|
-
});
|
|
76
|
+
// Start with auto-detected config as base
|
|
77
|
+
const baseConfig = { ...autoConfig };
|
|
78
|
+
// Load file config if specified (or try default locations)
|
|
79
|
+
let fileConfig = {};
|
|
80
|
+
if (configPath) {
|
|
81
|
+
fileConfig = (0, config_1.loadConfig)({ configPath, envPrefix });
|
|
86
82
|
}
|
|
87
83
|
else {
|
|
88
|
-
//
|
|
89
|
-
|
|
84
|
+
// Try common config file locations silently
|
|
85
|
+
fileConfig = (0, config_1.loadConfig)({ envPrefix });
|
|
86
|
+
}
|
|
87
|
+
// Merge: auto-detect -> file config -> explicit options
|
|
88
|
+
const mergedDict = configDict
|
|
89
|
+
? { ...baseConfig, ...fileConfig, ...configDict }
|
|
90
|
+
: { ...baseConfig, ...fileConfig };
|
|
91
|
+
config = (0, config_1.buildConfigFromOptions)({
|
|
92
|
+
preset: effectivePreset,
|
|
93
|
+
serviceName: serviceName || baseConfig.defaults?.service_name,
|
|
94
|
+
sink,
|
|
95
|
+
policies,
|
|
96
|
+
configDict: mergedDict,
|
|
97
|
+
});
|
|
98
|
+
// Log initialization info in development
|
|
99
|
+
if (detectedEnv === 'dev') {
|
|
100
|
+
const svcName = config.defaults?.service_name || 'unknown';
|
|
101
|
+
const installedSdks = autoConfig.instrumentation?.targets || [];
|
|
102
|
+
console.log(`Monora: Initialized (service=${svcName}, env=${detectedEnv}, preset=${effectivePreset})`);
|
|
103
|
+
if (installedSdks.length > 0) {
|
|
104
|
+
console.log(`Monora: Auto-detected SDKs: ${installedSdks.join(', ')}`);
|
|
105
|
+
}
|
|
90
106
|
}
|
|
91
107
|
initWithConfig(config, failFast);
|
|
92
108
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "monora-ai",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "Lightweight governance and trace SDK for AI systems",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -11,10 +11,12 @@
|
|
|
11
11
|
"build": "tsc && node scripts/copy-files.js",
|
|
12
12
|
"test": "jest",
|
|
13
13
|
"prepublishOnly": "npm run build",
|
|
14
|
+
"postinstall": "node scripts/postinstall.js",
|
|
14
15
|
"clean": "rm -rf dist"
|
|
15
16
|
},
|
|
16
17
|
"files": [
|
|
17
18
|
"dist",
|
|
19
|
+
"scripts",
|
|
18
20
|
"README.md",
|
|
19
21
|
"LICENSE"
|
|
20
22
|
],
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
const rootDir = path.resolve(__dirname, '..');
|
|
5
|
+
const srcPath = path.join(rootDir, 'src', 'registryData.json');
|
|
6
|
+
const distDir = path.join(rootDir, 'dist');
|
|
7
|
+
const destPath = path.join(distDir, 'registryData.json');
|
|
8
|
+
|
|
9
|
+
fs.mkdirSync(distDir, { recursive: true });
|
|
10
|
+
fs.copyFileSync(srcPath, destPath);
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Postinstall script for Monora SDK
|
|
4
|
+
* Automatically runs the setup wizard after npm install
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { execSync, spawn } = require('child_process');
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
// Check if we're in a CI environment or non-interactive terminal
|
|
12
|
+
function isCI() {
|
|
13
|
+
return !!(
|
|
14
|
+
process.env.CI ||
|
|
15
|
+
process.env.CONTINUOUS_INTEGRATION ||
|
|
16
|
+
process.env.BUILD_NUMBER ||
|
|
17
|
+
process.env.GITHUB_ACTIONS ||
|
|
18
|
+
process.env.GITLAB_CI ||
|
|
19
|
+
process.env.CIRCLECI ||
|
|
20
|
+
process.env.TRAVIS ||
|
|
21
|
+
process.env.JENKINS_URL ||
|
|
22
|
+
process.env.MONORA_SKIP_POSTINSTALL
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isTTY() {
|
|
27
|
+
return process.stdout.isTTY && process.stdin.isTTY;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function findProjectRoot() {
|
|
31
|
+
// Walk up from current directory to find package.json (the user's project)
|
|
32
|
+
let dir = process.cwd();
|
|
33
|
+
const maxLevels = 10;
|
|
34
|
+
|
|
35
|
+
for (let i = 0; i < maxLevels; i++) {
|
|
36
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
37
|
+
if (fs.existsSync(pkgPath)) {
|
|
38
|
+
try {
|
|
39
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
40
|
+
// Skip if this is the monora-ai package itself
|
|
41
|
+
if (pkg.name !== 'monora-ai') {
|
|
42
|
+
return dir;
|
|
43
|
+
}
|
|
44
|
+
} catch (e) {
|
|
45
|
+
// Continue searching
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const parent = path.dirname(dir);
|
|
49
|
+
if (parent === dir) break;
|
|
50
|
+
dir = parent;
|
|
51
|
+
}
|
|
52
|
+
return process.cwd();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function configExists(projectRoot) {
|
|
56
|
+
const configFiles = [
|
|
57
|
+
'monora.yml',
|
|
58
|
+
'monora.yaml',
|
|
59
|
+
'monora.json',
|
|
60
|
+
'.monora.yml',
|
|
61
|
+
'.monora.yaml',
|
|
62
|
+
'.monora.json',
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
return configFiles.some(file =>
|
|
66
|
+
fs.existsSync(path.join(projectRoot, file))
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function main() {
|
|
71
|
+
// Skip in CI environments
|
|
72
|
+
if (isCI()) {
|
|
73
|
+
console.log('\nš¦ Monora SDK installed successfully.');
|
|
74
|
+
console.log(' Run "npx monora init" to configure.\n');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const projectRoot = findProjectRoot();
|
|
79
|
+
|
|
80
|
+
// Check if config already exists
|
|
81
|
+
if (configExists(projectRoot)) {
|
|
82
|
+
console.log('\nā
Monora SDK installed. Existing configuration detected.\n');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Non-interactive terminal - show quick start
|
|
87
|
+
if (!isTTY()) {
|
|
88
|
+
console.log('\nš¦ Monora SDK installed successfully!');
|
|
89
|
+
console.log('');
|
|
90
|
+
console.log('Quick Start:');
|
|
91
|
+
console.log(' 1. Run: npx monora init');
|
|
92
|
+
console.log(' 2. Or use zero-config:');
|
|
93
|
+
console.log(' import { init } from "monora-ai";');
|
|
94
|
+
console.log(' init();');
|
|
95
|
+
console.log('');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Interactive terminal - run setup wizard
|
|
100
|
+
console.log('\nš Monora SDK installed! Starting setup wizard...\n');
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
// Run the wizard with --yes for smart defaults
|
|
104
|
+
// Users can run `npx monora init` later for full interactive mode
|
|
105
|
+
const cliPath = path.join(__dirname, '..', 'dist', 'cli.js');
|
|
106
|
+
|
|
107
|
+
if (fs.existsSync(cliPath)) {
|
|
108
|
+
// Run the CLI init command
|
|
109
|
+
const child = spawn('node', [cliPath, 'init', '--yes'], {
|
|
110
|
+
cwd: projectRoot,
|
|
111
|
+
stdio: 'inherit',
|
|
112
|
+
shell: process.platform === 'win32',
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
child.on('error', (err) => {
|
|
116
|
+
console.log('\nš¦ Monora SDK installed.');
|
|
117
|
+
console.log(' Run "npx monora init" to configure manually.\n');
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
child.on('close', (code) => {
|
|
121
|
+
if (code !== 0) {
|
|
122
|
+
console.log('\n Run "npx monora init" to configure manually.\n');
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
} else {
|
|
126
|
+
// CLI not built yet (fresh install), show manual instructions
|
|
127
|
+
console.log('š¦ Monora SDK installed successfully!');
|
|
128
|
+
console.log('');
|
|
129
|
+
console.log('Quick Start:');
|
|
130
|
+
console.log(' Option 1: Run "npx monora init" to configure');
|
|
131
|
+
console.log(' Option 2: Use zero-config in your code:');
|
|
132
|
+
console.log(' import { init } from "monora-ai";');
|
|
133
|
+
console.log(' init();');
|
|
134
|
+
console.log('');
|
|
135
|
+
}
|
|
136
|
+
} catch (err) {
|
|
137
|
+
// Silent fail - don't break npm install
|
|
138
|
+
console.log('\nš¦ Monora SDK installed.');
|
|
139
|
+
console.log(' Run "npx monora init" to configure.\n');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
main().catch(() => {
|
|
144
|
+
// Never fail the install
|
|
145
|
+
console.log('\nš¦ Monora SDK installed.\n');
|
|
146
|
+
});
|