@ciandt-flow/flow-ai-obs 0.16.0-beta.122 → 0.16.0-beta.128

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 zt=require('readline/promises'),Ds=require('https'),E=require('fs'),Le=require('os'),L=require('path'),child_process=require('child_process'),eo=require('http'),fn=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 zt__namespace=/*#__PURE__*/_interopNamespace(zt);var Ds__default=/*#__PURE__*/_interopDefault(Ds);var E__namespace=/*#__PURE__*/_interopNamespace(E);var Le__namespace=/*#__PURE__*/_interopNamespace(Le);var L__namespace=/*#__PURE__*/_interopNamespace(L);var eo__default=/*#__PURE__*/_interopDefault(eo);var fn__namespace=/*#__PURE__*/_interopNamespace(fn);var Xt=Object.defineProperty;var Is=Object.getOwnPropertyDescriptor;var vs=Object.getOwnPropertyNames;var bs=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 _=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Us=(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)Xt(e,r,{get:t[r],enumerable:true});},Ns=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of vs(t))!bs.call(e,s)&&s!==r&&Xt(e,s,{get:()=>t[s],enumerable:!(n=Is(t,s))||n.enumerable});return e};var x=e=>Ns(Xt({},"__esModule",{value:true}),e);var qt={};se(qt,{bold:()=>v,cyan:()=>M,dim:()=>m,green:()=>R,red:()=>k,yellow:()=>I});function De(e,t){return $s?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var $s,R,k,I,M,v,m,pe=_(()=>{"use strict";$s=!process.env.NO_COLOR&&process.stdout.isTTY;R=De("32","39"),k=De("31","39"),I=De("33","39"),M=De("36","39"),v=De("1","22"),m=De("2","22");});var nt=Us((Ui,Fs)=>{Fs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.16.0-beta.122",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 st(e,t){let r=zt__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 zt=require('readline/promises'),Ds=require('https'),E=require('fs'),Le=require('os'),L=require('path'),child_process=require('child_process'),eo=require('http'),fn=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 zt__namespace=/*#__PURE__*/_interopNamespace(zt);var Ds__default=/*#__PURE__*/_interopDefault(Ds);var E__namespace=/*#__PURE__*/_interopNamespace(E);var Le__namespace=/*#__PURE__*/_interopNamespace(Le);var L__namespace=/*#__PURE__*/_interopNamespace(L);var eo__default=/*#__PURE__*/_interopDefault(eo);var fn__namespace=/*#__PURE__*/_interopNamespace(fn);var Xt=Object.defineProperty;var Is=Object.getOwnPropertyDescriptor;var vs=Object.getOwnPropertyNames;var bs=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 _=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Us=(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)Xt(e,r,{get:t[r],enumerable:true});},Ns=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of vs(t))!bs.call(e,s)&&s!==r&&Xt(e,s,{get:()=>t[s],enumerable:!(n=Is(t,s))||n.enumerable});return e};var x=e=>Ns(Xt({},"__esModule",{value:true}),e);var qt={};se(qt,{bold:()=>v,cyan:()=>M,dim:()=>m,green:()=>R,red:()=>k,yellow:()=>I});function De(e,t){return $s?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var $s,R,k,I,M,v,m,pe=_(()=>{"use strict";$s=!process.env.NO_COLOR&&process.stdout.isTTY;R=De("32","39"),k=De("31","39"),I=De("33","39"),M=De("36","39"),v=De("1","22"),m=De("2","22");});var nt=Us((Ui,Fs)=>{Fs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.16.0-beta.128",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 st(e,t){let r=zt__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 Zt(e,t){let r=zt__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=_(()=>{"use strict";});var Me={};se(Me,{checkForUpdate:()=>Ks,checkForUpdateInteractive:()=>Ys,fetchLatestVersionAsync:()=>Vr,isNewer:()=>xe,primeUpdateCache:()=>js,runUpdate:()=>jr});function V(){return er||(er=nt()),er}function xe(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 nr(){try{let e=JSON.parse(E__namespace.default.readFileSync(Yr,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=Ws?null:e}catch{return null}}function sr(e,t,r=Date.now()){try{E__namespace.default.writeFileSync(Yr,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function or(e){let t=V().name,r=Ds__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 tr(e){let t=V().name,n=` Update available: ${V().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,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var l=require('path'),i=require('fs'),S=require('os'),child_process=require('child_process'),pe=require('crypto'),gt=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 i__namespace=/*#__PURE__*/_interopNamespace(i);var S__namespace=/*#__PURE__*/_interopNamespace(S);var pe__namespace=/*#__PURE__*/_interopNamespace(pe);var gt__default=/*#__PURE__*/_interopDefault(gt);var Y=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Se=Object.getOwnPropertyNames;var Ae=Object.prototype.hasOwnProperty;var Re=(e,n,t)=>()=>{if(t)throw t[0];try{return e&&(n=e(e=0)),n}catch(r){throw t=[r],r}};var Le=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(t){throw n=0,t}},Pe=(e,n)=>{for(var t in n)Y(e,t,{get:n[t],enumerable:true});},we=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Se(n))!Ae.call(e,o)&&o!==t&&Y(e,o,{get:()=>n[o],enumerable:!(r=Oe(n,o))||r.enumerable});return e};var Ie=e=>we(Y({},"__esModule",{value:true}),e);var Z={};Pe(Z,{AUTH_ENGINE:()=>j,BUFFER:()=>ke,CLAUDE_DESKTOP:()=>f,CONFIG_DIR_NAME:()=>z,CONFIG_FILE_NAME:()=>q,COPILOT_OTEL:()=>u,DEBUG_LOG_FILENAME:()=>K,ENV:()=>h,FLOW_URLS:()=>Ce,INSTALLER:()=>x,NATIVE_OTEL:()=>H,OTLP:()=>Ne,STATE_FILE_PREFIX:()=>Fe,TRACE_LIMITS:()=>De,VALIDATION:()=>_,VAULT:()=>v,getFlowBaseUrl:()=>b,getFlowUrls:()=>O,getMetrics:()=>Ue});function b(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():ve}function O(){let e=b();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 Ue(){let e=b();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var ve,Ce,v,z,q,Ne,H,h,j,x,ke,_,K,De,f,u,Fe,T=Re(()=>{"use strict";ve="https://flow.ciandt.com";Ce=O(),v={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},z="FLOW-nodejs",q="config.json",Ne={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},H={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},x={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},ke={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]+$/},K="flow-ai-obs-debug.log",De={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"},Fe="flow-obs-";});var ge=Le((Vn,Et)=>{Et.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.16.0-beta.122",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"}};});T();T();T();var $e=l.join(S.tmpdir(),K);function c(...e){if(process.env[h.FLOW_OBS_DEBUG]!=="1")return;let n=`[${new Date().toISOString()}] ${e.join(" ")}
2
+ 'use strict';var l=require('path'),i=require('fs'),S=require('os'),child_process=require('child_process'),pe=require('crypto'),gt=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 i__namespace=/*#__PURE__*/_interopNamespace(i);var S__namespace=/*#__PURE__*/_interopNamespace(S);var pe__namespace=/*#__PURE__*/_interopNamespace(pe);var gt__default=/*#__PURE__*/_interopDefault(gt);var H=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Se=Object.getOwnPropertyNames;var Ae=Object.prototype.hasOwnProperty;var Re=(e,n,t)=>()=>{if(t)throw t[0];try{return e&&(n=e(e=0)),n}catch(r){throw t=[r],r}};var Le=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(t){throw n=0,t}},Pe=(e,n)=>{for(var t in n)H(e,t,{get:n[t],enumerable:true});},we=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Se(n))!Ae.call(e,o)&&o!==t&&H(e,o,{get:()=>n[o],enumerable:!(r=Oe(n,o))||r.enumerable});return e};var Ie=e=>we(H({},"__esModule",{value:true}),e);var Q={};Pe(Q,{AUTH_ENGINE:()=>K,BUFFER:()=>ke,CLAUDE_DESKTOP:()=>f,CONFIG_DIR_NAME:()=>q,CONFIG_FILE_NAME:()=>Z,COPILOT_OTEL:()=>u,DEBUG_LOG_FILENAME:()=>W,ENV:()=>h,FLOW_URLS:()=>Ce,INSTALLER:()=>x,NATIVE_OTEL:()=>j,OTLP:()=>Ne,STATE_FILE_PREFIX:()=>Fe,TRACE_LIMITS:()=>De,VALIDATION:()=>_,VAULT:()=>v,getFlowBaseUrl:()=>b,getFlowUrls:()=>O,getMetrics:()=>Ue});function b(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():ve}function O(){let e=b();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 Ue(){let e=b();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var ve,Ce,v,q,Z,Ne,j,h,K,x,ke,_,W,De,f,u,Fe,T=Re(()=>{"use strict";ve="https://flow.ciandt.com";Ce=O(),v={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},q="FLOW-nodejs",Z="config.json",Ne={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},j={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"},K={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},x={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},ke={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]+$/},W="flow-ai-obs-debug.log",De={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"},Fe="flow-obs-";});var ge=Le((Gn,Et)=>{Et.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.16.0-beta.128",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"}};});T();T();T();var $e=l.join(S.tmpdir(),W);function c(...e){if(process.env[h.FLOW_OBS_DEBUG]!=="1")return;let n=`[${new Date().toISOString()}] ${e.join(" ")}
3
3
  `;try{i.writeFileSync($e,n,{flag:"a"});}catch(t){process.stderr.write(`[flow-obs debug ERROR] ${t.message}
4
- `);}}!process.env.NO_COLOR&&process.stdout.isTTY;function W(){return process.platform==="win32"?false:process.getuid?.()===0}function A(){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 w(){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 Q="flow-ai-obs",ee="config.json";function ne(){if(process.platform==="win32"){let t=process.env.APPDATA||l__namespace.join(S__namespace.homedir(),"AppData","Roaming");return l__namespace.join(t,Q,ee)}let e=A(),n=process.env.XDG_CONFIG_HOME||l__namespace.join(e.home,".config");return l__namespace.join(n,Q,ee)}var We=x.LOCK_STALE_MS;function Ve(e){try{let n=i__namespace.statSync(e);Date.now()-n.mtimeMs>We&&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 Ge(e){try{i__namespace.unlinkSync(e);}catch{}}function Be(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 m=d.hooks.filter(y=>!y.command?.startsWith?.(x.CLI));return m.length>0?{...d,hooks:m}: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 se(e,n){let t=w(),r=t+".lock";i__namespace.mkdirSync(l__namespace.dirname(t),{recursive:true}),Ve(r);try{if(i__namespace.existsSync(t)){i__namespace.copyFileSync(t,t+".bkp");try{i__namespace.chmodSync(t+".bkp",384);}catch{}}let o=ne();if(i__namespace.existsSync(o)){let U=o+".bkp";i__namespace.copyFileSync(o,U);try{i__namespace.chmodSync(U,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(),Ie(Z)),m=d().OTEL_ENDPOINT,y={...H,OTEL_EXPORTER_OTLP_ENDPOINT:e??m};s.env={...a,...y,...n??{}},s.otelHeadersHelper="flow-ai-obs otel-headers";let D=Be(s);i__namespace.writeFileSync(t,JSON.stringify(s,null,2)+`
5
- `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}return {settingsPath:t,preserved:D}}finally{Ge(r);}}var N;function oe(e){if(N===void 0)try{let t=i__namespace.readFileSync(w(),"utf8");N=JSON.parse(t).env??null;}catch{N=null;}if(!N)return null;let n=N[e];return typeof n=="string"?n:null}function ie(e){let n=process.env[e];return n!==void 0?n!==""?n:void 0:oe(e)??void 0}T();T();T();v.SERVICE;v.ACCOUNT_CREDS;v.ACCOUNT_TOKEN;T();T();function ae(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 ze(e){let n=process.env[h.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 ce(){let e=ie(h.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=ze("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 R(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 M(){let e=process.env[h.FLOW_API_KEY];return R(e)}function le(){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?A().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 Ze(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 Qe(e){if(process.env[h.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=le();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 ue(e,n={}){let t;try{t=n.customSettingsPath||le();}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(!Qe(t))return {status:"skipped",settingsPath:t,reason:"VS Code is not installed"};try{let r={};if(i__namespace.existsSync(t))try{let F=Ze(i__namespace.readFileSync(t,"utf8"));r=JSON.parse(F);}catch{return {status:"skipped",settingsPath:t,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let o=e||O().OTEL_ENDPOINT,s=n.apiKey!==void 0?n.apiKey:M(),a=n.userEmail!==void 0?n.userEmail:ce(),d=typeof r[u.HEADERS_KEY]=="object"&&r[u.HEADERS_KEY]!==null&&!Array.isArray(r[u.HEADERS_KEY])?r[u.HEADERS_KEY]:{},m={...d};s&&(m[u.HEADER_API_KEY]=s),a&&(m[u.HEADER_USER]=a);let y=Object.keys(m),D=Object.keys(d),U=y.length===0&&(r[u.HEADERS_KEY]===void 0||D.length===0)||y.length===D.length&&y.every(F=>d[F]===m[F]);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&&U)return {status:"already_configured",settingsPath:t};i__namespace.mkdirSync(l__namespace.dirname(t),{recursive:!0});let X={...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 y.length>0&&(X[u.HEADERS_KEY]=m),i__namespace.writeFileSync(t,JSON.stringify(X,null,2)+`
6
- `,{encoding:"utf8"}),{status:"configured",settingsPath:t}}catch(r){return {status:"skipped",settingsPath:t,reason:r.message}}}T();function fe(){return !!(process.env.WSL_DISTRO_NAME&&process.platform==="linux")}function G(){return process.platform==="win32"||fe()}function tt(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 de(){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 $(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 $(o)}if(process.platform==="darwin"){let r=l__namespace.join(S__namespace.homedir(),"Library","Application Support",f.DIR_3P);return $(r)}let e=A(),n=process.env.XDG_CONFIG_HOME||l__namespace.join(e.home,".config"),t=l__namespace.join(n,f.DIR_3P);return $(t)}function $(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 B(){let e=w(),n=l__namespace.dirname(e),t=G()?f.WRAPPER_SCRIPT_WIN:f.WRAPPER_SCRIPT_UNIX;return l__namespace.join(n,t)}function nt(){if(process.env[h.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=de();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=A(),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 rt(e){let n=e??B();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 R(r[1]);let o=t.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(o&&o[1])return R(o[1])}catch{}return null}function st(e,n,t=448){let r=l__namespace.dirname(e);i__namespace.mkdirSync(r,{recursive:true});let o=G(),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 ot(e){let n=B(),t=e?R(e):null,r=G()?at(t):it(t);return st(n,r,!!t?448:493),n}function it(e){let n=e?R(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(`
4
+ `);}}!process.env.NO_COLOR&&process.stdout.isTTY;function V(){return process.platform==="win32"?false:process.getuid?.()===0}function A(){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 w(){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 ee="flow-ai-obs",te="config.json";function re(){if(process.platform==="win32"){let t=process.env.APPDATA||l__namespace.join(S__namespace.homedir(),"AppData","Roaming");return l__namespace.join(t,ee,te)}let e=A(),n=process.env.XDG_CONFIG_HOME||l__namespace.join(e.home,".config");return l__namespace.join(n,ee,te)}var We=x.LOCK_STALE_MS;function Ve(e){try{let n=i__namespace.statSync(e);Date.now()-n.mtimeMs>We&&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 Ge(e){try{i__namespace.unlinkSync(e);}catch{}}function Be(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 m=d.hooks.filter(y=>!y.command?.startsWith?.(x.CLI));return m.length>0?{...d,hooks:m}: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 oe(e,n){let t=w(),r=t+".lock";i__namespace.mkdirSync(l__namespace.dirname(t),{recursive:true}),Ve(r);try{if(i__namespace.existsSync(t)){i__namespace.copyFileSync(t,t+".bkp");try{i__namespace.chmodSync(t+".bkp",384);}catch{}}let o=re();if(i__namespace.existsSync(o)){let U=o+".bkp";i__namespace.copyFileSync(o,U);try{i__namespace.chmodSync(U,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(),Ie(Q)),m=d().OTEL_ENDPOINT,y={...j,OTEL_EXPORTER_OTLP_ENDPOINT:e??m};s.env={...a,...y,...n??{}},s.otelHeadersHelper="flow-ai-obs otel-headers";let D=Be(s);i__namespace.writeFileSync(t,JSON.stringify(s,null,2)+`
5
+ `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}return {settingsPath:t,preserved:D}}finally{Ge(r);}}var N;function ie(e){if(N===void 0)try{let t=i__namespace.readFileSync(w(),"utf8");N=JSON.parse(t).env??null;}catch{N=null;}if(!N)return null;let n=N[e];return typeof n=="string"?n:null}function M(e){let n=process.env[e];return n!==void 0?n!==""?n:void 0:ie(e)??void 0}T();T();T();v.SERVICE;v.ACCOUNT_CREDS;v.ACCOUNT_TOKEN;T();T();function ae(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 ze(e){let n=process.env[h.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 ce(){let e=M(h.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=ze("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 R(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 $(){let e=process.env[h.FLOW_API_KEY];return R(e)}function le(){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?A().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 Ze(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 Qe(e){if(process.env[h.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=le();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 ue(e,n={}){let t;try{t=n.customSettingsPath||le();}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(!Qe(t))return {status:"skipped",settingsPath:t,reason:"VS Code is not installed"};try{let r={};if(i__namespace.existsSync(t))try{let F=Ze(i__namespace.readFileSync(t,"utf8"));r=JSON.parse(F);}catch{return {status:"skipped",settingsPath:t,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let o=e||O().OTEL_ENDPOINT,s=n.apiKey!==void 0?n.apiKey:$(),a=n.userEmail!==void 0?n.userEmail:ce(),d=typeof r[u.HEADERS_KEY]=="object"&&r[u.HEADERS_KEY]!==null&&!Array.isArray(r[u.HEADERS_KEY])?r[u.HEADERS_KEY]:{},m={...d};s&&(m[u.HEADER_API_KEY]=s),a&&(m[u.HEADER_USER]=a);let y=Object.keys(m),D=Object.keys(d),U=y.length===0&&(r[u.HEADERS_KEY]===void 0||D.length===0)||y.length===D.length&&y.every(F=>d[F]===m[F]);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&&U)return {status:"already_configured",settingsPath:t};i__namespace.mkdirSync(l__namespace.dirname(t),{recursive:!0});let z={...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 y.length>0&&(z[u.HEADERS_KEY]=m),i__namespace.writeFileSync(t,JSON.stringify(z,null,2)+`
6
+ `,{encoding:"utf8"}),{status:"configured",settingsPath:t}}catch(r){return {status:"skipped",settingsPath:t,reason:r.message}}}T();function fe(){return !!(process.env.WSL_DISTRO_NAME&&process.platform==="linux")}function B(){return process.platform==="win32"||fe()}function tt(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 de(){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 Y(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 Y(o)}if(process.platform==="darwin"){let r=l__namespace.join(S__namespace.homedir(),"Library","Application Support",f.DIR_3P);return Y(r)}let e=A(),n=process.env.XDG_CONFIG_HOME||l__namespace.join(e.home,".config"),t=l__namespace.join(n,f.DIR_3P);return Y(t)}function Y(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 J(){let e=w(),n=l__namespace.dirname(e),t=B()?f.WRAPPER_SCRIPT_WIN:f.WRAPPER_SCRIPT_UNIX;return l__namespace.join(n,t)}function nt(){if(process.env[h.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=de();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=A(),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 rt(e){let n=e??J();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 R(r[1]);let o=t.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(o&&o[1])return R(o[1])}catch{}return null}function st(e,n,t=448){let r=l__namespace.dirname(e);i__namespace.mkdirSync(r,{recursive:true});let o=B(),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 ot(e){let n=J(),t=e?R(e):null,r=B()?at(t):it(t);return st(n,r,!!t?448:493),n}function it(e){let n=e?R(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 at(e){let n=e?R(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 ct=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function lt(e){try{let n=i__namespace.readFileSync(e,"utf8");try{let t=JSON.parse(n);if(t.appliedId&&typeof t.appliedId=="string"&&ct.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 pe__namespace.randomUUID()}function ut(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)+`
9
9
  `;try{if(i__namespace.readFileSync(e,"utf8")===o)return}catch{}if(i__namespace.existsSync(e)){i__namespace.copyFileSync(e,e+".bkp");try{i__namespace.chmodSync(e+".bkp",384);}catch{}}i__namespace.writeFileSync(e,o,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(e,384);}catch{}}function pt(e,n,t,r){i__namespace.mkdirSync(e,{recursive:true});let o=l__namespace.resolve(e),s=l__namespace.resolve(e,`${n}.json`);if(!s.startsWith(o+l__namespace.sep))throw new Error(`Security error: invalid config path ${s}`);let a={};try{let m=i__namespace.readFileSync(s,"utf8");try{a=JSON.parse(m);}catch{c("writeConfigLibraryFile",`corrupted JSON in ${s} \u2014 starting fresh`);}}catch(m){m.code!=="ENOENT"&&c("writeConfigLibraryFile",`read error: ${m.message}`);}a[f.KEYS.OTLP_ENDPOINT]=t,a[f.KEYS.OTLP_PROTOCOL]=f.OTLP_PROTOCOL,a[f.KEYS.OTLP_HEADERS_HELPER]=fe()?tt(r):r,a[f.KEYS.OTLP_RESOURCE_ATTRIBUTES]={[f.CUSTOM_PROVIDER_KEY]:f.CUSTOM_PROVIDER_VALUE};let d=JSON.stringify(a,null,2)+`
10
10
  `;try{if(i__namespace.readFileSync(s,"utf8")===d)return s}catch{}if(i__namespace.existsSync(s)){i__namespace.copyFileSync(s,s+".bkp");try{i__namespace.chmodSync(s+".bkp",384);}catch{}}i__namespace.writeFileSync(s,d,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(s,384);}catch{}return s}function ft(e){let n=l__namespace.dirname(e);i__namespace.mkdirSync(n,{recursive:true});let t={};try{let r=i__namespace.readFileSync(e,"utf8");try{t=JSON.parse(r);}catch{c("mergeClaudeDesktopConfig",`corrupted JSON in ${e} \u2014 starting fresh (original backed up to .bkp)`);}}catch(r){r.code!=="ENOENT"&&c("mergeClaudeDesktopConfig",`read error: ${r.message}`);}if(t.deploymentMode!==f.DEPLOYMENT_MODE){if(i__namespace.existsSync(e)){i__namespace.copyFileSync(e,e+".bkp");try{i__namespace.chmodSync(e+".bkp",384);}catch{}}t.deploymentMode=f.DEPLOYMENT_MODE,i__namespace.writeFileSync(e,JSON.stringify(t,null,2)+`
11
- `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(e,384);}catch{}}}function Ee(e,n){if(!nt())return {configured:false};let t=de(),r=O().OTEL_ENDPOINT,o=M()??rt(B()),s=ot(o),a=lt(t.metaPath),d=pt(t.configLibraryDir,a,r,s);return ut(t.metaPath,a),ft(t.desktopConfigPath),{configured:true,configDir:t.configDir,configLibraryPath:d,uuid:a,wrapperScriptPath:s}}T();var J;function he(){return J||(J=ge()),J}var _e=l__namespace.default.join(S__namespace.default.tmpdir(),"flow-obs-update-cache.json"),_t=1440*60*1e3,Tt=3e3;function yt(e,n){let t=s=>{let a=String(s).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[3]]:null},r=t(e),o=t(n);return !r||!o?false:o[0]!==r[0]?o[0]>r[0]:o[1]!==r[1]?o[1]>r[1]:o[2]>r[2]}function Ot(){try{let e=JSON.parse(i__namespace.default.readFileSync(_e,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=_t?null:e}catch{return null}}function St(e,n,t=Date.now()){try{i__namespace.default.writeFileSync(_e,JSON.stringify({latestVersion:e,updatePriority:n??null,checkedAt:t}),{mode:384});}catch{}}function At(e){let n=he().name,t=gt__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(n)}/latest`,{timeout:Tt},r=>{if(r.statusCode!==200)return r.resume(),e(new Error(`HTTP ${r.statusCode}`));let o="";r.setEncoding("utf8"),r.on("data",s=>{o+=s;}),r.on("end",()=>{try{let s=JSON.parse(o);if(typeof s.version!="string")throw new Error("no version field");e(null,{version:s.version,updatePriority:typeof s.updatePriority=="string"?s.updatePriority:null});}catch(s){e(s);}});});t.on("error",e),t.on("timeout",()=>{t.destroy(new Error("timeout"));});}function Te(){try{if(Ot())return;setImmediate(()=>{At((e,n)=>{e||!n||yt(he().version,n.version)&&St(n.version,n.updatePriority,0);});});}catch{}}var Rt=l__namespace.default.resolve(__dirname,".."),Lt=process.env.INIT_CWD?l__namespace.default.resolve(process.env.INIT_CWD):null;Lt===Rt&&process.exit(0);W()&&(process.stderr.write(`
11
+ `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(e,384);}catch{}}}function Ee(e,n){if(!nt())return {configured:false};let t=de(),r=O().OTEL_ENDPOINT,o=$()??rt(J()),s=ot(o),a=lt(t.metaPath),d=pt(t.configLibraryDir,a,r,s);return ut(t.metaPath,a),ft(t.desktopConfigPath),{configured:true,configDir:t.configDir,configLibraryPath:d,uuid:a,wrapperScriptPath:s}}T();var X;function he(){return X||(X=ge()),X}var _e=l__namespace.default.join(S__namespace.default.tmpdir(),"flow-obs-update-cache.json"),_t=1440*60*1e3,Tt=3e3;function yt(e,n){let t=s=>{let a=String(s).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[3]]:null},r=t(e),o=t(n);return !r||!o?false:o[0]!==r[0]?o[0]>r[0]:o[1]!==r[1]?o[1]>r[1]:o[2]>r[2]}function Ot(){try{let e=JSON.parse(i__namespace.default.readFileSync(_e,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=_t?null:e}catch{return null}}function St(e,n,t=Date.now()){try{i__namespace.default.writeFileSync(_e,JSON.stringify({latestVersion:e,updatePriority:n??null,checkedAt:t}),{mode:384});}catch{}}function At(e){let n=he().name,t=gt__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(n)}/latest`,{timeout:Tt},r=>{if(r.statusCode!==200)return r.resume(),e(new Error(`HTTP ${r.statusCode}`));let o="";r.setEncoding("utf8"),r.on("data",s=>{o+=s;}),r.on("end",()=>{try{let s=JSON.parse(o);if(typeof s.version!="string")throw new Error("no version field");e(null,{version:s.version,updatePriority:typeof s.updatePriority=="string"?s.updatePriority:null});}catch(s){e(s);}});});t.on("error",e),t.on("timeout",()=>{t.destroy(new Error("timeout"));});}function Te(){try{if(Ot())return;setImmediate(()=>{At((e,n)=>{e||!n||yt(he().version,n.version)&&St(n.version,n.updatePriority,0);});});}catch{}}var Rt=l__namespace.default.resolve(__dirname,".."),Lt=process.env.INIT_CWD?l__namespace.default.resolve(process.env.INIT_CWD):null;Lt===Rt&&process.exit(0);V()&&(process.stderr.write(`
12
12
  [flow-ai-obs] \u2717 Do not install with sudo.
13
13
  Run without sudo: npm install -g @ciandt-flow/flow-ai-obs
14
14
 
15
- `),process.exit(1));async function Pt(){try{se();}catch{}try{ue();}catch{}try{Ee();}catch{}ae(process.env[h.ANTHROPIC_AUTH_TOKEN])||process.stderr.write(`
15
+ `),process.exit(1));function Pt(){let e=M(h.FLOW_BASE_URL);e&&(process.env.FLOW_BASE_URL=e);}async function wt(){Pt();try{oe();}catch{}try{ue();}catch{}try{Ee();}catch{}ae(process.env[h.ANTHROPIC_AUTH_TOKEN])||process.stderr.write(`
16
16
  [flow-ai-obs] No Flow API Token found.
17
17
  Run \`flow-ai-obs login\` to authenticate and enable telemetry.
18
18
 
19
- `);}Pt().catch(()=>{}).finally(()=>Te());
19
+ `);}wt().catch(()=>{}).finally(()=>Te());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.16.0-beta.122",
3
+ "version": "0.16.0-beta.128",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {