engrm 0.4.37 → 0.4.39

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.
@@ -220,6 +220,16 @@ function createDefaultConfig() {
220
220
  },
221
221
  transcript_analysis: {
222
222
  enabled: false
223
+ },
224
+ http: {
225
+ enabled: false,
226
+ port: 3767,
227
+ bearer_tokens: []
228
+ },
229
+ fleet: {
230
+ project_name: "shared-experience",
231
+ namespace: "",
232
+ api_key: ""
223
233
  }
224
234
  };
225
235
  }
@@ -281,6 +291,16 @@ function loadConfig() {
281
291
  },
282
292
  transcript_analysis: {
283
293
  enabled: asBool(config["transcript_analysis"]?.["enabled"], defaults.transcript_analysis.enabled)
294
+ },
295
+ http: {
296
+ enabled: asBool(config["http"]?.["enabled"], defaults.http.enabled),
297
+ port: asNumber(config["http"]?.["port"], defaults.http.port),
298
+ bearer_tokens: asStringArray(config["http"]?.["bearer_tokens"], defaults.http.bearer_tokens)
299
+ },
300
+ fleet: {
301
+ project_name: asString(config["fleet"]?.["project_name"], defaults.fleet.project_name),
302
+ namespace: asString(config["fleet"]?.["namespace"], defaults.fleet.namespace),
303
+ api_key: asString(config["fleet"]?.["api_key"], defaults.fleet.api_key)
284
304
  }
285
305
  };
286
306
  }
@@ -2299,6 +2319,12 @@ function containsSecrets(text, customPatterns = []) {
2299
2319
  }
2300
2320
  return false;
2301
2321
  }
2322
+ var FLEET_HOSTNAME_PATTERN = /\b(?=.{1,253}\b)(?!-)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}\b/gi;
2323
+ var FLEET_IP_PATTERN = /\b(?:\d{1,3}\.){3}\d{1,3}\b/g;
2324
+ var FLEET_MAC_PATTERN = /\b(?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}\b/gi;
2325
+ function scrubFleetIdentifiers(text) {
2326
+ return text.replace(FLEET_MAC_PATTERN, "[REDACTED_MAC]").replace(FLEET_IP_PATTERN, "[REDACTED_IP]").replace(FLEET_HOSTNAME_PATTERN, "[REDACTED_HOSTNAME]");
2327
+ }
2302
2328
 
2303
2329
  // src/capture/quality.ts
2304
2330
  var QUALITY_THRESHOLD = 0.1;
@@ -2669,6 +2695,35 @@ function narrativesConflict(narrative1, narrative2) {
2669
2695
  return null;
2670
2696
  }
2671
2697
 
2698
+ // src/sync/targets.ts
2699
+ function isFleetProjectName(projectName, config) {
2700
+ const fleetProjectName = config.fleet?.project_name ?? "shared-experience";
2701
+ if (!projectName || !fleetProjectName)
2702
+ return false;
2703
+ return projectName.trim().toLowerCase() === fleetProjectName.trim().toLowerCase();
2704
+ }
2705
+ function hasFleetTarget(config) {
2706
+ return Boolean(config.fleet?.namespace?.trim() && config.fleet?.api_key?.trim() && (config.fleet?.project_name ?? "shared-experience").trim());
2707
+ }
2708
+ function resolveSyncTarget(config, projectName) {
2709
+ if (isFleetProjectName(projectName, config) && hasFleetTarget(config)) {
2710
+ return {
2711
+ key: `fleet:${config.fleet.namespace}`,
2712
+ apiKey: config.fleet.api_key,
2713
+ namespace: config.fleet.namespace,
2714
+ siteId: config.site_id,
2715
+ isFleet: true
2716
+ };
2717
+ }
2718
+ return {
2719
+ key: `default:${config.namespace}`,
2720
+ apiKey: config.candengo_api_key,
2721
+ namespace: config.namespace,
2722
+ siteId: config.site_id,
2723
+ isFleet: false
2724
+ };
2725
+ }
2726
+
2672
2727
  // src/tools/save.ts
2673
2728
  var VALID_TYPES = [
2674
2729
  "bugfix",
@@ -2717,7 +2772,8 @@ async function saveObservation(db, config, input) {
2717
2772
  const factsJson = structuredFacts.length > 0 ? config.scrubbing.enabled ? scrubSecrets(JSON.stringify(structuredFacts), customPatterns) : JSON.stringify(structuredFacts) : null;
2718
2773
  const filesReadJson = filesRead ? JSON.stringify(filesRead) : null;
2719
2774
  const filesModifiedJson = filesModified ? JSON.stringify(filesModified) : null;
2720
- let sensitivity = input.sensitivity ?? config.scrubbing.default_sensitivity;
2775
+ const fleetProject = isFleetProjectName(project.name, config);
2776
+ let sensitivity = input.sensitivity ?? (fleetProject ? "shared" : config.scrubbing.default_sensitivity);
2721
2777
  if (config.scrubbing.enabled && containsSecrets([input.title, input.narrative, JSON.stringify(input.facts)].filter(Boolean).join(" "), customPatterns)) {
2722
2778
  if (sensitivity === "shared") {
2723
2779
  sensitivity = "personal";