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 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
- const serviceDefault = path.basename(process.cwd()) || 'monora-app';
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: serviceDefault,
203
- environment: 'dev',
204
- stdout_sink: true,
205
- file_sink: false,
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: false,
208
- allowlist: [],
233
+ enable_policies: smartAllowlist.length > 0,
234
+ allowlist: smartAllowlist,
209
235
  denylist: [],
210
- enable_instrumentation: false,
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', serviceDefault),
224
- environment: await ask(rl, 'Environment (dev/staging/production)', 'dev'),
225
- stdout_sink: await confirm(rl, 'Enable stdout sink?', true),
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/denylist?', false),
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?', false),
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
- answers.file_path = await ask(rl, 'File sink path', './monora_events.jsonl');
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
- answers.allowlist = parseList(await ask(rl, 'Allowlist patterns (comma-separated)', 'gpt-4*,claude-3-*'));
247
- answers.denylist = parseList(await ask(rl, 'Denylist patterns (comma-separated)', 'deepseek:*'));
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(`Monora config written to ${configPath}`);
289
- console.log('Next steps:');
290
- console.log(' 1) Load this config in your app');
291
- console.log(' 2) Update monora.yml as needed');
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';
@@ -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":"AAAA;;GAEG;AAKH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC;AAEzF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CA6D7D,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE;QACT,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;QAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,GAAG,CAAC,EAAE;YACJ,OAAO,CAAC,EAAE,OAAO,CAAC;YAClB,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,eAAe,CAAC,EAAE;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,uBAAuB,CAAC,EAAE,OAAO,CAAC;QAClC,yBAAyB,CAAC,EAAE,OAAO,CAAC;QACpC,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;IACF,aAAa,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;KACf,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,yBAAyB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,cAAc,CAAC,EAAE;QACf,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;QAChD,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;QAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACxC,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;QACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B,CAAC;IACF,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;QACtC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,qBAAqB,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,cAAc,CAAC;QACxE,4BAA4B,CAAC,EAAE,OAAO,CAAC;QACvC,2BAA2B,CAAC,EAAE,MAAM,EAAE,CAAC;KACxC,CAAC;CACH;AA6GD,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,YAAY,CA0Bf;AAkSD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,EAAE,CAsCnF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAOzE;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,qBAA0B,GAAG,YAAY,CA6CxF"}
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
- throw new Error(`Config file not found: ${configPath}`);
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')) {
@@ -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;AAmDD,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,CA2LrB;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"}
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
- if (model) {
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
- const response = body.response;
152
- if (response && typeof response === 'object') {
153
- const usage = response.usage;
154
- if (usage && typeof usage === 'object') {
155
- const prompt = coerceTokenCount(usage.prompt_tokens) ?? 0;
156
- const completion = coerceTokenCount(usage.completion_tokens) ?? 0;
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
- missingUsageEvents += 1;
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
- missingUsageModels.add(model);
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: policies ? Array.from(unknownModelsUsed).sort() : [],
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 (!projectName || projectName === 'unknown') {
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
- return config?.defaults?.environment || process.env.MONORA_ENV || 'dev';
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 sanitizedEvents = redactHosts ? redactEventHosts(events, redactionPrefix) : events;
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, {
@@ -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;AAMlB,OAAO,EAAE,kBAAkB,EAA4B,MAAM,aAAa,CAAC;AAI3E,OAAO,EAAE,aAAa,EAAuB,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,WAAW,EAA0B,MAAM,WAAW,CAAC;AAIhE,UAAU,WAAW;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,eAAe,CAAC;IAC5B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,kBAAkB,CAAC;IACjC,aAAa,EAAE,kBAAkB,CAAC;IAClC,GAAG,EAAE,aAAa,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAC;IACvC,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/C;AAID;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAgDhD;AAyED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CA8B/B;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAkCrB;AAuCD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAG7E;AAED,wBAAgB,QAAQ,CACtB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,CAAC,EAAE;IACR,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,IAAI,CAQN;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CACvD,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CASlD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CASlD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CASlD;AAED,wBAAgB,WAAW,IAAI,WAAW,CAKzC;AA0BD;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA8D7F;AAwHD,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EACpB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC3B,IAAI,EAAE,GAAG,EAAE,EACX,MAAM,EAAE;IACN,OAAO,EAAE,GAAG,CAAC;IACb,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,OAAO,EAAE,GAAG,GACX,GAAG,CAoPL;AAiDD,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAC9C,cAAc,EAAE,GAAG,CAAC;IACpB,QAAQ,EAAE,GAAG,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CACvD,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAwBtB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,cAAc,EAAE,GAAG,CAAC;IACpB,QAAQ,EAAE,GAAG,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAStB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,cAAc,EAAE,GAAG,CAAC;IACpB,QAAQ,EAAE,GAAG,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAWtB;AAuFD,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,CAE3D"}
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
- const env = (0, autodetect_1.detectEnvironment)();
70
- effectivePreset = (0, autodetect_1.selectPresetForEnvironment)(env);
72
+ effectivePreset = (0, autodetect_1.selectPresetForEnvironment)(detectedEnv);
71
73
  }
72
- // Build config from simplified options or use legacy path
74
+ // Build config - always use auto-detection as base
73
75
  let config;
74
- if (preset !== undefined || serviceName || sink || policies) {
75
- // Use simplified config builder
76
- const autoConfig = (0, autodetect_1.autoDetectConfig)();
77
- const mergedDict = { ...autoConfig, ...(configDict || {}) };
78
- config = (0, config_1.buildConfigFromOptions)({
79
- preset: effectivePreset,
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
- // Legacy path: load from file/dict/env
89
- config = (0, config_1.loadConfig)({ configPath, configDict, envPrefix });
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.5.0",
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
+ });