@ciandt-flow/flow-ai-obs 0.15.2-beta.105 → 0.15.2

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
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var er=require('readline/promises'),xs=require('https'),_=require('fs'),Re=require('os'),R=require('path'),child_process=require('child_process'),to=require('http'),En=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var er__namespace=/*#__PURE__*/_interopNamespace(er);var xs__default=/*#__PURE__*/_interopDefault(xs);var ___namespace=/*#__PURE__*/_interopNamespace(_);var Re__namespace=/*#__PURE__*/_interopNamespace(Re);var R__namespace=/*#__PURE__*/_interopNamespace(R);var to__default=/*#__PURE__*/_interopDefault(to);var En__namespace=/*#__PURE__*/_interopNamespace(En);var Zt=Object.defineProperty;var vs=Object.getOwnPropertyDescriptor;var bs=Object.getOwnPropertyNames;var Us=Object.prototype.hasOwnProperty;var Cs=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var T=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Ns=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},se=(e,t)=>{for(var r in t)Zt(e,r,{get:t[r],enumerable:true});},$s=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of bs(t))!Us.call(e,s)&&s!==r&&Zt(e,s,{get:()=>t[s],enumerable:!(n=vs(t,s))||n.enumerable});return e};var x=e=>$s(Zt({},"__esModule",{value:true}),e);var Qt={};se(Qt,{bold:()=>U,cyan:()=>M,dim:()=>m,green:()=>P,red:()=>I,yellow:()=>b});function Me(e,t){return Fs?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var Fs,P,I,b,M,U,m,pe=T(()=>{"use strict";Fs=!process.env.NO_COLOR&&process.stdout.isTTY;P=Me("32","39"),I=Me("31","39"),b=Me("33","39"),M=Me("36","39"),U=Me("1","22"),m=Me("2","22");});var st=Ns((Ni,Ds)=>{Ds.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.15.2-beta.105",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0","eslint-config-prettier":"^10.1.5",jest:"^30.4.2",lefthook:"^2.1.10",prettier:"^3.5.3","ts-jest":"^29.4.9",tsup:"^8.5.1",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function de(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function ot(e,t){let r=er__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${e} ${t===true?"(Y/n)":t===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&t!==void 0)return r.close(),t;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
2
+ 'use strict';var er=require('readline/promises'),xs=require('https'),_=require('fs'),Re=require('os'),R=require('path'),child_process=require('child_process'),to=require('http'),En=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var er__namespace=/*#__PURE__*/_interopNamespace(er);var xs__default=/*#__PURE__*/_interopDefault(xs);var ___namespace=/*#__PURE__*/_interopNamespace(_);var Re__namespace=/*#__PURE__*/_interopNamespace(Re);var R__namespace=/*#__PURE__*/_interopNamespace(R);var to__default=/*#__PURE__*/_interopDefault(to);var En__namespace=/*#__PURE__*/_interopNamespace(En);var Zt=Object.defineProperty;var vs=Object.getOwnPropertyDescriptor;var bs=Object.getOwnPropertyNames;var Us=Object.prototype.hasOwnProperty;var Cs=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var T=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Ns=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},se=(e,t)=>{for(var r in t)Zt(e,r,{get:t[r],enumerable:true});},$s=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of bs(t))!Us.call(e,s)&&s!==r&&Zt(e,s,{get:()=>t[s],enumerable:!(n=vs(t,s))||n.enumerable});return e};var x=e=>$s(Zt({},"__esModule",{value:true}),e);var Qt={};se(Qt,{bold:()=>U,cyan:()=>M,dim:()=>m,green:()=>P,red:()=>I,yellow:()=>b});function Me(e,t){return Fs?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var Fs,P,I,b,M,U,m,pe=T(()=>{"use strict";Fs=!process.env.NO_COLOR&&process.stdout.isTTY;P=Me("32","39"),I=Me("31","39"),b=Me("33","39"),M=Me("36","39"),U=Me("1","22"),m=Me("2","22");});var st=Ns((Ni,Ds)=>{Ds.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.15.2",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0","eslint-config-prettier":"^10.1.5",jest:"^30.4.2",lefthook:"^2.1.10",prettier:"^3.5.3","ts-jest":"^29.4.9",tsup:"^8.5.1",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function de(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function ot(e,t){let r=er__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${e} ${t===true?"(Y/n)":t===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&t!==void 0)return r.close(),t;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
3
  `);}catch(i){throw r.close(),i}if(r.close(),t!==void 0)return t;throw new Error("Too many invalid attempts for yes/no prompt")}async function tr(e,t){let r=er__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${e}: `)).trim();if(t);return n}catch(n){throw n}finally{r.close();}}var rr=T(()=>{"use strict";});var We={};se(We,{checkForUpdate:()=>Ys,checkForUpdateInteractive:()=>js,fetchLatestVersionAsync:()=>Xr,isNewer:()=>He,primeUpdateCache:()=>Vs,runUpdate:()=>Jr});function j(){return nr||(nr=st()),nr}function He(e,t){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(e),s=r(t);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function ir(){try{let e=JSON.parse(___namespace.default.readFileSync(Gr,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=Ws?null:e}catch{return null}}function ar(e,t,r=Date.now()){try{___namespace.default.writeFileSync(Gr,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function cr(e){let t=j().name,r=xs__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Bs},n=>{if(n.statusCode!==200)return n.resume(),e(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");e(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){e(o);}});});r.on("error",e),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function sr(e){let t=j().name,n=` Update available: ${j().version} \u2192 ${e}`,s=` Run: npm install -g ${t}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
4
4
  \u256D${i}\u256E
5
5
  \u2502${n.padEnd(o)}\u2502
package/dist/setup.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var l=require('path'),a=require('fs'),O=require('os'),child_process=require('child_process'),Ee=require('crypto'),_t=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var l__namespace=/*#__PURE__*/_interopNamespace(l);var a__namespace=/*#__PURE__*/_interopNamespace(a);var O__namespace=/*#__PURE__*/_interopNamespace(O);var Ee__namespace=/*#__PURE__*/_interopNamespace(Ee);var _t__default=/*#__PURE__*/_interopDefault(_t);var Y=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var Le=Object.getOwnPropertyNames;var Pe=Object.prototype.hasOwnProperty;var we=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};var Ie=(e,r)=>()=>{try{return r||e((r={exports:{}}).exports,r),r.exports}catch(t){throw r=0,t}},ve=(e,r)=>{for(var t in r)Y(e,t,{get:r[t],enumerable:true});},Ce=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of Le(r))!Pe.call(e,s)&&s!==t&&Y(e,s,{get:()=>r[s],enumerable:!(n=Re(r,s))||n.enumerable});return e};var ke=e=>Ce(Y({},"__esModule",{value:true}),e);var te={};ve(te,{AUTH_ENGINE:()=>j,BUFFER:()=>Fe,CLAUDE_DESKTOP:()=>f,CONFIG_DIR_NAME:()=>Q,CONFIG_FILE_NAME:()=>ee,COPILOT_OTEL:()=>u,DEBUG_LOG_FILENAME:()=>G,ENV:()=>h,FLOW_URLS:()=>Ue,HOOK_TIMEOUTS:()=>V,INSTALLER:()=>W,NATIVE_OTEL:()=>K,OTLP:()=>De,STATE_FILE_PREFIX:()=>Me,TRACE_LIMITS:()=>be,VALIDATION:()=>T,VAULT:()=>k,getFlowBaseUrl:()=>x,getFlowUrls:()=>S,getMetrics:()=>xe});function x(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ne}function S(){let e=x();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function xe(){let e=x();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ne,Ue,k,Q,ee,De,K,h,j,W,V,Fe,T,G,be,f,u,Me,y=we(()=>{"use strict";Ne="https://flow.ciandt.com";Ue=S(),k={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},Q="FLOW-nodejs",ee="config.json",De={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},K={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},h={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_SKIP_DESKTOP_DETECTION:"FLOW_OBS_SKIP_DESKTOP_DETECTION",FLOW_OBS_SKIP_COPILOT_DETECTION:"FLOW_OBS_SKIP_COPILOT_DETECTION",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL",FLOW_API_KEY:"FLOW_API_KEY",OTEL_EXPORTER_OTLP_HEADERS:"OTEL_EXPORTER_OTLP_HEADERS",FLOW_BASE_URL:"FLOW_BASE_URL"},j={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},W={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},V={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},Fe={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},T={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},G="flow-ai-obs-debug.log",be={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};f={DIR_3P:"Claude-3p",CONFIG_LIBRARY_DIR:"configLibrary",DESKTOP_CONFIG_FILE:"claude_desktop_config.json",META_FILE:"_meta.json",DEPLOYMENT_MODE:"3p",CONFIG_NAME:"Flow AI Obs",WRAPPER_SCRIPT_UNIX:"otel-headers-helper.sh",WRAPPER_SCRIPT_WIN:"otel-headers-helper.cmd",OTLP_PROTOCOL:"http/json",KEYS:{OTLP_ENDPOINT:"otlpEndpoint",OTLP_PROTOCOL:"otlpProtocol",OTLP_HEADERS_HELPER:"otlpHeadersHelper",OTLP_RESOURCE_ATTRIBUTES:"otlpResourceAttributes"},CUSTOM_PROVIDER_KEY:"custom.provider",CUSTOM_PROVIDER_VALUE:"claude-code-desktop"},u={ENABLED_KEY:"github.copilot.chat.otel.enabled",ENABLED_VALUE:!0,EXPORTER_TYPE_KEY:"github.copilot.chat.otel.exporterType",EXPORTER_TYPE_VALUE:"otlp-http",PROTOCOL_KEY:"github.copilot.chat.otel.protocol",PROTOCOL_VALUE:"http/json",ENDPOINT_KEY:"github.copilot.chat.otel.otlpEndpoint",HEADERS_KEY:"github.copilot.chat.otel.headers",HEADER_API_KEY:"x-flow-api-key",HEADER_USER:"x-flow-user"},Me="flow-obs-";});var _e=Ie((Gr,ht)=>{ht.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.15.2-beta.105",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0","eslint-config-prettier":"^10.1.5",jest:"^30.4.2",lefthook:"^2.1.10",prettier:"^3.5.3","ts-jest":"^29.4.9",tsup:"^8.5.1",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});y();y();y();var Ke=l.join(O.tmpdir(),G);function c(...e){if(process.env[h.FLOW_OBS_DEBUG]!=="1")return;let r=`[${new Date().toISOString()}] ${e.join(" ")}
2
+ 'use strict';var l=require('path'),a=require('fs'),O=require('os'),child_process=require('child_process'),Ee=require('crypto'),_t=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var l__namespace=/*#__PURE__*/_interopNamespace(l);var a__namespace=/*#__PURE__*/_interopNamespace(a);var O__namespace=/*#__PURE__*/_interopNamespace(O);var Ee__namespace=/*#__PURE__*/_interopNamespace(Ee);var _t__default=/*#__PURE__*/_interopDefault(_t);var Y=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var Le=Object.getOwnPropertyNames;var Pe=Object.prototype.hasOwnProperty;var we=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};var Ie=(e,r)=>()=>{try{return r||e((r={exports:{}}).exports,r),r.exports}catch(t){throw r=0,t}},ve=(e,r)=>{for(var t in r)Y(e,t,{get:r[t],enumerable:true});},Ce=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of Le(r))!Pe.call(e,s)&&s!==t&&Y(e,s,{get:()=>r[s],enumerable:!(n=Re(r,s))||n.enumerable});return e};var ke=e=>Ce(Y({},"__esModule",{value:true}),e);var te={};ve(te,{AUTH_ENGINE:()=>j,BUFFER:()=>Fe,CLAUDE_DESKTOP:()=>f,CONFIG_DIR_NAME:()=>Q,CONFIG_FILE_NAME:()=>ee,COPILOT_OTEL:()=>u,DEBUG_LOG_FILENAME:()=>G,ENV:()=>h,FLOW_URLS:()=>Ue,HOOK_TIMEOUTS:()=>V,INSTALLER:()=>W,NATIVE_OTEL:()=>K,OTLP:()=>De,STATE_FILE_PREFIX:()=>Me,TRACE_LIMITS:()=>be,VALIDATION:()=>T,VAULT:()=>k,getFlowBaseUrl:()=>x,getFlowUrls:()=>S,getMetrics:()=>xe});function x(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ne}function S(){let e=x();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function xe(){let e=x();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ne,Ue,k,Q,ee,De,K,h,j,W,V,Fe,T,G,be,f,u,Me,y=we(()=>{"use strict";Ne="https://flow.ciandt.com";Ue=S(),k={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},Q="FLOW-nodejs",ee="config.json",De={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},K={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},h={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_SKIP_DESKTOP_DETECTION:"FLOW_OBS_SKIP_DESKTOP_DETECTION",FLOW_OBS_SKIP_COPILOT_DETECTION:"FLOW_OBS_SKIP_COPILOT_DETECTION",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL",FLOW_API_KEY:"FLOW_API_KEY",OTEL_EXPORTER_OTLP_HEADERS:"OTEL_EXPORTER_OTLP_HEADERS",FLOW_BASE_URL:"FLOW_BASE_URL"},j={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},W={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},V={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},Fe={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},T={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},G="flow-ai-obs-debug.log",be={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};f={DIR_3P:"Claude-3p",CONFIG_LIBRARY_DIR:"configLibrary",DESKTOP_CONFIG_FILE:"claude_desktop_config.json",META_FILE:"_meta.json",DEPLOYMENT_MODE:"3p",CONFIG_NAME:"Flow AI Obs",WRAPPER_SCRIPT_UNIX:"otel-headers-helper.sh",WRAPPER_SCRIPT_WIN:"otel-headers-helper.cmd",OTLP_PROTOCOL:"http/json",KEYS:{OTLP_ENDPOINT:"otlpEndpoint",OTLP_PROTOCOL:"otlpProtocol",OTLP_HEADERS_HELPER:"otlpHeadersHelper",OTLP_RESOURCE_ATTRIBUTES:"otlpResourceAttributes"},CUSTOM_PROVIDER_KEY:"custom.provider",CUSTOM_PROVIDER_VALUE:"claude-code-desktop"},u={ENABLED_KEY:"github.copilot.chat.otel.enabled",ENABLED_VALUE:!0,EXPORTER_TYPE_KEY:"github.copilot.chat.otel.exporterType",EXPORTER_TYPE_VALUE:"otlp-http",PROTOCOL_KEY:"github.copilot.chat.otel.protocol",PROTOCOL_VALUE:"http/json",ENDPOINT_KEY:"github.copilot.chat.otel.otlpEndpoint",HEADERS_KEY:"github.copilot.chat.otel.headers",HEADER_API_KEY:"x-flow-api-key",HEADER_USER:"x-flow-user"},Me="flow-obs-";});var _e=Ie((Gr,ht)=>{ht.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.15.2",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0","eslint-config-prettier":"^10.1.5",jest:"^30.4.2",lefthook:"^2.1.10",prettier:"^3.5.3","ts-jest":"^29.4.9",tsup:"^8.5.1",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});y();y();y();var Ke=l.join(O.tmpdir(),G);function c(...e){if(process.env[h.FLOW_OBS_DEBUG]!=="1")return;let r=`[${new Date().toISOString()}] ${e.join(" ")}
3
3
  `;try{a.writeFileSync(Ke,r,{flag:"a"});}catch(t){process.stderr.write(`[flow-obs debug ERROR] ${t.message}
4
4
  `);}}!process.env.NO_COLOR&&process.stdout.isTTY;function B(){return process.platform==="win32"?false:process.getuid?.()===0}function A(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let r=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(r)return {home:r,username:process.env.SUDO_USER}}return {home:O__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||O__namespace.userInfo().username}}function I(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let t=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();t&&/^[A-Za-z]:\\/.test(t)&&(e=t);}if(e){let r=e.replace(/^([A-Za-z]):/,(t,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return l__namespace.join(r,".claude","settings.json")}return l__namespace.join(O__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||O__namespace.homedir();return l__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let r=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(r)return l__namespace.join(r,".claude","settings.json")}return l__namespace.join(O__namespace.homedir(),".claude","settings.json")}var re="flow-ai-obs",ne="config.json";function oe(){if(process.platform==="win32"){let t=process.env.APPDATA||l__namespace.join(O__namespace.homedir(),"AppData","Roaming");return l__namespace.join(t,re,ne)}let e=A(),r=process.env.XDG_CONFIG_HOME||l__namespace.join(e.home,".config");return l__namespace.join(r,re,ne)}var Be=W.LOCK_STALE_MS;function Je(e){try{let r=a__namespace.statSync(e);Date.now()-r.mtimeMs>Be&&a__namespace.unlinkSync(e);}catch{}try{a__namespace.writeFileSync(e,String(process.pid),{flag:"wx"});}catch(r){throw r.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+e):r}}function Xe(e){try{a__namespace.unlinkSync(e);}catch{}}function ze(e,r){let n=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [r,...n]}function ae(e,r){let t=I(),n=t+".lock",s=[];a__namespace.mkdirSync(l__namespace.dirname(t),{recursive:true}),Je(n);try{if(a__namespace.existsSync(t)){a__namespace.copyFileSync(t,t+".bkp");try{a__namespace.chmodSync(t+".bkp",384);}catch{}}let o=oe();if(a__namespace.existsSync(o)){let m=o+".bkp";a__namespace.copyFileSync(o,m);try{a__namespace.chmodSync(m,384);}catch{}}let i={};try{i=JSON.parse(a__namespace.readFileSync(t,"utf8"));}catch{}let g=i.env&&typeof i.env=="object"?i.env:{};delete g.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:_}=(y(),ke(te)),L=_().OTEL_ENDPOINT,F={...K,OTEL_EXPORTER_OTLP_ENDPOINT:e??L};i.env={...g,...F,...r??{}},i.otelHeadersHelper="flow-ai-obs otel-headers",(!i.hooks||typeof i.hooks!="object"||Array.isArray(i.hooks))&&(i.hooks={});let H=(m,b)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${m}`,timeout:b}]}),Z=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],C=i.hooks;for(let m of Z){let b=ze(C[m],H(m,V[m]));b.length>1&&s.push(m),C[m]=b;}a__namespace.writeFileSync(t,JSON.stringify(i,null,2)+`
5
5
  `,{encoding:"utf8",mode:384});try{a__namespace.chmodSync(t,384);}catch{}}finally{Xe(n);}return {settingsPath:t,preserved:s}}var U;function ce(e){if(U===void 0)try{let t=a__namespace.readFileSync(I(),"utf8");U=JSON.parse(t).env??null;}catch{U=null;}if(!U)return null;let r=U[e];return typeof r=="string"?r:null}function le(e){let r=process.env[e];return r!==void 0?r!==""?r:void 0:ce(e)??void 0}y();y();y();k.SERVICE;k.ACCOUNT_CREDS;k.ACCOUNT_TOKEN;y();y();function ue(e){if(!e)return null;try{let r=e.split(".");if(r.length<2)return null;let t=JSON.parse(Buffer.from(r[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:s,tenant:o}=t;return !n||!s||!o?null:{clientId:n,clientSecret:s,tenant:o}}catch{return null}}function Qe(e){let r=process.env[h.OTEL_EXPORTER_OTLP_HEADERS];if(!r)return null;let t=e.toLowerCase();for(let n of r.split(",")){let s=n.indexOf("=");if(!(s<=0)&&n.slice(0,s).trim().toLowerCase()===t){let o=n.slice(s+1),i=o.search(/[\r\n]/);return (i===-1?o:o.slice(0,i)).trim()||null}}return null}function pe(){let e=le(h.FLOW_USER_EMAIL);if(e!==void 0){let t=e.replace(/[\r\n]/g,"").trim();if(t)if(t.length>T.EMAIL_MAX_LENGTH)c("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${T.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!T.EMAIL_HEADER_PATTERN.test(t))c("resolveUserEmail","FLOW_USER_EMAIL contains non-printable or control characters \u2014 skipping");else return c("resolveUserEmail","using FLOW_USER_EMAIL override: [REDACTED]"),t}let r=Qe("x-flow-user");if(r){let t=r.replace(/[\r\n]/g,"").trim();if(t.length>T.EMAIL_MAX_LENGTH)c("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${T.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!T.EMAIL_HEADER_PATTERN.test(t))c("resolveUserEmail","x-flow-user from OTEL_EXPORTER_OTLP_HEADERS is empty or contains non-printable characters \u2014 skipping");else return c("resolveUserEmail","using x-flow-user from OTEL_EXPORTER_OTLP_HEADERS: [REDACTED]"),t}try{let t=O__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",n=t.lastIndexOf("\\");if(n!==-1&&(t=t.slice(n+1)),t=t.trim().replace(/[^a-zA-Z0-9._%+\-]/g,"").replace(/^\.+/,""),!t)return c("resolveUserEmail","Could not derive x-flow-user: username is empty. Run: flow-ai-obs init"),null;let s=`${t}@ciandt.com`;return c("resolveUserEmail","derived email: [REDACTED]"),s}catch(t){return c("resolveUserEmail",`Could not derive x-flow-user from OS username: ${t.message}. Run: flow-ai-obs init`),null}}function R(e){if(!e)return null;let r=e.replace(/[\r\n]/g,"").trim();return r?r.length>T.API_KEY_MAX_LENGTH?(c("validateApiKey",`API key exceeds ${T.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):T.API_KEY_PATTERN.test(r)?r:(c("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function M(){let e=process.env[h.FLOW_API_KEY];return R(e)}function fe(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.APPDATA;if(!t)try{let o=child_process.spawnSync("cmd.exe",["/c","echo","%APPDATA%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();o&&/^[A-Za-z]:\\/.test(o)&&(t=o);}catch(s){c("getVsCodeSettingsPath",`cmd.exe APPDATA lookup failed: ${s.message}`);}if(!t)return null;let n=t.replace(/^([A-Za-z]):/,(s,o)=>`/mnt/${o.toLowerCase()}`).replace(/\\/g,"/");return l__namespace.join(n,"Code","User","settings.json")}if(process.platform==="win32"){let t=process.env.APPDATA||l__namespace.join(O__namespace.homedir(),"AppData","Roaming");return l__namespace.join(t,"Code","User","settings.json")}if(process.platform==="darwin")return l__namespace.join(O__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let e=process.platform==="linux"&&process.getuid?.()===0?A().home:process.env.HOME||O__namespace.homedir(),r=process.env.XDG_CONFIG_HOME||l__namespace.join(e,".config");return l__namespace.join(r,"Code","User","settings.json")}function tt(e){let r=false,t=false,n="";for(let s=0;s<e.length;s++){let o=e[s];if(r){n+=o,t?t=false:o==="\\"?t=true:o==='"'&&(r=false);continue}if(o==='"'){r=true,n+=o;continue}if(o===","){let i=s+1;for(;i<e.length&&/\s/.test(e[i]);)i++;if(i<e.length&&(e[i]==="}"||e[i]==="]"))continue}n+=o;}return n}function rt(e){if(process.env[h.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(e&&a__namespace.existsSync(e));if(e&&(a__namespace.existsSync(e)||a__namespace.existsSync(l__namespace.dirname(e))||a__namespace.existsSync(l__namespace.dirname(l__namespace.dirname(e)))))return true;let r=fe();if(r&&(a__namespace.existsSync(r)||a__namespace.existsSync(l__namespace.dirname(r))||a__namespace.existsSync(l__namespace.dirname(l__namespace.dirname(r))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",l__namespace.join(O__namespace.homedir(),"Applications","Visual Studio Code.app")].some(n=>a__namespace.existsSync(n)))return true;if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||l__namespace.join(O__namespace.homedir(),"AppData","Local"),n=process.env.PROGRAMFILES||"C:\\Program Files",s=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([l__namespace.join(t,"Programs","Microsoft VS Code","Code.exe"),l__namespace.join(n,"Microsoft VS Code","Code.exe"),l__namespace.join(s,"Microsoft VS Code","Code.exe")].some(i=>a__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(n=>a__namespace.existsSync(n)))}function de(e,r={}){let t;try{t=r.customSettingsPath||fe();}catch(n){return {status:"skipped",reason:`VS Code path resolution failed: ${n.message}`}}if(!t)return {status:"skipped",reason:"VS Code path not found"};if(!rt(t))return {status:"skipped",settingsPath:t,reason:"VS Code is not installed"};try{let n={};if(a__namespace.existsSync(t))try{let m=tt(a__namespace.readFileSync(t,"utf8"));n=JSON.parse(m);}catch{return {status:"skipped",settingsPath:t,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=e||S().OTEL_ENDPOINT,o=r.apiKey!==void 0?r.apiKey:M(),i=r.userEmail!==void 0?r.userEmail:pe(),g=typeof n[u.HEADERS_KEY]=="object"&&n[u.HEADERS_KEY]!==null&&!Array.isArray(n[u.HEADERS_KEY])?n[u.HEADERS_KEY]:{},_={...g};o&&(_[u.HEADER_API_KEY]=o),i&&(_[u.HEADER_USER]=i);let L=Object.keys(_),F=Object.keys(g),H=L.length===0&&(n[u.HEADERS_KEY]===void 0||F.length===0)||L.length===F.length&&L.every(m=>g[m]===_[m]);if(n[u.ENABLED_KEY]===u.ENABLED_VALUE&&n[u.EXPORTER_TYPE_KEY]===u.EXPORTER_TYPE_VALUE&&n[u.PROTOCOL_KEY]===u.PROTOCOL_VALUE&&n[u.ENDPOINT_KEY]===s&&H)return {status:"already_configured",settingsPath:t};a__namespace.mkdirSync(l__namespace.dirname(t),{recursive:!0});let C={...n,[u.ENABLED_KEY]:u.ENABLED_VALUE,[u.EXPORTER_TYPE_KEY]:u.EXPORTER_TYPE_VALUE,[u.PROTOCOL_KEY]:u.PROTOCOL_VALUE,[u.ENDPOINT_KEY]:s};return L.length>0&&(C[u.HEADERS_KEY]=_),a__namespace.writeFileSync(t,JSON.stringify(C,null,2)+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.15.2-beta.105",
3
+ "version": "0.15.2",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {