trickle-observe 0.2.136 → 0.2.139

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.
@@ -1248,36 +1248,38 @@ if (enabled) {
1248
1248
  (0, llm_observer_1.initLlmObserver)();
1249
1249
  // ── Hook 0b4: Initialize MCP observer ──
1250
1250
  (0, mcp_observer_1.initMcpObserver)();
1251
- // ── Hook 0c: Capture environment snapshot ──
1252
- try {
1253
- const envDir = process.env.TRICKLE_LOCAL_DIR || path_1.default.join(process.cwd(), '.trickle');
1254
- fs_1.default.mkdirSync(envDir, { recursive: true });
1255
- const SENSITIVE = ['KEY', 'SECRET', 'TOKEN', 'PASSWORD', 'AUTH', 'CREDENTIAL', 'PRIVATE'];
1256
- const isSensitive = (k) => SENSITIVE.some(s => k.toUpperCase().includes(s));
1257
- const redact = (k, v) => isSensitive(k) ? (v.length <= 4 ? '****' : v.slice(0, 2) + '*'.repeat(v.length - 4) + v.slice(-2)) : v;
1258
- const skip = new Set(['PATH', 'HOME', 'USER', 'SHELL', 'TERM', 'LANG', 'LOGNAME', 'PWD', 'OLDPWD', 'SHLVL', 'TMPDIR']);
1259
- const trickleVars = {};
1260
- const appVars = {};
1261
- for (const [k, v] of Object.entries(process.env)) {
1262
- if (!v || k.startsWith('_'))
1263
- continue;
1264
- if (k.startsWith('TRICKLE_'))
1265
- trickleVars[k] = v;
1266
- else if (!skip.has(k))
1267
- appVars[k] = redact(k, v);
1268
- }
1269
- const envSnapshot = {
1270
- kind: 'environment',
1271
- timestamp: Date.now(),
1272
- node: { version: process.version, platform: process.platform, arch: process.arch },
1273
- cwd: process.cwd(),
1274
- argv: process.argv.slice(0, 10),
1275
- trickle: trickleVars,
1276
- env: appVars,
1277
- };
1278
- fs_1.default.writeFileSync(path_1.default.join(envDir, 'environment.json'), JSON.stringify(envSnapshot, null, 2));
1251
+ // ── Hook 0c: Capture environment snapshot (opt-in via TRICKLE_CAPTURE_ENV=1) ──
1252
+ if (process.env.TRICKLE_CAPTURE_ENV === '1') {
1253
+ try {
1254
+ const envDir = process.env.TRICKLE_LOCAL_DIR || path_1.default.join(process.cwd(), '.trickle');
1255
+ fs_1.default.mkdirSync(envDir, { recursive: true });
1256
+ const SENSITIVE = ['KEY', 'SECRET', 'TOKEN', 'PASSWORD', 'AUTH', 'CREDENTIAL', 'PRIVATE'];
1257
+ const isSensitive = (k) => SENSITIVE.some(s => k.toUpperCase().includes(s));
1258
+ const redact = (k, v) => isSensitive(k) ? (v.length <= 4 ? '****' : v.slice(0, 2) + '*'.repeat(v.length - 4) + v.slice(-2)) : v;
1259
+ const skip = new Set(['PATH', 'HOME', 'USER', 'SHELL', 'TERM', 'LANG', 'LOGNAME', 'PWD', 'OLDPWD', 'SHLVL', 'TMPDIR']);
1260
+ const trickleVars = {};
1261
+ const appVars = {};
1262
+ for (const [k, v] of Object.entries(process.env)) {
1263
+ if (!v || k.startsWith('_'))
1264
+ continue;
1265
+ if (k.startsWith('TRICKLE_'))
1266
+ trickleVars[k] = v;
1267
+ else if (!skip.has(k))
1268
+ appVars[k] = redact(k, v);
1269
+ }
1270
+ const envSnapshot = {
1271
+ kind: 'environment',
1272
+ timestamp: Date.now(),
1273
+ node: { version: process.version, platform: process.platform, arch: process.arch },
1274
+ cwd: process.cwd(),
1275
+ argv: process.argv.slice(0, 10),
1276
+ trickle: trickleVars,
1277
+ env: appVars,
1278
+ };
1279
+ fs_1.default.writeFileSync(path_1.default.join(envDir, 'environment.json'), JSON.stringify(envSnapshot, null, 2));
1280
+ }
1281
+ catch { }
1279
1282
  }
1280
- catch { }
1281
1283
  // ── Hook 0d: Memory profiling ──
1282
1284
  try {
1283
1285
  const profileDir = process.env.TRICKLE_LOCAL_DIR || path_1.default.join(process.cwd(), '.trickle');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trickle-observe",
3
- "version": "0.2.136",
3
+ "version": "0.2.139",
4
4
  "description": "Zero-code runtime observability for JavaScript/TypeScript. Auto-instruments Express, Fastify, Koa, Hono, OpenAI, Anthropic, Gemini, MCP. Captures functions, variables, LLM calls, agent workflows.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1238,32 +1238,34 @@ if (enabled) {
1238
1238
  // ── Hook 0b4: Initialize MCP observer ──
1239
1239
  initMcpObserver();
1240
1240
 
1241
- // ── Hook 0c: Capture environment snapshot ──
1242
- try {
1243
- const envDir = process.env.TRICKLE_LOCAL_DIR || path.join(process.cwd(), '.trickle');
1244
- fs.mkdirSync(envDir, { recursive: true });
1245
- const SENSITIVE = ['KEY', 'SECRET', 'TOKEN', 'PASSWORD', 'AUTH', 'CREDENTIAL', 'PRIVATE'];
1246
- const isSensitive = (k: string) => SENSITIVE.some(s => k.toUpperCase().includes(s));
1247
- const redact = (k: string, v: string) => isSensitive(k) ? (v.length <= 4 ? '****' : v.slice(0, 2) + '*'.repeat(v.length - 4) + v.slice(-2)) : v;
1248
- const skip = new Set(['PATH', 'HOME', 'USER', 'SHELL', 'TERM', 'LANG', 'LOGNAME', 'PWD', 'OLDPWD', 'SHLVL', 'TMPDIR']);
1249
- const trickleVars: Record<string, string> = {};
1250
- const appVars: Record<string, string> = {};
1251
- for (const [k, v] of Object.entries(process.env)) {
1252
- if (!v || k.startsWith('_')) continue;
1253
- if (k.startsWith('TRICKLE_')) trickleVars[k] = v;
1254
- else if (!skip.has(k)) appVars[k] = redact(k, v);
1255
- }
1256
- const envSnapshot = {
1257
- kind: 'environment',
1258
- timestamp: Date.now(),
1259
- node: { version: process.version, platform: process.platform, arch: process.arch },
1260
- cwd: process.cwd(),
1261
- argv: process.argv.slice(0, 10),
1262
- trickle: trickleVars,
1263
- env: appVars,
1264
- };
1265
- fs.writeFileSync(path.join(envDir, 'environment.json'), JSON.stringify(envSnapshot, null, 2));
1266
- } catch {}
1241
+ // ── Hook 0c: Capture environment snapshot (opt-in via TRICKLE_CAPTURE_ENV=1) ──
1242
+ if (process.env.TRICKLE_CAPTURE_ENV === '1') {
1243
+ try {
1244
+ const envDir = process.env.TRICKLE_LOCAL_DIR || path.join(process.cwd(), '.trickle');
1245
+ fs.mkdirSync(envDir, { recursive: true });
1246
+ const SENSITIVE = ['KEY', 'SECRET', 'TOKEN', 'PASSWORD', 'AUTH', 'CREDENTIAL', 'PRIVATE'];
1247
+ const isSensitive = (k: string) => SENSITIVE.some(s => k.toUpperCase().includes(s));
1248
+ const redact = (k: string, v: string) => isSensitive(k) ? (v.length <= 4 ? '****' : v.slice(0, 2) + '*'.repeat(v.length - 4) + v.slice(-2)) : v;
1249
+ const skip = new Set(['PATH', 'HOME', 'USER', 'SHELL', 'TERM', 'LANG', 'LOGNAME', 'PWD', 'OLDPWD', 'SHLVL', 'TMPDIR']);
1250
+ const trickleVars: Record<string, string> = {};
1251
+ const appVars: Record<string, string> = {};
1252
+ for (const [k, v] of Object.entries(process.env)) {
1253
+ if (!v || k.startsWith('_')) continue;
1254
+ if (k.startsWith('TRICKLE_')) trickleVars[k] = v;
1255
+ else if (!skip.has(k)) appVars[k] = redact(k, v);
1256
+ }
1257
+ const envSnapshot = {
1258
+ kind: 'environment',
1259
+ timestamp: Date.now(),
1260
+ node: { version: process.version, platform: process.platform, arch: process.arch },
1261
+ cwd: process.cwd(),
1262
+ argv: process.argv.slice(0, 10),
1263
+ trickle: trickleVars,
1264
+ env: appVars,
1265
+ };
1266
+ fs.writeFileSync(path.join(envDir, 'environment.json'), JSON.stringify(envSnapshot, null, 2));
1267
+ } catch {}
1268
+ }
1267
1269
 
1268
1270
  // ── Hook 0d: Memory profiling ──
1269
1271
  try {