@ciandt-flow/flow-ai-obs 1.0.0-beta.149 → 1.0.1-beta.158

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 _e=require('readline/promises'),Vn=require('https'),m=require('fs'),At=require('os'),w=require('path'),child_process=require('child_process'),hr=require('crypto'),Zs=require('http');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 _e__namespace=/*#__PURE__*/_interopNamespace(_e);var Vn__default=/*#__PURE__*/_interopDefault(Vn);var m__namespace=/*#__PURE__*/_interopNamespace(m);var At__namespace=/*#__PURE__*/_interopNamespace(At);var w__namespace=/*#__PURE__*/_interopNamespace(w);var hr__namespace=/*#__PURE__*/_interopNamespace(hr);var Zs__default=/*#__PURE__*/_interopDefault(Zs);var Ee=Object.defineProperty;var Fn=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var Mn=Object.prototype.hasOwnProperty;var Wn=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var E=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var Kn=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},z=(t,e)=>{for(var r in e)Ee(t,r,{get:e[r],enumerable:true});},Bn=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of xn(e))!Mn.call(t,s)&&s!==r&&Ee(t,s,{get:()=>e[s],enumerable:!(n=Fn(e,s))||n.enumerable});return t};var F=t=>Bn(Ee({},"__esModule",{value:true}),t);var he={};z(he,{bold:()=>b,cyan:()=>j,dim:()=>S,green:()=>v,red:()=>N,yellow:()=>C});function St(t,e){return Yn?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var Yn,v,N,C,j,b,S,ut=E(()=>{"use strict";Yn=!process.env.NO_COLOR&&process.stdout.isTTY;v=St("32","39"),N=St("31","39"),C=St("33","39"),j=St("36","39"),b=St("1","22"),S=St("2","22");});var Nt=Kn((go,jn)=>{jn.exports={name:"@ciandt-flow/flow-ai-obs",version:"1.0.0-beta.149",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",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"}};});var er={};z(er,{isTTY:()=>tt,promptRaw:()=>Hn,promptText:()=>qt,promptYesNo:()=>yt});function tt(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function yt(t,e){let r=_e__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&e!==void 0)return r.close(),e;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 _e=require('readline/promises'),Vn=require('https'),m=require('fs'),At=require('os'),w=require('path'),child_process=require('child_process'),hr=require('crypto'),Zs=require('http');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 _e__namespace=/*#__PURE__*/_interopNamespace(_e);var Vn__default=/*#__PURE__*/_interopDefault(Vn);var m__namespace=/*#__PURE__*/_interopNamespace(m);var At__namespace=/*#__PURE__*/_interopNamespace(At);var w__namespace=/*#__PURE__*/_interopNamespace(w);var hr__namespace=/*#__PURE__*/_interopNamespace(hr);var Zs__default=/*#__PURE__*/_interopDefault(Zs);var Ee=Object.defineProperty;var Fn=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var Wn=Object.prototype.hasOwnProperty;var Mn=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var E=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var Kn=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},z=(t,e)=>{for(var r in e)Ee(t,r,{get:e[r],enumerable:true});},Yn=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of xn(e))!Wn.call(t,s)&&s!==r&&Ee(t,s,{get:()=>e[s],enumerable:!(n=Fn(e,s))||n.enumerable});return t};var F=t=>Yn(Ee({},"__esModule",{value:true}),t);var he={};z(he,{bold:()=>b,cyan:()=>j,dim:()=>S,green:()=>v,red:()=>N,yellow:()=>C});function St(t,e){return Bn?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var Bn,v,N,C,j,b,S,ut=E(()=>{"use strict";Bn=!process.env.NO_COLOR&&process.stdout.isTTY;v=St("32","39"),N=St("31","39"),C=St("33","39"),j=St("36","39"),b=St("1","22"),S=St("2","22");});var Nt=Kn((go,jn)=>{jn.exports={name:"@ciandt-flow/flow-ai-obs",version:"1.0.1-beta.158",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",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"}};});var er={};z(er,{isTTY:()=>tt,promptRaw:()=>Hn,promptText:()=>qt,promptYesNo:()=>yt});function tt(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function yt(t,e){let r=_e__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&e!==void 0)return r.close(),e;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(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function qt(t,e){let r=_e__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${t}: `)).trim();if(e){let s=e(n);if(s)throw new Error(s)}return n}catch(n){throw n}finally{r.close();}}function Hn(t,e={}){return new Promise((r,n)=>{if(typeof process.stdin.setRawMode!="function"){n(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:o=""}=e;process.stdout.write(t+o);let i=o;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=h=>{if(h===""){u(),n(new Error("SIGINT"));return}if(h==="\r"||h===`
4
4
  `){u(),process.stdout.write(`
5
5
  `),r(i);return}if(h==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}h.startsWith("\x1B")||(i+=h,process.stdout.write(s?"*".repeat(h.length):h));};function u(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",a),process.removeListener("unhandledRejection",a);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}var zt=E(()=>{"use strict";});var $t={};z($t,{checkForUpdate:()=>Zn,checkForUpdateInteractive:()=>Qn,fetchLatestVersionAsync:()=>ir,isNewer:()=>Tt,primeUpdateCache:()=>ts,runUpdate:()=>or});function x(){return Se||(Se=Nt()),Se}function Tt(t,e){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(t),s=r(e);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 Oe(){try{let t=JSON.parse(m__namespace.default.readFileSync(sr,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=Xn?null:t}catch{return null}}function we(t,e,r=Date.now()){try{m__namespace.default.writeFileSync(sr,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:r}),{mode:384});}catch{}}function Le(t){let e=x().name,r=Vn__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:qn},n=>{if(n.statusCode!==200)return n.resume(),t(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");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});r.on("error",t),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function ye(t){let e=x().name,n=` Update available: ${x().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
@@ -11,7 +11,7 @@
11
11
  `);}function Te(t){let e=x().name;process.stderr.write(`
12
12
  [${e}] Critical update detected \u2014 auto-updating to ${t}...
13
13
 
14
- `);let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});r.on("error",()=>{}),r.unref();}async function zn(t,e=1e4){let r=Wn("readline"),n=x().name,o=` Update available: ${x().version} \u2192 ${t}`,i=` Run: npm install -g ${n}`,a=" Install now? [y/N]: ",c=Math.max(o.length,i.length,a.length-2)+2,u="\u2500".repeat(c);return process.stderr.write(`
14
+ `);let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});r.on("error",()=>{}),r.unref();}async function zn(t,e=1e4){let r=Mn("readline"),n=x().name,o=` Update available: ${x().version} \u2192 ${t}`,i=` Run: npm install -g ${n}`,a=" Install now? [y/N]: ",c=Math.max(o.length,i.length,a.length-2)+2,u="\u2500".repeat(c);return process.stderr.write(`
15
15
  \u256D${u}\u256E
16
16
  \u2502${o.padEnd(c)}\u2502
17
17
  \u2502${i.padEnd(c)}\u2502
@@ -23,24 +23,24 @@
23
23
 
24
24
  `);else {let c=a?` (${a})`:"";process.stderr.write(` \u2717 Update failed${c} \u2014 continuing with current version.
25
25
 
26
- `);}r();}}n.on("close",(i,a)=>o(i===0,a??void 0)),n.on("error",i=>o(false,i.code));})}function ir(){return new Promise(t=>{Le((e,r)=>t(e||!r?null:r));})}function Zn(){try{let t=Oe();if(t){Tt(x().version,t.latestVersion)&&(t.updatePriority==="auto"?Te(t.latestVersion):ye(t.latestVersion));return}setImmediate(()=>{Le((e,r)=>{e||!r||(we(r.version,r.updatePriority),Tt(x().version,r.version)&&(r.updatePriority==="auto"?Te(r.version):ye(r.version)));});});}catch{}}async function Qn(t={}){try{let e=Oe();if(e){if(!Tt(x().version,e.latestVersion))return}else {let n=await ir();if(!n||(we(n.version,n.updatePriority),!Tt(x().version,n.version)))return;e={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Te(e.latestVersion);return}if(!tt()){ye(e.latestVersion);return}await zn(e.latestVersion,t.timeoutMs)&&await or(e.latestVersion);}catch{}}function ts(){try{if(Oe())return;setImmediate(()=>{Le((t,e)=>{t||!e||Tt(x().version,e.version)&&we(e.version,e.updatePriority,0);});});}catch{}}var Se,sr,Xn,qn,Dt=E(()=>{"use strict";zt();sr=w__namespace.default.join(At__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Xn=1440*60*1e3,qn=3e3;});var cr={};z(cr,{BUFFER:()=>M,CLAUDE_DESKTOP:()=>R,COPILOT_OTEL:()=>g,DEBUG_LOG_FILENAME:()=>Ae,ENV:()=>d,FLOW_URLS:()=>rs,INSTALLER:()=>Qt,NATIVE_OTEL:()=>et,OTLP:()=>Zt,STATE_FILE_PREFIX:()=>ns,TRACE_LIMITS:()=>V,VALIDATION:()=>H,getFlowBaseUrl:()=>ar,getFlowUrls:()=>Z});function ar(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():es}function Z(){let t=ar();return {GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}var es,rs,Zt,et,d,Qt,M,H,Ae,V,R,g,ns,U=E(()=>{"use strict";es="https://flow.ciandt.com";rs=Z(),Zt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},et={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"},d={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"},Qt={LOCK_STALE_MS:3e4,CLI:"flow-ai-obs "},M={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},H={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},Ae="flow-ai-obs-debug.log",V={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60},R={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"},g={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"},ns="flow-obs-";});function l(...t){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
26
+ `);}r();}}n.on("close",(i,a)=>o(i===0,a??void 0)),n.on("error",i=>o(false,i.code));})}function ir(){return new Promise(t=>{Le((e,r)=>t(e||!r?null:r));})}function Zn(){try{let t=Oe();if(t){Tt(x().version,t.latestVersion)&&(t.updatePriority==="auto"?Te(t.latestVersion):ye(t.latestVersion));return}setImmediate(()=>{Le((e,r)=>{e||!r||(we(r.version,r.updatePriority),Tt(x().version,r.version)&&(r.updatePriority==="auto"?Te(r.version):ye(r.version)));});});}catch{}}async function Qn(t={}){try{let e=Oe();if(e){if(!Tt(x().version,e.latestVersion))return}else {let n=await ir();if(!n||(we(n.version,n.updatePriority),!Tt(x().version,n.version)))return;e={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Te(e.latestVersion);return}if(!tt()){ye(e.latestVersion);return}await zn(e.latestVersion,t.timeoutMs)&&await or(e.latestVersion);}catch{}}function ts(){try{if(Oe())return;setImmediate(()=>{Le((t,e)=>{t||!e||Tt(x().version,e.version)&&we(e.version,e.updatePriority,0);});});}catch{}}var Se,sr,Xn,qn,Dt=E(()=>{"use strict";zt();sr=w__namespace.default.join(At__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Xn=1440*60*1e3,qn=3e3;});var cr={};z(cr,{BUFFER:()=>W,CLAUDE_DESKTOP:()=>R,COPILOT_OTEL:()=>g,DEBUG_LOG_FILENAME:()=>Ae,ENV:()=>d,FLOW_URLS:()=>rs,INSTALLER:()=>Qt,NATIVE_OTEL:()=>et,OTLP:()=>Zt,STATE_FILE_PREFIX:()=>ns,TRACE_LIMITS:()=>V,VALIDATION:()=>H,getFlowBaseUrl:()=>ar,getFlowUrls:()=>Z});function ar(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():es}function Z(){let t=ar();return {GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}var es,rs,Zt,et,d,Qt,W,H,Ae,V,R,g,ns,U=E(()=>{"use strict";es="https://flow.ciandt.com";rs=Z(),Zt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},et={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"},d={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"},Qt={LOCK_STALE_MS:3e4,CLI:"flow-ai-obs "},W={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},H={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},Ae="flow-ai-obs-debug.log",V={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60},R={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"},g={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"},ns="flow-obs-";});function l(...t){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
27
27
  `;try{m.writeFileSync(as,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
28
- `);}}var as,W=E(()=>{"use strict";U();as=w.join(At.tmpdir(),Ae);});function lr(){return process.platform==="win32"?false:process.getuid?.()===0}function ur(){if(lr())return process.stderr.write(`
28
+ `);}}var as,M=E(()=>{"use strict";U();as=w.join(At.tmpdir(),Ae);});function lr(){return process.platform==="win32"?false:process.getuid?.()===0}function ur(){if(lr())return process.stderr.write(`
29
29
  `+N(` \u2717 flow-ai-obs is not supported in a sudo context.
30
30
 
31
31
  `)+j(` npm install -g @ciandt-flow/flow-ai-obs
32
32
  `)+`
33
- `),1}var Re=E(()=>{"use strict";ut();});function rt(t={}){let e=t.env??process.env,r=t.platform??process.platform;return !!(e.WSL_DISTRO_NAME&&r==="linux")}function xt(t,e={}){let r=e.env??process.env,n=e.spawnSync??child_process.spawnSync;if(!rt({env:r,platform:e.platform}))return;let s=r[t];if(!s)try{let i=n("cmd.exe",["/c","echo",`%${t}%`],{encoding:"utf8",timeout:5e3}).stdout?.trim();i&&/^[A-Za-z]:\\/.test(i)&&(s=i);}catch(o){l("resolveWslWindowsPath",`cmd.exe ${t} lookup failed: ${o.message}`);}if(s)return s.replace(/^([A-Za-z]):/,(o,i)=>`/mnt/${i.toLowerCase()}`).replace(/\\/g,"/")}function nt(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER)try{let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}catch(t){l("getActualUser",`getent passwd lookup failed: ${t.message}`);}return {home:At__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||At__namespace.userInfo().username}}function G(){if(rt()){let t=xt("USERPROFILE");return t?w__namespace.join(t,".claude","settings.json"):w__namespace.join(At__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||At__namespace.homedir();return w__namespace.join(t,".claude","settings.json")}return w__namespace.join(nt().home,".claude","settings.json")}var Mt=E(()=>{"use strict";W();Re();});function te(){if(process.platform==="win32"){let r=process.env.APPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Roaming");return w__namespace.join(r,dr,fr)}let t=nt(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t.home,".config");return w__namespace.join(e,dr,fr)}function Pe(){let{getPersistedFlowBaseUrl:t}=(wt(),F(gr));return t()??null}var dr,fr,ke=E(()=>{"use strict";Mt();dr="flow-ai-obs",fr="config.json";});var gr={};z(gr,{addEnvToClaudeSettings:()=>Ue,getClaudeSettingsPath:()=>G,getEffectiveEnv:()=>Ce,getEnvFromClaudeSettings:()=>pt,getPersistedFlowBaseUrl:()=>Er,removeEnvFromClaudeSettings:()=>us,resolveFlowBaseUrl:()=>Ne,writeClaudeSettings:()=>be});function Ie(t){try{let e=m__namespace.statSync(t);Date.now()-e.mtimeMs>cs&&m__namespace.unlinkSync(t);}catch{}try{m__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function ve(t){try{m__namespace.unlinkSync(t);}catch{}}function ls(t){let e=[];if(!t.hooks||typeof t.hooks!="object"||Array.isArray(t.hooks))return delete t.hooks,e;let r=t.hooks,n={};for(let[s,o]of Object.entries(r)){if(!Array.isArray(o))continue;let i=o.map(a=>{if(!Array.isArray(a?.hooks))return null;let c=a.hooks.filter(u=>!u.command?.startsWith?.(Qt.CLI));return c.length>0?{...a,hooks:c}:null}).filter(a=>a!=null);i.length>0&&(n[s]=i,e.push(s));}return Object.keys(n).length>0?t.hooks=n:delete t.hooks,e}function be(t,e){let r=G(),n=r+".lock";m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:true}),Ie(n);try{if(m__namespace.existsSync(r)){m__namespace.copyFileSync(r,r+".bkp");try{m__namespace.chmodSync(r+".bkp",384);}catch{}}let s=te();if(m__namespace.existsSync(s)){let L=s+".bkp";m__namespace.copyFileSync(s,L);try{m__namespace.chmodSync(L,384);}catch{}}let o={};try{o=JSON.parse(m__namespace.readFileSync(r,"utf8"));}catch{}let i=o.env&&typeof o.env=="object"?o.env:{};delete i.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:a}=(U(),F(cr)),c=a().OTEL_ENDPOINT,u={...et,OTEL_EXPORTER_OTLP_ENDPOINT:t??c};o.env={...i,...u,...e??{}},o.otelHeadersHelper="flow-ai-obs otel-headers";let h=ls(o);m__namespace.writeFileSync(r,JSON.stringify(o,null,2)+`
33
+ `),1}var Re=E(()=>{"use strict";ut();});function rt(t={}){let e=t.env??process.env,r=t.platform??process.platform;return !!(e.WSL_DISTRO_NAME&&r==="linux")}function xt(t,e={}){let r=e.env??process.env,n=e.spawnSync??child_process.spawnSync;if(!rt({env:r,platform:e.platform}))return;let s=r[t];if(!s)try{let i=n("cmd.exe",["/c","echo",`%${t}%`],{encoding:"utf8",timeout:5e3}).stdout?.trim();i&&/^[A-Za-z]:\\/.test(i)&&(s=i);}catch(o){l("resolveWslWindowsPath",`cmd.exe ${t} lookup failed: ${o.message}`);}if(s)return s.replace(/^([A-Za-z]):/,(o,i)=>`/mnt/${i.toLowerCase()}`).replace(/\\/g,"/")}function nt(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER)try{let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}catch(t){l("getActualUser",`getent passwd lookup failed: ${t.message}`);}return {home:At__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||At__namespace.userInfo().username}}function G(){if(rt()){let t=xt("USERPROFILE");return t?w__namespace.join(t,".claude","settings.json"):w__namespace.join(At__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||At__namespace.homedir();return w__namespace.join(t,".claude","settings.json")}return w__namespace.join(nt().home,".claude","settings.json")}var Wt=E(()=>{"use strict";M();Re();});function te(){if(process.platform==="win32"){let r=process.env.APPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Roaming");return w__namespace.join(r,dr,fr)}let t=nt(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t.home,".config");return w__namespace.join(e,dr,fr)}function Pe(){let{getPersistedFlowBaseUrl:t}=(wt(),F(gr));return t()??null}var dr,fr,ke=E(()=>{"use strict";Wt();dr="flow-ai-obs",fr="config.json";});var gr={};z(gr,{addEnvToClaudeSettings:()=>Ue,getClaudeSettingsPath:()=>G,getEffectiveEnv:()=>Ce,getEnvFromClaudeSettings:()=>pt,getPersistedFlowBaseUrl:()=>Er,removeEnvFromClaudeSettings:()=>us,resolveFlowBaseUrl:()=>Ne,writeClaudeSettings:()=>be});function Ie(t){try{let e=m__namespace.statSync(t);Date.now()-e.mtimeMs>cs&&m__namespace.unlinkSync(t);}catch{}try{m__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function ve(t){try{m__namespace.unlinkSync(t);}catch{}}function ls(t){let e=[];if(!t.hooks||typeof t.hooks!="object"||Array.isArray(t.hooks))return delete t.hooks,e;let r=t.hooks,n={};for(let[s,o]of Object.entries(r)){if(!Array.isArray(o))continue;let i=o.map(a=>{if(!Array.isArray(a?.hooks))return null;let c=a.hooks.filter(u=>!u.command?.startsWith?.(Qt.CLI));return c.length>0?{...a,hooks:c}:null}).filter(a=>a!=null);i.length>0&&(n[s]=i,e.push(s));}return Object.keys(n).length>0?t.hooks=n:delete t.hooks,e}function be(t,e){let r=G(),n=r+".lock";m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:true}),Ie(n);try{if(m__namespace.existsSync(r)){m__namespace.copyFileSync(r,r+".bkp");try{m__namespace.chmodSync(r+".bkp",384);}catch{}}let s=te();if(m__namespace.existsSync(s)){let L=s+".bkp";m__namespace.copyFileSync(s,L);try{m__namespace.chmodSync(L,384);}catch{}}let o={};try{o=JSON.parse(m__namespace.readFileSync(r,"utf8"));}catch{}let i=o.env&&typeof o.env=="object"?o.env:{};delete i.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:a}=(U(),F(cr)),c=a().OTEL_ENDPOINT,u={...et,OTEL_EXPORTER_OTLP_ENDPOINT:t??c};o.env={...i,...u,...e??{}},o.otelHeadersHelper="flow-ai-obs otel-headers";let h=ls(o);m__namespace.writeFileSync(r,JSON.stringify(o,null,2)+`
34
34
  `,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(r,384);}catch{}return st=void 0,{settingsPath:r,preserved:h}}finally{ve(n);}}function pt(t){if(st===void 0)try{let r=m__namespace.readFileSync(G(),"utf8");st=JSON.parse(r).env??null;}catch{st=null;}if(!st)return null;let e=st[t];return typeof e=="string"?e:null}function Ue(t){let e=G(),r=e+".lock";m__namespace.mkdirSync(w__namespace.dirname(e),{recursive:true}),Ie(r);try{let n={};try{n=JSON.parse(m__namespace.readFileSync(e,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,t),m__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
35
35
  `,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(e,384);}catch{}st=void 0;}finally{ve(r);}}function us(t){let e=G(),r=e+".lock";m__namespace.mkdirSync(w__namespace.dirname(e),{recursive:true}),Ie(r);try{let n={};try{n=JSON.parse(m__namespace.readFileSync(e,"utf8"));}catch{return}if(!n.env||typeof n.env!="object")return;for(let s of t)delete n.env[s];m__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
36
- `,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(e,384);}catch{}st=void 0;}finally{ve(r);}}function Ce(t){let e=process.env[t];return e!==void 0?e!==""?e:void 0:pt(t)??void 0}function Er(){let t=pt(d.FLOW_BASE_URL);return t&&t.trim()?t.trim():void 0}function Ne(){let t=process.env[d.FLOW_BASE_URL];return t&&t.trim()?t.trim():Er()}var cs,st,wt=E(()=>{"use strict";U();Mt();ke();cs=Qt.LOCK_STALE_MS;});function fs(t){return ds.some(e=>e.test(t))}function re(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[d.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&fs(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}function ms(t){let e=process.env[d.OTEL_EXPORTER_OTLP_HEADERS];if(!e)return null;let r=t.toLowerCase();for(let n of e.split(",")){let s=n.indexOf("=");if(!(s<=0)&&n.slice(0,s).trim().toLowerCase()===r){let o=n.slice(s+1),i=o.search(/[\r\n]/);return (i===-1?o:o.slice(0,i)).trim()||null}}return null}function K(){let t=Ce(d.FLOW_USER_EMAIL);if(t!==void 0){let r=t.replace(/[\r\n]/g,"").trim();if(r)if(r.length>H.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${H.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!H.EMAIL_HEADER_PATTERN.test(r))l("resolveUserEmail","FLOW_USER_EMAIL contains non-printable or control characters \u2014 skipping");else return l("resolveUserEmail","using FLOW_USER_EMAIL override: [REDACTED]"),r}let e=ms("x-flow-user");if(e){let r=e.replace(/[\r\n]/g,"").trim();if(r.length>H.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${H.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!H.EMAIL_HEADER_PATTERN.test(r))l("resolveUserEmail","x-flow-user from OTEL_EXPORTER_OTLP_HEADERS is empty or contains non-printable characters \u2014 skipping");else return l("resolveUserEmail","using x-flow-user from OTEL_EXPORTER_OTLP_HEADERS: [REDACTED]"),r}try{let r=At__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",n=r.lastIndexOf("\\");if(n!==-1&&(r=r.slice(n+1)),r=r.trim().replace(/[^a-zA-Z0-9._%+\-]/g,"").replace(/^\.+/,""),!r)return l("resolveUserEmail","Could not derive x-flow-user: username is empty. Run: flow-ai-obs init"),null;let s=`${r}@ciandt.com`;return l("resolveUserEmail","derived email: [REDACTED]"),s}catch(r){return l("resolveUserEmail",`Could not derive x-flow-user from OS username: ${r.message}. Run: flow-ai-obs init`),null}}function X(t){if(!t)return null;let e=t.replace(/[\r\n]/g,"").trim();return e?e.length>H.API_KEY_MAX_LENGTH?(l("validateApiKey",`API key exceeds ${H.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):H.API_KEY_PATTERN.test(e)?e:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function $(){let t=process.env[d.FLOW_API_KEY];return X(t)}function gs(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function Lt(){let t=[],e=process.env[d.FLOW_TELEMETRY]==="true",r=process.env[d.LANGFUSE_BASE_URL],n=process.env[d.LANGFUSE_PUBLIC_KEY],s=process.env[d.LANGFUSE_SECRET_KEY];if(e&&r&&n&&s){let o={user:K()??"",tenant:"",team:"",project:""};t.push({mode:"direct",...gs(re(r),n,s),...o}),l("resolveCredentials","direct mode active",`user=${o.user}`);}return t}var ds,J=E(()=>{"use strict";U();W();wt();ds=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];});function se(){return process.platform==="win32"||rt()}function Es(t){let e=t.match(/^\/mnt\/([a-z])\/(.*)$/);if(!e)return t;let r=e[1].toUpperCase(),n=e[2].replace(/\//g,"\\");return `${r}:\\${n}`}function _r(){if(rt()){let n=xt("LOCALAPPDATA");if(n){let s=w__namespace.join(n,R.DIR_3P);return ne(s)}}if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),s=w__namespace.join(n,R.DIR_3P);return ne(s)}if(process.platform==="darwin"){let n=w__namespace.join(At__namespace.homedir(),"Library","Application Support",R.DIR_3P);return ne(n)}let t=nt(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t.home,".config"),r=w__namespace.join(e,R.DIR_3P);return ne(r)}function ne(t){return {configDir:t,configLibraryDir:w__namespace.join(t,R.CONFIG_LIBRARY_DIR),desktopConfigPath:w__namespace.join(t,R.DESKTOP_CONFIG_FILE),metaPath:w__namespace.join(t,R.CONFIG_LIBRARY_DIR,R.META_FILE)}}function oe(){let t=G(),e=w__namespace.dirname(t),r=se()?R.WRAPPER_SCRIPT_WIN:R.WRAPPER_SCRIPT_UNIX;return w__namespace.join(e,r)}function ie(){if(process.env[d.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let t=_r();if(m__namespace.existsSync(t.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",w__namespace.join(At__namespace.homedir(),"Applications","Claude.app")].some(r=>m__namespace.existsSync(r));if(process.platform==="win32"){let e=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files";return [w__namespace.join(e,"AnthropicClaude","Claude.exe"),w__namespace.join(r,"Claude","Claude.exe")].some(s=>m__namespace.existsSync(s))}if(process.platform==="linux"){let e=nt(),r=process.env.XDG_CONFIG_HOME||w__namespace.join(e.home,".config"),n=w__namespace.join(r,"Claude");return m__namespace.existsSync(n)}return false}function hs(t){let e=t??oe();try{if(!m__namespace.existsSync(e))return null;let r=m__namespace.readFileSync(e,"utf8"),n=r.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(n&&n[1])return X(n[1]);let s=r.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(s&&s[1])return X(s[1])}catch{}return null}function Sr(t,e,r=448){let n=w__namespace.dirname(t);m__namespace.mkdirSync(n,{recursive:true});let s=se(),o=s?420:r,i=true;try{m__namespace.readFileSync(t,"utf8")===e&&(i=!1);}catch{}if(!i){if(!s)try{m__namespace.chmodSync(t,r);}catch{}return {written:false}}if(m__namespace.existsSync(t)&&(m__namespace.copyFileSync(t,t+".bkp"),!s))try{m__namespace.chmodSync(t+".bkp",448);}catch{}if(m__namespace.writeFileSync(t,e,{encoding:"utf8",mode:o}),!s)try{m__namespace.chmodSync(t,r);}catch{}return {written:true}}function _s(t){let e=oe(),r=t?X(t):null,n=se()?Tr(r):yr(r);return Sr(e,n,!!r?448:493),e}function yr(t){let e=t?X(t):null,r=["#!/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 e&&r.push(`export FLOW_API_KEY="${e}"`),r.push("exec flow-ai-obs otel-headers",""),r.join(`
36
+ `,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(e,384);}catch{}st=void 0;}finally{ve(r);}}function Ce(t){let e=process.env[t];return e!==void 0?e!==""?e:void 0:pt(t)??void 0}function Er(){let t=pt(d.FLOW_BASE_URL);return t&&t.trim()?t.trim():void 0}function Ne(){let t=process.env[d.FLOW_BASE_URL];return t&&t.trim()?t.trim():Er()}var cs,st,wt=E(()=>{"use strict";U();Wt();ke();cs=Qt.LOCK_STALE_MS;});function fs(t){return ds.some(e=>e.test(t))}function re(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[d.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&fs(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}function ms(t){let e=process.env[d.OTEL_EXPORTER_OTLP_HEADERS];if(!e)return null;let r=t.toLowerCase();for(let n of e.split(",")){let s=n.indexOf("=");if(!(s<=0)&&n.slice(0,s).trim().toLowerCase()===r){let o=n.slice(s+1),i=o.search(/[\r\n]/);return (i===-1?o:o.slice(0,i)).trim()||null}}return null}function K(){let t=Ce(d.FLOW_USER_EMAIL);if(t!==void 0){let r=t.replace(/[\r\n]/g,"").trim();if(r)if(r.length>H.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${H.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!H.EMAIL_HEADER_PATTERN.test(r))l("resolveUserEmail","FLOW_USER_EMAIL contains non-printable or control characters \u2014 skipping");else return l("resolveUserEmail","using FLOW_USER_EMAIL override: [REDACTED]"),r}let e=ms("x-flow-user");if(e){let r=e.replace(/[\r\n]/g,"").trim();if(r.length>H.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${H.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!H.EMAIL_HEADER_PATTERN.test(r))l("resolveUserEmail","x-flow-user from OTEL_EXPORTER_OTLP_HEADERS is empty or contains non-printable characters \u2014 skipping");else return l("resolveUserEmail","using x-flow-user from OTEL_EXPORTER_OTLP_HEADERS: [REDACTED]"),r}try{let r=At__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",n=r.lastIndexOf("\\");if(n!==-1&&(r=r.slice(n+1)),r=r.trim().replace(/[^a-zA-Z0-9._%+\-]/g,"").replace(/^\.+/,""),!r)return l("resolveUserEmail","Could not derive x-flow-user: username is empty. Run: flow-ai-obs init"),null;let s=`${r}@ciandt.com`;return l("resolveUserEmail","derived email: [REDACTED]"),s}catch(r){return l("resolveUserEmail",`Could not derive x-flow-user from OS username: ${r.message}. Run: flow-ai-obs init`),null}}function X(t){if(!t)return null;let e=t.replace(/[\r\n]/g,"").trim();return e?e.length>H.API_KEY_MAX_LENGTH?(l("validateApiKey",`API key exceeds ${H.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):H.API_KEY_PATTERN.test(e)?e:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function $(){let t=process.env[d.FLOW_API_KEY];return X(t)}function gs(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function Lt(){let t=[],e=process.env[d.FLOW_TELEMETRY]==="true",r=process.env[d.LANGFUSE_BASE_URL],n=process.env[d.LANGFUSE_PUBLIC_KEY],s=process.env[d.LANGFUSE_SECRET_KEY];if(e&&r&&n&&s){let o={user:K()??"",tenant:"",team:"",project:""};t.push({mode:"direct",...gs(re(r),n,s),...o}),l("resolveCredentials","direct mode active",`user=${o.user}`);}return t}var ds,J=E(()=>{"use strict";U();M();wt();ds=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];});function se(){return process.platform==="win32"||rt()}function Es(t){let e=t.match(/^\/mnt\/([a-z])\/(.*)$/);if(!e)return t;let r=e[1].toUpperCase(),n=e[2].replace(/\//g,"\\");return `${r}:\\${n}`}function _r(){if(rt()){let n=xt("LOCALAPPDATA");if(n){let s=w__namespace.join(n,R.DIR_3P);return ne(s)}}if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),s=w__namespace.join(n,R.DIR_3P);return ne(s)}if(process.platform==="darwin"){let n=w__namespace.join(At__namespace.homedir(),"Library","Application Support",R.DIR_3P);return ne(n)}let t=nt(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t.home,".config"),r=w__namespace.join(e,R.DIR_3P);return ne(r)}function ne(t){return {configDir:t,configLibraryDir:w__namespace.join(t,R.CONFIG_LIBRARY_DIR),desktopConfigPath:w__namespace.join(t,R.DESKTOP_CONFIG_FILE),metaPath:w__namespace.join(t,R.CONFIG_LIBRARY_DIR,R.META_FILE)}}function oe(){let t=G(),e=w__namespace.dirname(t),r=se()?R.WRAPPER_SCRIPT_WIN:R.WRAPPER_SCRIPT_UNIX;return w__namespace.join(e,r)}function ie(){if(process.env[d.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let t=_r();if(m__namespace.existsSync(t.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",w__namespace.join(At__namespace.homedir(),"Applications","Claude.app")].some(r=>m__namespace.existsSync(r));if(process.platform==="win32"){let e=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files";return [w__namespace.join(e,"AnthropicClaude","Claude.exe"),w__namespace.join(r,"Claude","Claude.exe")].some(s=>m__namespace.existsSync(s))}if(process.platform==="linux"){let e=nt(),r=process.env.XDG_CONFIG_HOME||w__namespace.join(e.home,".config"),n=w__namespace.join(r,"Claude");return m__namespace.existsSync(n)}return false}function hs(t){let e=t??oe();try{if(!m__namespace.existsSync(e))return null;let r=m__namespace.readFileSync(e,"utf8"),n=r.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(n&&n[1])return X(n[1]);let s=r.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(s&&s[1])return X(s[1])}catch{}return null}function Sr(t,e,r=448){let n=w__namespace.dirname(t);m__namespace.mkdirSync(n,{recursive:true});let s=se(),o=s?420:r,i=true;try{m__namespace.readFileSync(t,"utf8")===e&&(i=!1);}catch{}if(!i){if(!s)try{m__namespace.chmodSync(t,r);}catch{}return {written:false}}if(m__namespace.existsSync(t)&&(m__namespace.copyFileSync(t,t+".bkp"),!s))try{m__namespace.chmodSync(t+".bkp",448);}catch{}if(m__namespace.writeFileSync(t,e,{encoding:"utf8",mode:o}),!s)try{m__namespace.chmodSync(t,r);}catch{}return {written:true}}function _s(t){let e=oe(),r=t?X(t):null,n=se()?Tr(r):yr(r);return Sr(e,n,!!r?448:493),e}function yr(t){let e=t?X(t):null,r=["#!/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 e&&r.push(`export FLOW_API_KEY="${e}"`),r.push("exec flow-ai-obs otel-headers",""),r.join(`
37
37
  `)}function Tr(t){let e=t?X(t):null,r=["@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 e&&r.push(`set FLOW_API_KEY=${e}`),r.push("flow-ai-obs otel-headers",""),r.join(`\r
38
38
  `)}function Or(t){if(!ie())return {status:"skipped",reason:"Claude Desktop is not installed"};let e=X(t);if(!e)return {status:"skipped",reason:"Invalid API key provided"};try{let r=oe(),n=se()?Tr(e):yr(e),{written:s}=Sr(r,n,448);return {status:s?"configured":"already_configured",wrapperScriptPath:r}}catch(r){return {status:"skipped",reason:r.message}}}function ys(t){try{let e=m__namespace.readFileSync(t,"utf8");try{let r=JSON.parse(e);if(r.appliedId&&typeof r.appliedId=="string"&&Ss.test(r.appliedId))return r.appliedId;r.appliedId&&l("getOrCreateConfigUuid","appliedId is not a valid UUID \u2014 generating new UUID");}catch{l("getOrCreateConfigUuid",`corrupted JSON in ${t} \u2014 generating new UUID`);}}catch(e){e.code!=="ENOENT"&&l("getOrCreateConfigUuid",`read error: ${e.message}`);}return hr__namespace.randomUUID()}function Ts(t,e){let r=w__namespace.dirname(t);m__namespace.mkdirSync(r,{recursive:true});let n;try{let o=m__namespace.readFileSync(t,"utf8");try{n=JSON.parse(o),(!n.appliedId||typeof n.appliedId!="string")&&(n.appliedId=e),Array.isArray(n.entries)||(n.entries=[]);}catch{l("writeMetaJson",`corrupted JSON in ${t} \u2014 starting fresh`),n={appliedId:e,entries:[]};}}catch(o){o.code!=="ENOENT"&&l("writeMetaJson",`read error: ${o.message}`),n={appliedId:e,entries:[]};}n.entries.some(o=>o.id===e)||n.entries.push({id:e,name:R.CONFIG_NAME});let s=JSON.stringify(n,null,2)+`
39
39
  `;try{if(m__namespace.readFileSync(t,"utf8")===s)return}catch{}if(m__namespace.existsSync(t)){m__namespace.copyFileSync(t,t+".bkp");try{m__namespace.chmodSync(t+".bkp",384);}catch{}}m__namespace.writeFileSync(t,s,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(t,384);}catch{}}function Os(t,e,r,n){m__namespace.mkdirSync(t,{recursive:true});let s=w__namespace.resolve(t),o=w__namespace.resolve(t,`${e}.json`);if(!o.startsWith(s+w__namespace.sep))throw new Error(`Security error: invalid config path ${o}`);let i={};try{let c=m__namespace.readFileSync(o,"utf8");try{i=JSON.parse(c);}catch{l("writeConfigLibraryFile",`corrupted JSON in ${o} \u2014 starting fresh`);}}catch(c){c.code!=="ENOENT"&&l("writeConfigLibraryFile",`read error: ${c.message}`);}i[R.KEYS.OTLP_ENDPOINT]=r,i[R.KEYS.OTLP_PROTOCOL]=R.OTLP_PROTOCOL,i[R.KEYS.OTLP_HEADERS_HELPER]=rt()?Es(n):n,i[R.KEYS.OTLP_RESOURCE_ATTRIBUTES]={[R.CUSTOM_PROVIDER_KEY]:R.CUSTOM_PROVIDER_VALUE};let a=JSON.stringify(i,null,2)+`
40
40
  `;try{if(m__namespace.readFileSync(o,"utf8")===a)return o}catch{}if(m__namespace.existsSync(o)){m__namespace.copyFileSync(o,o+".bkp");try{m__namespace.chmodSync(o+".bkp",384);}catch{}}m__namespace.writeFileSync(o,a,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(o,384);}catch{}return o}function ws(t){let e=w__namespace.dirname(t);m__namespace.mkdirSync(e,{recursive:true});let r={};try{let n=m__namespace.readFileSync(t,"utf8");try{r=JSON.parse(n);}catch{l("mergeClaudeDesktopConfig",`corrupted JSON in ${t} \u2014 starting fresh (original backed up to .bkp)`);}}catch(n){n.code!=="ENOENT"&&l("mergeClaudeDesktopConfig",`read error: ${n.message}`);}if(r.deploymentMode!==R.DEPLOYMENT_MODE){if(m__namespace.existsSync(t)){m__namespace.copyFileSync(t,t+".bkp");try{m__namespace.chmodSync(t+".bkp",384);}catch{}}r.deploymentMode=R.DEPLOYMENT_MODE,m__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
41
- `,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(t,384);}catch{}}}function wr(t,e){if(!ie())return {configured:false};let r=_r(),n=t??Z().OTEL_ENDPOINT,s=e!==void 0?e:$()??hs(oe()),o=_s(s),i=ys(r.metaPath),a=Os(r.configLibraryDir,i,n,o);return Ts(r.metaPath,i),ws(r.desktopConfigPath),{configured:true,configDir:r.configDir,configLibraryPath:a,uuid:i,wrapperScriptPath:o}}var Ss,$e=E(()=>{"use strict";U();Mt();J();W();Ss=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;});function De(){if(rt()){let r=xt("APPDATA");return r?w__namespace.join(r,"Code","User","settings.json"):null}if(process.platform==="win32"){let r=process.env.APPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Roaming");return w__namespace.join(r,"Code","User","settings.json")}if(process.platform==="darwin")return w__namespace.join(At__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let t=process.platform==="linux"&&process.getuid?.()===0?nt().home:process.env.HOME||At__namespace.homedir(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t,".config");return w__namespace.join(e,"Code","User","settings.json")}function Lr(t){let e=false,r=false,n="";for(let s=0;s<t.length;s++){let o=t[s];if(e){n+=o,r?r=false:o==="\\"?r=true:o==='"'&&(e=false);continue}if(o==='"'){e=true,n+=o;continue}if(o===","){let i=s+1;for(;i<t.length&&/\s/.test(t[i]);)i++;if(i<t.length&&(t[i]==="}"||t[i]==="]"))continue}n+=o;}return n}function ae(t){if(process.env[d.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(t&&m__namespace.existsSync(t));if(t&&(m__namespace.existsSync(t)||m__namespace.existsSync(w__namespace.dirname(t))||m__namespace.existsSync(w__namespace.dirname(w__namespace.dirname(t)))))return true;let e=De();if(e&&(m__namespace.existsSync(e)||m__namespace.existsSync(w__namespace.dirname(e))||m__namespace.existsSync(w__namespace.dirname(w__namespace.dirname(e))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",w__namespace.join(At__namespace.homedir(),"Applications","Visual Studio Code.app")].some(n=>m__namespace.existsSync(n)))return true;if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),n=process.env.PROGRAMFILES||"C:\\Program Files",s=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([w__namespace.join(r,"Programs","Microsoft VS Code","Code.exe"),w__namespace.join(n,"Microsoft VS Code","Code.exe"),w__namespace.join(s,"Microsoft VS Code","Code.exe")].some(i=>m__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(n=>m__namespace.existsSync(n)))}function Ar(t,e={}){let r;try{r=e.customSettingsPath||De();}catch(n){return {status:"skipped",reason:`VS Code path resolution failed: ${n.message}`}}if(!r)return {status:"skipped",reason:"VS Code path not found"};if(!ae(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(m__namespace.existsSync(r))try{let p=Lr(m__namespace.readFileSync(r,"utf8"));n=JSON.parse(p);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=t||Z().OTEL_ENDPOINT,o=e.apiKey!==void 0?e.apiKey:$(),i=e.userEmail!==void 0?e.userEmail:K(),a=typeof n[g.HEADERS_KEY]=="object"&&n[g.HEADERS_KEY]!==null&&!Array.isArray(n[g.HEADERS_KEY])?n[g.HEADERS_KEY]:{},c={...a};o&&(c[g.HEADER_API_KEY]=o),i&&(c[g.HEADER_USER]=i);let u=Object.keys(c),h=Object.keys(a),L=u.length===0&&(n[g.HEADERS_KEY]===void 0||h.length===0)||u.length===h.length&&u.every(p=>a[p]===c[p]);if(n[g.ENABLED_KEY]===g.ENABLED_VALUE&&n[g.EXPORTER_TYPE_KEY]===g.EXPORTER_TYPE_VALUE&&n[g.PROTOCOL_KEY]===g.PROTOCOL_VALUE&&n[g.ENDPOINT_KEY]===s&&L)return {status:"already_configured",settingsPath:r};m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:!0});let A={...n,[g.ENABLED_KEY]:g.ENABLED_VALUE,[g.EXPORTER_TYPE_KEY]:g.EXPORTER_TYPE_VALUE,[g.PROTOCOL_KEY]:g.PROTOCOL_VALUE,[g.ENDPOINT_KEY]:s};return u.length>0&&(A[g.HEADERS_KEY]=c),m__namespace.writeFileSync(r,JSON.stringify(A,null,2)+`
41
+ `,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(t,384);}catch{}}}function wr(t,e){if(!ie())return {configured:false};let r=_r(),n=t??Z().OTEL_ENDPOINT,s=e!==void 0?e:$()??hs(oe()),o=_s(s),i=ys(r.metaPath),a=Os(r.configLibraryDir,i,n,o);return Ts(r.metaPath,i),ws(r.desktopConfigPath),{configured:true,configDir:r.configDir,configLibraryPath:a,uuid:i,wrapperScriptPath:o}}var Ss,$e=E(()=>{"use strict";U();Wt();J();M();Ss=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;});function De(){if(rt()){let r=xt("APPDATA");return r?w__namespace.join(r,"Code","User","settings.json"):null}if(process.platform==="win32"){let r=process.env.APPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Roaming");return w__namespace.join(r,"Code","User","settings.json")}if(process.platform==="darwin")return w__namespace.join(At__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let t=process.platform==="linux"&&process.getuid?.()===0?nt().home:process.env.HOME||At__namespace.homedir(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t,".config");return w__namespace.join(e,"Code","User","settings.json")}function Lr(t){let e=false,r=false,n="";for(let s=0;s<t.length;s++){let o=t[s];if(e){n+=o,r?r=false:o==="\\"?r=true:o==='"'&&(e=false);continue}if(o==='"'){e=true,n+=o;continue}if(o===","){let i=s+1;for(;i<t.length&&/\s/.test(t[i]);)i++;if(i<t.length&&(t[i]==="}"||t[i]==="]"))continue}n+=o;}return n}function ae(t){if(process.env[d.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(t&&m__namespace.existsSync(t));if(t&&(m__namespace.existsSync(t)||m__namespace.existsSync(w__namespace.dirname(t))||m__namespace.existsSync(w__namespace.dirname(w__namespace.dirname(t)))))return true;let e=De();if(e&&(m__namespace.existsSync(e)||m__namespace.existsSync(w__namespace.dirname(e))||m__namespace.existsSync(w__namespace.dirname(w__namespace.dirname(e))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",w__namespace.join(At__namespace.homedir(),"Applications","Visual Studio Code.app")].some(n=>m__namespace.existsSync(n)))return true;if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),n=process.env.PROGRAMFILES||"C:\\Program Files",s=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([w__namespace.join(r,"Programs","Microsoft VS Code","Code.exe"),w__namespace.join(n,"Microsoft VS Code","Code.exe"),w__namespace.join(s,"Microsoft VS Code","Code.exe")].some(i=>m__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(n=>m__namespace.existsSync(n)))}function Ar(t,e={}){let r;try{r=e.customSettingsPath||De();}catch(n){return {status:"skipped",reason:`VS Code path resolution failed: ${n.message}`}}if(!r)return {status:"skipped",reason:"VS Code path not found"};if(!ae(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(m__namespace.existsSync(r))try{let p=Lr(m__namespace.readFileSync(r,"utf8"));n=JSON.parse(p);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=t||Z().OTEL_ENDPOINT,o=e.apiKey!==void 0?e.apiKey:$(),i=e.userEmail!==void 0?e.userEmail:K(),a=typeof n[g.HEADERS_KEY]=="object"&&n[g.HEADERS_KEY]!==null&&!Array.isArray(n[g.HEADERS_KEY])?n[g.HEADERS_KEY]:{},c={...a};o&&(c[g.HEADER_API_KEY]=o),i&&(c[g.HEADER_USER]=i);let u=Object.keys(c),h=Object.keys(a),L=u.length===0&&(n[g.HEADERS_KEY]===void 0||h.length===0)||u.length===h.length&&u.every(p=>a[p]===c[p]);if(n[g.ENABLED_KEY]===g.ENABLED_VALUE&&n[g.EXPORTER_TYPE_KEY]===g.EXPORTER_TYPE_VALUE&&n[g.PROTOCOL_KEY]===g.PROTOCOL_VALUE&&n[g.ENDPOINT_KEY]===s&&L)return {status:"already_configured",settingsPath:r};m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:!0});let A={...n,[g.ENABLED_KEY]:g.ENABLED_VALUE,[g.EXPORTER_TYPE_KEY]:g.EXPORTER_TYPE_VALUE,[g.PROTOCOL_KEY]:g.PROTOCOL_VALUE,[g.ENDPOINT_KEY]:s};return u.length>0&&(A[g.HEADERS_KEY]=c),m__namespace.writeFileSync(r,JSON.stringify(A,null,2)+`
42
42
  `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}function Rr(t,e={}){let r;try{r=e.customSettingsPath||De();}catch(n){return {status:"skipped",reason:`VS Code path resolution failed: ${n.message}`}}if(!r)return {status:"skipped",reason:"VS Code path not found"};if(!ae(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(m__namespace.existsSync(r))try{let a=Lr(m__namespace.readFileSync(r,"utf8"));n=JSON.parse(a);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=typeof n[g.HEADERS_KEY]=="object"&&n[g.HEADERS_KEY]!==null&&!Array.isArray(n[g.HEADERS_KEY])?n[g.HEADERS_KEY]:{};if(s[g.HEADER_API_KEY]===t)return {status:"already_configured",settingsPath:r};let o={...s,[g.HEADER_API_KEY]:t};m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:!0});let i={...n,[g.ENABLED_KEY]:n[g.ENABLED_KEY]??g.ENABLED_VALUE,[g.EXPORTER_TYPE_KEY]:n[g.EXPORTER_TYPE_KEY]??g.EXPORTER_TYPE_VALUE,[g.PROTOCOL_KEY]:n[g.PROTOCOL_KEY]??g.PROTOCOL_VALUE,[g.ENDPOINT_KEY]:n[g.ENDPOINT_KEY]??Z().OTEL_ENDPOINT,[g.HEADERS_KEY]:o};return m__namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
43
- `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}var Fe=E(()=>{"use strict";U();J();Mt();});var Ir={};z(Ir,{normalizeCustomUrl:()=>kr,runInit:()=>Rs,validateCustomUrl:()=>Ke,validateEmail:()=>We});function xe(t,e,r){process.stdout.write(b(j(`
43
+ `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}var Fe=E(()=>{"use strict";U();J();Wt();});var Ir={};z(Ir,{normalizeCustomUrl:()=>kr,runInit:()=>Rs,validateCustomUrl:()=>Ke,validateEmail:()=>Me});function xe(t,e,r){process.stdout.write(b(j(`
44
44
  [${t}/${e}] ${r}
45
45
  `)));}function dt(t){process.stdout.write(` ${v("\u2713")} ${t}
46
46
  `);}function ft(t){process.stdout.write(` ${C("\u26A0")} ${t}
@@ -54,14 +54,14 @@
54
54
  Received: ${t}
55
55
  Expected: https://tenant.example.com`);if(i.username||i.password)throw new Error(`Custom URL must not contain embedded credentials.
56
56
  Received: ${t}
57
- Expected: https://tenant.example.com`);if(!i.hostname.includes("."))throw new Error(`Invalid domain: ${i.hostname}. Expected format: tenant.example.com`);let a=`${i.protocol}//${i.host}`,c=process.env[d.FLOW_OBS_ALLOW_HTTP];try{delete process.env[d.FLOW_OBS_ALLOW_HTTP],re(a);}finally{c!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=c);}return a}let r=kr(t),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${t}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!n.hostname.includes("."))throw new Error(`Invalid domain: ${n.hostname}. Expected format: tenant.example.com`);let s=process.env[d.FLOW_OBS_ALLOW_HTTP];try{delete process.env[d.FLOW_OBS_ALLOW_HTTP],re(r);}finally{s!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function Me(){for(let t=1;t<=3;t++)try{let e=await qt(" Enter your Flow domain (e.g., tenant.ciandt.com)");return Ke(e)}catch(e){if(process.stderr.write(C(` \u2717 ${e.message}
57
+ Expected: https://tenant.example.com`);if(!i.hostname.includes("."))throw new Error(`Invalid domain: ${i.hostname}. Expected format: tenant.example.com`);let a=`${i.protocol}//${i.host}`,c=process.env[d.FLOW_OBS_ALLOW_HTTP];try{delete process.env[d.FLOW_OBS_ALLOW_HTTP],re(a);}finally{c!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=c);}return a}let r=kr(t),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${t}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!n.hostname.includes("."))throw new Error(`Invalid domain: ${n.hostname}. Expected format: tenant.example.com`);let s=process.env[d.FLOW_OBS_ALLOW_HTTP];try{delete process.env[d.FLOW_OBS_ALLOW_HTTP],re(r);}finally{s!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function We(){for(let t=1;t<=3;t++)try{let e=await qt(" Enter your Flow domain (e.g., tenant.ciandt.com)");return Ke(e)}catch(e){if(process.stderr.write(C(` \u2717 ${e.message}
58
58
 
59
59
  `)),t===3)throw process.stderr.write(N(` Too many invalid attempts.
60
60
 
61
- `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function Pr(t){return t.replace(/[\r\n]/g,"").trim()}function We(t){if(t.length>254)return "Email must not exceed 254 characters";if(/\s/.test(t))return "Email must not contain spaces";if((t.match(/@/g)??[]).length!==1)return "Email must contain exactly one @";let e=t.indexOf("@");if(e<=0)return "Email must contain a local part before @";let r=t.slice(e+1);if(!r)return "Email must contain a domain after @";if(r.startsWith("."))return `Invalid email domain: ${r}`;if(/^\d{1,3}(\.\d{1,3}){3}$/.test(r))return "Email domain cannot be an IP address";try{let n=new URL(`https://${r}`);if(!n.hostname.includes("."))return "Email domain must contain at least one dot";if(n.pathname!=="/"||n.search||n.hash||n.port)return `Invalid email domain: ${r}`}catch(n){return l("validateEmail",`URL parse error for domain ${r}: ${n.message}`),`Invalid email domain: ${r}`}return null}async function As(t,e,r){let n=pt(d.FLOW_USER_EMAIL),s=K(),o=s??"(could not be derived)";if(!t||!tt()){if(r){let c=Pr(r);if(!c)throw new Error("--custom-email: value is empty after normalization");let u=We(c);if(u)throw new Error(`--custom-email: ${u}`);return dt(`Email: ${b(c)}`),c}return n??s?dt(`Email: ${b(n??s)}`):ft(`Email not configured \u2014 telemetry will not include user identity.
61
+ `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function Pr(t){return t.replace(/[\r\n]/g,"").trim()}function Me(t){if(t.length>254)return "Email must not exceed 254 characters";if(/\s/.test(t))return "Email must not contain spaces";if((t.match(/@/g)??[]).length!==1)return "Email must contain exactly one @";let e=t.indexOf("@");if(e<=0)return "Email must contain a local part before @";let r=t.slice(e+1);if(!r)return "Email must contain a domain after @";if(r.startsWith("."))return `Invalid email domain: ${r}`;if(/^\d{1,3}(\.\d{1,3}){3}$/.test(r))return "Email domain cannot be an IP address";try{let n=new URL(`https://${r}`);if(!n.hostname.includes("."))return "Email domain must contain at least one dot";if(n.pathname!=="/"||n.search||n.hash||n.port)return `Invalid email domain: ${r}`}catch(n){return l("validateEmail",`URL parse error for domain ${r}: ${n.message}`),`Invalid email domain: ${r}`}return null}async function As(t,e,r){let n=pt(d.FLOW_USER_EMAIL),s=K(),o=s??"(could not be derived)";if(!t||!tt()){if(r){let c=Pr(r);if(!c)throw new Error("--custom-email: value is empty after normalization");let u=Me(c);if(u)throw new Error(`--custom-email: ${u}`);return dt(`Email: ${b(c)}`),c}return n??s?dt(`Email: ${b(n??s)}`):ft(`Email not configured \u2014 telemetry will not include user identity.
62
62
  To set it: flow-ai-obs init --custom-email <you@company.com>`),null}r&&ft("--custom-email is ignored in interactive mode. Use --no-interactive to apply it.");async function i(){for(let c=1;c<=3;c++){let u;try{u=await qt(" Enter your corporate email (e.g., user@company.com)");}catch(I){throw process.stderr.write(N(` \u2717 Input error: ${I.message}
63
63
 
64
- `)),I}let h=Pr(u),L=We(h);if(!L)return h;process.stderr.write(C(` \u2717 ${L}
64
+ `)),I}let h=Pr(u),L=Me(h);if(!L)return h;process.stderr.write(C(` \u2717 ${L}
65
65
 
66
66
  `));}throw process.stderr.write(N(` Too many invalid attempts.
67
67
 
@@ -88,10 +88,10 @@
88
88
  `)+C(" on Windows too: ")+j(`npm install -g @ciandt-flow/flow-ai-obs
89
89
  `)+C(` Without the Windows install, observability will not work for the Windows-side code assistant.
90
90
 
91
- `)),Ls(),!r&&!t.noInteractive&&tt()){let p=ce();o?r=await Me():p?(process.stdout.write(`
91
+ `)),Ls(),!r&&!t.noInteractive&&tt()){let p=ce();o?r=await We():p?(process.stdout.write(`
92
92
  Current base URL: ${b(p)}
93
- `),await yt(" Keep this URL?",true)||(r=await Me())):(process.stdout.write(`
94
- `),await yt(" Does your organization use a custom Flow URL?",false)?r=await Me():dt("Using default Flow Base URL: https://flow.ciandt.com")),process.stdout.write(`
93
+ `),await yt(" Keep this URL?",true)||(r=await We())):(process.stdout.write(`
94
+ `),await yt(" Does your organization use a custom Flow URL?",false)?r=await We():dt("Using default Flow Base URL: https://flow.ciandt.com")),process.stdout.write(`
95
95
  `);}if(!r&&!t.noInteractive&&!tt()){let p=ce();if(p)process.stdout.write(C(` \u26A0 Non-interactive environment detected.
96
96
  `)+S(` Using URL: ${p}
97
97
 
@@ -132,12 +132,12 @@
132
132
 
133
133
  `)+S(` Start your code assistant and begin working.
134
134
 
135
- `))),0}var vr=E(()=>{"use strict";wt();U();ut();Re();ke();J();zt();W();$e();Fe();});function Ps(){return Ne()??null}async function br(){let t=Ps();if(!t)return {ok:false,baseUrl:"",user:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let n=new URL(t);if(n.protocol!=="https:"&&n.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:t,user:"",notConfigured:true,error:"NOT_CONFIGURED"}}if(!$()){let n=!!process.env[d.FLOW_API_KEY];return {ok:false,baseUrl:t,user:"",error:n?"FLOW_API_KEY is set but invalid":"No credentials found"}}let r=K();return r?{ok:true,baseUrl:t,user:r}:{ok:false,baseUrl:t,user:"",error:"FLOW_API_KEY is set but x-flow-user could not be resolved"}}var Ur=E(()=>{"use strict";J();wt();U();});var Wr={};z(Wr,{runStatus:()=>Is});function Cr(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function ks(t){process.stdout.write(` ${v("\u2713")} ${t}
135
+ `))),0}var vr=E(()=>{"use strict";wt();U();ut();Re();ke();J();zt();M();$e();Fe();});function Ps(){return Ne()??null}async function br(){let t=Ps();if(!t)return {ok:false,baseUrl:"",user:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let n=new URL(t);if(n.protocol!=="https:"&&n.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:t,user:"",notConfigured:true,error:"NOT_CONFIGURED"}}if(!$()){let n=!!process.env[d.FLOW_API_KEY];return {ok:false,baseUrl:t,user:"",error:n?"FLOW_API_KEY is set but invalid":"No credentials found"}}let r=K();return r?{ok:true,baseUrl:t,user:r}:{ok:false,baseUrl:t,user:"",error:"FLOW_API_KEY is set but x-flow-user could not be resolved"}}var Ur=E(()=>{"use strict";J();wt();U();});var Mr={};z(Mr,{runStatus:()=>Is});function Cr(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function ks(t){process.stdout.write(` ${v("\u2713")} ${t}
136
136
  `);}function Nr(t){process.stdout.write(` ${C("\u26A0")} ${t}
137
- `);}function Be(t){process.stdout.write(` ${v("\u2713")} ${t}
137
+ `);}function Ye(t){process.stdout.write(` ${v("\u2713")} ${t}
138
138
  `);}function $r(t){process.stdout.write(` ${C("\u26A0")} ${t}
139
139
  `);}function le(t){process.stdout.write(` ${N("\u2717")} ${t}
140
- `);}function Bt(t){process.stdout.write(` ${S(t)}
140
+ `);}function Yt(t){process.stdout.write(` ${S(t)}
141
141
  `);}function Dr(t){process.stdout.write(b(j(`
142
142
  ${t}
143
143
  `)));}function Fr(t,e=false){let r=e?`${C("\u26A0")} ${b(C(t))}`:b(t);process.stdout.write(`
@@ -149,11 +149,11 @@
149
149
  `),process.stdout.write(` ${S("User: ")}${t.user}
150
150
  `),process.stdout.write(` ${S("Storage: FLOW_API_KEY (environment)")}
151
151
  `);else {let c=t.error==="FLOW_API_KEY is set but x-flow-user could not be resolved"?"Run `flow-ai-obs init --custom-email <EMAIL>`.":"Set FLOW_API_KEY and run `flow-ai-obs init`.";Nr(`${t.error}. ${c}`),process.stdout.write(` ${S("URL: ")}${t.baseUrl}
152
- `);}let e={},r={};try{let c=m__namespace.readFileSync(G(),"utf8");r=JSON.parse(c),e=r.env||{};}catch{}Dr("Observability configuration (OpenTelemetry)");let n=Object.keys(et).filter(c=>!e[c]);Fr("Metrics and Logs",n.length>0),n.length===0?(Be("All OTEL env vars present in settings.json"),Bt(`Endpoint: ${e.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
152
+ `);}let e={},r={};try{let c=m__namespace.readFileSync(G(),"utf8");r=JSON.parse(c),e=r.env||{};}catch{}Dr("Observability configuration (OpenTelemetry)");let n=Object.keys(et).filter(c=>!e[c]);Fr("Metrics and Logs",n.length>0),n.length===0?(Ye("All OTEL env vars present in settings.json"),Yt(`Endpoint: ${e.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
153
153
  `),process.stdout.write(` ${S("Run: flow-ai-obs init (restores missing vars automatically)")}
154
154
  `),process.stdout.write(`
155
155
  `),$r(`${n.length} OTEL var(s) missing from settings.json`),n.forEach(c=>le(`Missing: ${c}`))),xr();for(let c of Object.keys(et)){let u=e[c]??N("(missing)");process.stdout.write(S(` ${c.padEnd(36)}`)+u+`
156
- `);}Fr("Trace Destination");let s=process.env[d.FLOW_TELEMETRY]==="true",o=process.env[d.LANGFUSE_BASE_URL],i=process.env[d.LANGFUSE_PUBLIC_KEY],a=process.env[d.LANGFUSE_SECRET_KEY];if(s)if(o&&i&&a){let c=await Lt();for(let u of c)u.mode==="direct"&&(Be("FLOW_TELEMETRY=true (direct mode enabled)"),Be("Mode: direct"),Bt(`Endpoint: ${u.endpoint}`),Bt(`PK: ${Cr(i)}`),Bt(`SK: ${Cr(a)}`));}else $r("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),o||le("LANGFUSE_BASE_URL not set"),i||le("LANGFUSE_PUBLIC_KEY not set"),a||le("LANGFUSE_SECRET_KEY not set");else Bt("No active tracing destination configured.");return xr(),0}var Kr=E(()=>{"use strict";J();wt();U();ut();Ur();});var Br={};z(Br,{runUpdateApiKey:()=>vs});async function vs(t={}){let e=t.key!==void 0?X(t.key):$();if(!e)return t.key!==void 0?process.stderr.write(N(` \u2717 Provided API key is invalid.
156
+ `);}Fr("Trace Destination");let s=process.env[d.FLOW_TELEMETRY]==="true",o=process.env[d.LANGFUSE_BASE_URL],i=process.env[d.LANGFUSE_PUBLIC_KEY],a=process.env[d.LANGFUSE_SECRET_KEY];if(s)if(o&&i&&a){let c=await Lt();for(let u of c)u.mode==="direct"&&(Ye("FLOW_TELEMETRY=true (direct mode enabled)"),Ye("Mode: direct"),Yt(`Endpoint: ${u.endpoint}`),Yt(`PK: ${Cr(i)}`),Yt(`SK: ${Cr(a)}`));}else $r("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),o||le("LANGFUSE_BASE_URL not set"),i||le("LANGFUSE_PUBLIC_KEY not set"),a||le("LANGFUSE_SECRET_KEY not set");else Yt("No active tracing destination configured.");return xr(),0}var Kr=E(()=>{"use strict";J();wt();U();ut();Ur();});var Yr={};z(Yr,{runUpdateApiKey:()=>vs});async function vs(t={}){let e=t.key!==void 0?X(t.key):$();if(!e)return t.key!==void 0?process.stderr.write(N(` \u2717 Provided API key is invalid.
157
157
  `)+S(` Ensure the key contains valid characters and does not exceed 1024 characters.
158
158
 
159
159
  `)):process.stderr.write(N(` \u2717 FLOW_API_KEY environment variable is not set or is invalid.
@@ -167,7 +167,7 @@
167
167
  `)):s.status==="already_configured"?process.stdout.write(v(` \u2713 Claude Desktop API key is already up to date in ${s.wrapperScriptPath}
168
168
  `)):s.reason?.includes("not installed")?process.stdout.write(S(` \u2139 Claude Desktop is not installed \u2014 skipping Desktop API key update.
169
169
  `)):(process.stderr.write(N(` \u2717 Claude Desktop API key update failed: ${s.reason}
170
- `)),r=true),r?1:0}var Yr=E(()=>{"use strict";J();Fe();$e();ut();});var jr={};z(jr,{runOtelHeaders:()=>bs});async function bs(){let t=$();if(!t)return process.stderr.write(process.env[d.FLOW_API_KEY]?`[flow-ai-obs otel-headers] FLOW_API_KEY is set but its value was rejected (invalid characters or length).
170
+ `)),r=true),r?1:0}var Br=E(()=>{"use strict";J();Fe();$e();ut();});var jr={};z(jr,{runOtelHeaders:()=>bs});async function bs(){let t=$();if(!t)return process.stderr.write(process.env[d.FLOW_API_KEY]?`[flow-ai-obs otel-headers] FLOW_API_KEY is set but its value was rejected (invalid characters or length).
171
171
  Set a valid FLOW_API_KEY in the environment used by your code assistant, then restart it.
172
172
  `:`[flow-ai-obs otel-headers] FLOW_API_KEY is not set.
173
173
  Set FLOW_API_KEY in the environment used by your code assistant, then restart it.
@@ -175,43 +175,43 @@
175
175
  Run: flow-ai-obs init --custom-email <EMAIL>
176
176
  `),1;let r=s=>s.replace(/[\r\n]/g,""),n={"x-flow-api-key":r(t),"x-flow-user":r(e)};return process.stdout.write(JSON.stringify(n)+`
177
177
  `),0}var Hr=E(()=>{"use strict";J();U();});function q(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function ue(t,e=100){return String(t??"").split(`
178
- `)[0].slice(0,e).trim()}function Yt(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function D(t){process.stdout.write(JSON.stringify(t));}var kt=E(()=>{"use strict";});function ot(){return String(BigInt(Date.now())*1000000n)}var Ye,mt,jt=E(()=>{"use strict";Ye=()=>hr.randomBytes(16).toString("hex"),mt=()=>hr.randomBytes(8).toString("hex");});function Bs(t,e){let r=w.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function je(t){if(!Ws.test(t))throw new Error(`Invalid session ID: ${t}`);return Bs(w.join(At.tmpdir(),`flow-obs-${t}.json`),Ks)}function It(t){let e;try{e=je(t);}catch{return null}if(!m.existsSync(e))return null;try{return JSON.parse(m.readFileSync(e,"utf8"))}catch{return null}}function vt(t,e){m.writeFileSync(je(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function He(t){try{m.unlinkSync(je(t));}catch{}}var Ws,Ks,Ht=E(()=>{"use strict";Ws=/^[0-9a-f-]{1,64}$/i,Ks=w.normalize(At.tmpdir())+w.sep;});function qr(t){if(!t||!m.existsSync(t))return null;try{let e=m.readFileSync(t,"utf8").trimEnd().split(`
178
+ `)[0].slice(0,e).trim()}function Bt(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function D(t){process.stdout.write(JSON.stringify(t));}var kt=E(()=>{"use strict";});function ot(){return String(BigInt(Date.now())*1000000n)}var Be,mt,jt=E(()=>{"use strict";Be=()=>hr.randomBytes(16).toString("hex"),mt=()=>hr.randomBytes(8).toString("hex");});function Ys(t,e){let r=w.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function je(t){if(!Ms.test(t))throw new Error(`Invalid session ID: ${t}`);return Ys(w.join(At.tmpdir(),`flow-obs-${t}.json`),Ks)}function It(t){let e;try{e=je(t);}catch{return null}if(!m.existsSync(e))return null;try{return JSON.parse(m.readFileSync(e,"utf8"))}catch{return null}}function vt(t,e){m.writeFileSync(je(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function He(t){try{m.unlinkSync(je(t));}catch{}}var Ms,Ks,Ht=E(()=>{"use strict";Ms=/^[0-9a-f-]{1,64}$/i,Ks=w.normalize(At.tmpdir())+w.sep;});function qr(t){if(!t||!m.existsSync(t))return null;try{let e=m.readFileSync(t,"utf8").trimEnd().split(`
179
179
  `);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function Ve(t){if(!t||!m.existsSync(t))return null;try{let e=m.readFileSync(t,"utf8").trimEnd().split(`
180
180
  `),r=[],n=0,s=0,o;for(let i=e.length-1;i>=0;i--)try{let a=JSON.parse(e[i]);if(a.type==="user")break;if(a.type==="assistant"){!o&&a.message?.model&&(o=a.message.model);let u=(a.message?.content??[]).filter(L=>L.type==="text").map(L=>L.text??"").join("");u&&r.unshift(u);let h=a.message?.usage??{};n+=(h.input_tokens??0)+(h.cache_read_input_tokens??0)+(h.cache_creation_input_tokens??0),s+=h.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
181
181
 
182
182
  `),inputTokens:n,outputTokens:s,model:o}}catch{}return null}var Ge=E(()=>{"use strict";});function Qr(t){return t.replace(":","/")}function pe(t,e){if(!t)return null;let r=Qr(t),n=[w.join(At.homedir(),".claude","skills",r,"SKILL.md"),w.join(e??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(m.existsSync(s))try{return m.readFileSync(s,"utf8")}catch{}return null}function tn(t){return t.split(`
183
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function en(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Xs.has(n.tool))?"complete":"prerequisite_required":null}function de(t,e){if(!t)return null;let r=Qr(t),n=[w.join(At.homedir(),".claude","skills",r),w.join(e??"",".claude","skills",r)],s=null;for(let a of n)if(m.existsSync(w.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let u of m.readdirSync(a,{withFileTypes:true})){if(Vs.has(u.name)||Js.has(u.name)||Gs.has(w.extname(u.name)))continue;let h=c?`${c}/${u.name}`:u.name;u.isDirectory()?i(w.join(a,u.name),h):o.push(h);}}return i(s,""),o.length>0?o:null}var Vs,Gs,Js,Xs,fe=E(()=>{"use strict";Vs=new Set([".venv","__pycache__",".git","node_modules"]),Gs=new Set([".pyc",".pyo"]),Js=new Set(["SKILL.md",".DS_Store",".gitignore"]);Xs=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});async function rn(t){let e=t.session_id||"unknown",r=t.prompt||"",n=t.cwd||"",s=qr(t.transcript_path)||Ye(),o=tn(r),i=o?pe(o,n):null,a=o?de(o,n):null;vt(e,{traceId:Ye(),spanId:mt(),startNs:ot(),sessionId:e,prompt:r,cwd:n,traceName:s,transcriptPath:t.transcript_path||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:o,skillContent:i,skillArtifacts:a}),l("UserPromptSubmit",`sid=${e}`,`traceName=${s}`,`slashSkill=${o}`),D(t);}var nn=E(()=>{"use strict";jt();Ht();Ge();fe();kt();W();});async function sn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=It(e);s&&(s.pendingTool={name:r,inputStr:q(n,V.TOOL_INPUT),startNs:ot()},vt(e,s)),l("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!s}`),D(t);}var on=E(()=>{"use strict";jt();Ht();kt();W();U();});function f(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function gt(...t){return t.filter(e=>e!==null)}function an(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:qs,spans:Array.isArray(e)?e:[e]}]}]}}var qs,T,cn=E(()=>{"use strict";U();qs={name:Zt.SCOPE_NAME,version:Zt.SCOPE_VERSION},T={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};});function un(t,e,r,n,s){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:s}});try{m.writeFileSync(ln,o+`
184
- `,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${ln}`);}catch(i){l("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function ro(t){let e=new URL(t),r=new URL(Z().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function pn(t,e){return new Promise((r,n)=>{let s=t._isSSL?Vn__default.default:Zs__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=s.request(t,i=>{let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>r({statusCode:i.statusCode??0,body:a.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}async function dn(t,e){let r;try{r=ro(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let o=await pn({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:s,_isSSL:n},null);return l("checkHealth",`url=${r.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function me(t,e,r){let n=JSON.stringify(t),s=new URL(e),o=s.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};l("sendTraces:request",`POST ${e}`),l("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:i.slice(0,20)+"\u2026"})}`),l("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let c=await pn({hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname,method:"POST",headers:a,_isSSL:o},n);return l("sendTraces:response",`status=${c.statusCode}`),un(e,a,n,c.statusCode,c.body),c.statusCode}catch(c){return l("sendTraces:error",c.message),un(e,a,n,0,c.message),0}}var ln,fn=E(()=>{"use strict";U();W();ln=w.join(At.tmpdir(),"flow-obs-requests.ndjson");});function no(){let t=parseInt(process.env[d.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(M.MIN_TTL_DAYS,Math.min(M.MAX_TTL_DAYS,t)):M.DEFAULT_TTL_DAYS)*24*60*60*1e3}function so(){let t=parseInt(process.env[d.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(M.MIN_MAX_FILES,Math.min(M.MAX_MAX_FILES,t)):M.DEFAULT_MAX_FILES}function gn(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return w__namespace.default.join(At__namespace.default.tmpdir(),`${M.FILE_PREFIX}${t}.json`)}function Xe(){let t=At__namespace.default.tmpdir(),e;try{e=m__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(M.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=w__namespace.default.join(t,r),s=0;try{s=m__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function Vt(t){try{let e=so(),r=Xe();if(r.length>=e){let o=r.slice(0,r.length-e+1);for(let i of o)try{m__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:t};return m__namespace.default.writeFileSync(gn(n),JSON.stringify(s),{encoding:"utf8",mode:384}),l("buffer",`saved fileId=${n}`),n}catch(e){return l("buffer",`saveToBuffer failed: ${e.message}`),null}}function En(t){let e=Xe(),r=t!=null&&t>0?t:e.length,n=[];for(let s of e){if(n.length>=r)break;try{let o=m__namespace.default.readFileSync(s,"utf8"),i=JSON.parse(o);i&&i.fileId&&i.payload&&n.push(i);}catch{l("buffer",`skipping malformed file: ${s}`);}}return n}function hn(t){try{m__namespace.default.unlinkSync(gn(t)),l("buffer",`deleted fileId=${t}`);}catch{}}function _n(){let t=Date.now()-no();for(let e of Xe())try{let{mtimeMs:r}=m__namespace.default.statSync(e);r<t&&(m__namespace.default.unlinkSync(e),l("buffer",`evicted stale: ${w__namespace.default.basename(e)}`));}catch{}}var Sn=E(()=>{"use strict";U();W();});async function oo(t){_n();let e=En(M.REPLAY_BATCH_SIZE);e.length&&(l("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await me(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(hn(r.fileId),l("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):l("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){l("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function yn(t){let e=await Lt();if(!e.length)return e.authError&&(l("postToLangfuse","auth refresh failed \u2014 buffering trace"),Vt(t)),0;let r=await Promise.all(e.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await dn(o.endpoint,o.authHeader);return {creds:o,healthy:i}})),n=r.find(o=>o.creds.mode==="gateway"&&o.healthy)?.creds??r.find(o=>o.creds.mode==="direct")?.creds;return n&&await oo(n),(await Promise.all(r.map(async({creds:o,healthy:i})=>{if(o.mode==="gateway"){if(!i)return l("postToLangfuse","gateway health check failed \u2014 buffering trace"),Vt(t),0;let c=await me(t,o.endpoint,o.authHeader);return (c===0||c>=500)&&(l("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),Vt(t)),c}let a=await me(t,o.endpoint,o.authHeader);return (a===0||a>=500)&&(l("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),Vt(t)),a}))).find(o=>o!==0)??0}var Tn=E(()=>{"use strict";J();W();fn();Sn();U();});var qe=E(()=>{"use strict";cn();Tn();});function at(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return lo.reduce((r,{re:n,replace:s})=>r.replace(n,s),e)}var B,io,ao,co,On,lo,ze=E(()=>{"use strict";B="[REDACTED]",io="[REDACTED-EMAIL]",ao="[REDACTED-CPF]",co="[REDACTED-CNPJ]",On="[REDACTED-PHONE]",lo=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${B}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${B}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${B}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${B}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
185
- ${B}
186
- ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${B}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${B}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${B}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${B}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${B}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${B}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${B}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>io},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>ao},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>co},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>On},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>On}];});async function wn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=t.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=It(e);if(!i){D(t);return}let a=ot(),c=i.pendingTool,u=c?.name===r,h=u?c.startNs:String(BigInt(a)-200000000n),L=u?c.inputStr:q(n,V.TOOL_INPUT),I=L,A=null;if(r==="Skill"){let Ct=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);A=Ct?String(Ct).trim():null;let _t=A?pe(A,i.cwd):null;_t&&(I=_t,i.skillContent||(i.skillContent=_t),i.skillArtifacts||(i.skillArtifacts=de(A,i.cwd))),A&&!i.slashSkill&&(i.slashSkill=A),l("PostToolUse","Skill tool detected",`skillName=${A}`,`contentFound=${!!_t}`);}let p=at(q(o,V.TOOL_OUTPUT)),O=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(p.slice(0,500)),ct=O?"ERROR":"DEFAULT",Ut=mt(),Gt=Math.round(Number(BigInt(a)-BigInt(h))/1e6),Xt={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",ht=r==="Skill"&&A?A:ue(L,60);i.toolCalls.push({tool:r,brief:ht,error:O,durationMs:Gt});let Q=i.spans;Q.push({traceId:i.traceId,spanId:Ut,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:h,endTimeUnixNano:a,attributes:gt(f(T.OBS_NAME,r),f(T.OBS_TYPE,Xt),f(T.OBS_LEVEL,ct),f(T.OBS_INPUT,at(I)),f(T.OBS_OUTPUT,p),f("tool.name",r),f("tool.error",String(O)),r==="Skill"&&A?f("skill.name",A):null,r==="Skill"?f("skill.invocation","slash-command"):null),status:{code:O?2:1}}),i.pendingTool=null,vt(e,i),l("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${O}`,`durationMs=${Gt}`,`totalSpans=${Q.length}`),D(t);}var Ln=E(()=>{"use strict";jt();Ht();qe();kt();fe();W();U();ze();});function Rn(t,e,r){let n=Object.keys(An).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let s=An[n],o=(e*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var An,Pn=E(()=>{"use strict";An={"claude-opus-5":{input:5,output:25},"claude-sonnet-5":{input:2,output:10},"claude-fable-5":{input:10,output:50},"claude-opus-4-6":{input:5,output:25},"claude-opus-4-5":{input:5,output:25},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:1,output:5},"claude-4-6-opus":{input:5,output:25},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:5,output:25},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:1,output:5},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};});async function kn(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=It(e);if(!n){D(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(l("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=ot(),o=K()??"",i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(y=>y.tool==="Skill")){let y=mt(),lt=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});i.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),a.push({traceId:n.traceId,spanId:y,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:gt(f(T.OBS_NAME,"Skill"),f(T.OBS_TYPE,"TOOL"),f(T.OBS_LEVEL,"DEFAULT"),f(T.OBS_INPUT,lt),f(T.OBS_OUTPUT,"loaded via slash command"),f("tool.name","Skill"),f("tool.error","false"),f("skill.name",n.slashSkill),f("skill.invocation","slash-command")),status:{code:1}}),l("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||n.transcriptPath||"",u=Ve(c);if(c&&(i.some(y=>y.tool==="Skill"&&!y.synthetic)||!!n.slashSkill)&&!u?.text){await new Promise(lt=>setTimeout(lt,500));let y=Ve(c);y?.text&&(u=y);}l("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${u?`text=${u.text.length}chars`:"null"}`);let L=i.length,I=i.filter(y=>y.error).length,A=at(u?.text?q(u.text,V.TRACE_OUTPUT):L===0?"No tools used":i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""}`).join(`
187
- `)),p=u?.inputTokens??0,O=u?.outputTokens??0,ct=i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""} (${y.durationMs}ms)`),Ut=!!(n.slashSkill||i.some(y=>y.tool==="Skill")),Gt=i.some(y=>y.tool==="Agent");if(!Ut&&!Gt){l("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),He(e),D(t);return}let Jt=Ut?"skill":"agent",Xt=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),ht=u?.model||"",ge=Rn(ht,p,O),Q=en(n);Q==="prerequisite_required"&&u?.text&&(Q="complete"),Q==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:mt(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:gt(f(T.OBS_NAME,"prerequisite-check"),f(T.OBS_TYPE,"EVENT"),f(T.OBS_LEVEL,"WARNING"),f(T.OBS_OUTPUT,A),f("skill.name",n.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),l("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let Ct=(()=>{if(!(!Ut||!n.prompt)){if(n.slashSkill){let y=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return y?q(at(y),V.USER_INSTRUCTION):void 0}return q(at(n.prompt),V.USER_INSTRUCTION)||void 0}})(),_t=JSON.stringify({trace_type:Jt,...Q!==null&&{execution_status:Q},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Ct!==void 0&&{user_instruction:Ct},latency_ms:Xt,...p&&{tokens_input:p},...O&&{tokens_output:O},cost_usd:ge,...ht?{model:ht}:{},toolCount:L,errorCount:I,stopReason:r,sessionId:n.sessionId,tools:ct.length?ct:void 0}),Qe=at(q(n.prompt,V.TRACE_INPUT)),Cn=gt(f(T.TRACE_NAME,n.traceName),f(T.TRACE_INPUT,Qe),f(T.TRACE_OUTPUT,A),f(T.OBS_INPUT,Qe),f(T.OBS_OUTPUT,A),f(T.TRACE_METADATA,_t),f(T.SESSION_ID,n.sessionId),f(T.USER_ID,o),f(T.OBS_TYPE,"GENERATION"),f(T.MODEL,ht),p?f(T.INPUT_TOKENS,p):null,O?f(T.OUTPUT_TOKENS,O):null,f("claude.stop_reason",r),f("claude.tool_count",String(L)),f("claude.error_count",String(I)),f("claude.session_id",n.sessionId),f("flow.trace_type",Jt),{key:T.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Jt}]}}}),Nn={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Cn,status:{code:I>0?2:1}},$n=gt(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),tr=[...a,Nn];l("Stop",`sid=${e}`,`totalTools=${L}`,`errorTools=${I}`,`spans=${tr.length}`,`inputTokens=${p}`,`outputTokens=${O}`,`traceOutput="${ue(A,80)}"`);let Dn=await yn(an($n,tr));l("Stop",`POST status=${Dn}`,`traceId=${n.traceId}`,`latencyMs=${Xt}`,`costUsd=${ge}`),He(e),D(t);}var In=E(()=>{"use strict";jt();Ht();qe();J();Pn();Ge();kt();W();fe();ze();U();});var Et,vn=E(()=>{"use strict";J();kt();nn();on();Ln();In();Et=class{static async userPromptSubmit(){let e=await Yt(),r;try{r=(await Lt()).length>0;}catch{D(e);return}r?await rn(e):D(e);}static async preToolUse(){let e=await Yt();await sn(e);}static async postToolUse(){let e=await Yt();await wn(e);}static async stop(){let e=await Yt();await kn(e);}};});var po={};async function uo(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await Et.userPromptSubmit();break;case "PreToolUse":await Et.preToolUse();break;case "PostToolUse":await Et.postToolUse();break;case "Stop":await Et.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
183
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function en(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Xs.has(n.tool))?"complete":"prerequisite_required":null}function de(t,e){if(!t)return null;let r=Qr(t),n=[w.join(At.homedir(),".claude","skills",r),w.join(e??"",".claude","skills",r)],s=null;for(let a of n)if(m.existsSync(w.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let u of m.readdirSync(a,{withFileTypes:true})){if(Vs.has(u.name)||Js.has(u.name)||Gs.has(w.extname(u.name)))continue;let h=c?`${c}/${u.name}`:u.name;u.isDirectory()?i(w.join(a,u.name),h):o.push(h);}}return i(s,""),o.length>0?o:null}var Vs,Gs,Js,Xs,fe=E(()=>{"use strict";Vs=new Set([".venv","__pycache__",".git","node_modules"]),Gs=new Set([".pyc",".pyo"]),Js=new Set(["SKILL.md",".DS_Store",".gitignore"]);Xs=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});async function rn(t){let e=t.session_id||"unknown",r=t.prompt||"",n=t.cwd||"",s=qr(t.transcript_path)||Be(),o=tn(r),i=o?pe(o,n):null,a=o?de(o,n):null;vt(e,{traceId:Be(),spanId:mt(),startNs:ot(),sessionId:e,prompt:r,cwd:n,traceName:s,transcriptPath:t.transcript_path||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:o,skillContent:i,skillArtifacts:a}),l("UserPromptSubmit",`sid=${e}`,`traceName=${s}`,`slashSkill=${o}`),D(t);}var nn=E(()=>{"use strict";jt();Ht();Ge();fe();kt();M();});async function sn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=It(e);s&&(s.pendingTool={name:r,inputStr:q(n,V.TOOL_INPUT),startNs:ot()},vt(e,s)),l("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!s}`),D(t);}var on=E(()=>{"use strict";jt();Ht();kt();M();U();});function f(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function gt(...t){return t.filter(e=>e!==null)}function an(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:qs,spans:Array.isArray(e)?e:[e]}]}]}}var qs,T,cn=E(()=>{"use strict";U();qs={name:Zt.SCOPE_NAME,version:Zt.SCOPE_VERSION},T={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};});function un(t,e,r,n,s){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:s}});try{m.writeFileSync(ln,o+`
184
+ `,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${ln}`);}catch(i){l("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function ro(t){let e=new URL(t),r=new URL(Z().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function pn(t,e){return new Promise((r,n)=>{let s=t._isSSL?Vn__default.default:Zs__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=s.request(t,i=>{let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>r({statusCode:i.statusCode??0,body:a.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}async function dn(t,e){let r;try{r=ro(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let o=await pn({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:s,_isSSL:n},null);return l("checkHealth",`url=${r.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function me(t,e,r){let n=JSON.stringify(t),s=new URL(e),o=s.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};l("sendTraces:request",`POST ${e}`),l("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:i.slice(0,20)+"\u2026"})}`),l("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let c=await pn({hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname,method:"POST",headers:a,_isSSL:o},n);return l("sendTraces:response",`status=${c.statusCode}`),un(e,a,n,c.statusCode,c.body),c.statusCode}catch(c){return l("sendTraces:error",c.message),un(e,a,n,0,c.message),0}}var ln,fn=E(()=>{"use strict";U();M();ln=w.join(At.tmpdir(),"flow-obs-requests.ndjson");});function no(){let t=parseInt(process.env[d.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(W.MIN_TTL_DAYS,Math.min(W.MAX_TTL_DAYS,t)):W.DEFAULT_TTL_DAYS)*24*60*60*1e3}function so(){let t=parseInt(process.env[d.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(W.MIN_MAX_FILES,Math.min(W.MAX_MAX_FILES,t)):W.DEFAULT_MAX_FILES}function gn(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return w__namespace.default.join(At__namespace.default.tmpdir(),`${W.FILE_PREFIX}${t}.json`)}function Xe(){let t=At__namespace.default.tmpdir(),e;try{e=m__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(W.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=w__namespace.default.join(t,r),s=0;try{s=m__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function Vt(t){try{let e=so(),r=Xe();if(r.length>=e){let o=r.slice(0,r.length-e+1);for(let i of o)try{m__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:t};return m__namespace.default.writeFileSync(gn(n),JSON.stringify(s),{encoding:"utf8",mode:384}),l("buffer",`saved fileId=${n}`),n}catch(e){return l("buffer",`saveToBuffer failed: ${e.message}`),null}}function En(t){let e=Xe(),r=t!=null&&t>0?t:e.length,n=[];for(let s of e){if(n.length>=r)break;try{let o=m__namespace.default.readFileSync(s,"utf8"),i=JSON.parse(o);i&&i.fileId&&i.payload&&n.push(i);}catch{l("buffer",`skipping malformed file: ${s}`);}}return n}function hn(t){try{m__namespace.default.unlinkSync(gn(t)),l("buffer",`deleted fileId=${t}`);}catch{}}function _n(){let t=Date.now()-no();for(let e of Xe())try{let{mtimeMs:r}=m__namespace.default.statSync(e);r<t&&(m__namespace.default.unlinkSync(e),l("buffer",`evicted stale: ${w__namespace.default.basename(e)}`));}catch{}}var Sn=E(()=>{"use strict";U();M();});async function oo(t){_n();let e=En(W.REPLAY_BATCH_SIZE);e.length&&(l("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await me(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(hn(r.fileId),l("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):l("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){l("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function yn(t){let e=await Lt();if(!e.length)return e.authError&&(l("postToLangfuse","auth refresh failed \u2014 buffering trace"),Vt(t)),0;let r=await Promise.all(e.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await dn(o.endpoint,o.authHeader);return {creds:o,healthy:i}})),n=r.find(o=>o.creds.mode==="gateway"&&o.healthy)?.creds??r.find(o=>o.creds.mode==="direct")?.creds;return n&&await oo(n),(await Promise.all(r.map(async({creds:o,healthy:i})=>{if(o.mode==="gateway"){if(!i)return l("postToLangfuse","gateway health check failed \u2014 buffering trace"),Vt(t),0;let c=await me(t,o.endpoint,o.authHeader);return (c===0||c>=500)&&(l("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),Vt(t)),c}let a=await me(t,o.endpoint,o.authHeader);return (a===0||a>=500)&&(l("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),Vt(t)),a}))).find(o=>o!==0)??0}var Tn=E(()=>{"use strict";J();M();fn();Sn();U();});var qe=E(()=>{"use strict";cn();Tn();});function at(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return lo.reduce((r,{re:n,replace:s})=>r.replace(n,s),e)}var Y,io,ao,co,On,lo,ze=E(()=>{"use strict";Y="[REDACTED]",io="[REDACTED-EMAIL]",ao="[REDACTED-CPF]",co="[REDACTED-CNPJ]",On="[REDACTED-PHONE]",lo=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${Y}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${Y}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${Y}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${Y}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
185
+ ${Y}
186
+ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${Y}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${Y}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${Y}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${Y}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${Y}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${Y}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${Y}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>io},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>ao},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>co},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>On},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>On}];});async function wn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=t.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=It(e);if(!i){D(t);return}let a=ot(),c=i.pendingTool,u=c?.name===r,h=u?c.startNs:String(BigInt(a)-200000000n),L=u?c.inputStr:q(n,V.TOOL_INPUT),I=L,A=null;if(r==="Skill"){let Ct=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);A=Ct?String(Ct).trim():null;let _t=A?pe(A,i.cwd):null;_t&&(I=_t,i.skillContent||(i.skillContent=_t),i.skillArtifacts||(i.skillArtifacts=de(A,i.cwd))),A&&!i.slashSkill&&(i.slashSkill=A),l("PostToolUse","Skill tool detected",`skillName=${A}`,`contentFound=${!!_t}`);}let p=at(q(o,V.TOOL_OUTPUT)),O=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(p.slice(0,500)),ct=O?"ERROR":"DEFAULT",Ut=mt(),Gt=Math.round(Number(BigInt(a)-BigInt(h))/1e6),Xt={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",ht=r==="Skill"&&A?A:ue(L,60);i.toolCalls.push({tool:r,brief:ht,error:O,durationMs:Gt});let Q=i.spans;Q.push({traceId:i.traceId,spanId:Ut,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:h,endTimeUnixNano:a,attributes:gt(f(T.OBS_NAME,r),f(T.OBS_TYPE,Xt),f(T.OBS_LEVEL,ct),f(T.OBS_INPUT,at(I)),f(T.OBS_OUTPUT,p),f("tool.name",r),f("tool.error",String(O)),r==="Skill"&&A?f("skill.name",A):null,r==="Skill"?f("skill.invocation","slash-command"):null),status:{code:O?2:1}}),i.pendingTool=null,vt(e,i),l("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${O}`,`durationMs=${Gt}`,`totalSpans=${Q.length}`),D(t);}var Ln=E(()=>{"use strict";jt();Ht();qe();kt();fe();M();U();ze();});function Rn(t,e,r){let n=Object.keys(An).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let s=An[n],o=(e*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var An,Pn=E(()=>{"use strict";An={"claude-opus-5":{input:5,output:25},"claude-sonnet-5":{input:2,output:10},"claude-fable-5":{input:10,output:50},"claude-opus-4-6":{input:5,output:25},"claude-opus-4-5":{input:5,output:25},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:1,output:5},"claude-4-6-opus":{input:5,output:25},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:5,output:25},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:1,output:5},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};});async function kn(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=It(e);if(!n){D(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(l("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=ot(),o=K()??"",i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(y=>y.tool==="Skill")){let y=mt(),lt=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});i.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),a.push({traceId:n.traceId,spanId:y,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:gt(f(T.OBS_NAME,"Skill"),f(T.OBS_TYPE,"TOOL"),f(T.OBS_LEVEL,"DEFAULT"),f(T.OBS_INPUT,lt),f(T.OBS_OUTPUT,"loaded via slash command"),f("tool.name","Skill"),f("tool.error","false"),f("skill.name",n.slashSkill),f("skill.invocation","slash-command")),status:{code:1}}),l("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||n.transcriptPath||"",u=Ve(c);if(c&&(i.some(y=>y.tool==="Skill"&&!y.synthetic)||!!n.slashSkill)&&!u?.text){await new Promise(lt=>setTimeout(lt,500));let y=Ve(c);y?.text&&(u=y);}l("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${u?`text=${u.text.length}chars`:"null"}`);let L=i.length,I=i.filter(y=>y.error).length,A=at(u?.text?q(u.text,V.TRACE_OUTPUT):L===0?"No tools used":i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""}`).join(`
187
+ `)),p=u?.inputTokens??0,O=u?.outputTokens??0,ct=i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""} (${y.durationMs}ms)`),Ut=!!(n.slashSkill||i.some(y=>y.tool==="Skill")),Gt=i.some(y=>y.tool==="Agent");if(!Ut&&!Gt){l("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),He(e),D(t);return}let Jt=Ut?"skill":"agent",Xt=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),ht=u?.model||"",ge=Rn(ht,p,O),Q=en(n);Q==="prerequisite_required"&&u?.text&&(Q="complete"),Q==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:mt(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:gt(f(T.OBS_NAME,"prerequisite-check"),f(T.OBS_TYPE,"EVENT"),f(T.OBS_LEVEL,"WARNING"),f(T.OBS_OUTPUT,A),f("skill.name",n.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),l("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let Ct=(()=>{if(!(!Ut||!n.prompt)){if(n.slashSkill){let y=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return y?q(at(y),V.USER_INSTRUCTION):void 0}return q(at(n.prompt),V.USER_INSTRUCTION)||void 0}})(),_t=JSON.stringify({trace_type:Jt,...Q!==null&&{execution_status:Q},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Ct!==void 0&&{user_instruction:Ct},latency_ms:Xt,...p&&{tokens_input:p},...O&&{tokens_output:O},cost_usd:ge,...ht?{model:ht}:{},toolCount:L,errorCount:I,stopReason:r,sessionId:n.sessionId,tools:ct.length?ct:void 0}),Qe=at(q(n.prompt,V.TRACE_INPUT)),Cn=gt(f(T.TRACE_NAME,n.traceName),f(T.TRACE_INPUT,Qe),f(T.TRACE_OUTPUT,A),f(T.OBS_INPUT,Qe),f(T.OBS_OUTPUT,A),f(T.TRACE_METADATA,_t),f(T.SESSION_ID,n.sessionId),f(T.USER_ID,o),f(T.OBS_TYPE,"GENERATION"),f(T.MODEL,ht),p?f(T.INPUT_TOKENS,p):null,O?f(T.OUTPUT_TOKENS,O):null,f("claude.stop_reason",r),f("claude.tool_count",String(L)),f("claude.error_count",String(I)),f("claude.session_id",n.sessionId),f("flow.trace_type",Jt),{key:T.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Jt}]}}}),Nn={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Cn,status:{code:I>0?2:1}},$n=gt(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),tr=[...a,Nn];l("Stop",`sid=${e}`,`totalTools=${L}`,`errorTools=${I}`,`spans=${tr.length}`,`inputTokens=${p}`,`outputTokens=${O}`,`traceOutput="${ue(A,80)}"`);let Dn=await yn(an($n,tr));l("Stop",`POST status=${Dn}`,`traceId=${n.traceId}`,`latencyMs=${Xt}`,`costUsd=${ge}`),He(e),D(t);}var In=E(()=>{"use strict";jt();Ht();qe();J();Pn();Ge();kt();M();fe();ze();U();});var Et,vn=E(()=>{"use strict";J();kt();nn();on();Ln();In();Et=class{static async userPromptSubmit(){let e=await Bt(),r;try{r=(await Lt()).length>0;}catch{D(e);return}r?await rn(e):D(e);}static async preToolUse(){let e=await Bt();await sn(e);}static async postToolUse(){let e=await Bt();await wn(e);}static async stop(){let e=await Bt();await kn(e);}};});var po={};async function uo(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await Et.userPromptSubmit();break;case "PreToolUse":await Et.preToolUse();break;case "PostToolUse":await Et.postToolUse();break;case "Stop":await Et.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
188
188
  `),process.stdin.on("data",e=>process.stdout.write(e));}}var bn=E(()=>{"use strict";vn();uo().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
189
- `),process.exit(0);});});var fo=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,Y]=process.argv;function Ze(t,e){let r=t.indexOf(e);return r!==-1?t[r+1]:void 0}function Un(){let{bold:t,cyan:e,dim:r,green:n}=(ut(),F(he)),{version:s}=Nt();process.stdout.write(`
189
+ `),process.exit(0);});});var fo=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,B]=process.argv;function Ze(t,e){let r=t.indexOf(e);return r!==-1?t[r+1]:void 0}function Un(){let{bold:t,cyan:e,dim:r,green:n}=(ut(),F(he)),{version:s}=Nt();process.stdout.write(`
190
190
  `+t(" flow-ai-obs")+r(" v"+s)+`
191
191
 
192
- `),process.stdout.write(e(" init")+r(` Configure environment: Claude Code + Proxy + OTEL + Trace hooks
192
+ `),process.stdout.write(e(" init")+r(` Configure native OTEL for Code Assistants.
193
193
  `)),process.stdout.write(r(` --custom-url <URL> Set a custom Flow base URL
194
194
  `)),process.stdout.write(r(` --no-interactive Suppress interactive prompts (CI/CD)
195
195
  `)),process.stdout.write(r(` --custom-email <EMAIL> Set user email (used with --no-interactive)
196
196
  `)),process.stdout.write(e(" status")+r(` Show current observability configuration
197
+ `)),process.stdout.write(e(" update-api-key")+r(` Update FLOW_API_KEY in VS Code/Copilot and Claude Desktop
198
+ `)),process.stdout.write(r(` --key <KEY> API key to set (defaults to FLOW_API_KEY)
197
199
  `)),process.stdout.write(n(" update")+r(` Update to the latest version
198
200
 
199
201
  `)),process.stdout.write(r(` Flags: --version -v Show version
200
202
  `)),process.stdout.write(r(` --help -h Show this help
201
203
 
202
- `)),process.stdout.write(r(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
203
-
204
- `));}if(Y==="--version"||Y==="-v")(async()=>{let{version:t}=Nt();process.stdout.write(t+`
204
+ `));}if(B==="--version"||B==="-v")(async()=>{let{version:t}=Nt();process.stdout.write(t+`
205
205
  `);let e=(Dt(),F($t)),r=await e.fetchLatestVersionAsync().catch(()=>null);if(r&&e.isNewer(t,r.version)){let{dim:n,yellow:s}=(ut(),F(he));process.stdout.write(s(`
206
206
  Update available: ${t} \u2192 ${r.version}
207
207
  `)+n(` Run: flow-ai-obs update
208
208
 
209
- `));}process.exit(0);})().catch(()=>process.exit(0));else if(Y==="--help"||Y==="-h")Un(),process.exit(0);else if(Y==="init"||Y==="install")(async()=>{Y==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
209
+ `));}process.exit(0);})().catch(()=>process.exit(0));else if(B==="--help"||B==="-h")Un(),process.exit(0);else if(B==="init"||B==="install")(async()=>{B==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
210
210
  `),await(Dt(),F($t)).checkForUpdateInteractive();let{runInit:t}=(vr(),F(Ir)),e=process.argv.slice(3);process.exit(await t({url:Ze(e,"--custom-url"),noInteractive:e.includes("--no-interactive"),email:Ze(e,"--custom-email")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
211
- `),process.exit(1);});else if(Y==="status")(async()=>{await(Dt(),F($t)).checkForUpdateInteractive();let{runStatus:t}=(Kr(),F(Wr));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
212
- `),process.exit(1);});else if(Y==="update-api-key")(async()=>{let{runUpdateApiKey:t}=(Yr(),F(Br)),e=process.argv.slice(3);process.exit(await t({key:Ze(e,"--key")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
213
- `),process.exit(1);});else if(Y==="update")(async()=>{let t=(Dt(),F($t)),{version:e}=Nt(),r=await t.fetchLatestVersionAsync();r||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
211
+ `),process.exit(1);});else if(B==="status")(async()=>{await(Dt(),F($t)).checkForUpdateInteractive();let{runStatus:t}=(Kr(),F(Mr));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
212
+ `),process.exit(1);});else if(B==="update-api-key")(async()=>{let{runUpdateApiKey:t}=(Br(),F(Yr)),e=process.argv.slice(3);process.exit(await t({key:Ze(e,"--key")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
213
+ `),process.exit(1);});else if(B==="update")(async()=>{let t=(Dt(),F($t)),{version:e}=Nt(),r=await t.fetchLatestVersionAsync();r||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
214
214
  `),process.exit(1)),t.isNewer(e,r.version)||(process.stdout.write(` \u2713 Already up to date (v${e})
215
215
  `),process.exit(0)),await t.runUpdate(r.version),process.exit(0);})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
216
- `),process.exit(1);});else if(Y==="otel-headers"){let{runOtelHeaders:t}=(Hr(),F(jr));t().then(e=>process.exit(e)).catch(e=>{process.stderr.write(`[flow-ai-obs otel-headers] Unexpected error: ${e.message}
217
- `),process.exit(1);});}else fo.has(Y)?(bn(),F(po)):(Un(),process.exit(0));
216
+ `),process.exit(1);});else if(B==="otel-headers"){let{runOtelHeaders:t}=(Hr(),F(jr));t().then(e=>process.exit(e)).catch(e=>{process.stderr.write(`[flow-ai-obs otel-headers] Unexpected error: ${e.message}
217
+ `),process.exit(1);});}else fo.has(B)?(bn(),F(po)):(Un(),process.exit(0));
package/dist/setup.js CHANGED
@@ -2,7 +2,7 @@
2
2
  'use strict';var a=require('fs'),N=require('os'),c=require('path'),child_process=require('child_process'),me=require('crypto'),Et=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 a__namespace=/*#__PURE__*/_interopNamespace(a);var N__namespace=/*#__PURE__*/_interopNamespace(N);var c__namespace=/*#__PURE__*/_interopNamespace(c);var me__namespace=/*#__PURE__*/_interopNamespace(me);var Et__default=/*#__PURE__*/_interopDefault(Et);var H=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var Pe=Object.getOwnPropertyNames;var we=Object.prototype.hasOwnProperty;var L=(e,n,t)=>()=>{if(t)throw t[0];try{return e&&(n=e(e=0)),n}catch(r){throw t=[r],r}};var ve=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(t){throw n=0,t}},Ie=(e,n)=>{for(var t in n)H(e,t,{get:n[t],enumerable:true});},Ce=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Pe(n))!we.call(e,o)&&o!==t&&H(e,o,{get:()=>n[o],enumerable:!(r=Re(n,o))||r.enumerable});return e};var De=e=>Ce(H({},"__esModule",{value:true}),e);var Q={};Ie(Q,{BUFFER:()=>ke,CLAUDE_DESKTOP:()=>f,COPILOT_OTEL:()=>u,DEBUG_LOG_FILENAME:()=>V,ENV:()=>_,FLOW_URLS:()=>Ue,INSTALLER:()=>M,NATIVE_OTEL:()=>$,OTLP:()=>Fe,STATE_FILE_PREFIX:()=>xe,TRACE_LIMITS:()=>be,VALIDATION:()=>h,getFlowBaseUrl:()=>Z,getFlowUrls:()=>R});function Z(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ne}function R(){let e=Z();return {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`}}var Ne,Ue,Fe,$,_,M,ke,h,V,be,f,u,xe,T=L(()=>{"use strict";Ne="https://flow.ciandt.com";Ue=R(),Fe={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},$={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"},_={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"},M={LOCK_STALE_MS:3e4,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},h={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},V="flow-ai-obs-debug.log",be={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60},f={DIR_3P:"Claude-3p",CONFIG_LIBRARY_DIR:"configLibrary",DESKTOP_CONFIG_FILE:"claude_desktop_config.json",META_FILE:"_meta.json",DEPLOYMENT_MODE:"3p",CONFIG_NAME:"Flow AI Obs",WRAPPER_SCRIPT_UNIX:"otel-headers-helper.sh",WRAPPER_SCRIPT_WIN:"otel-headers-helper.cmd",OTLP_PROTOCOL:"http/json",KEYS:{OTLP_ENDPOINT:"otlpEndpoint",OTLP_PROTOCOL:"otlpProtocol",OTLP_HEADERS_HELPER:"otlpHeadersHelper",OTLP_RESOURCE_ATTRIBUTES:"otlpResourceAttributes"},CUSTOM_PROVIDER_KEY:"custom.provider",CUSTOM_PROVIDER_VALUE:"claude-code-desktop"},u={ENABLED_KEY:"github.copilot.chat.otel.enabled",ENABLED_VALUE:!0,EXPORTER_TYPE_KEY:"github.copilot.chat.otel.exporterType",EXPORTER_TYPE_VALUE:"otlp-http",PROTOCOL_KEY:"github.copilot.chat.otel.protocol",PROTOCOL_VALUE:"http/json",ENDPOINT_KEY:"github.copilot.chat.otel.otlpEndpoint",HEADERS_KEY:"github.copilot.chat.otel.headers",HEADER_API_KEY:"x-flow-api-key",HEADER_USER:"x-flow-user"},xe="flow-obs-";});function l(...e){if(process.env[_.FLOW_OBS_DEBUG]!=="1")return;let n=`[${new Date().toISOString()}] ${e.join(" ")}
3
3
  `;try{a.writeFileSync(Ke,n,{flag:"a"});}catch(t){process.stderr.write(`[flow-obs debug ERROR] ${t.message}
4
4
  `);}}var Ke,K=L(()=>{"use strict";T();Ke=c.join(N.tmpdir(),V);});function P(e,n){return je?t=>`\x1B[${e}m${t}\x1B[${n}m`:t=>t}var je,Ft,He,kt,$e,bt,xt,ee=L(()=>{"use strict";je=!process.env.NO_COLOR&&process.stdout.isTTY;Ft=P("32","39"),He=P("31","39"),kt=P("33","39"),$e=P("36","39"),bt=P("1","22"),xt=P("2","22");});function B(){return process.platform==="win32"?false:process.getuid?.()===0}var te=L(()=>{"use strict";ee();});function y(e={}){let n=e.env??process.env,t=e.platform??process.platform;return !!(n.WSL_DISTRO_NAME&&t==="linux")}function F(e,n={}){let t=n.env??process.env,r=n.spawnSync??child_process.spawnSync;if(!y({env:t,platform:n.platform}))return;let o=t[e];if(!o)try{let i=r("cmd.exe",["/c","echo",`%${e}%`],{encoding:"utf8",timeout:5e3}).stdout?.trim();i&&/^[A-Za-z]:\\/.test(i)&&(o=i);}catch(s){l("resolveWslWindowsPath",`cmd.exe ${e} lookup failed: ${s.message}`);}if(o)return o.replace(/^([A-Za-z]):/,(s,i)=>`/mnt/${i.toLowerCase()}`).replace(/\\/g,"/")}function S(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER)try{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}}catch(e){l("getActualUser",`getent passwd lookup failed: ${e.message}`);}return {home:N__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||N__namespace.userInfo().username}}function v(){if(y()){let e=F("USERPROFILE");return e?c__namespace.join(e,".claude","settings.json"):c__namespace.join(N__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||N__namespace.homedir();return c__namespace.join(e,".claude","settings.json")}return c__namespace.join(S().home,".claude","settings.json")}var I=L(()=>{"use strict";K();te();});function ie(){if(process.platform==="win32"){let t=process.env.APPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Roaming");return c__namespace.join(t,re,se)}let e=S(),n=process.env.XDG_CONFIG_HOME||c__namespace.join(e.home,".config");return c__namespace.join(n,re,se)}var re,se,ae=L(()=>{"use strict";I();re="flow-ai-obs",se="config.json";});function Be(e){try{let n=a__namespace.statSync(e);Date.now()-n.mtimeMs>Ve&&a__namespace.unlinkSync(e);}catch{}try{a__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{a__namespace.unlinkSync(e);}catch{}}function Xe(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 i=s.map(E=>{if(!Array.isArray(E?.hooks))return null;let m=E.hooks.filter(O=>!O.command?.startsWith?.(M.CLI));return m.length>0?{...E,hooks:m}:null}).filter(E=>E!=null);i.length>0&&(r[o]=i,n.push(o));}return Object.keys(r).length>0?e.hooks=r:delete e.hooks,n}function le(e,n){let t=v(),r=t+".lock";a__namespace.mkdirSync(c__namespace.dirname(t),{recursive:true}),Be(r);try{if(a__namespace.existsSync(t)){a__namespace.copyFileSync(t,t+".bkp");try{a__namespace.chmodSync(t+".bkp",384);}catch{}}let o=ie();if(a__namespace.existsSync(o)){let Y=o+".bkp";a__namespace.copyFileSync(o,Y);try{a__namespace.chmodSync(Y,384);}catch{}}let s={};try{s=JSON.parse(a__namespace.readFileSync(t,"utf8"));}catch{}let i=s.env&&typeof s.env=="object"?s.env:{};delete i.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:E}=(T(),De(Q)),m=E().OTEL_ENDPOINT,O={...$,OTEL_EXPORTER_OTLP_ENDPOINT:e??m};s.env={...i,...O,...n??{}},s.otelHeadersHelper="flow-ai-obs otel-headers";let x=Xe(s);a__namespace.writeFileSync(t,JSON.stringify(s,null,2)+`
5
- `,{encoding:"utf8",mode:384});try{a__namespace.chmodSync(t,384);}catch{}return C=void 0,{settingsPath:t,preserved:x}}finally{Ge(r);}}function ue(e){if(C===void 0)try{let t=a__namespace.readFileSync(v(),"utf8");C=JSON.parse(t).env??null;}catch{C=null;}if(!C)return null;let n=C[e];return typeof n=="string"?n:null}function pe(e){let n=process.env[e];return n!==void 0?n!==""?n:void 0:ue(e)??void 0}function Je(){let e=ue(_.FLOW_BASE_URL);return e&&e.trim()?e.trim():void 0}function fe(){let e=process.env[_.FLOW_BASE_URL];return e&&e.trim()?e.trim():Je()}var Ve,C,G=L(()=>{"use strict";T();I();ae();Ve=M.LOCK_STALE_MS;});var Oe=ve((dn,dt)=>{dt.exports={name:"@ciandt-flow/flow-ai-obs",version:"1.0.0-beta.149",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",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"}};});G();T();T();K();G();function ze(e){let n=process.env[_.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),i=s.search(/[\r\n]/);return (i===-1?s:s.slice(0,i)).trim()||null}}return null}function de(){let e=pe(_.FLOW_USER_EMAIL);if(e!==void 0){let t=e.replace(/[\r\n]/g,"").trim();if(t)if(t.length>h.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${h.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!h.EMAIL_HEADER_PATTERN.test(t))l("resolveUserEmail","FLOW_USER_EMAIL contains non-printable or control characters \u2014 skipping");else return l("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>h.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${h.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!h.EMAIL_HEADER_PATTERN.test(t))l("resolveUserEmail","x-flow-user from OTEL_EXPORTER_OTLP_HEADERS is empty or contains non-printable characters \u2014 skipping");else return l("resolveUserEmail","using x-flow-user from OTEL_EXPORTER_OTLP_HEADERS: [REDACTED]"),t}try{let t=N__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 l("resolveUserEmail","Could not derive x-flow-user: username is empty. Run: flow-ai-obs init"),null;let o=`${t}@ciandt.com`;return l("resolveUserEmail","derived email: [REDACTED]"),o}catch(t){return l("resolveUserEmail",`Could not derive x-flow-user from OS username: ${t.message}. Run: flow-ai-obs init`),null}}function A(e){if(!e)return null;let n=e.replace(/[\r\n]/g,"").trim();return n?n.length>h.API_KEY_MAX_LENGTH?(l("validateApiKey",`API key exceeds ${h.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):h.API_KEY_PATTERN.test(n)?n:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function D(){let e=process.env[_.FLOW_API_KEY];return A(e)}I();function Ee(){if(y()){let t=F("APPDATA");return t?c__namespace.join(t,"Code","User","settings.json"):null}if(process.platform==="win32"){let t=process.env.APPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Roaming");return c__namespace.join(t,"Code","User","settings.json")}if(process.platform==="darwin")return c__namespace.join(N__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let e=process.platform==="linux"&&process.getuid?.()===0?S().home:process.env.HOME||N__namespace.homedir(),n=process.env.XDG_CONFIG_HOME||c__namespace.join(e,".config");return c__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 i=o+1;for(;i<e.length&&/\s/.test(e[i]);)i++;if(i<e.length&&(e[i]==="}"||e[i]==="]"))continue}r+=s;}return r}function Qe(e){if(process.env[_.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(e&&a__namespace.existsSync(e));if(e&&(a__namespace.existsSync(e)||a__namespace.existsSync(c__namespace.dirname(e))||a__namespace.existsSync(c__namespace.dirname(c__namespace.dirname(e)))))return true;let n=Ee();if(n&&(a__namespace.existsSync(n)||a__namespace.existsSync(c__namespace.dirname(n))||a__namespace.existsSync(c__namespace.dirname(c__namespace.dirname(n))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",c__namespace.join(N__namespace.homedir(),"Applications","Visual Studio Code.app")].some(r=>a__namespace.existsSync(r)))return true;if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files",o=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([c__namespace.join(t,"Programs","Microsoft VS Code","Code.exe"),c__namespace.join(r,"Microsoft VS Code","Code.exe"),c__namespace.join(o,"Microsoft VS Code","Code.exe")].some(i=>a__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(r=>a__namespace.existsSync(r)))}function ge(e,n={}){let t;try{t=n.customSettingsPath||Ee();}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(a__namespace.existsSync(t))try{let W=Ze(a__namespace.readFileSync(t,"utf8"));r=JSON.parse(W);}catch{return {status:"skipped",settingsPath:t,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let o=e||R().OTEL_ENDPOINT,s=n.apiKey!==void 0?n.apiKey:D(),i=n.userEmail!==void 0?n.userEmail:de(),E=typeof r[u.HEADERS_KEY]=="object"&&r[u.HEADERS_KEY]!==null&&!Array.isArray(r[u.HEADERS_KEY])?r[u.HEADERS_KEY]:{},m={...E};s&&(m[u.HEADER_API_KEY]=s),i&&(m[u.HEADER_USER]=i);let O=Object.keys(m),x=Object.keys(E),Y=O.length===0&&(r[u.HEADERS_KEY]===void 0||x.length===0)||O.length===x.length&&O.every(W=>E[W]===m[W]);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&&Y)return {status:"already_configured",settingsPath:t};a__namespace.mkdirSync(c__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 O.length>0&&(z[u.HEADERS_KEY]=m),a__namespace.writeFileSync(t,JSON.stringify(z,null,2)+`
5
+ `,{encoding:"utf8",mode:384});try{a__namespace.chmodSync(t,384);}catch{}return C=void 0,{settingsPath:t,preserved:x}}finally{Ge(r);}}function ue(e){if(C===void 0)try{let t=a__namespace.readFileSync(v(),"utf8");C=JSON.parse(t).env??null;}catch{C=null;}if(!C)return null;let n=C[e];return typeof n=="string"?n:null}function pe(e){let n=process.env[e];return n!==void 0?n!==""?n:void 0:ue(e)??void 0}function Je(){let e=ue(_.FLOW_BASE_URL);return e&&e.trim()?e.trim():void 0}function fe(){let e=process.env[_.FLOW_BASE_URL];return e&&e.trim()?e.trim():Je()}var Ve,C,G=L(()=>{"use strict";T();I();ae();Ve=M.LOCK_STALE_MS;});var Oe=ve((dn,dt)=>{dt.exports={name:"@ciandt-flow/flow-ai-obs",version:"1.0.1-beta.158",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",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"}};});G();T();T();K();G();function ze(e){let n=process.env[_.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),i=s.search(/[\r\n]/);return (i===-1?s:s.slice(0,i)).trim()||null}}return null}function de(){let e=pe(_.FLOW_USER_EMAIL);if(e!==void 0){let t=e.replace(/[\r\n]/g,"").trim();if(t)if(t.length>h.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${h.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!h.EMAIL_HEADER_PATTERN.test(t))l("resolveUserEmail","FLOW_USER_EMAIL contains non-printable or control characters \u2014 skipping");else return l("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>h.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${h.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!h.EMAIL_HEADER_PATTERN.test(t))l("resolveUserEmail","x-flow-user from OTEL_EXPORTER_OTLP_HEADERS is empty or contains non-printable characters \u2014 skipping");else return l("resolveUserEmail","using x-flow-user from OTEL_EXPORTER_OTLP_HEADERS: [REDACTED]"),t}try{let t=N__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 l("resolveUserEmail","Could not derive x-flow-user: username is empty. Run: flow-ai-obs init"),null;let o=`${t}@ciandt.com`;return l("resolveUserEmail","derived email: [REDACTED]"),o}catch(t){return l("resolveUserEmail",`Could not derive x-flow-user from OS username: ${t.message}. Run: flow-ai-obs init`),null}}function A(e){if(!e)return null;let n=e.replace(/[\r\n]/g,"").trim();return n?n.length>h.API_KEY_MAX_LENGTH?(l("validateApiKey",`API key exceeds ${h.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):h.API_KEY_PATTERN.test(n)?n:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function D(){let e=process.env[_.FLOW_API_KEY];return A(e)}I();function Ee(){if(y()){let t=F("APPDATA");return t?c__namespace.join(t,"Code","User","settings.json"):null}if(process.platform==="win32"){let t=process.env.APPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Roaming");return c__namespace.join(t,"Code","User","settings.json")}if(process.platform==="darwin")return c__namespace.join(N__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let e=process.platform==="linux"&&process.getuid?.()===0?S().home:process.env.HOME||N__namespace.homedir(),n=process.env.XDG_CONFIG_HOME||c__namespace.join(e,".config");return c__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 i=o+1;for(;i<e.length&&/\s/.test(e[i]);)i++;if(i<e.length&&(e[i]==="}"||e[i]==="]"))continue}r+=s;}return r}function Qe(e){if(process.env[_.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(e&&a__namespace.existsSync(e));if(e&&(a__namespace.existsSync(e)||a__namespace.existsSync(c__namespace.dirname(e))||a__namespace.existsSync(c__namespace.dirname(c__namespace.dirname(e)))))return true;let n=Ee();if(n&&(a__namespace.existsSync(n)||a__namespace.existsSync(c__namespace.dirname(n))||a__namespace.existsSync(c__namespace.dirname(c__namespace.dirname(n))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",c__namespace.join(N__namespace.homedir(),"Applications","Visual Studio Code.app")].some(r=>a__namespace.existsSync(r)))return true;if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files",o=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([c__namespace.join(t,"Programs","Microsoft VS Code","Code.exe"),c__namespace.join(r,"Microsoft VS Code","Code.exe"),c__namespace.join(o,"Microsoft VS Code","Code.exe")].some(i=>a__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(r=>a__namespace.existsSync(r)))}function ge(e,n={}){let t;try{t=n.customSettingsPath||Ee();}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(a__namespace.existsSync(t))try{let W=Ze(a__namespace.readFileSync(t,"utf8"));r=JSON.parse(W);}catch{return {status:"skipped",settingsPath:t,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let o=e||R().OTEL_ENDPOINT,s=n.apiKey!==void 0?n.apiKey:D(),i=n.userEmail!==void 0?n.userEmail:de(),E=typeof r[u.HEADERS_KEY]=="object"&&r[u.HEADERS_KEY]!==null&&!Array.isArray(r[u.HEADERS_KEY])?r[u.HEADERS_KEY]:{},m={...E};s&&(m[u.HEADER_API_KEY]=s),i&&(m[u.HEADER_USER]=i);let O=Object.keys(m),x=Object.keys(E),Y=O.length===0&&(r[u.HEADERS_KEY]===void 0||x.length===0)||O.length===x.length&&O.every(W=>E[W]===m[W]);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&&Y)return {status:"already_configured",settingsPath:t};a__namespace.mkdirSync(c__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 O.length>0&&(z[u.HEADERS_KEY]=m),a__namespace.writeFileSync(t,JSON.stringify(z,null,2)+`
6
6
  `,{encoding:"utf8"}),{status:"configured",settingsPath:t}}catch(r){return {status:"skipped",settingsPath:t,reason:r.message}}}T();I();K();function X(){return process.platform==="win32"||y()}function et(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 _e(){if(y()){let r=F("LOCALAPPDATA");if(r){let o=c__namespace.join(r,f.DIR_3P);return j(o)}}if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Local"),o=c__namespace.join(r,f.DIR_3P);return j(o)}if(process.platform==="darwin"){let r=c__namespace.join(N__namespace.homedir(),"Library","Application Support",f.DIR_3P);return j(r)}let e=S(),n=process.env.XDG_CONFIG_HOME||c__namespace.join(e.home,".config"),t=c__namespace.join(n,f.DIR_3P);return j(t)}function j(e){return {configDir:e,configLibraryDir:c__namespace.join(e,f.CONFIG_LIBRARY_DIR),desktopConfigPath:c__namespace.join(e,f.DESKTOP_CONFIG_FILE),metaPath:c__namespace.join(e,f.CONFIG_LIBRARY_DIR,f.META_FILE)}}function J(){let e=v(),n=c__namespace.dirname(e),t=X()?f.WRAPPER_SCRIPT_WIN:f.WRAPPER_SCRIPT_UNIX;return c__namespace.join(n,t)}function tt(){if(process.env[_.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=_e();if(a__namespace.existsSync(e.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",c__namespace.join(N__namespace.homedir(),"Applications","Claude.app")].some(t=>a__namespace.existsSync(t));if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Local"),t=process.env.PROGRAMFILES||"C:\\Program Files";return [c__namespace.join(n,"AnthropicClaude","Claude.exe"),c__namespace.join(t,"Claude","Claude.exe")].some(o=>a__namespace.existsSync(o))}if(process.platform==="linux"){let n=S(),t=process.env.XDG_CONFIG_HOME||c__namespace.join(n.home,".config"),r=c__namespace.join(t,"Claude");return a__namespace.existsSync(r)}return false}function nt(e){let n=e??J();try{if(!a__namespace.existsSync(n))return null;let t=a__namespace.readFileSync(n,"utf8"),r=t.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(r&&r[1])return A(r[1]);let o=t.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(o&&o[1])return A(o[1])}catch{}return null}function rt(e,n,t=448){let r=c__namespace.dirname(e);a__namespace.mkdirSync(r,{recursive:true});let o=X(),s=o?420:t,i=true;try{a__namespace.readFileSync(e,"utf8")===n&&(i=!1);}catch{}if(!i){if(!o)try{a__namespace.chmodSync(e,t);}catch{}return {written:false}}if(a__namespace.existsSync(e)&&(a__namespace.copyFileSync(e,e+".bkp"),!o))try{a__namespace.chmodSync(e+".bkp",448);}catch{}if(a__namespace.writeFileSync(e,n,{encoding:"utf8",mode:s}),!o)try{a__namespace.chmodSync(e,t);}catch{}return {written:true}}function st(e){let n=J(),t=e?A(e):null,r=X()?it(t):ot(t);return rt(n,r,!!t?448:493),n}function ot(e){let n=e?A(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 it(e){let n=e?A(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 at=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function ct(e){try{let n=a__namespace.readFileSync(e,"utf8");try{let t=JSON.parse(n);if(t.appliedId&&typeof t.appliedId=="string"&&at.test(t.appliedId))return t.appliedId;t.appliedId&&l("getOrCreateConfigUuid","appliedId is not a valid UUID \u2014 generating new UUID");}catch{l("getOrCreateConfigUuid",`corrupted JSON in ${e} \u2014 generating new UUID`);}}catch(n){n.code!=="ENOENT"&&l("getOrCreateConfigUuid",`read error: ${n.message}`);}return me__namespace.randomUUID()}function lt(e,n){let t=c__namespace.dirname(e);a__namespace.mkdirSync(t,{recursive:true});let r;try{let s=a__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{l("writeMetaJson",`corrupted JSON in ${e} \u2014 starting fresh`),r={appliedId:n,entries:[]};}}catch(s){s.code!=="ENOENT"&&l("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": "1.0.0-beta.149",
3
+ "version": "1.0.1-beta.158",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {