@ciandt-flow/flow-ai-obs 0.16.1-beta.136 → 0.16.1

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 Jt=require('readline/promises'),Is=require('https'),E=require('fs'),ke=require('os'),L=require('path'),child_process=require('child_process'),js=require('http'),nn=require('crypto');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 Jt__namespace=/*#__PURE__*/_interopNamespace(Jt);var Is__namespace=/*#__PURE__*/_interopNamespace(Is);var E__namespace=/*#__PURE__*/_interopNamespace(E);var ke__namespace=/*#__PURE__*/_interopNamespace(ke);var L__namespace=/*#__PURE__*/_interopNamespace(L);var js__namespace=/*#__PURE__*/_interopNamespace(js);var nn__namespace=/*#__PURE__*/_interopNamespace(nn);var Vt=Object.defineProperty;var ys=Object.getOwnPropertyDescriptor;var Ss=Object.getOwnPropertyNames;var ws=Object.prototype.hasOwnProperty;var As=(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 Os=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},Z=(e,t)=>{for(var r in t)Vt(e,r,{get:t[r],enumerable:true});},Ls=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ss(t))!ws.call(e,s)&&s!==r&&Vt(e,s,{get:()=>t[s],enumerable:!(n=ys(t,s))||n.enumerable});return e};var D=e=>Ls(Vt({},"__esModule",{value:true}),e);var Gt={};Z(Gt,{bold:()=>v,cyan:()=>M,dim:()=>m,green:()=>R,red:()=>k,yellow:()=>I});function Be(e,t){return Rs?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var Rs,R,k,I,M,v,m,de=T(()=>{"use strict";Rs=!process.env.NO_COLOR&&process.stdout.isTTY;R=Be("32","39"),k=Be("31","39"),I=Be("33","39"),M=Be("36","39"),v=Be("1","22"),m=Be("2","22");});var nt=Os((Li,ks)=>{ks.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.16.1-beta.136",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 fe(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function st(e,t){let r=Jt__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 Jt=require('readline/promises'),Is=require('https'),E=require('fs'),ke=require('os'),L=require('path'),child_process=require('child_process'),js=require('http'),nn=require('crypto');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 Jt__namespace=/*#__PURE__*/_interopNamespace(Jt);var Is__namespace=/*#__PURE__*/_interopNamespace(Is);var E__namespace=/*#__PURE__*/_interopNamespace(E);var ke__namespace=/*#__PURE__*/_interopNamespace(ke);var L__namespace=/*#__PURE__*/_interopNamespace(L);var js__namespace=/*#__PURE__*/_interopNamespace(js);var nn__namespace=/*#__PURE__*/_interopNamespace(nn);var Vt=Object.defineProperty;var ys=Object.getOwnPropertyDescriptor;var Ss=Object.getOwnPropertyNames;var ws=Object.prototype.hasOwnProperty;var As=(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 Os=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},Z=(e,t)=>{for(var r in t)Vt(e,r,{get:t[r],enumerable:true});},Ls=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ss(t))!ws.call(e,s)&&s!==r&&Vt(e,s,{get:()=>t[s],enumerable:!(n=ys(t,s))||n.enumerable});return e};var D=e=>Ls(Vt({},"__esModule",{value:true}),e);var Gt={};Z(Gt,{bold:()=>v,cyan:()=>M,dim:()=>m,green:()=>R,red:()=>k,yellow:()=>I});function Be(e,t){return Rs?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var Rs,R,k,I,M,v,m,de=T(()=>{"use strict";Rs=!process.env.NO_COLOR&&process.stdout.isTTY;R=Be("32","39"),k=Be("31","39"),I=Be("33","39"),M=Be("36","39"),v=Be("1","22"),m=Be("2","22");});var nt=Os((Li,ks)=>{ks.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.16.1",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 fe(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function st(e,t){let r=Jt__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 Xt(e,t){let r=Jt__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 qt=T(()=>{"use strict";});var He={};Z(He,{checkForUpdate:()=>Ns,checkForUpdateInteractive:()=>$s,fetchLatestVersionAsync:()=>Hr,isNewer:()=>We,primeUpdateCache:()=>Fs,runUpdate:()=>Wr});function X(){return zt||(zt=nt()),zt}function We(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 er(){try{let e=JSON.parse(E__namespace.default.readFileSync(Br,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=bs?null:e}catch{return null}}function tr(e,t,r=Date.now()){try{E__namespace.default.writeFileSync(Br,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function rr(e){let t=X().name,r=Is__namespace.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Us},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 Zt(e){let t=X().name,n=` Update available: ${X().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
@@ -2,7 +2,7 @@
2
2
  'use strict';var i=require('fs'),S=require('os'),l=require('path'),child_process=require('child_process'),Oe=require('crypto'),Rt=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 i__namespace=/*#__PURE__*/_interopNamespace(i);var S__namespace=/*#__PURE__*/_interopNamespace(S);var l__namespace=/*#__PURE__*/_interopNamespace(l);var Oe__namespace=/*#__PURE__*/_interopNamespace(Oe);var Rt__default=/*#__PURE__*/_interopDefault(Rt);var j=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var Ne=Object.prototype.hasOwnProperty;var y=(e,n,t)=>()=>{if(t)throw t[0];try{return e&&(n=e(e=0)),n}catch(r){throw t=[r],r}};var De=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(t){throw n=0,t}},Ue=(e,n)=>{for(var t in n)j(e,t,{get:n[t],enumerable:true});},Fe=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of ke(n))!Ne.call(e,o)&&o!==t&&j(e,o,{get:()=>n[o],enumerable:!(r=ve(n,o))||r.enumerable});return e};var be=e=>Fe(j({},"__esModule",{value:true}),e);var se={};Ue(se,{AUTH_ENGINE:()=>V,BUFFER:()=>Ye,CLAUDE_DESKTOP:()=>f,CONFIG_DIR_NAME:()=>te,CONFIG_FILE_NAME:()=>ne,COPILOT_OTEL:()=>u,DEBUG_LOG_FILENAME:()=>G,ENV:()=>m,FLOW_URLS:()=>Me,INSTALLER:()=>$,NATIVE_OTEL:()=>W,OTLP:()=>$e,STATE_FILE_PREFIX:()=>je,TOKEN_CACHE_KEY:()=>re,TRACE_LIMITS:()=>He,VALIDATION:()=>_,getFlowBaseUrl:()=>M,getFlowUrls:()=>A,getMetrics:()=>Ke});function M(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():xe}function A(){let e=M();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 Ke(){let e=M();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var xe,Me,te,ne,re,$e,W,m,V,$,Ye,_,G,He,f,u,je,T=y(()=>{"use strict";xe="https://flow.ciandt.com";Me=A(),te="FLOW-nodejs",ne="config.json",re="tokenCache",$e={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},W={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"},m={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"},V={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},$={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},Ye={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},_={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",He={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"},je="flow-obs-";});function c(...e){if(process.env[m.FLOW_OBS_DEBUG]!=="1")return;let n=`[${new Date().toISOString()}] ${e.join(" ")}
3
3
  `;try{i.writeFileSync(Be,n,{flag:"a"});}catch(t){process.stderr.write(`[flow-obs debug ERROR] ${t.message}
4
4
  `);}}var Be,P=y(()=>{"use strict";T();Be=l.join(S.tmpdir(),G);});var B=y(()=>{"use strict";T();P();});function I(e,n){return Xe?t=>`\x1B[${e}m${t}\x1B[${n}m`:t=>t}var Xe,Bt,Je,Xt,ze,Jt,zt,oe=y(()=>{"use strict";Xe=!process.env.NO_COLOR&&process.stdout.isTTY;Bt=I("32","39"),Je=I("31","39"),Xt=I("33","39"),ze=I("36","39"),Jt=I("1","22"),zt=I("2","22");});function X(){return process.platform==="win32"?false:process.getuid?.()===0}var ie=y(()=>{"use strict";oe();});function R(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let n=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(n)return {home:n,username:process.env.SUDO_USER}}return {home:S__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||S__namespace.userInfo().username}}function C(){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 n=e.replace(/^([A-Za-z]):/,(t,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return l__namespace.join(n,".claude","settings.json")}return l__namespace.join(S__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||S__namespace.homedir();return l__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let n=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(n)return l__namespace.join(n,".claude","settings.json")}return l__namespace.join(S__namespace.homedir(),".claude","settings.json")}var v=y(()=>{"use strict";ie();});function ue(){if(process.platform==="win32"){let t=process.env.APPDATA||l__namespace.join(S__namespace.homedir(),"AppData","Roaming");return l__namespace.join(t,ae,ce)}let e=R(),n=process.env.XDG_CONFIG_HOME||l__namespace.join(e.home,".config");return l__namespace.join(n,ae,ce)}var ae,ce,pe=y(()=>{"use strict";v();ae="flow-ai-obs",ce="config.json";});function Qe(e){try{let n=i__namespace.statSync(e);Date.now()-n.mtimeMs>Ze&&i__namespace.unlinkSync(e);}catch{}try{i__namespace.writeFileSync(e,String(process.pid),{flag:"wx"});}catch(n){throw n.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+e):n}}function et(e){try{i__namespace.unlinkSync(e);}catch{}}function tt(e){let n=[];if(!e.hooks||typeof e.hooks!="object"||Array.isArray(e.hooks))return delete e.hooks,n;let t=e.hooks,r={};for(let[o,s]of Object.entries(t)){if(!Array.isArray(s))continue;let a=s.map(d=>{if(!Array.isArray(d?.hooks))return null;let h=d.hooks.filter(O=>!O.command?.startsWith?.($.CLI));return h.length>0?{...d,hooks:h}:null}).filter(d=>d!=null);a.length>0&&(r[o]=a,n.push(o));}return Object.keys(r).length>0?e.hooks=r:delete e.hooks,n}function de(e,n){let t=C(),r=t+".lock";i__namespace.mkdirSync(l__namespace.dirname(t),{recursive:true}),Qe(r);try{if(i__namespace.existsSync(t)){i__namespace.copyFileSync(t,t+".bkp");try{i__namespace.chmodSync(t+".bkp",384);}catch{}}let o=ue();if(i__namespace.existsSync(o)){let b=o+".bkp";i__namespace.copyFileSync(o,b);try{i__namespace.chmodSync(b,384);}catch{}}let s={};try{s=JSON.parse(i__namespace.readFileSync(t,"utf8"));}catch{}let a=s.env&&typeof s.env=="object"?s.env:{};delete a.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:d}=(T(),be(se)),h=d().OTEL_ENDPOINT,O={...W,OTEL_EXPORTER_OTLP_ENDPOINT:e??h};s.env={...a,...O,...n??{}},s.otelHeadersHelper="flow-ai-obs otel-headers";let F=tt(s);i__namespace.writeFileSync(t,JSON.stringify(s,null,2)+`
5
- `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}return k=void 0,{settingsPath:t,preserved:F}}finally{et(r);}}function z(e){if(k===void 0)try{let t=i__namespace.readFileSync(C(),"utf8");k=JSON.parse(t).env??null;}catch{k=null;}if(!k)return null;let n=k[e];return typeof n=="string"?n:null}function Ee(e){let n=process.env[e];return n!==void 0?n!==""?n:void 0:z(e)??void 0}function nt(){let e=z(m.FLOW_BASE_URL);return e&&e.trim()?e.trim():void 0}function ge(){let e=process.env[m.FLOW_BASE_URL];return e&&e.trim()?e.trim():nt()}var Ze,k,Y=y(()=>{"use strict";T();B();v();pe();Ze=$.LOCK_STALE_MS;});var Re=De((Vn,St)=>{St.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.16.1-beta.136",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();T();T();B();T();P();Y();P();T();Y();function me(e){if(!e)return null;try{let n=e.split(".");if(n.length<2)return null;let t=JSON.parse(Buffer.from(n[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:o,tenant:s}=t;return !r||!o||!s?null:{clientId:r,clientSecret:o,tenant:s}}catch{return null}}function ot(e){let n=process.env[m.OTEL_EXPORTER_OTLP_HEADERS];if(!n)return null;let t=e.toLowerCase();for(let r of n.split(",")){let o=r.indexOf("=");if(!(o<=0)&&r.slice(0,o).trim().toLowerCase()===t){let s=r.slice(o+1),a=s.search(/[\r\n]/);return (a===-1?s:s.slice(0,a)).trim()||null}}return null}function he(){let e=Ee(m.FLOW_USER_EMAIL);if(e!==void 0){let t=e.replace(/[\r\n]/g,"").trim();if(t)if(t.length>_.EMAIL_MAX_LENGTH)c("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${_.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!_.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 n=ot("x-flow-user");if(n){let t=n.replace(/[\r\n]/g,"").trim();if(t.length>_.EMAIL_MAX_LENGTH)c("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${_.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!_.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=S__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",r=t.lastIndexOf("\\");if(r!==-1&&(t=t.slice(r+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 o=`${t}@ciandt.com`;return c("resolveUserEmail","derived email: [REDACTED]"),o}catch(t){return c("resolveUserEmail",`Could not derive x-flow-user from OS username: ${t.message}. Run: flow-ai-obs init`),null}}function L(e){if(!e)return null;let n=e.replace(/[\r\n]/g,"").trim();return n?n.length>_.API_KEY_MAX_LENGTH?(c("validateApiKey",`API key exceeds ${_.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):_.API_KEY_PATTERN.test(n)?n:(c("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function H(){let e=process.env[m.FLOW_API_KEY];return L(e)}v();P();function _e(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.APPDATA;if(!t)try{let s=child_process.spawnSync("cmd.exe",["/c","echo","%APPDATA%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();s&&/^[A-Za-z]:\\/.test(s)&&(t=s);}catch(o){c("getVsCodeSettingsPath",`cmd.exe APPDATA lookup failed: ${o.message}`);}if(!t)return null;let r=t.replace(/^([A-Za-z]):/,(o,s)=>`/mnt/${s.toLowerCase()}`).replace(/\\/g,"/");return l__namespace.join(r,"Code","User","settings.json")}if(process.platform==="win32"){let t=process.env.APPDATA||l__namespace.join(S__namespace.homedir(),"AppData","Roaming");return l__namespace.join(t,"Code","User","settings.json")}if(process.platform==="darwin")return l__namespace.join(S__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let e=process.platform==="linux"&&process.getuid?.()===0?R().home:process.env.HOME||S__namespace.homedir(),n=process.env.XDG_CONFIG_HOME||l__namespace.join(e,".config");return l__namespace.join(n,"Code","User","settings.json")}function at(e){let n=false,t=false,r="";for(let o=0;o<e.length;o++){let s=e[o];if(n){r+=s,t?t=false:s==="\\"?t=true:s==='"'&&(n=false);continue}if(s==='"'){n=true,r+=s;continue}if(s===","){let a=o+1;for(;a<e.length&&/\s/.test(e[a]);)a++;if(a<e.length&&(e[a]==="}"||e[a]==="]"))continue}r+=s;}return r}function ct(e){if(process.env[m.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(e&&i__namespace.existsSync(e));if(e&&(i__namespace.existsSync(e)||i__namespace.existsSync(l__namespace.dirname(e))||i__namespace.existsSync(l__namespace.dirname(l__namespace.dirname(e)))))return true;let n=_e();if(n&&(i__namespace.existsSync(n)||i__namespace.existsSync(l__namespace.dirname(n))||i__namespace.existsSync(l__namespace.dirname(l__namespace.dirname(n))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",l__namespace.join(S__namespace.homedir(),"Applications","Visual Studio Code.app")].some(r=>i__namespace.existsSync(r)))return true;if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||l__namespace.join(S__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files",o=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([l__namespace.join(t,"Programs","Microsoft VS Code","Code.exe"),l__namespace.join(r,"Microsoft VS Code","Code.exe"),l__namespace.join(o,"Microsoft VS Code","Code.exe")].some(a=>i__namespace.existsSync(a)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(r=>i__namespace.existsSync(r)))}function Te(e,n={}){let t;try{t=n.customSettingsPath||_e();}catch(r){return {status:"skipped",reason:`VS Code path resolution failed: ${r.message}`}}if(!t)return {status:"skipped",reason:"VS Code path not found"};if(!ct(t))return {status:"skipped",settingsPath:t,reason:"VS Code is not installed"};try{let r={};if(i__namespace.existsSync(t))try{let x=at(i__namespace.readFileSync(t,"utf8"));r=JSON.parse(x);}catch{return {status:"skipped",settingsPath:t,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let o=e||A().OTEL_ENDPOINT,s=n.apiKey!==void 0?n.apiKey:H(),a=n.userEmail!==void 0?n.userEmail:he(),d=typeof r[u.HEADERS_KEY]=="object"&&r[u.HEADERS_KEY]!==null&&!Array.isArray(r[u.HEADERS_KEY])?r[u.HEADERS_KEY]:{},h={...d};s&&(h[u.HEADER_API_KEY]=s),a&&(h[u.HEADER_USER]=a);let O=Object.keys(h),F=Object.keys(d),b=O.length===0&&(r[u.HEADERS_KEY]===void 0||F.length===0)||O.length===F.length&&O.every(x=>d[x]===h[x]);if(r[u.ENABLED_KEY]===u.ENABLED_VALUE&&r[u.EXPORTER_TYPE_KEY]===u.EXPORTER_TYPE_VALUE&&r[u.PROTOCOL_KEY]===u.PROTOCOL_VALUE&&r[u.ENDPOINT_KEY]===o&&b)return {status:"already_configured",settingsPath:t};i__namespace.mkdirSync(l__namespace.dirname(t),{recursive:!0});let ee={...r,[u.ENABLED_KEY]:u.ENABLED_VALUE,[u.EXPORTER_TYPE_KEY]:u.EXPORTER_TYPE_VALUE,[u.PROTOCOL_KEY]:u.PROTOCOL_VALUE,[u.ENDPOINT_KEY]:o};return O.length>0&&(ee[u.HEADERS_KEY]=h),i__namespace.writeFileSync(t,JSON.stringify(ee,null,2)+`
5
+ `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}return k=void 0,{settingsPath:t,preserved:F}}finally{et(r);}}function z(e){if(k===void 0)try{let t=i__namespace.readFileSync(C(),"utf8");k=JSON.parse(t).env??null;}catch{k=null;}if(!k)return null;let n=k[e];return typeof n=="string"?n:null}function Ee(e){let n=process.env[e];return n!==void 0?n!==""?n:void 0:z(e)??void 0}function nt(){let e=z(m.FLOW_BASE_URL);return e&&e.trim()?e.trim():void 0}function ge(){let e=process.env[m.FLOW_BASE_URL];return e&&e.trim()?e.trim():nt()}var Ze,k,Y=y(()=>{"use strict";T();B();v();pe();Ze=$.LOCK_STALE_MS;});var Re=De((Vn,St)=>{St.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.16.1",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();T();T();B();T();P();Y();P();T();Y();function me(e){if(!e)return null;try{let n=e.split(".");if(n.length<2)return null;let t=JSON.parse(Buffer.from(n[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:o,tenant:s}=t;return !r||!o||!s?null:{clientId:r,clientSecret:o,tenant:s}}catch{return null}}function ot(e){let n=process.env[m.OTEL_EXPORTER_OTLP_HEADERS];if(!n)return null;let t=e.toLowerCase();for(let r of n.split(",")){let o=r.indexOf("=");if(!(o<=0)&&r.slice(0,o).trim().toLowerCase()===t){let s=r.slice(o+1),a=s.search(/[\r\n]/);return (a===-1?s:s.slice(0,a)).trim()||null}}return null}function he(){let e=Ee(m.FLOW_USER_EMAIL);if(e!==void 0){let t=e.replace(/[\r\n]/g,"").trim();if(t)if(t.length>_.EMAIL_MAX_LENGTH)c("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${_.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!_.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 n=ot("x-flow-user");if(n){let t=n.replace(/[\r\n]/g,"").trim();if(t.length>_.EMAIL_MAX_LENGTH)c("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${_.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!_.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=S__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",r=t.lastIndexOf("\\");if(r!==-1&&(t=t.slice(r+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 o=`${t}@ciandt.com`;return c("resolveUserEmail","derived email: [REDACTED]"),o}catch(t){return c("resolveUserEmail",`Could not derive x-flow-user from OS username: ${t.message}. Run: flow-ai-obs init`),null}}function L(e){if(!e)return null;let n=e.replace(/[\r\n]/g,"").trim();return n?n.length>_.API_KEY_MAX_LENGTH?(c("validateApiKey",`API key exceeds ${_.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):_.API_KEY_PATTERN.test(n)?n:(c("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function H(){let e=process.env[m.FLOW_API_KEY];return L(e)}v();P();function _e(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.APPDATA;if(!t)try{let s=child_process.spawnSync("cmd.exe",["/c","echo","%APPDATA%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();s&&/^[A-Za-z]:\\/.test(s)&&(t=s);}catch(o){c("getVsCodeSettingsPath",`cmd.exe APPDATA lookup failed: ${o.message}`);}if(!t)return null;let r=t.replace(/^([A-Za-z]):/,(o,s)=>`/mnt/${s.toLowerCase()}`).replace(/\\/g,"/");return l__namespace.join(r,"Code","User","settings.json")}if(process.platform==="win32"){let t=process.env.APPDATA||l__namespace.join(S__namespace.homedir(),"AppData","Roaming");return l__namespace.join(t,"Code","User","settings.json")}if(process.platform==="darwin")return l__namespace.join(S__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let e=process.platform==="linux"&&process.getuid?.()===0?R().home:process.env.HOME||S__namespace.homedir(),n=process.env.XDG_CONFIG_HOME||l__namespace.join(e,".config");return l__namespace.join(n,"Code","User","settings.json")}function at(e){let n=false,t=false,r="";for(let o=0;o<e.length;o++){let s=e[o];if(n){r+=s,t?t=false:s==="\\"?t=true:s==='"'&&(n=false);continue}if(s==='"'){n=true,r+=s;continue}if(s===","){let a=o+1;for(;a<e.length&&/\s/.test(e[a]);)a++;if(a<e.length&&(e[a]==="}"||e[a]==="]"))continue}r+=s;}return r}function ct(e){if(process.env[m.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(e&&i__namespace.existsSync(e));if(e&&(i__namespace.existsSync(e)||i__namespace.existsSync(l__namespace.dirname(e))||i__namespace.existsSync(l__namespace.dirname(l__namespace.dirname(e)))))return true;let n=_e();if(n&&(i__namespace.existsSync(n)||i__namespace.existsSync(l__namespace.dirname(n))||i__namespace.existsSync(l__namespace.dirname(l__namespace.dirname(n))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",l__namespace.join(S__namespace.homedir(),"Applications","Visual Studio Code.app")].some(r=>i__namespace.existsSync(r)))return true;if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||l__namespace.join(S__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files",o=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([l__namespace.join(t,"Programs","Microsoft VS Code","Code.exe"),l__namespace.join(r,"Microsoft VS Code","Code.exe"),l__namespace.join(o,"Microsoft VS Code","Code.exe")].some(a=>i__namespace.existsSync(a)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(r=>i__namespace.existsSync(r)))}function Te(e,n={}){let t;try{t=n.customSettingsPath||_e();}catch(r){return {status:"skipped",reason:`VS Code path resolution failed: ${r.message}`}}if(!t)return {status:"skipped",reason:"VS Code path not found"};if(!ct(t))return {status:"skipped",settingsPath:t,reason:"VS Code is not installed"};try{let r={};if(i__namespace.existsSync(t))try{let x=at(i__namespace.readFileSync(t,"utf8"));r=JSON.parse(x);}catch{return {status:"skipped",settingsPath:t,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let o=e||A().OTEL_ENDPOINT,s=n.apiKey!==void 0?n.apiKey:H(),a=n.userEmail!==void 0?n.userEmail:he(),d=typeof r[u.HEADERS_KEY]=="object"&&r[u.HEADERS_KEY]!==null&&!Array.isArray(r[u.HEADERS_KEY])?r[u.HEADERS_KEY]:{},h={...d};s&&(h[u.HEADER_API_KEY]=s),a&&(h[u.HEADER_USER]=a);let O=Object.keys(h),F=Object.keys(d),b=O.length===0&&(r[u.HEADERS_KEY]===void 0||F.length===0)||O.length===F.length&&O.every(x=>d[x]===h[x]);if(r[u.ENABLED_KEY]===u.ENABLED_VALUE&&r[u.EXPORTER_TYPE_KEY]===u.EXPORTER_TYPE_VALUE&&r[u.PROTOCOL_KEY]===u.PROTOCOL_VALUE&&r[u.ENDPOINT_KEY]===o&&b)return {status:"already_configured",settingsPath:t};i__namespace.mkdirSync(l__namespace.dirname(t),{recursive:!0});let ee={...r,[u.ENABLED_KEY]:u.ENABLED_VALUE,[u.EXPORTER_TYPE_KEY]:u.EXPORTER_TYPE_VALUE,[u.PROTOCOL_KEY]:u.PROTOCOL_VALUE,[u.ENDPOINT_KEY]:o};return O.length>0&&(ee[u.HEADERS_KEY]=h),i__namespace.writeFileSync(t,JSON.stringify(ee,null,2)+`
6
6
  `,{encoding:"utf8"}),{status:"configured",settingsPath:t}}catch(r){return {status:"skipped",settingsPath:t,reason:r.message}}}T();v();P();function ye(){return !!(process.env.WSL_DISTRO_NAME&&process.platform==="linux")}function q(){return process.platform==="win32"||ye()}function ut(e){let n=e.match(/^\/mnt\/([a-z])\/(.*)$/);if(!n)return e;let t=n[1].toUpperCase(),r=n[2].replace(/\//g,"\\");return `${t}:\\${r}`}function Ae(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let r=process.env.LOCALAPPDATA;if(!r)try{let o=child_process.execSync("cmd.exe /c echo %LOCALAPPDATA%",{encoding:"utf8",timeout:5e3}).trim();o&&/^[A-Za-z]:\\/.test(o)&&(r=o);}catch(o){c("getDesktopPaths",`cmd.exe LOCALAPPDATA lookup failed: ${o.message}`);}if(r){let o=r.replace(/^([A-Za-z]):/,(a,d)=>`/mnt/${d.toLowerCase()}`).replace(/\\/g,"/"),s=l__namespace.join(o,f.DIR_3P);return K(s)}}if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||l__namespace.join(S__namespace.homedir(),"AppData","Local"),o=l__namespace.join(r,f.DIR_3P);return K(o)}if(process.platform==="darwin"){let r=l__namespace.join(S__namespace.homedir(),"Library","Application Support",f.DIR_3P);return K(r)}let e=R(),n=process.env.XDG_CONFIG_HOME||l__namespace.join(e.home,".config"),t=l__namespace.join(n,f.DIR_3P);return K(t)}function K(e){return {configDir:e,configLibraryDir:l__namespace.join(e,f.CONFIG_LIBRARY_DIR),desktopConfigPath:l__namespace.join(e,f.DESKTOP_CONFIG_FILE),metaPath:l__namespace.join(e,f.CONFIG_LIBRARY_DIR,f.META_FILE)}}function Z(){let e=C(),n=l__namespace.dirname(e),t=q()?f.WRAPPER_SCRIPT_WIN:f.WRAPPER_SCRIPT_UNIX;return l__namespace.join(n,t)}function pt(){if(process.env[m.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=Ae();if(i__namespace.existsSync(e.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",l__namespace.join(S__namespace.homedir(),"Applications","Claude.app")].some(t=>i__namespace.existsSync(t));if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||l__namespace.join(S__namespace.homedir(),"AppData","Local"),t=process.env.PROGRAMFILES||"C:\\Program Files";return [l__namespace.join(n,"AnthropicClaude","Claude.exe"),l__namespace.join(t,"Claude","Claude.exe")].some(o=>i__namespace.existsSync(o))}if(process.platform==="linux"){let n=R(),t=process.env.XDG_CONFIG_HOME||l__namespace.join(n.home,".config"),r=l__namespace.join(t,"Claude");return i__namespace.existsSync(r)}return false}function ft(e){let n=e??Z();try{if(!i__namespace.existsSync(n))return null;let t=i__namespace.readFileSync(n,"utf8"),r=t.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(r&&r[1])return L(r[1]);let o=t.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(o&&o[1])return L(o[1])}catch{}return null}function dt(e,n,t=448){let r=l__namespace.dirname(e);i__namespace.mkdirSync(r,{recursive:true});let o=q(),s=o?420:t,a=true;try{i__namespace.readFileSync(e,"utf8")===n&&(a=!1);}catch{}if(!a){if(!o)try{i__namespace.chmodSync(e,t);}catch{}return {written:false}}if(i__namespace.existsSync(e)&&(i__namespace.copyFileSync(e,e+".bkp"),!o))try{i__namespace.chmodSync(e+".bkp",448);}catch{}if(i__namespace.writeFileSync(e,n,{encoding:"utf8",mode:s}),!o)try{i__namespace.chmodSync(e,t);}catch{}return {written:true}}function Et(e){let n=Z(),t=e?L(e):null,r=q()?mt(t):gt(t);return dt(n,r,!!t?448:493),n}function gt(e){let n=e?L(e):null,t=["#!/usr/bin/env bash","# Auto-generated by flow-ai-obs \u2014 do not edit manually.","# Wrapper script for Claude Desktop otelHeadersHelper.","# Invokes flow-ai-obs otel-headers to produce fresh OTLP headers at runtime.","set -euo pipefail"];return n&&t.push(`export FLOW_API_KEY="${n}"`),t.push("exec flow-ai-obs otel-headers",""),t.join(`
7
7
  `)}function mt(e){let n=e?L(e):null,t=["@echo off","REM Auto-generated by flow-ai-obs \u2014 do not edit manually.","REM Wrapper script for Claude Desktop otelHeadersHelper.","REM Invokes flow-ai-obs otel-headers to produce fresh OTLP headers at runtime."];return n&&t.push(`set FLOW_API_KEY=${n}`),t.push("flow-ai-obs otel-headers",""),t.join(`\r
8
8
  `)}var ht=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function _t(e){try{let n=i__namespace.readFileSync(e,"utf8");try{let t=JSON.parse(n);if(t.appliedId&&typeof t.appliedId=="string"&&ht.test(t.appliedId))return t.appliedId;t.appliedId&&c("getOrCreateConfigUuid","appliedId is not a valid UUID \u2014 generating new UUID");}catch{c("getOrCreateConfigUuid",`corrupted JSON in ${e} \u2014 generating new UUID`);}}catch(n){n.code!=="ENOENT"&&c("getOrCreateConfigUuid",`read error: ${n.message}`);}return Oe__namespace.randomUUID()}function Tt(e,n){let t=l__namespace.dirname(e);i__namespace.mkdirSync(t,{recursive:true});let r;try{let s=i__namespace.readFileSync(e,"utf8");try{r=JSON.parse(s),(!r.appliedId||typeof r.appliedId!="string")&&(r.appliedId=n),Array.isArray(r.entries)||(r.entries=[]);}catch{c("writeMetaJson",`corrupted JSON in ${e} \u2014 starting fresh`),r={appliedId:n,entries:[]};}}catch(s){s.code!=="ENOENT"&&c("writeMetaJson",`read error: ${s.message}`),r={appliedId:n,entries:[]};}r.entries.some(s=>s.id===n)||r.entries.push({id:n,name:f.CONFIG_NAME});let o=JSON.stringify(r,null,2)+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.16.1-beta.136",
3
+ "version": "0.16.1",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {