@ciandt-flow/flow-ai-obs 0.14.0 → 0.15.0-beta.87

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,104 +1,104 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var zt=require('readline/promises'),Cs=require('https'),S=require('fs'),Le=require('os'),k=require('path'),child_process=require('child_process'),qs=require('http'),fn=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var zt__namespace=/*#__PURE__*/_interopNamespace(zt);var Cs__default=/*#__PURE__*/_interopDefault(Cs);var S__namespace=/*#__PURE__*/_interopNamespace(S);var Le__namespace=/*#__PURE__*/_interopNamespace(Le);var k__namespace=/*#__PURE__*/_interopNamespace(k);var qs__default=/*#__PURE__*/_interopDefault(qs);var fn__namespace=/*#__PURE__*/_interopNamespace(fn);var Xt=Object.defineProperty;var Rs=Object.getOwnPropertyDescriptor;var Ls=Object.getOwnPropertyNames;var ks=Object.prototype.hasOwnProperty;var Ps=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var _=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Is=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},re=(e,t)=>{for(var r in t)Xt(e,r,{get:t[r],enumerable:true});},vs=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ls(t))!ks.call(e,s)&&s!==r&&Xt(e,s,{get:()=>t[s],enumerable:!(n=Rs(t,s))||n.enumerable});return e};var M=e=>vs(Xt({},"__esModule",{value:true}),e);var qt={};re(qt,{bold:()=>b,cyan:()=>D,dim:()=>m,green:()=>I,red:()=>$,yellow:()=>v});function Me(e,t){return bs?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var bs,I,$,v,D,b,m,le=_(()=>{"use strict";bs=!process.env.NO_COLOR&&process.stdout.isTTY;I=Me("32","39"),$=Me("31","39"),v=Me("33","39"),D=Me("36","39"),b=Me("1","22"),m=Me("2","22");});var st=Is((bi,Us)=>{Us.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.14.0",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0","eslint-config-prettier":"^10.1.5",jest:"^30.4.2",lefthook:"^2.1.10",prettier:"^3.5.3","ts-jest":"^29.4.9",tsup:"^8.5.1",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function ue(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function ot(e,t){let r=zt__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${e} ${t===true?"(Y/n)":t===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&t!==void 0)return r.close(),t;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
- `);}catch(i){throw r.close(),i}if(r.close(),t!==void 0)return t;throw new Error("Too many invalid attempts for yes/no prompt")}async function Zt(e,t){let r=zt__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${e}: `)).trim();if(t);return n}catch(n){throw n}finally{r.close();}}var Qt=_(()=>{"use strict";});var Be={};re(Be,{checkForUpdate:()=>Ms,checkForUpdateInteractive:()=>Hs,fetchLatestVersionAsync:()=>jr,isNewer:()=>He,primeUpdateCache:()=>Bs,runUpdate:()=>Kr});function G(){return er||(er=st()),er}function He(e,t){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(e),s=r(t);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function nr(){try{let e=JSON.parse(S__namespace.default.readFileSync(Yr,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=Fs?null:e}catch{return null}}function sr(e,t,r=Date.now()){try{S__namespace.default.writeFileSync(Yr,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function or(e){let t=G().name,r=Cs__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Ds},n=>{if(n.statusCode!==200)return n.resume(),e(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");e(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){e(o);}});});r.on("error",e),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function tr(e){let t=G().name,n=` Update available: ${G().version} \u2192 ${e}`,s=` Run: npm install -g ${t}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
2
+ 'use strict';var er=require('readline/promises'),Ms=require('https'),_=require('fs'),ke=require('os'),k=require('path'),child_process=require('child_process'),ro=require('http'),En=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var er__namespace=/*#__PURE__*/_interopNamespace(er);var Ms__default=/*#__PURE__*/_interopDefault(Ms);var ___namespace=/*#__PURE__*/_interopNamespace(_);var ke__namespace=/*#__PURE__*/_interopNamespace(ke);var k__namespace=/*#__PURE__*/_interopNamespace(k);var ro__default=/*#__PURE__*/_interopDefault(ro);var En__namespace=/*#__PURE__*/_interopNamespace(En);var Zt=Object.defineProperty;var bs=Object.getOwnPropertyDescriptor;var Us=Object.getOwnPropertyNames;var Cs=Object.prototype.hasOwnProperty;var Ns=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var T=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var $s=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},ne=(e,t)=>{for(var r in t)Zt(e,r,{get:t[r],enumerable:true});},Fs=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Us(t))!Cs.call(e,s)&&s!==r&&Zt(e,s,{get:()=>t[s],enumerable:!(n=bs(t,s))||n.enumerable});return e};var M=e=>Fs(Zt({},"__esModule",{value:true}),e);var Qt={};ne(Qt,{bold:()=>b,cyan:()=>D,dim:()=>m,green:()=>P,red:()=>U,yellow:()=>v});function He(e,t){return Ds?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var Ds,P,U,v,D,b,m,ue=T(()=>{"use strict";Ds=!process.env.NO_COLOR&&process.stdout.isTTY;P=He("32","39"),U=He("31","39"),v=He("33","39"),D=He("36","39"),b=He("1","22"),m=He("2","22");});var ot=$s(($i,xs)=>{xs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.15.0-beta.87",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0","eslint-config-prettier":"^10.1.5",jest:"^30.4.2",lefthook:"^2.1.10",prettier:"^3.5.3","ts-jest":"^29.4.9",tsup:"^8.5.1",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function pe(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function it(e,t){let r=er__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${e} ${t===true?"(Y/n)":t===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&t!==void 0)return r.close(),t;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
+ `);}catch(i){throw r.close(),i}if(r.close(),t!==void 0)return t;throw new Error("Too many invalid attempts for yes/no prompt")}async function tr(e,t){let r=er__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${e}: `)).trim();if(t);return n}catch(n){throw n}finally{r.close();}}var rr=T(()=>{"use strict";});var We={};ne(We,{checkForUpdate:()=>js,checkForUpdateInteractive:()=>Vs,fetchLatestVersionAsync:()=>Jr,isNewer:()=>Be,primeUpdateCache:()=>Gs,runUpdate:()=>Gr});function J(){return nr||(nr=ot()),nr}function Be(e,t){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(e),s=r(t);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function ir(){try{let e=JSON.parse(___namespace.default.readFileSync(Vr,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=Ws?null:e}catch{return null}}function ar(e,t,r=Date.now()){try{___namespace.default.writeFileSync(Vr,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function cr(e){let t=J().name,r=Ms__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Ks},n=>{if(n.statusCode!==200)return n.resume(),e(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");e(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){e(o);}});});r.on("error",e),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function sr(e){let t=J().name,n=` Update available: ${J().version} \u2192 ${e}`,s=` Run: npm install -g ${t}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
4
4
  \u256D${i}\u256E
5
5
  \u2502${n.padEnd(o)}\u2502
6
6
  \u2502${s.padEnd(o)}\u2502
7
7
  \u2570${i}\u256F
8
8
 
9
- `);}function rr(e){let t=G().name;process.stderr.write(`
9
+ `);}function or(e){let t=J().name;process.stderr.write(`
10
10
  [${t}] Critical update detected \u2014 auto-updating to ${e}...
11
11
 
12
- `);let r=child_process.spawn("npm",["install","-g",`${t}@${e}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});r.on("error",()=>{}),r.unref();}async function xs(e,t=1e4){let r=Ps("readline"),n=G().name,o=` Update available: ${G().version} \u2192 ${e}`,i=` Run: npm install -g ${n}`,a=" Install now? [y/N]: ",c=Math.max(o.length,i.length,a.length-2)+2,p="\u2500".repeat(c);return process.stderr.write(`
12
+ `);let r=child_process.spawn("npm",["install","-g",`${t}@${e}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});r.on("error",()=>{}),r.unref();}async function Ys(e,t=1e4){let r=Ns("readline"),n=J().name,o=` Update available: ${J().version} \u2192 ${e}`,i=` Run: npm install -g ${n}`,a=" Install now? [y/N]: ",c=Math.max(o.length,i.length,a.length-2)+2,p="\u2500".repeat(c);return process.stderr.write(`
13
13
  \u256D${p}\u256E
14
14
  \u2502${o.padEnd(c)}\u2502
15
15
  \u2502${i.padEnd(c)}\u2502
16
16
  \u2502${a.padEnd(c)}\u2502
17
17
  \u2570${p}\u256F
18
18
  `),new Promise(g=>{let u=r.createInterface({input:process.stdin,output:void 0,terminal:false}),E=false;function y(O){E||(E=true,clearTimeout(w),u.close(),process.stderr.write(`
19
- `),g(O));}let w=setTimeout(()=>y(false),t);u.once("line",O=>y(O.trim().toLowerCase()==="y")),u.once("close",()=>y(false));})}async function Kr(e){let t=G().name;return process.stderr.write(` Installing ${t}@${e}...
19
+ `),g(O));}let w=setTimeout(()=>y(false),t);u.once("line",O=>y(O.trim().toLowerCase()==="y")),u.once("close",()=>y(false));})}async function Gr(e){let t=J().name;return process.stderr.write(` Installing ${t}@${e}...
20
20
  `),new Promise(r=>{let n=child_process.spawn("npm",["install","-g",`${t}@${e}`],{stdio:"inherit",shell:process.platform==="win32"}),s=false;function o(i,a){if(!s){if(s=true,i)process.stderr.write(` \u2713 Updated to ${e}. Please restart the command.
21
21
 
22
22
  `);else {let c=a?` (${a})`:"";process.stderr.write(` \u2717 Update failed${c} \u2014 continuing with current version.
23
23
 
24
- `);}r();}}n.on("close",(i,a)=>o(i===0,a??void 0)),n.on("error",i=>o(false,i.code));})}function jr(){return new Promise(e=>{or((t,r)=>e(t||!r?null:r));})}function Ms(){try{let e=nr();if(e){He(G().version,e.latestVersion)&&(e.updatePriority==="auto"?rr(e.latestVersion):tr(e.latestVersion));return}setImmediate(()=>{or((t,r)=>{t||!r||(sr(r.version,r.updatePriority),He(G().version,r.version)&&(r.updatePriority==="auto"?rr(r.version):tr(r.version)));});});}catch{}}async function Hs(e={}){try{let t=nr();if(t){if(!He(G().version,t.latestVersion))return}else {let n=await jr();if(!n||(sr(n.version,n.updatePriority),!He(G().version,n.version)))return;t={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(t.updatePriority==="auto"){rr(t.latestVersion);return}if(!ue()){tr(t.latestVersion);return}await xs(t.latestVersion,e.timeoutMs)&&await Kr(t.latestVersion);}catch{}}function Bs(){try{if(nr())return;setImmediate(()=>{or((e,t)=>{e||!t||He(G().version,t.version)&&sr(t.version,t.updatePriority,0);});});}catch{}}var er,Yr,Fs,Ds,We=_(()=>{"use strict";Qt();Yr=k__namespace.default.join(Le__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Fs=1440*60*1e3,Ds=3e3;});var Vr={};re(Vr,{AUTH_ENGINE:()=>Ye,BUFFER:()=>X,CLAUDE_DESKTOP:()=>C,CONFIG_DIR_NAME:()=>at,CONFIG_FILE_NAME:()=>ct,COPILOT_OTEL:()=>T,DEBUG_LOG_FILENAME:()=>ir,ENV:()=>d,FLOW_URLS:()=>Ys,HOOK_TIMEOUTS:()=>Oe,INSTALLER:()=>lt,NATIVE_OTEL:()=>pe,OTLP:()=>kt,STATE_FILE_PREFIX:()=>Ks,TRACE_LIMITS:()=>Q,VALIDATION:()=>Y,VAULT:()=>it,getFlowBaseUrl:()=>we,getFlowUrls:()=>J,getMetrics:()=>Pt});function we(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ws}function J(){let e=we();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function Pt(){let e=we();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ws,Ys,it,at,ct,kt,pe,d,Ye,lt,Oe,X,Y,ir,Q,C,T,Ks,P=_(()=>{"use strict";Ws="https://flow.ciandt.com";Ys=J(),it={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},at="FLOW-nodejs",ct="config.json",kt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},pe={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"},Ye={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},lt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},Oe={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},X={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},Y={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[\x21-\x7E]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},ir="flow-ai-obs-debug.log",Q={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};C={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"},T={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"},Ks="flow-obs-";});function l(...e){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let t=`[${new Date().toISOString()}] ${e.join(" ")}
25
- `;try{S.writeFileSync(Js,t,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
26
- `);}}var Js,x=_(()=>{"use strict";P();Js=k.join(Le.tmpdir(),ir);});function Zs(e){if(!zs.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Qs(e,t){let r=t.length>400?t.slice(0,400)+"\u2026":t;l("toAuthError",`status=${e} body=${r}`);try{let n=JSON.parse(t);if(typeof n.error=="string"&&(l("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),Gr[n.error]))return new Ae(Gr[n.error],e)}catch{}return e===401||e===403||e===500?new Ae("Invalid credentials",e):e>=400&&e<500?new Ae("Authentication request was rejected",e):new Error("Authentication service unavailable, please try again later")}function q(e){return new Promise((t,r)=>{try{Zs(e.tenant);}catch(p){return r(p)}let n=JSON.stringify({clientSecret:e.clientSecret}),s=new URL(J().AUTH_ENGINE),o=s.protocol==="https:",i={hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),FlowTenant:e.tenant}};l("getToken",`requesting token tenant=${e.tenant} host=${i.hostname} path=${i.path}`);let c=(o?Cs__default.default:qs__default.default).request(i,p=>{let g=[];p.on("data",u=>g.push(u)),p.on("end",()=>{let u=g.join("");if((p.statusCode??0)>=400)return r(Qs(p.statusCode??0,u));let E;try{E=JSON.parse(u);}catch{return r(new Error("Invalid response from auth engine"))}let y=E.expires_at??new Date(Date.now()+(E.expires_in??3600)*1e3).toISOString();if(!E.access_token)return r(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));t({accessToken:E.access_token,expiresAt:y});});});c.on("error",p=>r(new Error(`Network error: ${p.message}`))),c.setTimeout(Ye.REQUEST_TIMEOUT_MS,()=>{c.destroy(new Error("Request timeout"));}),c.write(n),c.end();})}var Ae,zs,Gr,Re=_(()=>{"use strict";P();x();Ae=class extends Error{statusCode;constructor(t,r=0){super(t),this.name="AuthError",this.statusCode=r;}},zs=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;Gr={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};});function Jr(){return process.platform==="win32"?false:process.getuid?.()===0}function It(){if(Jr())return process.stderr.write(`
27
- `+$(` \u2717 flow-ai-obs is not supported in a sudo context.
24
+ `);}r();}}n.on("close",(i,a)=>o(i===0,a??void 0)),n.on("error",i=>o(false,i.code));})}function Jr(){return new Promise(e=>{cr((t,r)=>e(t||!r?null:r));})}function js(){try{let e=ir();if(e){Be(J().version,e.latestVersion)&&(e.updatePriority==="auto"?or(e.latestVersion):sr(e.latestVersion));return}setImmediate(()=>{cr((t,r)=>{t||!r||(ar(r.version,r.updatePriority),Be(J().version,r.version)&&(r.updatePriority==="auto"?or(r.version):sr(r.version)));});});}catch{}}async function Vs(e={}){try{let t=ir();if(t){if(!Be(J().version,t.latestVersion))return}else {let n=await Jr();if(!n||(ar(n.version,n.updatePriority),!Be(J().version,n.version)))return;t={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(t.updatePriority==="auto"){or(t.latestVersion);return}if(!pe()){sr(t.latestVersion);return}await Ys(t.latestVersion,e.timeoutMs)&&await Gr(t.latestVersion);}catch{}}function Gs(){try{if(ir())return;setImmediate(()=>{cr((e,t)=>{e||!t||Be(J().version,t.version)&&ar(t.version,t.updatePriority,0);});});}catch{}}var nr,Vr,Ws,Ks,Ke=T(()=>{"use strict";rr();Vr=k__namespace.default.join(ke__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Ws=1440*60*1e3,Ks=3e3;});var Xr={};ne(Xr,{AUTH_ENGINE:()=>Ye,BUFFER:()=>q,CLAUDE_DESKTOP:()=>N,CONFIG_DIR_NAME:()=>ct,CONFIG_FILE_NAME:()=>lt,COPILOT_OTEL:()=>S,DEBUG_LOG_FILENAME:()=>lr,ENV:()=>d,FLOW_URLS:()=>Xs,HOOK_TIMEOUTS:()=>Ae,INSTALLER:()=>ut,NATIVE_OTEL:()=>de,OTLP:()=>Pt,STATE_FILE_PREFIX:()=>qs,TRACE_LIMITS:()=>ee,VALIDATION:()=>Y,VAULT:()=>at,getFlowBaseUrl:()=>Oe,getFlowUrls:()=>X,getMetrics:()=>It});function Oe(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Js}function X(){let e=Oe();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function It(){let e=Oe();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Js,Xs,at,ct,lt,Pt,de,d,Ye,ut,Ae,q,Y,lr,ee,N,S,qs,I=T(()=>{"use strict";Js="https://flow.ciandt.com";Xs=X(),at={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},ct="FLOW-nodejs",lt="config.json",Pt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},de={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"},Ye={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},ut={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},Ae={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},q={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},Y={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},lr="flow-ai-obs-debug.log",ee={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};N={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"},S={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"},qs="flow-obs-";});function l(...e){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let t=`[${new Date().toISOString()}] ${e.join(" ")}
25
+ `;try{_.writeFileSync(eo,t,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
26
+ `);}}var eo,x=T(()=>{"use strict";I();eo=k.join(ke.tmpdir(),lr);});function so(e){if(!no.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function oo(e,t){let r=t.length>400?t.slice(0,400)+"\u2026":t;l("toAuthError",`status=${e} body=${r}`);try{let n=JSON.parse(t);if(typeof n.error=="string"&&(l("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),qr[n.error]))return new Re(qr[n.error],e)}catch{}return e===401||e===403||e===500?new Re("Invalid credentials",e):e>=400&&e<500?new Re("Authentication request was rejected",e):new Error("Authentication service unavailable, please try again later")}function z(e){return new Promise((t,r)=>{try{so(e.tenant);}catch(p){return r(p)}let n=JSON.stringify({clientSecret:e.clientSecret}),s=new URL(X().AUTH_ENGINE),o=s.protocol==="https:",i={hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),FlowTenant:e.tenant}};l("getToken",`requesting token tenant=${e.tenant} host=${i.hostname} path=${i.path}`);let c=(o?Ms__default.default:ro__default.default).request(i,p=>{let g=[];p.on("data",u=>g.push(u)),p.on("end",()=>{let u=g.join("");if((p.statusCode??0)>=400)return r(oo(p.statusCode??0,u));let E;try{E=JSON.parse(u);}catch{return r(new Error("Invalid response from auth engine"))}let y=E.expires_at??new Date(Date.now()+(E.expires_in??3600)*1e3).toISOString();if(!E.access_token)return r(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));t({accessToken:E.access_token,expiresAt:y});});});c.on("error",p=>r(new Error(`Network error: ${p.message}`))),c.setTimeout(Ye.REQUEST_TIMEOUT_MS,()=>{c.destroy(new Error("Request timeout"));}),c.write(n),c.end();})}var Re,no,qr,Le=T(()=>{"use strict";I();x();Re=class extends Error{statusCode;constructor(t,r=0){super(t),this.name="AuthError",this.statusCode=r;}},no=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;qr={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};});function zr(){return process.platform==="win32"?false:process.getuid?.()===0}function vt(){if(zr())return process.stderr.write(`
27
+ `+U(` \u2717 flow-ai-obs is not supported in a sudo context.
28
28
 
29
29
  `)+D(` npm install -g @ciandt-flow/flow-ai-obs
30
30
  `)+`
31
- `),1}var vt=_(()=>{"use strict";le();});function ke(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return {home:t,username:process.env.SUDO_USER}}return {home:Le__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||Le__namespace.userInfo().username}}function ne(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(e=r);}if(e){let t=e.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return k__namespace.join(t,".claude","settings.json")}return k__namespace.join(Le__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||Le__namespace.homedir();return k__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return k__namespace.join(t,".claude","settings.json")}return k__namespace.join(Le__namespace.homedir(),".claude","settings.json")}var ut=_(()=>{"use strict";vt();});function bt(){if(process.platform==="win32"){let r=process.env.APPDATA||k__namespace.join(Le__namespace.homedir(),"AppData","Roaming");return k__namespace.join(r,Xr,qr)}let e=ke(),t=process.env.XDG_CONFIG_HOME||k__namespace.join(e.home,".config");return k__namespace.join(t,Xr,qr)}function cr(){try{let e=S__namespace.readFileSync(ne(),"utf8"),r=JSON.parse(e).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}var Xr,qr,lr=_(()=>{"use strict";ut();Xr="flow-ai-obs",qr="config.json";});function Qr(e){try{let t=S__namespace.statSync(e);Date.now()-t.mtimeMs>eo&&S__namespace.unlinkSync(e);}catch{}try{S__namespace.writeFileSync(e,String(process.pid),{flag:"wx"});}catch(t){throw t.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+e):t}}function en(e){try{S__namespace.unlinkSync(e);}catch{}}function to(e,t){let n=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [t,...n]}function tn(e,t){let r=ne(),n=r+".lock",s=[];S__namespace.mkdirSync(k__namespace.dirname(r),{recursive:true}),Qr(n);try{if(S__namespace.existsSync(r)){S__namespace.copyFileSync(r,r+".bkp");try{S__namespace.chmodSync(r+".bkp",384);}catch{}}let o=bt();if(S__namespace.existsSync(o)){let w=o+".bkp";S__namespace.copyFileSync(o,w);try{S__namespace.chmodSync(w,384);}catch{}}let i={};try{i=JSON.parse(S__namespace.readFileSync(r,"utf8"));}catch{}let a=i.env&&typeof i.env=="object"?i.env:{};delete a.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:c}=(P(),M(Vr)),p=c().OTEL_ENDPOINT,g={...pe,OTEL_EXPORTER_OTLP_ENDPOINT:e??p};i.env={...a,...g,...t??{}},i.otelHeadersHelper="flow-ai-obs otel-headers",(!i.hooks||typeof i.hooks!="object"||Array.isArray(i.hooks))&&(i.hooks={});let u=(w,O)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${w}`,timeout:O}]}),E=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],y=i.hooks;for(let w of E){let O=to(y[w],u(w,Oe[w]));O.length>1&&s.push(w),y[w]=O;}S__namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
32
- `,{encoding:"utf8",mode:384});try{S__namespace.chmodSync(r,384);}catch{}}finally{en(n);}return {settingsPath:r,preserved:s}}function z(e){if(dt===void 0)try{let r=S__namespace.readFileSync(ne(),"utf8");dt=JSON.parse(r).env??null;}catch{dt=null;}if(!dt)return null;let t=dt[e];return typeof t=="string"?t:null}function je(e){let t=ne(),r=t+".lock";S__namespace.mkdirSync(k__namespace.dirname(t),{recursive:true}),Qr(r);try{let n={};try{n=JSON.parse(S__namespace.readFileSync(t,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,e),S__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
33
- `,{encoding:"utf8",mode:384});try{S__namespace.chmodSync(t,384);}catch{}}finally{en(r);}}function ft(e){let t=process.env[e];return t!==void 0?t!==""?t:void 0:z(e)??void 0}var eo,dt,de=_(()=>{"use strict";P();Re();ut();lr();eo=lt.LOCK_STALE_MS;});function mt(){let e=Le__namespace.default.homedir();if(process.platform==="darwin")return k__namespace.default.join(e,"Library","Preferences",at,ct);if(process.platform==="win32"){let r=process.env.APPDATA??k__namespace.default.join(e,"AppData","Roaming");return k__namespace.default.join(r,at,ct)}let t=process.env.XDG_CONFIG_HOME??k__namespace.default.join(e,".config");return k__namespace.default.join(t,at,ct)}function dr(){try{let e=S__namespace.default.readFileSync(mt(),"utf8");return JSON.parse(e)}catch{return {}}}function rn(e){let t=mt();S__namespace.default.mkdirSync(k__namespace.default.dirname(t),{recursive:true}),S__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var pr,Ut,nn=_(()=>{"use strict";P();pr={credentials:"credentials","token-cache":"tokenCache"};Ut=class{static isAvailable(){return !0}static hasExistingData(){try{if(!S__namespace.default.existsSync(mt()))return !1;let t=JSON.parse(S__namespace.default.readFileSync(mt(),"utf8"));return !!(t&&t.credentials)}catch{return !1}}async getSecret(t,r){let n=dr(),s=pr[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,r,n){let s=dr(),o=pr[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;rn(s);}async deleteSecret(t,r){let n=dr(),s=pr[r]??r;return s in n?(delete n[s],rn(n),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${mt()}`}};});async function sn(){return new Ut}var on=_(()=>{"use strict";nn();});var cn={};re(cn,{clearFlowCredentials:()=>so,getConfigPath:()=>io,getEmailFromToken:()=>Xe,getFlowCredentials:()=>an,getTokenCache:()=>Et,hasCredentials:()=>ao,isTokenValid:()=>oo,saveFlowCredentials:()=>no,saveTokenCache:()=>fe});function Je(){return fr||(fr=sn()),fr}async function an(){let t=await(await Je()).getSecret(Ge,mr);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function no(e){if(!e.clientId||!e.clientSecret||!e.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await Je()).setSecret(Ge,mr,JSON.stringify(e));}async function so(){let e=await Je();await e.deleteSecret(Ge,mr),await e.deleteSecret(Ge,gr);}async function fe(e){await(await Je()).setSecret(Ge,gr,JSON.stringify({accessToken:e.accessToken,expiresAt:e.expiresAt,lastAuthCheckAt:e.lastAuthCheckAt}));}async function Et(){let t=await(await Je()).getSecret(Ge,gr);if(!t)return null;try{let r=JSON.parse(t);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function oo(){let e=await Et();return e?new Date(e.expiresAt)>new Date:false}async function Xe(){let e=await Et();if(!e||!e.accessToken)return null;try{let t=e.accessToken.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}async function io(){return (await Je()).getStoragePath?.()??"FLOW-nodejs/config.json"}async function ao(){let e=await an();return !!(e&&e.clientId&&e.clientSecret&&e.tenant)}var Ge,mr,gr,fr,qe=_(()=>{"use strict";on();P();Ge=it.SERVICE,mr=it.ACCOUNT_CREDS,gr=it.ACCOUNT_TOKEN,fr=null;});function ln(){return !!process.env[d.FLOW_USER_EMAIL]||!!z(d.FLOW_USER_EMAIL)}function Er(e){l("maybePersistUserEmail",`${e}: starting`);let t=e==="api-key"?`\u26A0\uFE0F flow-ai-obs: FLOW_USER_EMAIL is not set. Configure it with:
31
+ `),1}var bt=T(()=>{"use strict";ue();});function Pe(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return {home:t,username:process.env.SUDO_USER}}return {home:ke__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||ke__namespace.userInfo().username}}function se(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(e=r);}if(e){let t=e.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return k__namespace.join(t,".claude","settings.json")}return k__namespace.join(ke__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||ke__namespace.homedir();return k__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return k__namespace.join(t,".claude","settings.json")}return k__namespace.join(ke__namespace.homedir(),".claude","settings.json")}var pt=T(()=>{"use strict";bt();});function Ut(){if(process.platform==="win32"){let r=process.env.APPDATA||k__namespace.join(ke__namespace.homedir(),"AppData","Roaming");return k__namespace.join(r,Zr,Qr)}let e=Pe(),t=process.env.XDG_CONFIG_HOME||k__namespace.join(e.home,".config");return k__namespace.join(t,Zr,Qr)}function pr(){try{let e=___namespace.readFileSync(se(),"utf8"),r=JSON.parse(e).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}var Zr,Qr,dr=T(()=>{"use strict";pt();Zr="flow-ai-obs",Qr="config.json";});function rn(e){try{let t=___namespace.statSync(e);Date.now()-t.mtimeMs>io&&___namespace.unlinkSync(e);}catch{}try{___namespace.writeFileSync(e,String(process.pid),{flag:"wx"});}catch(t){throw t.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+e):t}}function nn(e){try{___namespace.unlinkSync(e);}catch{}}function ao(e,t){let n=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [t,...n]}function sn(e,t){let r=se(),n=r+".lock",s=[];___namespace.mkdirSync(k__namespace.dirname(r),{recursive:true}),rn(n);try{if(___namespace.existsSync(r)){___namespace.copyFileSync(r,r+".bkp");try{___namespace.chmodSync(r+".bkp",384);}catch{}}let o=Ut();if(___namespace.existsSync(o)){let w=o+".bkp";___namespace.copyFileSync(o,w);try{___namespace.chmodSync(w,384);}catch{}}let i={};try{i=JSON.parse(___namespace.readFileSync(r,"utf8"));}catch{}let a=i.env&&typeof i.env=="object"?i.env:{};delete a.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:c}=(I(),M(Xr)),p=c().OTEL_ENDPOINT,g={...de,OTEL_EXPORTER_OTLP_ENDPOINT:e??p};i.env={...a,...g,...t??{}},i.otelHeadersHelper="flow-ai-obs otel-headers",(!i.hooks||typeof i.hooks!="object"||Array.isArray(i.hooks))&&(i.hooks={});let u=(w,O)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${w}`,timeout:O}]}),E=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],y=i.hooks;for(let w of E){let O=ao(y[w],u(w,Ae[w]));O.length>1&&s.push(w),y[w]=O;}___namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
32
+ `,{encoding:"utf8",mode:384});try{___namespace.chmodSync(r,384);}catch{}}finally{nn(n);}return {settingsPath:r,preserved:s}}function Z(e){if(ft===void 0)try{let r=___namespace.readFileSync(se(),"utf8");ft=JSON.parse(r).env??null;}catch{ft=null;}if(!ft)return null;let t=ft[e];return typeof t=="string"?t:null}function Ve(e){let t=se(),r=t+".lock";___namespace.mkdirSync(k__namespace.dirname(t),{recursive:true}),rn(r);try{let n={};try{n=JSON.parse(___namespace.readFileSync(t,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,e),___namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
33
+ `,{encoding:"utf8",mode:384});try{___namespace.chmodSync(t,384);}catch{}}finally{nn(r);}}function mt(e){let t=process.env[e];return t!==void 0?t!==""?t:void 0:Z(e)??void 0}var io,ft,fe=T(()=>{"use strict";I();Le();pt();dr();io=ut.LOCK_STALE_MS;});function gt(){let e=ke__namespace.default.homedir();if(process.platform==="darwin")return k__namespace.default.join(e,"Library","Preferences",ct,lt);if(process.platform==="win32"){let r=process.env.APPDATA??k__namespace.default.join(e,"AppData","Roaming");return k__namespace.default.join(r,ct,lt)}let t=process.env.XDG_CONFIG_HOME??k__namespace.default.join(e,".config");return k__namespace.default.join(t,ct,lt)}function gr(){try{let e=___namespace.default.readFileSync(gt(),"utf8");return JSON.parse(e)}catch{return {}}}function on(e){let t=gt();___namespace.default.mkdirSync(k__namespace.default.dirname(t),{recursive:true}),___namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var mr,Ct,an=T(()=>{"use strict";I();mr={credentials:"credentials","token-cache":"tokenCache"};Ct=class{static isAvailable(){return !0}static hasExistingData(){try{if(!___namespace.default.existsSync(gt()))return !1;let t=JSON.parse(___namespace.default.readFileSync(gt(),"utf8"));return !!(t&&t.credentials)}catch{return !1}}async getSecret(t,r){let n=gr(),s=mr[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,r,n){let s=gr(),o=mr[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;on(s);}async deleteSecret(t,r){let n=gr(),s=mr[r]??r;return s in n?(delete n[s],on(n),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${gt()}`}};});async function cn(){return new Ct}var ln=T(()=>{"use strict";an();});var pn={};ne(pn,{clearFlowCredentials:()=>uo,getConfigPath:()=>fo,getEmailFromToken:()=>qe,getFlowCredentials:()=>un,getTokenCache:()=>ht,hasCredentials:()=>mo,isTokenValid:()=>po,saveFlowCredentials:()=>lo,saveTokenCache:()=>me});function Xe(){return Er||(Er=cn()),Er}async function un(){let t=await(await Xe()).getSecret(Je,hr);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function lo(e){if(!e.clientId||!e.clientSecret||!e.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await Xe()).setSecret(Je,hr,JSON.stringify(e));}async function uo(){let e=await Xe();await e.deleteSecret(Je,hr),await e.deleteSecret(Je,_r);}async function me(e){await(await Xe()).setSecret(Je,_r,JSON.stringify({accessToken:e.accessToken,expiresAt:e.expiresAt,lastAuthCheckAt:e.lastAuthCheckAt}));}async function ht(){let t=await(await Xe()).getSecret(Je,_r);if(!t)return null;try{let r=JSON.parse(t);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function po(){let e=await ht();return e?new Date(e.expiresAt)>new Date:false}async function qe(){let e=await ht();if(!e||!e.accessToken)return null;try{let t=e.accessToken.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}async function fo(){return (await Xe()).getStoragePath?.()??"FLOW-nodejs/config.json"}async function mo(){let e=await un();return !!(e&&e.clientId&&e.clientSecret&&e.tenant)}var Je,hr,_r,Er,ze=T(()=>{"use strict";ln();I();Je=at.SERVICE,hr=at.ACCOUNT_CREDS,_r=at.ACCOUNT_TOKEN,Er=null;});function dn(){return !!process.env[d.FLOW_USER_EMAIL]||!!Z(d.FLOW_USER_EMAIL)}function Tr(e){l("maybePersistUserEmail",`${e}: starting`);let t=e==="api-key"?`\u26A0\uFE0F flow-ai-obs: FLOW_USER_EMAIL is not set. Configure it with:
34
34
  flow-ai-obs init --custom-email <EMAIL>
35
35
  `:`\u26A0\uFE0F flow-ai-obs: FLOW_USER_EMAIL is not set and could not be derived from token.
36
36
  Run: flow-ai-obs init
37
- `;return Xe().then(r=>{if(r){let n=r.split(/[\r\n]/)[0].replace(/[\x00-\x1F\x7F]/g,"").trim();if(!n)return;let s=n.indexOf("@"),o=n.slice(s+1);if(!(n.length<=254&&Y.EMAIL_HEADER_PATTERN.test(n)&&(n.match(/@/g)??[]).length===1&&s>0&&s<n.length-1&&o.includes("."))){l("maybePersistUserEmail",`${e}: email from token failed basic validation \u2014 skipping persist`);return}try{je({[d.FLOW_USER_EMAIL]:n}),l("maybePersistUserEmail",`${e}: persisted FLOW_USER_EMAIL from OAuth token`);}catch(a){l("maybePersistUserEmail",`${e}: FLOW_USER_EMAIL write failed: ${a.message}`),process.stderr.write(`\u26A0\uFE0F flow-ai-obs: could not persist FLOW_USER_EMAIL to settings.json.
37
+ `;return qe().then(r=>{if(r){let n=r.split(/[\r\n]/)[0].replace(/[\x00-\x1F\x7F]/g,"").trim();if(!n)return;let s=n.indexOf("@"),o=n.slice(s+1);if(!(n.length<=254&&Y.EMAIL_HEADER_PATTERN.test(n)&&(n.match(/@/g)??[]).length===1&&s>0&&s<n.length-1&&o.includes("."))){l("maybePersistUserEmail",`${e}: email from token failed basic validation \u2014 skipping persist`);return}try{Ve({[d.FLOW_USER_EMAIL]:n}),l("maybePersistUserEmail",`${e}: persisted FLOW_USER_EMAIL from OAuth token`);}catch(a){l("maybePersistUserEmail",`${e}: FLOW_USER_EMAIL write failed: ${a.message}`),process.stderr.write(`\u26A0\uFE0F flow-ai-obs: could not persist FLOW_USER_EMAIL to settings.json.
38
38
  Run: flow-ai-obs init
39
- `);}}else process.stderr.write(t);}).catch(r=>{l("maybePersistUserEmail",`${e}: getEmailFromToken failed: ${r.message}`);})}var un=_(()=>{"use strict";qe();de();x();P();});function uo(e){return lo.some(t=>t.test(e))}function po(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function me(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:s,tenant:o}=r;return !n||!s||!o?null:{clientId:n,clientSecret:s,tenant:o}}catch{return null}}function pn(e){let t=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant})).toString("base64url");return `${t}.${r}.`}function Pe(e){let t;try{t=new URL(e);}catch{throw new Error(`Invalid URL: ${e}`)}let r=process.env[d.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&t.protocol!=="https:")throw new Error(`URL must use HTTPS: ${e}`);if(t.username||t.password)throw new Error(`URL must not contain embedded credentials: ${e}`);if(!r&&uo(t.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${t.hostname}`);return e}async function dn(){let e=me(process.env[d.ANTHROPIC_AUTH_TOKEN]);return e?{user:await Xe().catch(()=>null)??e.clientId,tenant:e.tenant}:{user:"",tenant:""}}function fo(e){let t=process.env[d.OTEL_EXPORTER_OTLP_HEADERS];if(!t)return null;let r=e.toLowerCase();for(let n of t.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 Ie(){let e=ft(d.FLOW_USER_EMAIL);if(e!==void 0){let r=e.replace(/[\r\n]/g,"").trim();if(r)if(r.length>Y.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${Y.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!Y.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 t=fo("x-flow-user");if(t){let r=t.replace(/[\r\n]/g,"").trim();if(r.length>Y.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${Y.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!Y.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=Le__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 se(){let e=process.env[d.FLOW_API_KEY];if(!e)return null;let t=e.replace(/[\r\n]/g,"").trim();return t?t.length>Y.API_KEY_MAX_LENGTH?(l("resolveApiKey",`FLOW_API_KEY exceeds ${Y.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):Y.API_KEY_PATTERN.test(t)?t:(l("resolveApiKey","FLOW_API_KEY contains non-printable or control characters \u2014 rejected"),null):null}function mo(){return new Date().toISOString().slice(0,10)}async function go(e){let t=mo(),r=await Et();if(r?.lastAuthCheckAt!==t){l("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);let o=Ye.MAX_RETRY_ATTEMPTS;for(let i=1;i<=o;i++)try{let a=await q(e);try{await fe({...a,lastAuthCheckAt:t});}catch(p){l("getOrRefreshToken",`saveTokenCache failed (non-fatal): ${p.message}`);}return l("getOrRefreshToken",`daily check passed (attempt ${i}), expires=${a.expiresAt}`),se()?ln()||await Er("api-key"):await Er("oauth"),a.accessToken}catch(a){if(a instanceof Ae){if(a.statusCode!==500)throw l("getOrRefreshToken",`daily check auth error (${a.statusCode}) \u2014 propagating immediately`),a;if(i<o){l("getOrRefreshToken",`daily check 500 error (attempt ${i}/${o}) \u2014 retrying in 1s`),await new Promise(c=>setTimeout(c,Ye.RETRY_DELAY_MS));continue}throw l("getOrRefreshToken",`daily check failed after ${o} attempts \u2014 propagating`),a}l("getOrRefreshToken",`daily check network error \u2014 using cache: ${a.message}`);break}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(l("getOrRefreshToken",`cacheValid=${n}`),n)return l("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;l("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${e.tenant} clientId=${e.clientId})`);let s=await q(e);try{await fe({...s,lastAuthCheckAt:t});}catch(o){l("getOrRefreshToken",`token cache save failed (non-fatal): ${o.message}`);}return l("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function Eo(e,t){let r=t&&t.accessToken?t.accessToken:"";return {endpoint:e.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function ho(e,t,r){let n=Buffer.from(`${t}:${r}`).toString("base64");return {endpoint:e.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function ie(){let e=[],t=me(process.env[d.ANTHROPIC_AUTH_TOKEN]);l("resolveCredentials",t?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),t&&l("resolveCredentials",`clientId=${t.clientId}`,`tenant=${t.tenant}`);let r=t?t.tenant:"",n=process.env[d.FLOW_TELEMETRY]==="true",s=process.env[d.LANGFUSE_BASE_URL],o=process.env[d.LANGFUSE_PUBLIC_KEY],i=process.env[d.LANGFUSE_SECRET_KEY];if(n&&s&&o&&i){let u="",E=r;t&&(u=await Xe().catch(()=>null)??t.clientId);let y={user:u??"",tenant:E??"",team:"",project:""};e.push({mode:"direct",...ho(Pe(s),o,i),...y}),l("resolveCredentials","direct mode active",`user=${y.user}`,`tenant=${y.tenant}`);}if(!t){if(e.length===0){let u=[];return u.authError=false,u}return e}let a;try{a=await go(t);}catch(u){if(l("resolveCredentials",`token refresh failed: ${u.message}`,`(tenant=${t.tenant} clientId=${t.clientId})`),e.length>0)return e.authError=true,e;let E=[];return E.authError=true,E}let p={user:po(a)??t.clientId,tenant:r,team:"",project:""},g=process.env[d.FLOW_TELEMETRY_GATEWAY]??we();return e.push({mode:"gateway",...Eo(Pe(g),{accessToken:a}),...p}),e}var lo,K=_(()=>{"use strict";qe();Re();P();x();un();de();lo=[/^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 mn(){return !!(process.env.WSL_DISTRO_NAME&&process.platform==="linux")}function Nt(){return process.platform==="win32"||mn()}function To(e){let t=e.match(/^\/mnt\/([a-z])\/(.*)$/);if(!t)return e;let r=t[1].toUpperCase(),n=t[2].replace(/\//g,"\\");return `${r}:\\${n}`}function gn(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let n=process.env.LOCALAPPDATA;if(!n)try{let s=child_process.execSync("cmd.exe /c echo %LOCALAPPDATA%",{encoding:"utf8",timeout:5e3}).trim();s&&/^[A-Za-z]:\\/.test(s)&&(n=s);}catch(s){l("getDesktopPaths",`cmd.exe LOCALAPPDATA lookup failed: ${s.message}`);}if(n){let s=n.replace(/^([A-Za-z]):/,(i,a)=>`/mnt/${a.toLowerCase()}`).replace(/\\/g,"/"),o=k__namespace.join(s,C.DIR_3P);return Ct(o)}}if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||k__namespace.join(Le__namespace.homedir(),"AppData","Local"),s=k__namespace.join(n,C.DIR_3P);return Ct(s)}if(process.platform==="darwin"){let n=k__namespace.join(Le__namespace.homedir(),"Library","Application Support",C.DIR_3P);return Ct(n)}let e=ke(),t=process.env.XDG_CONFIG_HOME||k__namespace.join(e.home,".config"),r=k__namespace.join(t,C.DIR_3P);return Ct(r)}function Ct(e){return {configDir:e,configLibraryDir:k__namespace.join(e,C.CONFIG_LIBRARY_DIR),desktopConfigPath:k__namespace.join(e,C.DESKTOP_CONFIG_FILE),metaPath:k__namespace.join(e,C.CONFIG_LIBRARY_DIR,C.META_FILE)}}function So(){let e=ne(),t=k__namespace.dirname(e),r=Nt()?C.WRAPPER_SCRIPT_WIN:C.WRAPPER_SCRIPT_UNIX;return k__namespace.join(t,r)}function hr(){if(process.env[d.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=gn();if(S__namespace.existsSync(e.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",k__namespace.join(Le__namespace.homedir(),"Applications","Claude.app")].some(r=>S__namespace.existsSync(r));if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||k__namespace.join(Le__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files";return [k__namespace.join(t,"AnthropicClaude","Claude.exe"),k__namespace.join(r,"Claude","Claude.exe")].some(s=>S__namespace.existsSync(s))}if(process.platform==="linux"){let t=ke(),r=process.env.XDG_CONFIG_HOME||k__namespace.join(t.home,".config"),n=k__namespace.join(r,"Claude");return S__namespace.existsSync(n)}return false}function yo(){let e=So(),t=k__namespace.dirname(e);S__namespace.mkdirSync(t,{recursive:true});let r=Nt()?Oo():wo(),n=true;try{S__namespace.readFileSync(e,"utf8")===r&&(n=!1);}catch{}if(n&&(S__namespace.existsSync(e)&&S__namespace.copyFileSync(e,e+".bkp"),S__namespace.writeFileSync(e,r,{encoding:"utf8",mode:Nt()?420:493})),!Nt())try{S__namespace.chmodSync(e,493);}catch{}return e}function wo(){return ["#!/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","exec flow-ai-obs otel-headers",""].join(`
40
- `)}function Oo(){return ["@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.","flow-ai-obs otel-headers",""].join(`\r
41
- `)}function Ro(e){try{let t=S__namespace.readFileSync(e,"utf8");try{let r=JSON.parse(t);if(r.appliedId&&typeof r.appliedId=="string"&&Ao.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 ${e} \u2014 generating new UUID`);}}catch(t){t.code!=="ENOENT"&&l("getOrCreateConfigUuid",`read error: ${t.message}`);}return fn__namespace.randomUUID()}function Lo(e,t){let r=k__namespace.dirname(e);S__namespace.mkdirSync(r,{recursive:true});let n;try{let o=S__namespace.readFileSync(e,"utf8");try{n=JSON.parse(o),(!n.appliedId||typeof n.appliedId!="string")&&(n.appliedId=t),Array.isArray(n.entries)||(n.entries=[]);}catch{l("writeMetaJson",`corrupted JSON in ${e} \u2014 starting fresh`),n={appliedId:t,entries:[]};}}catch(o){o.code!=="ENOENT"&&l("writeMetaJson",`read error: ${o.message}`),n={appliedId:t,entries:[]};}n.entries.some(o=>o.id===t)||n.entries.push({id:t,name:C.CONFIG_NAME});let s=JSON.stringify(n,null,2)+`
42
- `;try{if(S__namespace.readFileSync(e,"utf8")===s)return}catch{}S__namespace.existsSync(e)&&S__namespace.copyFileSync(e,e+".bkp"),S__namespace.writeFileSync(e,s,{encoding:"utf8",mode:384});try{S__namespace.chmodSync(e,384);}catch{}}function ko(e,t,r,n){S__namespace.mkdirSync(e,{recursive:true});let s=k__namespace.resolve(e),o=k__namespace.resolve(e,`${t}.json`);if(!o.startsWith(s+k__namespace.sep))throw new Error(`Security error: invalid config path ${o}`);let i={};try{let c=S__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[C.KEYS.OTLP_ENDPOINT]=r,i[C.KEYS.OTLP_PROTOCOL]=C.OTLP_PROTOCOL,i[C.KEYS.OTLP_HEADERS_HELPER]=mn()?To(n):n,i[C.KEYS.OTLP_RESOURCE_ATTRIBUTES]={[C.CUSTOM_PROVIDER_KEY]:C.CUSTOM_PROVIDER_VALUE};let a=JSON.stringify(i,null,2)+`
43
- `;try{if(S__namespace.readFileSync(o,"utf8")===a)return o}catch{}if(S__namespace.existsSync(o)){S__namespace.copyFileSync(o,o+".bkp");try{S__namespace.chmodSync(o+".bkp",384);}catch{}}S__namespace.writeFileSync(o,a,{encoding:"utf8",mode:384});try{S__namespace.chmodSync(o,384);}catch{}return o}function Po(e){let t=k__namespace.dirname(e);S__namespace.mkdirSync(t,{recursive:true});let r={};try{let n=S__namespace.readFileSync(e,"utf8");try{r=JSON.parse(n);}catch{l("mergeClaudeDesktopConfig",`corrupted JSON in ${e} \u2014 starting fresh (original backed up to .bkp)`);}}catch(n){n.code!=="ENOENT"&&l("mergeClaudeDesktopConfig",`read error: ${n.message}`);}if(r.deploymentMode!==C.DEPLOYMENT_MODE){S__namespace.existsSync(e)&&S__namespace.copyFileSync(e,e+".bkp"),r.deploymentMode=C.DEPLOYMENT_MODE,S__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
44
- `,{encoding:"utf8",mode:384});try{S__namespace.chmodSync(e,384);}catch{}}}function En(e){if(!hr())return {configured:false};let t=gn(),r=e??J().OTEL_ENDPOINT,n=yo(),s=Ro(t.metaPath),o=ko(t.configLibraryDir,s,r,n);return Lo(t.metaPath,s),Po(t.desktopConfigPath),{configured:true,configDir:t.configDir,configLibraryPath:o,uuid:s,wrapperScriptPath:n}}var Ao,hn=_(()=>{"use strict";P();ut();x();Ao=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;});function _r(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let r=process.env.APPDATA;if(!r)try{let o=child_process.spawnSync("cmd.exe",["/c","echo","%APPDATA%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();o&&/^[A-Za-z]:\\/.test(o)&&(r=o);}catch(s){l("getVsCodeSettingsPath",`cmd.exe APPDATA lookup failed: ${s.message}`);}if(!r)return null;let n=r.replace(/^([A-Za-z]):/,(s,o)=>`/mnt/${o.toLowerCase()}`).replace(/\\/g,"/");return k__namespace.join(n,"Code","User","settings.json")}if(process.platform==="win32"){let r=process.env.APPDATA||k__namespace.join(Le__namespace.homedir(),"AppData","Roaming");return k__namespace.join(r,"Code","User","settings.json")}if(process.platform==="darwin")return k__namespace.join(Le__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let e=process.platform==="linux"&&process.getuid?.()===0?ke().home:process.env.HOME||Le__namespace.homedir(),t=process.env.XDG_CONFIG_HOME||k__namespace.join(e,".config");return k__namespace.join(t,"Code","User","settings.json")}function _n(e){let t=false,r=false,n="";for(let s=0;s<e.length;s++){let o=e[s];if(t){n+=o,r?r=false:o==="\\"?r=true:o==='"'&&(t=false);continue}if(o==='"'){t=true,n+=o;continue}if(o===","){let i=s+1;for(;i<e.length&&/\s/.test(e[i]);)i++;if(i<e.length&&(e[i]==="}"||e[i]==="]"))continue}n+=o;}return n}function $t(e){if(process.env[d.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(e&&S__namespace.existsSync(e));if(e&&(S__namespace.existsSync(e)||S__namespace.existsSync(k__namespace.dirname(e))||S__namespace.existsSync(k__namespace.dirname(k__namespace.dirname(e)))))return true;let t=_r();if(t&&(S__namespace.existsSync(t)||S__namespace.existsSync(k__namespace.dirname(t))||S__namespace.existsSync(k__namespace.dirname(k__namespace.dirname(t))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",k__namespace.join(Le__namespace.homedir(),"Applications","Visual Studio Code.app")].some(n=>S__namespace.existsSync(n)))return true;if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||k__namespace.join(Le__namespace.homedir(),"AppData","Local"),n=process.env.PROGRAMFILES||"C:\\Program Files",s=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([k__namespace.join(r,"Programs","Microsoft VS Code","Code.exe"),k__namespace.join(n,"Microsoft VS Code","Code.exe"),k__namespace.join(s,"Microsoft VS Code","Code.exe")].some(i=>S__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(n=>S__namespace.existsSync(n)))}function Tn(e,t={}){let r;try{r=t.customSettingsPath||_r();}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(!$t(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(S__namespace.existsSync(r))try{let w=_n(S__namespace.readFileSync(r,"utf8"));n=JSON.parse(w);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=e||J().OTEL_ENDPOINT,o=t.apiKey!==void 0?t.apiKey:se(),i=t.userEmail!==void 0?t.userEmail:Ie(),a=typeof n[T.HEADERS_KEY]=="object"&&n[T.HEADERS_KEY]!==null&&!Array.isArray(n[T.HEADERS_KEY])?n[T.HEADERS_KEY]:{},c={...a};o&&(c[T.HEADER_API_KEY]=o),i&&(c[T.HEADER_USER]=i);let p=Object.keys(c),g=Object.keys(a),u=p.length===0&&(n[T.HEADERS_KEY]===void 0||g.length===0)||p.length===g.length&&p.every(w=>a[w]===c[w]);if(n[T.ENABLED_KEY]===T.ENABLED_VALUE&&n[T.EXPORTER_TYPE_KEY]===T.EXPORTER_TYPE_VALUE&&n[T.PROTOCOL_KEY]===T.PROTOCOL_VALUE&&n[T.ENDPOINT_KEY]===s&&u)return {status:"already_configured",settingsPath:r};S__namespace.mkdirSync(k__namespace.dirname(r),{recursive:!0});let y={...n,[T.ENABLED_KEY]:T.ENABLED_VALUE,[T.EXPORTER_TYPE_KEY]:T.EXPORTER_TYPE_VALUE,[T.PROTOCOL_KEY]:T.PROTOCOL_VALUE,[T.ENDPOINT_KEY]:s};return p.length>0&&(y[T.HEADERS_KEY]=c),S__namespace.writeFileSync(r,JSON.stringify(y,null,2)+`
45
- `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}function Sn(e,t={}){let r;try{r=t.customSettingsPath||_r();}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(!$t(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(S__namespace.existsSync(r))try{let a=_n(S__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[T.HEADERS_KEY]=="object"&&n[T.HEADERS_KEY]!==null&&!Array.isArray(n[T.HEADERS_KEY])?n[T.HEADERS_KEY]:{};if(s[T.HEADER_API_KEY]===e)return {status:"already_configured",settingsPath:r};let o={...s,[T.HEADER_API_KEY]:e};S__namespace.mkdirSync(k__namespace.dirname(r),{recursive:!0});let i={...n,[T.ENABLED_KEY]:n[T.ENABLED_KEY]??T.ENABLED_VALUE,[T.EXPORTER_TYPE_KEY]:n[T.EXPORTER_TYPE_KEY]??T.EXPORTER_TYPE_VALUE,[T.PROTOCOL_KEY]:n[T.PROTOCOL_KEY]??T.PROTOCOL_VALUE,[T.ENDPOINT_KEY]:n[T.ENDPOINT_KEY]??J().OTEL_ENDPOINT,[T.HEADERS_KEY]:o};return S__namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
46
- `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}var Tr=_(()=>{"use strict";P();K();ut();x();});var wn={};re(wn,{clearLoggedOutMarker:()=>yr,isLoggedOut:()=>Uo,markLoggedOut:()=>bo});function Sr(){return k__namespace.default.join(Le__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function bo(){try{let e=Sr();S__namespace.default.mkdirSync(k__namespace.default.dirname(e),{recursive:!0}),S__namespace.default.writeFileSync(e,"",{mode:384});}catch{}}function yr(){try{S__namespace.default.unlinkSync(Sr());}catch{}}function Uo(){try{return S__namespace.default.existsSync(Sr())}catch{return false}}var wr=_(()=>{"use strict";});function Or(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():z("FLOW_BASE_URL")}function Co(){return z(d.ANTHROPIC_AUTH_TOKEN)??void 0}async function Dt(){let e=Or();if(!e)return {ok:false,baseUrl:"",user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let s=new URL(e);if(s.protocol!=="https:"&&s.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:e,user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"}}let t=Co(),r=me(t);if(!r)return {ok:false,baseUrl:e,user:"",tenant:"",error:"No credentials found"};let n=process.env.FLOW_BASE_URL;process.env.FLOW_BASE_URL=e;try{let s=await q({clientId:r.clientId,clientSecret:r.clientSecret,tenant:r.tenant});await fe({accessToken:s.accessToken,expiresAt:s.expiresAt});let o=r.clientId;try{let i=s.accessToken.split(".");if(i.length>=2){let a=JSON.parse(Buffer.from(i[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));o=a.email??a.preferred_username??a.upn??a.sub??o;}}catch{}return {ok:!0,baseUrl:e,user:o,tenant:r.tenant}}catch(s){return {ok:false,baseUrl:e,user:r.clientId,tenant:r.tenant,error:s.message}}finally{n===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=n;}}var Ar=_(()=>{"use strict";qe();K();de();P();Re();});var Tt={};re(Tt,{promptRaw:()=>_t,runLogin:()=>Fo});function ee(e){return typeof e=="string"?e.replace(No,""):e}function _t(e,t={}){return new Promise((r,n)=>{if(typeof process.stdin.setRawMode!="function"){n(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:o=""}=t;process.stdout.write(e+o);let i=o;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=g=>{if(g===""){p(),n(new Error("SIGINT"));return}if(g==="\r"||g===`
39
+ `);}}else process.stderr.write(t);}).catch(r=>{l("maybePersistUserEmail",`${e}: getEmailFromToken failed: ${r.message}`);})}var fn=T(()=>{"use strict";ze();fe();x();I();});function ho(e){return Eo.some(t=>t.test(e))}function _o(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function ge(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:s,tenant:o}=r;return !n||!s||!o?null:{clientId:n,clientSecret:s,tenant:o}}catch{return null}}function mn(e){let t=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant})).toString("base64url");return `${t}.${r}.`}function Ie(e){let t;try{t=new URL(e);}catch{throw new Error(`Invalid URL: ${e}`)}let r=process.env[d.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&t.protocol!=="https:")throw new Error(`URL must use HTTPS: ${e}`);if(t.username||t.password)throw new Error(`URL must not contain embedded credentials: ${e}`);if(!r&&ho(t.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${t.hostname}`);return e}async function gn(){let e=ge(process.env[d.ANTHROPIC_AUTH_TOKEN]);return e?{user:await qe().catch(()=>null)??e.clientId,tenant:e.tenant}:{user:"",tenant:""}}function To(e){let t=process.env[d.OTEL_EXPORTER_OTLP_HEADERS];if(!t)return null;let r=e.toLowerCase();for(let n of t.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 ve(){let e=mt(d.FLOW_USER_EMAIL);if(e!==void 0){let r=e.replace(/[\r\n]/g,"").trim();if(r)if(r.length>Y.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${Y.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!Y.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 t=To("x-flow-user");if(t){let r=t.replace(/[\r\n]/g,"").trim();if(r.length>Y.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${Y.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!Y.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=ke__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 oe(e){if(!e)return null;let t=e.replace(/[\r\n]/g,"").trim();return t?t.length>Y.API_KEY_MAX_LENGTH?(l("validateApiKey",`API key exceeds ${Y.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):Y.API_KEY_PATTERN.test(t)?t:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function j(){let e=process.env[d.FLOW_API_KEY];return oe(e)}function So(){return new Date().toISOString().slice(0,10)}async function yo(e){let t=So(),r=await ht();if(r?.lastAuthCheckAt!==t){l("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);let o=Ye.MAX_RETRY_ATTEMPTS;for(let i=1;i<=o;i++)try{let a=await z(e);try{await me({...a,lastAuthCheckAt:t});}catch(p){l("getOrRefreshToken",`saveTokenCache failed (non-fatal): ${p.message}`);}return l("getOrRefreshToken",`daily check passed (attempt ${i}), expires=${a.expiresAt}`),j()?dn()||await Tr("api-key"):await Tr("oauth"),a.accessToken}catch(a){if(a instanceof Re){if(a.statusCode!==500)throw l("getOrRefreshToken",`daily check auth error (${a.statusCode}) \u2014 propagating immediately`),a;if(i<o){l("getOrRefreshToken",`daily check 500 error (attempt ${i}/${o}) \u2014 retrying in 1s`),await new Promise(c=>setTimeout(c,Ye.RETRY_DELAY_MS));continue}throw l("getOrRefreshToken",`daily check failed after ${o} attempts \u2014 propagating`),a}l("getOrRefreshToken",`daily check network error \u2014 using cache: ${a.message}`);break}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(l("getOrRefreshToken",`cacheValid=${n}`),n)return l("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;l("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${e.tenant} clientId=${e.clientId})`);let s=await z(e);try{await me({...s,lastAuthCheckAt:t});}catch(o){l("getOrRefreshToken",`token cache save failed (non-fatal): ${o.message}`);}return l("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function wo(e,t){let r=t&&t.accessToken?t.accessToken:"";return {endpoint:e.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function Oo(e,t,r){let n=Buffer.from(`${t}:${r}`).toString("base64");return {endpoint:e.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function ae(){let e=[],t=ge(process.env[d.ANTHROPIC_AUTH_TOKEN]);l("resolveCredentials",t?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),t&&l("resolveCredentials",`clientId=${t.clientId}`,`tenant=${t.tenant}`);let r=t?t.tenant:"",n=process.env[d.FLOW_TELEMETRY]==="true",s=process.env[d.LANGFUSE_BASE_URL],o=process.env[d.LANGFUSE_PUBLIC_KEY],i=process.env[d.LANGFUSE_SECRET_KEY];if(n&&s&&o&&i){let u="",E=r;t&&(u=await qe().catch(()=>null)??t.clientId);let y={user:u??"",tenant:E??"",team:"",project:""};e.push({mode:"direct",...Oo(Ie(s),o,i),...y}),l("resolveCredentials","direct mode active",`user=${y.user}`,`tenant=${y.tenant}`);}if(!t){if(e.length===0){let u=[];return u.authError=false,u}return e}let a;try{a=await yo(t);}catch(u){if(l("resolveCredentials",`token refresh failed: ${u.message}`,`(tenant=${t.tenant} clientId=${t.clientId})`),e.length>0)return e.authError=true,e;let E=[];return E.authError=true,E}let p={user:_o(a)??t.clientId,tenant:r,team:"",project:""},g=process.env[d.FLOW_TELEMETRY_GATEWAY]??Oe();return e.push({mode:"gateway",...wo(Ie(g),{accessToken:a}),...p}),e}var Eo,H=T(()=>{"use strict";ze();Le();I();x();fn();fe();Eo=[/^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 hn(){return !!(process.env.WSL_DISTRO_NAME&&process.platform==="linux")}function $t(){return process.platform==="win32"||hn()}function Ro(e){let t=e.match(/^\/mnt\/([a-z])\/(.*)$/);if(!t)return e;let r=t[1].toUpperCase(),n=t[2].replace(/\//g,"\\");return `${r}:\\${n}`}function _n(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let n=process.env.LOCALAPPDATA;if(!n)try{let s=child_process.execSync("cmd.exe /c echo %LOCALAPPDATA%",{encoding:"utf8",timeout:5e3}).trim();s&&/^[A-Za-z]:\\/.test(s)&&(n=s);}catch(s){l("getDesktopPaths",`cmd.exe LOCALAPPDATA lookup failed: ${s.message}`);}if(n){let s=n.replace(/^([A-Za-z]):/,(i,a)=>`/mnt/${a.toLowerCase()}`).replace(/\\/g,"/"),o=k__namespace.join(s,N.DIR_3P);return Nt(o)}}if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||k__namespace.join(ke__namespace.homedir(),"AppData","Local"),s=k__namespace.join(n,N.DIR_3P);return Nt(s)}if(process.platform==="darwin"){let n=k__namespace.join(ke__namespace.homedir(),"Library","Application Support",N.DIR_3P);return Nt(n)}let e=Pe(),t=process.env.XDG_CONFIG_HOME||k__namespace.join(e.home,".config"),r=k__namespace.join(t,N.DIR_3P);return Nt(r)}function Nt(e){return {configDir:e,configLibraryDir:k__namespace.join(e,N.CONFIG_LIBRARY_DIR),desktopConfigPath:k__namespace.join(e,N.DESKTOP_CONFIG_FILE),metaPath:k__namespace.join(e,N.CONFIG_LIBRARY_DIR,N.META_FILE)}}function Ft(){let e=se(),t=k__namespace.dirname(e),r=$t()?N.WRAPPER_SCRIPT_WIN:N.WRAPPER_SCRIPT_UNIX;return k__namespace.join(t,r)}function Dt(){if(process.env[d.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=_n();if(___namespace.existsSync(e.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",k__namespace.join(ke__namespace.homedir(),"Applications","Claude.app")].some(r=>___namespace.existsSync(r));if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||k__namespace.join(ke__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files";return [k__namespace.join(t,"AnthropicClaude","Claude.exe"),k__namespace.join(r,"Claude","Claude.exe")].some(s=>___namespace.existsSync(s))}if(process.platform==="linux"){let t=Pe(),r=process.env.XDG_CONFIG_HOME||k__namespace.join(t.home,".config"),n=k__namespace.join(r,"Claude");return ___namespace.existsSync(n)}return false}function Lo(e){let t=e??Ft();try{if(!___namespace.existsSync(t))return null;let r=___namespace.readFileSync(t,"utf8"),n=r.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(n&&n[1])return oe(n[1]);let s=r.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(s&&s[1])return oe(s[1])}catch{}return null}function Tn(e,t,r=448){let n=k__namespace.dirname(e);___namespace.mkdirSync(n,{recursive:true});let s=$t(),o=s?420:r,i=true;try{___namespace.readFileSync(e,"utf8")===t&&(i=!1);}catch{}if(!i){if(!s)try{___namespace.chmodSync(e,r);}catch{}return {written:false}}if(___namespace.existsSync(e)&&(___namespace.copyFileSync(e,e+".bkp"),!s))try{___namespace.chmodSync(e+".bkp",448);}catch{}if(___namespace.writeFileSync(e,t,{encoding:"utf8",mode:o}),!s)try{___namespace.chmodSync(e,r);}catch{}return {written:true}}function ko(e){let t=Ft(),r=e?oe(e):null,n=$t()?yn(r):Sn(r);return Tn(t,n,!!r?448:493),t}function Sn(e){let t=e?oe(e):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 t&&r.push(`export FLOW_API_KEY="${t}"`),r.push("exec flow-ai-obs otel-headers",""),r.join(`
40
+ `)}function yn(e){let t=e?oe(e):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 t&&r.push(`set FLOW_API_KEY=${t}`),r.push("flow-ai-obs otel-headers",""),r.join(`\r
41
+ `)}function wn(e){if(!Dt())return {status:"skipped",reason:"Claude Desktop is not installed"};let t=oe(e);if(!t)return {status:"skipped",reason:"Invalid API key provided"};try{let r=Ft(),n=$t()?yn(t):Sn(t),{written:s}=Tn(r,n,448);return {status:s?"configured":"already_configured",wrapperScriptPath:r}}catch(r){return {status:"skipped",reason:r.message}}}function Io(e){try{let t=___namespace.readFileSync(e,"utf8");try{let r=JSON.parse(t);if(r.appliedId&&typeof r.appliedId=="string"&&Po.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 ${e} \u2014 generating new UUID`);}}catch(t){t.code!=="ENOENT"&&l("getOrCreateConfigUuid",`read error: ${t.message}`);}return En__namespace.randomUUID()}function vo(e,t){let r=k__namespace.dirname(e);___namespace.mkdirSync(r,{recursive:true});let n;try{let o=___namespace.readFileSync(e,"utf8");try{n=JSON.parse(o),(!n.appliedId||typeof n.appliedId!="string")&&(n.appliedId=t),Array.isArray(n.entries)||(n.entries=[]);}catch{l("writeMetaJson",`corrupted JSON in ${e} \u2014 starting fresh`),n={appliedId:t,entries:[]};}}catch(o){o.code!=="ENOENT"&&l("writeMetaJson",`read error: ${o.message}`),n={appliedId:t,entries:[]};}n.entries.some(o=>o.id===t)||n.entries.push({id:t,name:N.CONFIG_NAME});let s=JSON.stringify(n,null,2)+`
42
+ `;try{if(___namespace.readFileSync(e,"utf8")===s)return}catch{}if(___namespace.existsSync(e)){___namespace.copyFileSync(e,e+".bkp");try{___namespace.chmodSync(e+".bkp",384);}catch{}}___namespace.writeFileSync(e,s,{encoding:"utf8",mode:384});try{___namespace.chmodSync(e,384);}catch{}}function bo(e,t,r,n){___namespace.mkdirSync(e,{recursive:true});let s=k__namespace.resolve(e),o=k__namespace.resolve(e,`${t}.json`);if(!o.startsWith(s+k__namespace.sep))throw new Error(`Security error: invalid config path ${o}`);let i={};try{let c=___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[N.KEYS.OTLP_ENDPOINT]=r,i[N.KEYS.OTLP_PROTOCOL]=N.OTLP_PROTOCOL,i[N.KEYS.OTLP_HEADERS_HELPER]=hn()?Ro(n):n,i[N.KEYS.OTLP_RESOURCE_ATTRIBUTES]={[N.CUSTOM_PROVIDER_KEY]:N.CUSTOM_PROVIDER_VALUE};let a=JSON.stringify(i,null,2)+`
43
+ `;try{if(___namespace.readFileSync(o,"utf8")===a)return o}catch{}if(___namespace.existsSync(o)){___namespace.copyFileSync(o,o+".bkp");try{___namespace.chmodSync(o+".bkp",384);}catch{}}___namespace.writeFileSync(o,a,{encoding:"utf8",mode:384});try{___namespace.chmodSync(o,384);}catch{}return o}function Uo(e){let t=k__namespace.dirname(e);___namespace.mkdirSync(t,{recursive:true});let r={};try{let n=___namespace.readFileSync(e,"utf8");try{r=JSON.parse(n);}catch{l("mergeClaudeDesktopConfig",`corrupted JSON in ${e} \u2014 starting fresh (original backed up to .bkp)`);}}catch(n){n.code!=="ENOENT"&&l("mergeClaudeDesktopConfig",`read error: ${n.message}`);}if(r.deploymentMode!==N.DEPLOYMENT_MODE){if(___namespace.existsSync(e)){___namespace.copyFileSync(e,e+".bkp");try{___namespace.chmodSync(e+".bkp",384);}catch{}}r.deploymentMode=N.DEPLOYMENT_MODE,___namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
44
+ `,{encoding:"utf8",mode:384});try{___namespace.chmodSync(e,384);}catch{}}}function On(e,t){if(!Dt())return {configured:false};let r=_n(),n=e??X().OTEL_ENDPOINT,s=t!==void 0?t:j()??Lo(Ft()),o=ko(s),i=Io(r.metaPath),a=bo(r.configLibraryDir,i,n,o);return vo(r.metaPath,i),Uo(r.desktopConfigPath),{configured:true,configDir:r.configDir,configLibraryPath:a,uuid:i,wrapperScriptPath:o}}var Po,Sr=T(()=>{"use strict";I();pt();H();x();Po=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;});function yr(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let r=process.env.APPDATA;if(!r)try{let o=child_process.spawnSync("cmd.exe",["/c","echo","%APPDATA%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();o&&/^[A-Za-z]:\\/.test(o)&&(r=o);}catch(s){l("getVsCodeSettingsPath",`cmd.exe APPDATA lookup failed: ${s.message}`);}if(!r)return null;let n=r.replace(/^([A-Za-z]):/,(s,o)=>`/mnt/${o.toLowerCase()}`).replace(/\\/g,"/");return k__namespace.join(n,"Code","User","settings.json")}if(process.platform==="win32"){let r=process.env.APPDATA||k__namespace.join(ke__namespace.homedir(),"AppData","Roaming");return k__namespace.join(r,"Code","User","settings.json")}if(process.platform==="darwin")return k__namespace.join(ke__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let e=process.platform==="linux"&&process.getuid?.()===0?Pe().home:process.env.HOME||ke__namespace.homedir(),t=process.env.XDG_CONFIG_HOME||k__namespace.join(e,".config");return k__namespace.join(t,"Code","User","settings.json")}function An(e){let t=false,r=false,n="";for(let s=0;s<e.length;s++){let o=e[s];if(t){n+=o,r?r=false:o==="\\"?r=true:o==='"'&&(t=false);continue}if(o==='"'){t=true,n+=o;continue}if(o===","){let i=s+1;for(;i<e.length&&/\s/.test(e[i]);)i++;if(i<e.length&&(e[i]==="}"||e[i]==="]"))continue}n+=o;}return n}function xt(e){if(process.env[d.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(e&&___namespace.existsSync(e));if(e&&(___namespace.existsSync(e)||___namespace.existsSync(k__namespace.dirname(e))||___namespace.existsSync(k__namespace.dirname(k__namespace.dirname(e)))))return true;let t=yr();if(t&&(___namespace.existsSync(t)||___namespace.existsSync(k__namespace.dirname(t))||___namespace.existsSync(k__namespace.dirname(k__namespace.dirname(t))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",k__namespace.join(ke__namespace.homedir(),"Applications","Visual Studio Code.app")].some(n=>___namespace.existsSync(n)))return true;if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||k__namespace.join(ke__namespace.homedir(),"AppData","Local"),n=process.env.PROGRAMFILES||"C:\\Program Files",s=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([k__namespace.join(r,"Programs","Microsoft VS Code","Code.exe"),k__namespace.join(n,"Microsoft VS Code","Code.exe"),k__namespace.join(s,"Microsoft VS Code","Code.exe")].some(i=>___namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(n=>___namespace.existsSync(n)))}function Rn(e,t={}){let r;try{r=t.customSettingsPath||yr();}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(!xt(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(___namespace.existsSync(r))try{let w=An(___namespace.readFileSync(r,"utf8"));n=JSON.parse(w);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=e||X().OTEL_ENDPOINT,o=t.apiKey!==void 0?t.apiKey:j(),i=t.userEmail!==void 0?t.userEmail:ve(),a=typeof n[S.HEADERS_KEY]=="object"&&n[S.HEADERS_KEY]!==null&&!Array.isArray(n[S.HEADERS_KEY])?n[S.HEADERS_KEY]:{},c={...a};o&&(c[S.HEADER_API_KEY]=o),i&&(c[S.HEADER_USER]=i);let p=Object.keys(c),g=Object.keys(a),u=p.length===0&&(n[S.HEADERS_KEY]===void 0||g.length===0)||p.length===g.length&&p.every(w=>a[w]===c[w]);if(n[S.ENABLED_KEY]===S.ENABLED_VALUE&&n[S.EXPORTER_TYPE_KEY]===S.EXPORTER_TYPE_VALUE&&n[S.PROTOCOL_KEY]===S.PROTOCOL_VALUE&&n[S.ENDPOINT_KEY]===s&&u)return {status:"already_configured",settingsPath:r};___namespace.mkdirSync(k__namespace.dirname(r),{recursive:!0});let y={...n,[S.ENABLED_KEY]:S.ENABLED_VALUE,[S.EXPORTER_TYPE_KEY]:S.EXPORTER_TYPE_VALUE,[S.PROTOCOL_KEY]:S.PROTOCOL_VALUE,[S.ENDPOINT_KEY]:s};return p.length>0&&(y[S.HEADERS_KEY]=c),___namespace.writeFileSync(r,JSON.stringify(y,null,2)+`
45
+ `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}function Ln(e,t={}){let r;try{r=t.customSettingsPath||yr();}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(!xt(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(___namespace.existsSync(r))try{let a=An(___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[S.HEADERS_KEY]=="object"&&n[S.HEADERS_KEY]!==null&&!Array.isArray(n[S.HEADERS_KEY])?n[S.HEADERS_KEY]:{};if(s[S.HEADER_API_KEY]===e)return {status:"already_configured",settingsPath:r};let o={...s,[S.HEADER_API_KEY]:e};___namespace.mkdirSync(k__namespace.dirname(r),{recursive:!0});let i={...n,[S.ENABLED_KEY]:n[S.ENABLED_KEY]??S.ENABLED_VALUE,[S.EXPORTER_TYPE_KEY]:n[S.EXPORTER_TYPE_KEY]??S.EXPORTER_TYPE_VALUE,[S.PROTOCOL_KEY]:n[S.PROTOCOL_KEY]??S.PROTOCOL_VALUE,[S.ENDPOINT_KEY]:n[S.ENDPOINT_KEY]??X().OTEL_ENDPOINT,[S.HEADERS_KEY]:o};return ___namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
46
+ `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}var wr=T(()=>{"use strict";I();H();pt();x();});var Pn={};ne(Pn,{clearLoggedOutMarker:()=>Ar,isLoggedOut:()=>Fo,markLoggedOut:()=>$o});function Or(){return k__namespace.default.join(ke__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function $o(){try{let e=Or();___namespace.default.mkdirSync(k__namespace.default.dirname(e),{recursive:!0}),___namespace.default.writeFileSync(e,"",{mode:384});}catch{}}function Ar(){try{___namespace.default.unlinkSync(Or());}catch{}}function Fo(){try{return ___namespace.default.existsSync(Or())}catch{return false}}var Rr=T(()=>{"use strict";});function Lr(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Z("FLOW_BASE_URL")}function Do(){return Z(d.ANTHROPIC_AUTH_TOKEN)??void 0}async function Ht(){let e=Lr();if(!e)return {ok:false,baseUrl:"",user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let s=new URL(e);if(s.protocol!=="https:"&&s.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:e,user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"}}let t=Do(),r=ge(t);if(!r)return {ok:false,baseUrl:e,user:"",tenant:"",error:"No credentials found"};let n=process.env.FLOW_BASE_URL;process.env.FLOW_BASE_URL=e;try{let s=await z({clientId:r.clientId,clientSecret:r.clientSecret,tenant:r.tenant});await me({accessToken:s.accessToken,expiresAt:s.expiresAt});let o=r.clientId;try{let i=s.accessToken.split(".");if(i.length>=2){let a=JSON.parse(Buffer.from(i[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));o=a.email??a.preferred_username??a.upn??a.sub??o;}}catch{}return {ok:!0,baseUrl:e,user:o,tenant:r.tenant}}catch(s){return {ok:false,baseUrl:e,user:r.clientId,tenant:r.tenant,error:s.message}}finally{n===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=n;}}var kr=T(()=>{"use strict";ze();H();fe();I();Le();});var St={};ne(St,{promptRaw:()=>Tt,runLogin:()=>Ho});function te(e){return typeof e=="string"?e.replace(xo,""):e}function Tt(e,t={}){return new Promise((r,n)=>{if(typeof process.stdin.setRawMode!="function"){n(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:o=""}=t;process.stdout.write(e+o);let i=o;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=g=>{if(g===""){p(),n(new Error("SIGINT"));return}if(g==="\r"||g===`
47
47
  `){p(),process.stdout.write(`
48
- `),r(i);return}if(g==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}g.startsWith("\x1B")||(i+=g,process.stdout.write(s?"*".repeat(g.length):g));};function p(){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);})}async function xt(e,t=false){let r=Or(),n=process.env.FLOW_BASE_URL;r&&(process.env.FLOW_BASE_URL=r);try{let{accessToken:s,expiresAt:o}=await q(e),i=pn(e);if(t)return {jwt:i,accessToken:s,expiresAt:o};je({[d.ANTHROPIC_AUTH_TOKEN]:i}),yr(),await fe({accessToken:s,expiresAt:o});}finally{n===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=n;}}async function $o(e=false){try{let t=(await _t(D(" ? ")+"Client ID: ")).trim(),r=(await _t(D(" ? ")+"Client Secret: ",{masked:!0})).trim(),n=(await _t(D(" ? ")+"Tenant: ")).trim();if(!t||!r||!n)return process.stderr.write($(` \u2717 All fields are required
48
+ `),r(i);return}if(g==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}g.startsWith("\x1B")||(i+=g,process.stdout.write(s?"*".repeat(g.length):g));};function p(){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);})}async function Bt(e,t=false){let r=Lr(),n=process.env.FLOW_BASE_URL;r&&(process.env.FLOW_BASE_URL=r);try{let{accessToken:s,expiresAt:o}=await z(e),i=mn(e);if(t)return {jwt:i,accessToken:s,expiresAt:o};Ve({[d.ANTHROPIC_AUTH_TOKEN]:i}),Ar(),await me({accessToken:s,expiresAt:o});}finally{n===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=n;}}async function Mo(e=false){try{let t=(await Tt(D(" ? ")+"Client ID: ")).trim(),r=(await Tt(D(" ? ")+"Client Secret: ",{masked:!0})).trim(),n=(await Tt(D(" ? ")+"Tenant: ")).trim();if(!t||!r||!n)return process.stderr.write(U(` \u2717 All fields are required
49
49
  `)),1;if(process.stdout.write(m(` Authenticating...
50
- `)),e){let s=await xt({clientId:t,clientSecret:r,tenant:n},!0);return process.stdout.write(`
51
- ${I("\u2713")} ${b("Authenticated")}
52
- `+m(` Tenant: ${ee(n)}
50
+ `)),e){let s=await Bt({clientId:t,clientSecret:r,tenant:n},!0);return process.stdout.write(`
51
+ ${P("\u2713")} ${b("Authenticated")}
52
+ `+m(` Tenant: ${te(n)}
53
53
  `)+m(` Storage: pending (will be written at end of init)
54
54
 
55
- `)),{code:0,result:s}}return await xt({clientId:t,clientSecret:r,tenant:n}),process.stdout.write(`
56
- ${I("\u2713")} ${b("Authenticated")}
57
- `+m(` Tenant: ${ee(n)}
55
+ `)),{code:0,result:s}}return await Bt({clientId:t,clientSecret:r,tenant:n}),process.stdout.write(`
56
+ ${P("\u2713")} ${b("Authenticated")}
57
+ `+m(` Tenant: ${te(n)}
58
58
  `)+m(` Storage: ANTHROPIC_AUTH_TOKEN (settings.json)
59
59
 
60
60
  `)),0}catch(t){if(t.message==="SIGINT"||t.message==="NOT_A_TTY")throw t;return process.stderr.write(`
61
- ${$("\u2717")} ${b("Authentication failed:")}
62
- ${ee(t.message)}
61
+ ${U("\u2717")} ${b("Authentication failed:")}
62
+ ${te(t.message)}
63
63
 
64
- `),1}}async function Fo(e={}){let t=It();if(t)return t;let{deferPersist:r=false,skipAuthCheck:n=false}=e;if(e.clientId&&e.clientSecret&&e.tenant)try{if(r){let o=await xt({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant},!0);return process.stdout.write(I(` \u2713 Authenticated. Tenant: ${ee(e.tenant)}
64
+ `),1}}async function Ho(e={}){let t=vt();if(t)return t;let{deferPersist:r=false,skipAuthCheck:n=false}=e;if(e.clientId&&e.clientSecret&&e.tenant)try{if(r){let o=await Bt({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant},!0);return process.stdout.write(P(` \u2713 Authenticated. Tenant: ${te(e.tenant)}
65
65
 
66
- `)),{code:0,result:o}}return await xt({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant}),process.stdout.write(I(` \u2713 Authenticated. Tenant: ${ee(e.tenant)}
66
+ `)),{code:0,result:o}}return await Bt({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant}),process.stdout.write(P(` \u2713 Authenticated. Tenant: ${te(e.tenant)}
67
67
 
68
- `)),0}catch(o){return process.stderr.write($(` \u2717 Authentication failed: ${ee(o.message)}
69
- `)),1}let s=await Dt();if(!n){if(process.stdout.write(`
68
+ `)),0}catch(o){return process.stderr.write(U(` \u2717 Authentication failed: ${te(o.message)}
69
+ `)),1}let s=await Ht();if(!n){if(process.stdout.write(`
70
70
  `),process.stdout.write(b(` Auth
71
71
  `)),s.notConfigured)return process.stdout.write(` ${v("\u26A0")} Not configured
72
72
  `),process.stdout.write(m(" Run `flow-ai-obs init` to set up the environment first.\n")),process.stdout.write(`
73
- `),1;if(s.ok){process.stdout.write(` ${I("\u2713")} Authenticated
74
- `),process.stdout.write(m(" URL: ")+ee(s.baseUrl)+`
75
- `),process.stdout.write(m(" Tenant: ")+ee(s.tenant)+`
76
- `),process.stdout.write(m(" User: ")+ee(s.user)+`
73
+ `),1;if(s.ok){process.stdout.write(` ${P("\u2713")} Authenticated
74
+ `),process.stdout.write(m(" URL: ")+te(s.baseUrl)+`
75
+ `),process.stdout.write(m(" Tenant: ")+te(s.tenant)+`
76
+ `),process.stdout.write(m(" User: ")+te(s.user)+`
77
77
  `),process.stdout.write(`
78
- `);let o;try{o=await _t(D(" ? ")+"Re-authenticate? (y/N): ");}catch(i){if(i.message==="SIGINT")return process.stdout.write(`
79
- `),130;if(i.message==="NOT_A_TTY")return process.stdout.write(I(` \u2713 Using existing credentials.
78
+ `);let o;try{o=await Tt(D(" ? ")+"Re-authenticate? (y/N): ");}catch(i){if(i.message==="SIGINT")return process.stdout.write(`
79
+ `),130;if(i.message==="NOT_A_TTY")return process.stdout.write(P(` \u2713 Using existing credentials.
80
80
 
81
- `)),0;throw i}if(o.trim().toLowerCase()!=="y")return process.stdout.write(I(` \u2713 Using existing credentials.
81
+ `)),0;throw i}if(o.trim().toLowerCase()!=="y")return process.stdout.write(P(` \u2713 Using existing credentials.
82
82
 
83
83
  `)),0}else s.error==="No credentials found"?(process.stdout.write(` ${v("\u26A0")} Not authenticated
84
84
  `),process.stdout.write(m(` URL: ${s.baseUrl}
85
85
  `)),process.stdout.write(`
86
86
  `)):(process.stdout.write(` ${v("\u26A0")} Session not valid for current endpoint
87
- `),process.stdout.write(m(" URL: ")+ee(s.baseUrl)+`
88
- `),process.stdout.write(m(" Tenant: ")+ee(s.tenant)+`
87
+ `),process.stdout.write(m(" URL: ")+te(s.baseUrl)+`
88
+ `),process.stdout.write(m(" Tenant: ")+te(s.tenant)+`
89
89
  `),process.stdout.write(m(" User: ")+m("(not authenticated)")+`
90
90
  `),process.stdout.write(`
91
- `));}try{return await $o(r)}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
92
- `),130;if(o.message==="NOT_A_TTY")return process.stderr.write($(` \u2717 No TTY available for interactive login.
91
+ `));}try{return await Mo(r)}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
92
+ `),130;if(o.message==="NOT_A_TTY")return process.stderr.write(U(` \u2717 No TTY available for interactive login.
93
93
  `)+` Pass --client-id, --client-secret and --tenant for non-interactive use.
94
94
 
95
- `),1;throw o}}var No,St=_(()=>{"use strict";qe();wr();Re();K();de();P();le();vt();Ar();No=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var Ln={};re(Ln,{normalizeCustomUrl:()=>Rn,runInit:()=>Mo,validateCustomUrl:()=>kr,validateEmail:()=>Lr});function Mt(e,t,r){process.stdout.write(b(D(`
95
+ `),1;throw o}}var xo,yt=T(()=>{"use strict";ze();Rr();Le();H();fe();I();ue();bt();kr();xo=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var Un={};ne(Un,{normalizeCustomUrl:()=>bn,runInit:()=>Ko,validateCustomUrl:()=>vr,validateEmail:()=>Ir});function Wt(e,t,r){process.stdout.write(b(D(`
96
96
  [${e}/${t}] ${r}
97
- `)));}function ge(e){process.stdout.write(` ${I("\u2713")} ${e}
98
- `);}function be(e){process.stdout.write(` ${v("\u26A0")} ${e}
99
- `);}function ve(e){process.stdout.write(` ${m(e)}
100
- `);}function On(){return !!z(d.ANTHROPIC_AUTH_TOKEN)}function Do(){let e=cr();if(!e)return null;je({FLOW_BASE_URL:e});try{let t=bt(),r={};try{r=JSON.parse(S__namespace.readFileSync(t,"utf8"));}catch{return e}delete r.baseUrl,Object.keys(r).length===0?S__namespace.unlinkSync(t):S__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
101
- `,{encoding:"utf8",mode:384});}catch{}return e}function Rn(e){let t=e.trim().replace(/\\/g,"/");/^https?:\/\//i.test(t)||(t=`https://${t}`);try{let r=new URL(t);return `${r.protocol}//${r.host}`}catch{return t}}function kr(e,t=false){if(t){let o=/^https?:\/\//i.test(e.trim())?e.trim().replace(/\\/g,"/"):`https://${e.trim().replace(/\\/g,"/")}`,i;try{i=new URL(o);}catch{throw new Error(`Invalid URL: ${e}`)}if(i.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${e}`);if(i.pathname!=="/"&&i.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
97
+ `)));}function Ee(e){process.stdout.write(` ${P("\u2713")} ${e}
98
+ `);}function Ue(e){process.stdout.write(` ${v("\u26A0")} ${e}
99
+ `);}function be(e){process.stdout.write(` ${m(e)}
100
+ `);}function In(){return !!Z(d.ANTHROPIC_AUTH_TOKEN)}function Bo(){let e=pr();if(!e)return null;Ve({FLOW_BASE_URL:e});try{let t=Ut(),r={};try{r=JSON.parse(___namespace.readFileSync(t,"utf8"));}catch{return e}delete r.baseUrl,Object.keys(r).length===0?___namespace.unlinkSync(t):___namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
101
+ `,{encoding:"utf8",mode:384});}catch{}return e}function bn(e){let t=e.trim().replace(/\\/g,"/");/^https?:\/\//i.test(t)||(t=`https://${t}`);try{let r=new URL(t);return `${r.protocol}//${r.host}`}catch{return t}}function vr(e,t=false){if(t){let o=/^https?:\/\//i.test(e.trim())?e.trim().replace(/\\/g,"/"):`https://${e.trim().replace(/\\/g,"/")}`,i;try{i=new URL(o);}catch{throw new Error(`Invalid URL: ${e}`)}if(i.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${e}`);if(i.pathname!=="/"&&i.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
102
102
  Received: ${e}
103
103
  Expected: https://tenant.example.com`);if(i.search)throw new Error(`Custom URL must not contain query parameters.
104
104
  Received: ${e}
@@ -106,28 +106,28 @@
106
106
  Received: ${e}
107
107
  Expected: https://tenant.example.com`);if(i.username||i.password)throw new Error(`Custom URL must not contain embedded credentials.
108
108
  Received: ${e}
109
- 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],Pe(a);}finally{c!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=c);}return a}let r=Rn(e),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${e}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${e}`);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],Pe(r);}finally{s!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function Rr(){for(let e=1;e<=3;e++)try{let t=await Zt(" Enter your Flow domain (e.g., tenant.ciandt.com)");return kr(t)}catch(t){if(process.stderr.write(v(` \u2717 ${t.message}
109
+ 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],Ie(a);}finally{c!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=c);}return a}let r=bn(e),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${e}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${e}`);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],Ie(r);}finally{s!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function Pr(){for(let e=1;e<=3;e++)try{let t=await tr(" Enter your Flow domain (e.g., tenant.ciandt.com)");return vr(t)}catch(t){if(process.stderr.write(v(` \u2717 ${t.message}
110
110
 
111
- `)),e===3)throw process.stderr.write($(` Too many invalid attempts.
111
+ `)),e===3)throw process.stderr.write(U(` Too many invalid attempts.
112
112
 
113
- `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function An(e){return e.replace(/[\r\n]/g,"").trim()}function Lr(e){if(e.length>254)return "Email must not exceed 254 characters";if(/\s/.test(e))return "Email must not contain spaces";if((e.match(/@/g)??[]).length!==1)return "Email must contain exactly one @";let t=e.indexOf("@");if(t<=0)return "Email must contain a local part before @";let r=e.slice(t+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 xo(e,t,r){let n=z(d.FLOW_USER_EMAIL),s=Ie(),o=s??"(could not be derived)";if(!e||!ue()){if(r){let c=An(r);if(!c)throw new Error("--custom-email: value is empty after normalization");let p=Lr(c);if(p)throw new Error(`--custom-email: ${p}`);return ge(`Email: ${b(c)}`),c}return n??s?ge(`Email: ${b(n??s)}`):be(`Email not configured \u2014 telemetry will not include user identity.
114
- To set it: flow-ai-obs init --custom-email <you@company.com>`),null}r&&be("--custom-email is ignored in interactive mode. Use --no-interactive to apply it.");async function i(){for(let c=1;c<=3;c++){let p;try{p=await Zt(" Enter your corporate email (e.g., user@company.com)");}catch(E){throw process.stderr.write($(` \u2717 Input error: ${E.message}
113
+ `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function vn(e){return e.replace(/[\r\n]/g,"").trim()}function Ir(e){if(e.length>254)return "Email must not exceed 254 characters";if(/\s/.test(e))return "Email must not contain spaces";if((e.match(/@/g)??[]).length!==1)return "Email must contain exactly one @";let t=e.indexOf("@");if(t<=0)return "Email must contain a local part before @";let r=e.slice(t+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 Wo(e,t,r){let n=Z(d.FLOW_USER_EMAIL),s=ve(),o=s??"(could not be derived)";if(!e||!pe()){if(r){let c=vn(r);if(!c)throw new Error("--custom-email: value is empty after normalization");let p=Ir(c);if(p)throw new Error(`--custom-email: ${p}`);return Ee(`Email: ${b(c)}`),c}return n??s?Ee(`Email: ${b(n??s)}`):Ue(`Email not configured \u2014 telemetry will not include user identity.
114
+ To set it: flow-ai-obs init --custom-email <you@company.com>`),null}r&&Ue("--custom-email is ignored in interactive mode. Use --no-interactive to apply it.");async function i(){for(let c=1;c<=3;c++){let p;try{p=await tr(" Enter your corporate email (e.g., user@company.com)");}catch(E){throw process.stderr.write(U(` \u2717 Input error: ${E.message}
115
115
 
116
- `)),E}let g=An(p),u=Lr(g);if(!u)return g;process.stderr.write(v(` \u2717 ${u}
116
+ `)),E}let g=vn(p),u=Ir(g);if(!u)return g;process.stderr.write(v(` \u2717 ${u}
117
117
 
118
- `));}throw process.stderr.write($(` Too many invalid attempts.
118
+ `));}throw process.stderr.write(U(` Too many invalid attempts.
119
119
 
120
- `)),new Error("Too many invalid email attempts")}async function a(){let c=await i();return process.stdout.write(I(` \u2713 Email: ${c}
120
+ `)),new Error("Too many invalid email attempts")}async function a(){let c=await i();return process.stdout.write(P(` \u2713 Email: ${c}
121
121
 
122
- `)),c}return n?await ot(` Registered email: ${b(n)} \u2014 still correct?`,true)?(process.stdout.write(I(` \u2713 Email: ${b(n)}
122
+ `)),c}return n?await it(` Registered email: ${b(n)} \u2014 still correct?`,true)?(process.stdout.write(P(` \u2713 Email: ${b(n)}
123
123
 
124
- `)),null):a():s?t?await ot(" Is your corporate email domain @ciandt.com?",true)?(process.stdout.write(I(` \u2713 Email: ${b(o)}
124
+ `)),null):a():s?t?await it(" Is your corporate email domain @ciandt.com?",true)?(process.stdout.write(P(` \u2713 Email: ${b(o)}
125
125
 
126
- `)),s):a():(process.stdout.write(I(` \u2713 Email: ${b(o)}
126
+ `)),s):a():(process.stdout.write(P(` \u2713 Email: ${b(o)}
127
127
 
128
128
  `)),s):(process.stdout.write(v(`
129
129
  \u26A0 Could not derive email from OS username.
130
- `)),a())}function yt(){let e=z(d.FLOW_BASE_URL);return e&&e.trim()?e.trim():null}async function Mo(e={}){let t=It();if(t)return t;let r=e.url,n=!!se();!n&&process.env[d.FLOW_API_KEY]&&be(`FLOW_API_KEY appears to be misconfigured \u2014 authentication with Flow is required.
130
+ `)),a())}function wt(){let e=Z(d.FLOW_BASE_URL);return e&&e.trim()?e.trim():null}async function Ko(e={}){let t=vt();if(t)return t;let r=e.url,n=!!j();!n&&process.env[d.FLOW_API_KEY]&&Ue(`FLOW_API_KEY appears to be misconfigured \u2014 authentication with Flow is required.
131
131
  To fix: unset FLOW_API_KEY && flow-ai-obs init`);let s=n?3:4;process.stdout.write(b(D(`
132
132
  flow-ai-obs init
133
133
  `))),process.stdout.write(m(` Configuring your development environment:
@@ -137,42 +137,42 @@
137
137
  `)),n?process.stdout.write(m(` [3/${s}] Observability OpenTelemetry metrics, logs and trace hooks
138
138
  `)):(process.stdout.write(m(` [3/${s}] Authentication Authenticate with Flow
139
139
  `)),process.stdout.write(m(` [4/${s}] Observability OpenTelemetry metrics, logs and trace hooks
140
- `))),Mt(1,s,"Flow Environment Setup");let o=false;{let f=z(d.FLOW_BASE_URL);if(f&&(be(`Base URL already configured (FLOW_BASE_URL=${f})`),!e.noInteractive&&ue()))try{let{promptRaw:U}=await Promise.resolve().then(()=>(St(),Tt));o=(await U(D(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",o||ve("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(v(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
140
+ `))),Wt(1,s,"Flow Environment Setup");let o=false;{let f=Z(d.FLOW_BASE_URL);if(f&&(Ue(`Base URL already configured (FLOW_BASE_URL=${f})`),!e.noInteractive&&pe()))try{let{promptRaw:C}=await Promise.resolve().then(()=>(yt(),St));o=(await C(D(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",o||be("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(v(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
141
141
  `)+v(" on Windows too: ")+D(`npm install -g @ciandt-flow/flow-ai-obs
142
142
  `)+v(` Without the Windows install, observability will not work for the Windows-side code assistant.
143
143
 
144
- `)),Do(),!r&&!e.noInteractive&&ue()){let f=yt();o?r=await Rr():f?(process.stdout.write(`
144
+ `)),Bo(),!r&&!e.noInteractive&&pe()){let f=wt();o?r=await Pr():f?(process.stdout.write(`
145
145
  Current base URL: ${b(f)}
146
- `),await ot(" Keep this URL?",true)||(r=await Rr())):(process.stdout.write(`
147
- `),await ot(" Does your organization use a custom Flow URL?",false)?r=await Rr():ge("Using default Flow Base URL: https://flow.ciandt.com")),process.stdout.write(`
148
- `);}if(!r&&!e.noInteractive&&!ue()){let f=yt();if(f)process.stdout.write(v(` \u26A0 Non-interactive environment detected.
146
+ `),await it(" Keep this URL?",true)||(r=await Pr())):(process.stdout.write(`
147
+ `),await it(" Does your organization use a custom Flow URL?",false)?r=await Pr():Ee("Using default Flow Base URL: https://flow.ciandt.com")),process.stdout.write(`
148
+ `);}if(!r&&!e.noInteractive&&!pe()){let f=wt();if(f)process.stdout.write(v(` \u26A0 Non-interactive environment detected.
149
149
  `)+m(` Using URL: ${f}
150
150
 
151
151
  `));else return process.stderr.write(` \u2717 No URL configured and no TTY available.
152
152
  Run: flow-ai-obs init --custom-url <URL>
153
153
 
154
- `),1}let i,a=false;if(r){let f;try{f=kr(r,!0);}catch(te){return process.stderr.write(`
155
- \u2717 Invalid --custom-url: ${te.message}
154
+ `),1}let i,a=false;if(r){let f;try{f=vr(r,!0);}catch(re){return process.stderr.write(`
155
+ \u2717 Invalid --custom-url: ${re.message}
156
156
 
157
- `),1}let U=yt();i=f,a=!!U&&U!==f,a?process.stdout.write(v(` \u26A0 Base URL changed \u2014 re-authentication required.
158
- `)+m(` Previous: ${U}
157
+ `),1}let C=wt();i=f,a=!!C&&C!==f,a?process.stdout.write(v(` \u26A0 Base URL changed \u2014 re-authentication required.
158
+ `)+m(` Previous: ${C}
159
159
  `)+m(` New: ${f}
160
160
 
161
- `)):process.stdout.write(I(` \u2713 Base URL configured: ${f}
161
+ `)):process.stdout.write(P(` \u2713 Base URL configured: ${f}
162
162
 
163
- `));}else i=yt()??"https://flow.ciandt.com";let c={FLOW_BASE_URL:i,OTEL_EXPORTER_OTLP_ENDPOINT:`${i}/otel`};process.env.FLOW_BASE_URL=i,process.stdout.write(I(`
163
+ `));}else i=wt()??"https://flow.ciandt.com";let c={FLOW_BASE_URL:i,OTEL_EXPORTER_OTLP_ENDPOINT:`${i}/otel`};process.env.FLOW_BASE_URL=i,process.stdout.write(P(`
164
164
  \u2713 Flow environment ready.
165
- `));let p=36;for(let[f,U]of Object.entries(c))process.stdout.write(m(` ${f.padEnd(p)}`)+U+`
166
- `);Mt(2,s,"User Identity");let g=await xo(!e.noInteractive,!!(r??cr()),e.email),u=null;if(n)l("init","FLOW_API_KEY detected \u2014 skipping OAuth authentication step");else {Mt(3,s,"Authentication");let f=yt(),U=!!f&&f!==i;if(!On()||a||U)if(e.noInteractive||!ue()){let{clientId:B,clientSecret:V,tenant:W}=e,ce=B&&V&&W;if(!ce&&(B||V||W)){let De=[!B&&"--client-id",!V&&"--client-secret",!W&&"--tenant"].filter(Boolean).join(", ");return process.stderr.write(`
167
- ${$("\u2717")} Non-interactive mode requires all credential flags.
168
- Missing: ${De}
165
+ `));let p=36;for(let[f,C]of Object.entries(c))process.stdout.write(m(` ${f.padEnd(p)}`)+C+`
166
+ `);Wt(2,s,"User Identity");let g=await Wo(!e.noInteractive,!!(r??pr()),e.email),u=null;if(n)l("init","FLOW_API_KEY detected \u2014 skipping OAuth authentication step");else {Wt(3,s,"Authentication");let f=wt(),C=!!f&&f!==i;if(!In()||a||C)if(e.noInteractive||!pe()){let{clientId:W,clientSecret:G,tenant:K}=e,le=W&&G&&K;if(!le&&(W||G||K)){let xe=[!W&&"--client-id",!G&&"--client-secret",!K&&"--tenant"].filter(Boolean).join(", ");return process.stderr.write(`
167
+ ${U("\u2717")} Non-interactive mode requires all credential flags.
168
+ Missing: ${xe}
169
169
 
170
- `),1}if(ce){let{runLogin:De}=await Promise.resolve().then(()=>(St(),Tt)),xe;try{xe=await De({deferPersist:!0,clientId:B,clientSecret:V,tenant:W});}catch(Jt){return process.stderr.write(`
171
- ${$("\u2717")} Authentication failed unexpectedly.
172
- ${Jt.message}
170
+ `),1}if(le){let{runLogin:xe}=await Promise.resolve().then(()=>(yt(),St)),Me;try{Me=await xe({deferPersist:!0,clientId:W,clientSecret:G,tenant:K});}catch(zt){return process.stderr.write(`
171
+ ${U("\u2717")} Authentication failed unexpectedly.
172
+ ${zt.message}
173
173
 
174
- `),1}if(typeof xe=="number")return xe;u=xe.result;}else return process.stderr.write(`
175
- ${$("\u2717")} Authentication required.
174
+ `),1}if(typeof Me=="number")return Me;u=Me.result;}else return process.stderr.write(`
175
+ ${U("\u2717")} Authentication required.
176
176
  Run: flow-ai-obs login
177
177
 
178
178
  `),1}else {(e.clientId||e.clientSecret||e.tenant)&&process.stderr.write(`
@@ -182,87 +182,94 @@
182
182
  `),process.stdout.write(`
183
183
  ${v("\u26A0")} Authentication required for the new endpoint.
184
184
 
185
- `);let{runLogin:B}=await Promise.resolve().then(()=>(St(),Tt)),V=await B({deferPersist:true,skipAuthCheck:a});if(typeof V=="number")return V;u=V.result;}else ge("Already authenticated \u2014 skipping."),ve("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");}let E=On()?z(d.ANTHROPIC_AUTH_TOKEN):null,y={...c,...g?{[d.FLOW_USER_EMAIL]:g}:{},...u?{[d.ANTHROPIC_AUTH_TOKEN]:u.jwt}:{},...E&&!u?{[d.ANTHROPIC_AUTH_TOKEN]:E}:{}},w,O;Mt(n?3:4,s,"Observability (OpenTelemetry)"),process.stdout.write(`
185
+ `);let{runLogin:W}=await Promise.resolve().then(()=>(yt(),St)),G=await W({deferPersist:true,skipAuthCheck:a});if(typeof G=="number")return G;u=G.result;}else Ee("Already authenticated \u2014 skipping."),be("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");}let E=In()?Z(d.ANTHROPIC_AUTH_TOKEN):null,y={...c,...g?{[d.FLOW_USER_EMAIL]:g}:{},...u?{[d.ANTHROPIC_AUTH_TOKEN]:u.jwt}:{},...E&&!u?{[d.ANTHROPIC_AUTH_TOKEN]:E}:{}},w,O;Wt(n?3:4,s,"Observability (OpenTelemetry)"),process.stdout.write(`
186
186
  ${b("Metrics and Logs")}
187
- `);let Fe={...pe,OTEL_EXPORTER_OTLP_ENDPOINT:c.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[f,U]of Object.entries(Fe))process.stdout.write(m(` ${f.padEnd(36)}`)+U+`
187
+ `);let De={...de,OTEL_EXPORTER_OTLP_ENDPOINT:c.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[f,C]of Object.entries(De))process.stdout.write(m(` ${f.padEnd(36)}`)+C+`
188
188
  `);process.stdout.write(`
189
189
  `),process.stdout.write(` ${b("Trace (Hook)")}
190
- `);let Te=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"];for(let f of Te){let U=Oe[f];process.stdout.write(m(` ${f.padEnd(18)}`)+`\u2192 flow-ai-obs ${f} (timeout: ${U}s)
190
+ `);let Se=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"];for(let f of Se){let C=Ae[f];process.stdout.write(m(` ${f.padEnd(18)}`)+`\u2192 flow-ai-obs ${f} (timeout: ${C}s)
191
191
  `);}process.stdout.write(`
192
- `);try{({settingsPath:w,preserved:O}=tn(c.OTEL_EXPORTER_OTLP_ENDPOINT,y));}catch(f){return process.stderr.write(` \u2717 Failed to write settings: ${f.message}
193
- `),1}if(u){let{saveTokenCache:f}=await Promise.resolve().then(()=>(qe(),cn));try{await f({accessToken:u.accessToken,expiresAt:u.expiresAt});}catch(te){process.stderr.write(` ${v("\u26A0")} Token cache could not be saved: ${te.message}
192
+ `);try{({settingsPath:w,preserved:O}=sn(c.OTEL_EXPORTER_OTLP_ENDPOINT,y));}catch(f){return process.stderr.write(` \u2717 Failed to write settings: ${f.message}
193
+ `),1}if(u){let{saveTokenCache:f}=await Promise.resolve().then(()=>(ze(),pn));try{await f({accessToken:u.accessToken,expiresAt:u.expiresAt});}catch(re){process.stderr.write(` ${v("\u26A0")} Token cache could not be saved: ${re.message}
194
194
  Hooks will authenticate on first use.
195
- `);}let{clearLoggedOutMarker:U}=await Promise.resolve().then(()=>(wr(),wn));U();}if(ge(`Settings written: ${w}`),O.length>0&&(process.stdout.write(`
195
+ `);}let{clearLoggedOutMarker:C}=await Promise.resolve().then(()=>(Rr(),Pn));C();}if(Ee(`Settings written: ${w}`),O.length>0&&(process.stdout.write(`
196
196
  `),process.stdout.write(v(` \u26A0 Third-party hooks preserved on: ${O.join(", ")}
197
197
  `)),process.stdout.write(m(` flow-ai-obs was prepended \u2014 it executes first.
198
198
  `))),process.stdout.write(`
199
- `),hr()){process.stdout.write(` ${b("Claude Desktop")}
200
- `);try{let f=En(c.OTEL_EXPORTER_OTLP_ENDPOINT);f.configured&&(ge(`Desktop config written: ${f.configLibraryPath}`),ve(`Wrapper script: ${f.wrapperScriptPath}`),ve(`Config UUID: ${f.uuid}`),process.stdout.write(m(` Relaunch Claude Desktop to activate OTLP telemetry.
201
- `)));}catch(f){be(`Claude Desktop config failed: ${f.message}`),ve("CLI observability is configured \u2014 Desktop config can be retried.");}process.stdout.write(`
202
- `);}if($t()){process.stdout.write(` ${b("GitHub Copilot (VS Code)")}
203
- `);try{let f=Tn(c.OTEL_EXPORTER_OTLP_ENDPOINT,{apiKey:se(),userEmail:g??Ie()});f.status==="configured"?ge(`Copilot OTEL configured: ${f.settingsPath}`):f.status==="already_configured"?ge("Copilot OTEL: Already configured \u2014 skipping."):(be(`Copilot OTEL skipped: ${f.reason??"unknown"}`),f.reason?.includes("could not be parsed")&&ve("Remove comments from VS Code settings.json and re-run init, or add the keys manually."));}catch(f){be(`GitHub Copilot OTEL config failed: ${f.message}`),ve("CLI observability is configured \u2014 Copilot config can be retried.");}process.stdout.write(`
199
+ `),Dt()){process.stdout.write(` ${b("Claude Desktop")}
200
+ `);try{let f=On(c.OTEL_EXPORTER_OTLP_ENDPOINT,j()??void 0);f.configured&&(Ee(`Desktop config written: ${f.configLibraryPath}`),be(`Wrapper script: ${f.wrapperScriptPath}`),be(`Config UUID: ${f.uuid}`),process.stdout.write(m(` Relaunch Claude Desktop to activate OTLP telemetry.
201
+ `)));}catch(f){Ue(`Claude Desktop config failed: ${f.message}`),be("CLI observability is configured \u2014 Desktop config can be retried.");}process.stdout.write(`
202
+ `);}if(xt()){process.stdout.write(` ${b("GitHub Copilot (VS Code)")}
203
+ `);try{let f=Rn(c.OTEL_EXPORTER_OTLP_ENDPOINT,{apiKey:j(),userEmail:g??ve()});f.status==="configured"?Ee(`Copilot OTEL configured: ${f.settingsPath}`):f.status==="already_configured"?Ee("Copilot OTEL: Already configured \u2014 skipping."):(Ue(`Copilot OTEL skipped: ${f.reason??"unknown"}`),f.reason?.includes("could not be parsed")&&be("Remove comments from VS Code settings.json and re-run init, or add the keys manually."));}catch(f){Ue(`GitHub Copilot OTEL config failed: ${f.message}`),be("CLI observability is configured \u2014 Copilot config can be retried.");}process.stdout.write(`
204
204
  `);}return e.skipHint||(process.stdout.write(`
205
- `),process.stdout.write(I(` \u2713 Setup complete.
205
+ `),process.stdout.write(P(` \u2713 Setup complete.
206
206
 
207
207
  `)),process.stdout.write(m(` Verify your configuration:
208
208
  `)+D(` flow-ai-obs status
209
209
 
210
210
  `)+m(` Start your code assistant and begin working.
211
211
 
212
- `))),0}var kn=_(()=>{"use strict";de();P();le();vt();lr();K();Qt();x();hn();Tr();});var Un={};re(Un,{runStatus:()=>Bo});function Pn(e){return !e||e.length<=8?"****":e.slice(0,4)+"****...****"+e.slice(-4)}function Ho(e){process.stdout.write(` ${I("\u2713")} ${e}
213
- `);}function Pr(e){process.stdout.write(` ${v("\u26A0")} ${e}
214
- `);}function wt(e){process.stdout.write(` ${I("\u2713")} ${e}
215
- `);}function Ht(e){process.stdout.write(` ${v("\u26A0")} ${e}
216
- `);}function Bt(e){process.stdout.write(` ${$("\u2717")} ${e}
217
- `);}function Qe(e){process.stdout.write(` ${m(e)}
218
- `);}function In(e){process.stdout.write(b(D(`
212
+ `))),0}var Cn=T(()=>{"use strict";fe();I();ue();bt();dr();H();rr();x();Sr();wr();});var xn={};ne(xn,{runStatus:()=>jo});function Nn(e){return !e||e.length<=8?"****":e.slice(0,4)+"****...****"+e.slice(-4)}function Yo(e){process.stdout.write(` ${P("\u2713")} ${e}
213
+ `);}function br(e){process.stdout.write(` ${v("\u26A0")} ${e}
214
+ `);}function Ot(e){process.stdout.write(` ${P("\u2713")} ${e}
215
+ `);}function Kt(e){process.stdout.write(` ${v("\u26A0")} ${e}
216
+ `);}function Yt(e){process.stdout.write(` ${U("\u2717")} ${e}
217
+ `);}function et(e){process.stdout.write(` ${m(e)}
218
+ `);}function $n(e){process.stdout.write(b(D(`
219
219
  ${e}
220
- `)));}function vn(e,t=false){let r=t?`${v("\u26A0")} ${b(v(e))}`:b(e);process.stdout.write(`
220
+ `)));}function Fn(e,t=false){let r=t?`${v("\u26A0")} ${b(v(e))}`:b(e);process.stdout.write(`
221
221
  ${r}
222
- `);}function Ir(){process.stdout.write(`
223
- `);}async function Bo(){In("Auth");let e=await Dt();e.notConfigured?(Pr("Not configured."),process.stdout.write(`
222
+ `);}function Ur(){process.stdout.write(`
223
+ `);}async function jo(){$n("Auth");let e=await Ht();e.notConfigured?(br("Not configured."),process.stdout.write(`
224
224
  `),process.stdout.write(` ${m("Run `flow-ai-obs init` to set up.")}
225
- `)):!e.ok&&e.error==="No credentials found"?Pr("Not authenticated. Run `flow-ai-obs login` to set up."):e.ok?(Ho("Authenticated"),process.stdout.write(` ${m("URL: ")}${e.baseUrl}
225
+ `)):!e.ok&&e.error==="No credentials found"?br("Not authenticated. Run `flow-ai-obs login` to set up."):e.ok?(Yo("Authenticated"),process.stdout.write(` ${m("URL: ")}${e.baseUrl}
226
226
  `),process.stdout.write(` ${m("Tenant: ")}${e.tenant}
227
227
  `),process.stdout.write(` ${m("User: ")}${e.user}
228
228
  `),process.stdout.write(` ${m("Storage: ANTHROPIC_AUTH_TOKEN (settings.json)")}
229
- `)):Pr(`Session rejected by ${e.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`);let t={},r={};try{let u=S__namespace.readFileSync(ne(),"utf8");r=JSON.parse(u),t=r.env||{};}catch{}In("Observability configuration (OpenTelemetry)");let n=Object.keys(pe).filter(u=>!t[u]);vn("Metrics and Logs",n.length>0),n.length===0?(wt("All OTEL env vars present in settings.json"),Qe(`Endpoint: ${t.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
229
+ `)):br(`Session rejected by ${e.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`);let t={},r={};try{let u=___namespace.readFileSync(se(),"utf8");r=JSON.parse(u),t=r.env||{};}catch{}$n("Observability configuration (OpenTelemetry)");let n=Object.keys(de).filter(u=>!t[u]);Fn("Metrics and Logs",n.length>0),n.length===0?(Ot("All OTEL env vars present in settings.json"),et(`Endpoint: ${t.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
230
230
  `),process.stdout.write(` ${m("Run: flow-ai-obs init (restores missing vars automatically)")}
231
231
  `),process.stdout.write(`
232
- `),Ht(`${n.length} OTEL var(s) missing from settings.json`),n.forEach(u=>Bt(`Missing: ${u}`))),Ir();for(let u of Object.keys(pe)){let E=t[u]??$("(missing)");process.stdout.write(m(` ${u.padEnd(36)}`)+E+`
233
- `);}let s=r.hooks??{},o=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],i=o.every(u=>{let E=s[u];return Array.isArray(E)?E.some(y=>{let w=y;return Array.isArray(w?.hooks)&&w.hooks.some(O=>O?.command?.startsWith(lt.CLI))}):false});vn("Tracing",!i),i?wt("Hooks registered (trace capture)"):(process.stdout.write(`
232
+ `),Kt(`${n.length} OTEL var(s) missing from settings.json`),n.forEach(u=>Yt(`Missing: ${u}`))),Ur();for(let u of Object.keys(de)){let E=t[u]??U("(missing)");process.stdout.write(m(` ${u.padEnd(36)}`)+E+`
233
+ `);}let s=r.hooks??{},o=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],i=o.every(u=>{let E=s[u];return Array.isArray(E)?E.some(y=>{let w=y;return Array.isArray(w?.hooks)&&w.hooks.some(O=>O?.command?.startsWith(ut.CLI))}):false});Fn("Tracing",!i),i?Ot("Hooks registered (trace capture)"):(process.stdout.write(`
234
234
  `),process.stdout.write(` ${m("Run `flow-ai-obs init` to configure.")}
235
235
  `),process.stdout.write(`
236
- `),Ht("Hooks NOT registered."));for(let u of o){let E=Oe[u];process.stdout.write(m(` ${u.padEnd(18)}`)+`\u2192 flow-ai-obs ${u} (timeout: ${E}s)
237
- `);}Ir();let a=process.env[d.FLOW_TELEMETRY]==="true",c=process.env[d.LANGFUSE_BASE_URL],p=process.env[d.LANGFUSE_PUBLIC_KEY],g=process.env[d.LANGFUSE_SECRET_KEY];if(a)if(c&&p&&g){let u=await ie();for(let E of u)E.mode==="direct"&&(wt("FLOW_TELEMETRY=true (direct mode enabled)"),wt("Mode: direct"),Qe(`Endpoint: ${E.endpoint}`),Qe(`PK: ${Pn(p)}`),Qe(`SK: ${Pn(g)}`));}else Ht("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),c||Bt("LANGFUSE_BASE_URL not set"),p||Bt("LANGFUSE_PUBLIC_KEY not set"),g||Bt("LANGFUSE_SECRET_KEY not set");else {let u=await ie();if(u.length>0)for(let E of u)E.mode==="gateway"&&(wt("Mode: gateway"),Qe(`Endpoint: ${E.endpoint}`));else u.authError?Ht("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):Qe("No active tracing destination configured.");}return Ir(),0}var Cn=_(()=>{"use strict";K();de();P();le();Ar();});var Nn={};re(Nn,{runUpdateApiKey:()=>Wo});async function Wo(e={}){let t=e.key||se();if(!t)return process.stderr.write($(` \u2717 FLOW_API_KEY environment variable is not set or is invalid.
236
+ `),Kt("Hooks NOT registered."));for(let u of o){let E=Ae[u];process.stdout.write(m(` ${u.padEnd(18)}`)+`\u2192 flow-ai-obs ${u} (timeout: ${E}s)
237
+ `);}Ur();let a=process.env[d.FLOW_TELEMETRY]==="true",c=process.env[d.LANGFUSE_BASE_URL],p=process.env[d.LANGFUSE_PUBLIC_KEY],g=process.env[d.LANGFUSE_SECRET_KEY];if(a)if(c&&p&&g){let u=await ae();for(let E of u)E.mode==="direct"&&(Ot("FLOW_TELEMETRY=true (direct mode enabled)"),Ot("Mode: direct"),et(`Endpoint: ${E.endpoint}`),et(`PK: ${Nn(p)}`),et(`SK: ${Nn(g)}`));}else Kt("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),c||Yt("LANGFUSE_BASE_URL not set"),p||Yt("LANGFUSE_PUBLIC_KEY not set"),g||Yt("LANGFUSE_SECRET_KEY not set");else {let u=await ae();if(u.length>0)for(let E of u)E.mode==="gateway"&&(Ot("Mode: gateway"),et(`Endpoint: ${E.endpoint}`));else u.authError?Kt("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):et("No active tracing destination configured.");}return Ur(),0}var Mn=T(()=>{"use strict";H();fe();I();ue();kr();});var Hn={};ne(Hn,{runUpdateApiKey:()=>Vo});async function Vo(e={}){let t=e.key!==void 0?oe(e.key):j();if(!t)return e.key!==void 0?process.stderr.write(U(` \u2717 Provided API key is invalid.
238
+ `)+m(` Ensure the key contains valid characters and does not exceed 1024 characters.
239
+
240
+ `)):process.stderr.write(U(` \u2717 FLOW_API_KEY environment variable is not set or is invalid.
238
241
  `)+m(` Set FLOW_API_KEY=<key> in your environment and re-run.
239
242
 
240
- `)),1;let r=Sn(t);return r.status==="configured"?(process.stdout.write(I(` \u2713 GitHub Copilot API key updated successfully in ${r.settingsPath}
241
- `)),0):r.status==="already_configured"?(process.stdout.write(I(` \u2713 GitHub Copilot API key is already up to date in ${r.settingsPath}
242
- `)),0):r.reason?.includes("not installed")?(process.stdout.write(m(` \u2139 VS Code is not installed \u2014 skipping Copilot API key update.
243
- `)),0):(process.stderr.write($(` \u2717 GitHub Copilot API key update failed: ${r.reason}
244
- `)),1)}var $n=_(()=>{"use strict";K();Tr();le();});var Fn={};re(Fn,{runOtelHeaders:()=>Yo});async function Yo(){let e=se(),t=Ie(),r=me(ft(d.ANTHROPIC_AUTH_TOKEN));if(e&&!t&&!r)return process.stderr.write(`[flow-ai-obs otel-headers] FLOW_API_KEY is set but x-flow-user could not be resolved.
243
+ `)),1;let r=false,n=Ln(t);n.status==="configured"?process.stdout.write(P(` \u2713 GitHub Copilot API key updated successfully in ${n.settingsPath}
244
+ `)):n.status==="already_configured"?process.stdout.write(P(` \u2713 GitHub Copilot API key is already up to date in ${n.settingsPath}
245
+ `)):n.reason?.includes("not installed")?process.stdout.write(m(` \u2139 VS Code is not installed \u2014 skipping Copilot API key update.
246
+ `)):(process.stderr.write(U(` \u2717 GitHub Copilot API key update failed: ${n.reason}
247
+ `)),r=true);let s=wn(t);return s.status==="configured"?process.stdout.write(P(` \u2713 Claude Desktop API key updated successfully in ${s.wrapperScriptPath}
248
+ `)):s.status==="already_configured"?process.stdout.write(P(` \u2713 Claude Desktop API key is already up to date in ${s.wrapperScriptPath}
249
+ `)):s.reason?.includes("not installed")?process.stdout.write(m(` \u2139 Claude Desktop is not installed \u2014 skipping Desktop API key update.
250
+ `)):(process.stderr.write(U(` \u2717 Claude Desktop API key update failed: ${s.reason}
251
+ `)),r=true),r?1:0}var Bn=T(()=>{"use strict";H();wr();Sr();ue();});var Wn={};ne(Wn,{runOtelHeaders:()=>Go});async function Go(){let e=j(),t=ve(),r=ge(mt(d.ANTHROPIC_AUTH_TOKEN));if(e&&!t&&!r)return process.stderr.write(`[flow-ai-obs otel-headers] FLOW_API_KEY is set but x-flow-user could not be resolved.
245
252
  Run: flow-ai-obs init --custom-email <EMAIL>
246
253
  `),1;if(!e&&process.env[d.FLOW_API_KEY]&&process.stderr.write(`[flow-ai-obs otel-headers] FLOW_API_KEY is set but its value was rejected (invalid characters or length). Falling back to OAuth.
247
254
  `),e&&t){let i=c=>c.replace(/[\r\n]/g,""),a={"x-flow-api-key":i(e),"x-flow-user":i(t)};return process.stdout.write(JSON.stringify(a)+`
248
255
  `),0}if(!r)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs login
249
- `),1;let n=ft(d.FLOW_BASE_URL),s=process.env[d.FLOW_BASE_URL];n&&(process.env[d.FLOW_BASE_URL]=n);let o;try{o=(await q(r)).accessToken;}catch(i){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${i.message}
256
+ `),1;let n=mt(d.FLOW_BASE_URL),s=process.env[d.FLOW_BASE_URL];n&&(process.env[d.FLOW_BASE_URL]=n);let o;try{o=(await z(r)).accessToken;}catch(i){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${i.message}
250
257
  `),1}finally{s===void 0?delete process.env[d.FLOW_BASE_URL]:process.env[d.FLOW_BASE_URL]=s;}return o?(process.stdout.write(JSON.stringify({Authorization:`Bearer ${o.replace(/[\r\n]/g,"")}`})+`
251
258
  `),0):(process.stderr.write(`[flow-ai-obs otel-headers] Empty token received
252
- `),1)}var Dn=_(()=>{"use strict";Re();K();de();P();});function oe(e,t){let r=typeof e=="object"?JSON.stringify(e):String(e??"");return r.length>t?r.slice(0,t)+" \u2026[truncated]":r}function Wt(e,t=100){return String(e??"").split(`
253
- `)[0].slice(0,t).trim()}function Ot(){return new Promise(e=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{t+=r;}),process.stdin.on("end",()=>{try{e(JSON.parse(t));}catch{e({});}});})}function H(e){process.stdout.write(JSON.stringify(e));}var et=_(()=>{"use strict";});function Ee(){return String(BigInt(Date.now())*1000000n)}var vr,Ue,At=_(()=>{"use strict";vr=()=>fn.randomBytes(16).toString("hex"),Ue=()=>fn.randomBytes(8).toString("hex");});function ei(e,t){let r=k.resolve(e);if(!r.startsWith(t))throw new Error(`Path traversal detected: ${e}`);return r}function br(e){if(!Zo.test(e))throw new Error(`Invalid session ID: ${e}`);return ei(k.join(Le.tmpdir(),`flow-obs-${e}.json`),Qo)}function tt(e){let t;try{t=br(e);}catch{return null}if(!S.existsSync(t))return null;try{return JSON.parse(S.readFileSync(t,"utf8"))}catch{return null}}function rt(e,t){S.writeFileSync(br(e),JSON.stringify(t),{encoding:"utf8",mode:384});}function Ur(e){try{S.unlinkSync(br(e));}catch{}}var Zo,Qo,Rt=_(()=>{"use strict";Zo=/^[0-9a-f-]{1,64}$/i,Qo=k.normalize(Le.tmpdir())+k.sep;});function Wn(e){if(!e||!S.existsSync(e))return null;try{let t=S.readFileSync(e,"utf8").trimEnd().split(`
254
- `);for(let r=t.length-1;r>=0;r--)try{let n=JSON.parse(t[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function Cr(e){if(!e||!S.existsSync(e))return null;try{let t=S.readFileSync(e,"utf8").trimEnd().split(`
259
+ `),1)}var Kn=T(()=>{"use strict";Le();H();fe();I();});function ie(e,t){let r=typeof e=="object"?JSON.stringify(e):String(e??"");return r.length>t?r.slice(0,t)+" \u2026[truncated]":r}function jt(e,t=100){return String(e??"").split(`
260
+ `)[0].slice(0,t).trim()}function At(){return new Promise(e=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{t+=r;}),process.stdin.on("end",()=>{try{e(JSON.parse(t));}catch{e({});}});})}function B(e){process.stdout.write(JSON.stringify(e));}var tt=T(()=>{"use strict";});function he(){return String(BigInt(Date.now())*1000000n)}var Cr,Ce,Rt=T(()=>{"use strict";Cr=()=>En.randomBytes(16).toString("hex"),Ce=()=>En.randomBytes(8).toString("hex");});function si(e,t){let r=k.resolve(e);if(!r.startsWith(t))throw new Error(`Path traversal detected: ${e}`);return r}function Nr(e){if(!ri.test(e))throw new Error(`Invalid session ID: ${e}`);return si(k.join(ke.tmpdir(),`flow-obs-${e}.json`),ni)}function rt(e){let t;try{t=Nr(e);}catch{return null}if(!_.existsSync(t))return null;try{return JSON.parse(_.readFileSync(t,"utf8"))}catch{return null}}function nt(e,t){_.writeFileSync(Nr(e),JSON.stringify(t),{encoding:"utf8",mode:384});}function $r(e){try{_.unlinkSync(Nr(e));}catch{}}var ri,ni,Lt=T(()=>{"use strict";ri=/^[0-9a-f-]{1,64}$/i,ni=k.normalize(ke.tmpdir())+k.sep;});function Jn(e){if(!e||!_.existsSync(e))return null;try{let t=_.readFileSync(e,"utf8").trimEnd().split(`
261
+ `);for(let r=t.length-1;r>=0;r--)try{let n=JSON.parse(t[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function Fr(e){if(!e||!_.existsSync(e))return null;try{let t=_.readFileSync(e,"utf8").trimEnd().split(`
255
262
  `),r=[],n=0,s=0,o;for(let i=t.length-1;i>=0;i--)try{let a=JSON.parse(t[i]);if(a.type==="user")break;if(a.type==="assistant"){!o&&a.message?.model&&(o=a.message.model);let p=(a.message?.content??[]).filter(u=>u.type==="text").map(u=>u.text??"").join("");p&&r.unshift(p);let g=a.message?.usage??{};n+=(g.input_tokens??0)+(g.cache_read_input_tokens??0)+(g.cache_creation_input_tokens??0),s+=g.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
256
263
 
257
- `),inputTokens:n,outputTokens:s,model:o}}catch{}return null}var Nr=_(()=>{"use strict";});function jn(e){return e.replace(":","/")}function Yt(e,t){if(!e)return null;let r=jn(e),n=[k.join(Le.homedir(),".claude","skills",r,"SKILL.md"),k.join(t??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(S.existsSync(s))try{return S.readFileSync(s,"utf8")}catch{}return null}function Vn(e){return e.split(`
258
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function Gn(e){return !!e.slashSkill||e.toolCalls.some(n=>n.tool==="Skill")?e.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||ai.has(n.tool))?"complete":"prerequisite_required":null}function Kt(e,t){if(!e)return null;let r=jn(e),n=[k.join(Le.homedir(),".claude","skills",r),k.join(t??"",".claude","skills",r)],s=null;for(let a of n)if(S.existsSync(k.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let p of S.readdirSync(a,{withFileTypes:true})){if(si.has(p.name)||ii.has(p.name)||oi.has(k.extname(p.name)))continue;let g=c?`${c}/${p.name}`:p.name;p.isDirectory()?i(k.join(a,p.name),g):o.push(g);}}return i(s,""),o.length>0?o:null}var si,oi,ii,ai,jt=_(()=>{"use strict";si=new Set([".venv","__pycache__",".git","node_modules"]),oi=new Set([".pyc",".pyo"]),ii=new Set(["SKILL.md",".DS_Store",".gitignore"]);ai=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function ui(e){try{let t=e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(t,"base64").toString())}catch{return null}}function pi(e,t,r,n){return new Promise(s=>{let o=new URL(e),i=o.protocol==="https:",a=(i?Cs__default.default:qs__default.default).request({hostname:o.hostname,port:o.port||(i?443:80),path:o.pathname+o.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(t),Authorization:`Bearer ${String(r).replace(/[\r\n]/g,"")}`,FlowTenant:String(n).replace(/[\r\n]/g,"")}},c=>{c.resume(),s(c.statusCode??0);});a.on("error",()=>s(0)),a.setTimeout(5e3,()=>{a.destroy(),s(0);}),a.write(t),a.end();})}async function Ce(e,t={}){try{let r=me(process.env[d.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,s=new Promise((u,E)=>{n=setTimeout(()=>E(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:o}=await Promise.race([q(r),s]);clearTimeout(n);let i=ui(o);if(!i)return;let a=i.tenant||r.tenant,c=JSON.stringify({action:e,booster:Pt().BOOSTER,metadata:t,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:i.email||"",id:i.sub||"",name:i.name||i.email||""}}),p=Pe(Pt().API_URL),g=await pi(p,c,o,a);l("metrics.logEvent",`action=${e} status=${g}`);}catch(r){l("metrics.logEvent",`silenced error: ${r.message}`);}}var Vt=_(()=>{"use strict";P();Re();K();x();});async function $r(e,t=false){if(t){process.stdout.write(JSON.stringify({decision:"block",reason:di})+`
259
- `);return}let n=!!(await ie()).authError,s=e.session_id||"unknown",o=e.prompt||"",i=e.cwd||"",a=Wn(e.transcript_path)||vr(),c=Vn(o),p=c?Yt(c,i):null,g=c?Kt(c,i):null;rt(s,{traceId:vr(),spanId:Ue(),startNs:Ee(),sessionId:s,prompt:o,cwd:i,traceName:a,transcriptPath:e.transcript_path||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:p,skillArtifacts:g}),Ce("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),l("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),H(e);}var di,Jn=_(()=>{"use strict";At();Rt();Nr();jt();et();x();P();K();Vt();di=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${we()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;});async function Xn(e){let t=e.session_id||"unknown",r=e.tool_name||"unknown",n=e.tool_input||{},s=tt(t);s&&(s.pendingTool={name:r,inputStr:oe(n,Q.TOOL_INPUT),startNs:Ee()},rt(t,s)),l("PreToolUse",`sid=${t}`,`tool=${r}`,`stateFound=${!!s}`),H(e);}var qn=_(()=>{"use strict";At();Rt();et();x();P();});function h(e,t){return t==null||t===""?null:{key:e,value:{stringValue:String(t)}}}function Ne(...e){return e.filter(t=>t!==null)}function zn(e,t){return {resourceSpans:[{resource:{attributes:e},scopeSpans:[{scope:fi,spans:Array.isArray(t)?t:[t]}]}]}}var fi,R,Zn=_(()=>{"use strict";P();fi={name:kt.SCOPE_NAME,version:kt.SCOPE_VERSION},R={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 es(e,t,r,n,s){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:e,headers:t,body:JSON.parse(r)},response:{status:n,body:s}});try{S.writeFileSync(Qn,o+`
260
- `,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${Qn}`);}catch(i){l("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Ti(e){let t=new URL(e),r=new URL(J().GATEWAY_HEALTH);return r.hostname=t.hostname,r.port=t.port,r.protocol=t.protocol,r}function ts(e,t){return new Promise((r,n)=>{let s=e._isSSL?Cs__default.default:qs__default.default;e.headers=Object.assign({},e.headers,{Connection:"close"});let o=s.request(e,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}`))),t&&o.write(t),o.end();})}async function rs(e,t){let r;try{r=Ti(e);}catch{return false}let n=r.protocol==="https:";try{let s={};t&&(s.Authorization=String(t).replace(/[\r\n]/g,""));let o=await ts({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 Gt(e,t,r){let n=JSON.stringify(e),s=new URL(t),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 ${t}`),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 ts({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}`),es(t,a,n,c.statusCode,c.body),c.statusCode}catch(c){return l("sendTraces:error",c.message),es(t,a,n,0,c.message),0}}var Qn,ns=_(()=>{"use strict";P();x();Qn=k.join(Le.tmpdir(),"flow-obs-requests.ndjson");});function Si(){let e=parseInt(process.env[d.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(e)?Math.max(X.MIN_TTL_DAYS,Math.min(X.MAX_TTL_DAYS,e)):X.DEFAULT_TTL_DAYS)*24*60*60*1e3}function yi(){let e=parseInt(process.env[d.BUFFER_MAX_FILES]??"",10);return Number.isFinite(e)?Math.max(X.MIN_MAX_FILES,Math.min(X.MAX_MAX_FILES,e)):X.DEFAULT_MAX_FILES}function os(e){if(/[/\\]/.test(e))throw new Error(`Invalid buffer fileId: ${e}`);return k__namespace.default.join(Le__namespace.default.tmpdir(),`${X.FILE_PREFIX}${e}.json`)}function Dr(){let e=Le__namespace.default.tmpdir(),t;try{t=S__namespace.default.readdirSync(e);}catch{return []}return t.filter(r=>r.startsWith(X.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=k__namespace.default.join(e,r),s=0;try{s=S__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function Lt(e){try{let t=yi(),r=Dr();if(r.length>=t){let o=r.slice(0,r.length-t+1);for(let i of o)try{S__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:e};return S__namespace.default.writeFileSync(os(n),JSON.stringify(s),{encoding:"utf8",mode:384}),l("buffer",`saved fileId=${n}`),n}catch(t){return l("buffer",`saveToBuffer failed: ${t.message}`),null}}function is(e){let t=Dr(),r=e!=null&&e>0?e:t.length,n=[];for(let s of t){if(n.length>=r)break;try{let o=S__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 as(e){try{S__namespace.default.unlinkSync(os(e)),l("buffer",`deleted fileId=${e}`);}catch{}}function cs(){let e=Date.now()-Si();for(let t of Dr())try{let{mtimeMs:r}=S__namespace.default.statSync(t);r<e&&(S__namespace.default.unlinkSync(t),l("buffer",`evicted stale: ${k__namespace.default.basename(t)}`));}catch{}}var ls=_(()=>{"use strict";P();x();});async function wi(e){cs();let t=is(X.REPLAY_BATCH_SIZE);t.length&&(l("replayBufferedTraces",`replaying ${t.length} buffered trace(s)`),await Promise.allSettled(t.map(async r=>{try{let n=await Gt(r.payload,e.endpoint,e.authHeader);n>=200&&n<300?(as(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 us(e){let t=await ie();if(!t.length)return t.authError&&(l("postToLangfuse","auth refresh failed \u2014 buffering trace"),Lt(e)),0;let r=await Promise.all(t.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await rs(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 wi(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"),Lt(e),0;let c=await Gt(e,o.endpoint,o.authHeader);return (c===0||c>=500)&&(l("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),Lt(e)),c}let a=await Gt(e,o.endpoint,o.authHeader);return (a===0||a>=500)&&(l("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),Lt(e)),a}))).find(o=>o!==0)??0}var ps=_(()=>{"use strict";K();x();ns();ls();P();});var xr=_(()=>{"use strict";Zn();ps();});function _e(e){if(e==null)return "";let t=typeof e=="string"?e:JSON.stringify(e);return Li.reduce((r,{re:n,replace:s})=>r.replace(n,s),t)}var Z,Oi,Ai,Ri,ds,Li,Mr=_(()=>{"use strict";Z="[REDACTED]",Oi="[REDACTED-EMAIL]",Ai="[REDACTED-CPF]",Ri="[REDACTED-CNPJ]",ds="[REDACTED-PHONE]",Li=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${Z}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${Z}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(e,t)=>`${t}${Z}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(e,t)=>`${t}${Z}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(e,t,r)=>`${t}
261
- ${Z}
262
- ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${Z}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(e,t)=>`${t}${Z}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${Z}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${Z}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${Z}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(e,t,r)=>`${t}${r}${Z}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(e,t)=>`${t}:${Z}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>Oi},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Ai},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Ri},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>ds},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>ds}];});async function fs(e){let t=e.session_id||"unknown",r=e.tool_name||"unknown",n=e.tool_input||{},s=e.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=tt(t);if(!i){H(e);return}let a=Ee(),c=i.pendingTool,p=c?.name===r,g=p?c.startNs:String(BigInt(a)-200000000n),u=p?c.inputStr:oe(n,Q.TOOL_INPUT),E=u,y=null;if(r==="Skill"){let ce=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);y=ce?String(ce).trim():null;let Se=y?Yt(y,i.cwd):null;Se&&(E=Se,i.skillContent||(i.skillContent=Se),i.skillArtifacts||(i.skillArtifacts=Kt(y,i.cwd))),y&&!i.slashSkill&&(i.slashSkill=y),l("PostToolUse","Skill tool detected",`skillName=${y}`,`contentFound=${!!Se}`);}let w=_e(oe(o,Q.TOOL_OUTPUT)),O=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(w.slice(0,500)),Fe=O?"ERROR":"DEFAULT",Te=Ue(),f=Math.round(Number(BigInt(a)-BigInt(g))/1e6),te={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",B=r==="Skill"&&y?y:Wt(u,60);i.toolCalls.push({tool:r,brief:B,error:O,durationMs:f});let W=i.spans;W.push({traceId:i.traceId,spanId:Te,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:g,endTimeUnixNano:a,attributes:Ne(h(R.OBS_NAME,r),h(R.OBS_TYPE,te),h(R.OBS_LEVEL,Fe),h(R.OBS_INPUT,_e(E)),h(R.OBS_OUTPUT,w),h("tool.name",r),h("tool.error",String(O)),r==="Skill"&&y?h("skill.name",y):null,r==="Skill"?h("skill.invocation","slash-command"):null),status:{code:O?2:1}}),i.pendingTool=null,rt(t,i),O&&Ce("TOOL_ERROR",{toolName:r}),l("PostToolUse",`sid=${t}`,`tool=${r}`,`error=${O}`,`durationMs=${f}`,`totalSpans=${W.length}`),H(e);}var ms=_(()=>{"use strict";At();Rt();xr();et();jt();x();P();Mr();Vt();});function Es(e,t,r){let n=Object.keys(gs).find(i=>(e??"").toLowerCase().includes(i));if(!n)return;let s=gs[n],o=(t*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var gs,hs=_(()=>{"use strict";gs={"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 _s(e){let t=e.session_id||"unknown",r=e.stop_reason||"end_turn",n=tt(t);if(!n){H(e);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(l("Stop",`sid=${t}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=Ee(),o=await dn(),i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(A=>A.tool==="Skill")){let A=Ue(),ye=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:A,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:Ne(h(R.OBS_NAME,"Skill"),h(R.OBS_TYPE,"TOOL"),h(R.OBS_LEVEL,"DEFAULT"),h(R.OBS_INPUT,ye),h(R.OBS_OUTPUT,"loaded via slash command"),h("tool.name","Skill"),h("tool.error","false"),h("skill.name",n.slashSkill),h("skill.invocation","slash-command")),status:{code:1}}),l("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=e.transcript_path||n.transcriptPath||"",p=Cr(c);if(c&&(i.some(A=>A.tool==="Skill"&&!A.synthetic)||!!n.slashSkill)&&!p?.text){await new Promise(ye=>setTimeout(ye,500));let A=Cr(c);A?.text&&(p=A);}l("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${p?`text=${p.text.length}chars`:"null"}`);let u=i.length,E=i.filter(A=>A.error).length,y=_e(p?.text?oe(p.text,Q.TRACE_OUTPUT):u===0?"No tools used":i.map((A,ye)=>`${ye+1}. ${A.tool}${A.brief?` \u2192 ${A.brief}`:""}${A.error?" [ERROR]":""}`).join(`
263
- `)),w=p?.inputTokens??0,O=p?.outputTokens??0,Fe=i.map((A,ye)=>`${ye+1}. ${A.tool}${A.brief?` \u2192 ${A.brief}`:""}${A.error?" [ERROR]":""} (${A.durationMs}ms)`),Te=!!(n.slashSkill||i.some(A=>A.tool==="Skill")),f=i.some(A=>A.tool==="Agent");if(!Te&&!f){l("Stop",`sid=${t}`,"skipping trace \u2014 no Skill or Agent calls found"),Ce("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),Ur(t),H(e);return}let U=Te?"skill":"agent",te=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),B=p?.model||"",V=Es(B,w,O),W=Gn(n);W==="prerequisite_required"&&p?.text&&(W="complete"),W==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:Ue(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Ne(h(R.OBS_NAME,"prerequisite-check"),h(R.OBS_TYPE,"EVENT"),h(R.OBS_LEVEL,"WARNING"),h(R.OBS_OUTPUT,y),h("skill.name",n.slashSkill||void 0),h("execution_status","prerequisite_required")),status:{code:1}}),l("Stop",`sid=${t}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let ce=(()=>{if(!(!Te||!n.prompt)){if(n.slashSkill){let A=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return A?oe(_e(A),Q.USER_INSTRUCTION):void 0}return oe(_e(n.prompt),Q.USER_INSTRUCTION)||void 0}})(),Se=JSON.stringify({trace_type:U,...W!==null&&{execution_status:W},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...ce!==void 0&&{user_instruction:ce},latency_ms:te,...w&&{tokens_input:w},...O&&{tokens_output:O},cost_usd:V,...B?{model:B}:{},toolCount:u,errorCount:E,stopReason:r,sessionId:n.sessionId,tools:Fe.length?Fe:void 0}),De=_e(oe(n.prompt,Q.TRACE_INPUT)),xe=Ne(h(R.TRACE_NAME,n.traceName),h(R.TRACE_INPUT,De),h(R.TRACE_OUTPUT,y),h(R.OBS_INPUT,De),h(R.OBS_OUTPUT,y),h(R.TRACE_METADATA,Se),h(R.SESSION_ID,n.sessionId),h(R.USER_ID,o.user),h(R.OBS_TYPE,"GENERATION"),h(R.MODEL,B),w?h(R.INPUT_TOKENS,w):null,O?h(R.OUTPUT_TOKENS,O):null,h("claude.stop_reason",r),h("claude.tool_count",String(u)),h("claude.error_count",String(E)),h("claude.session_id",n.sessionId),h("flow.trace_type",U),{key:R.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:U}]}}}),Jt={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:xe,status:{code:E>0?2:1}},Os=Ne(h("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),h("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Hr=[...a,Jt];l("Stop",`sid=${t}`,`totalTools=${u}`,`errorTools=${E}`,`spans=${Hr.length}`,`inputTokens=${w}`,`outputTokens=${O}`,`traceOutput="${Wt(y,80)}"`);let As=await us(zn(Os,Hr));l("Stop",`POST status=${As}`,`traceId=${n.traceId}`),Ce("TRACE_SENT",{latencyMs:te,totalTools:u,errorTools:E,inputTokens:w,outputTokens:O,costUsd:V}),Ur(t),H(e);}var Ts=_(()=>{"use strict";At();Rt();xr();K();hs();Nr();et();x();jt();Mr();P();Vt();});var $e,Ss=_(()=>{"use strict";K();et();Jn();qn();ms();Ts();$e=class{static async userPromptSubmit(){let t=await Ot(),r;try{r=await ie();}catch{H(t);return}r.authError?await $r(t,!0):r.length>0?await $r(t):H(t);}static async preToolUse(){let t=await Ot();await Xn(t);}static async postToolUse(){let t=await Ot();await fs(t);}static async stop(){let t=await Ot();await _s(t);}};});var Pi={};async function ki(){let e=process.argv[2];switch(e){case "UserPromptSubmit":await $e.userPromptSubmit();break;case "PreToolUse":await $e.preToolUse();break;case "PostToolUse":await $e.postToolUse();break;case "Stop":await $e.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${e}
264
- `),process.stdin.on("data",t=>process.stdout.write(t));}}var ys=_(()=>{"use strict";Ss();ki().catch(e=>{process.stderr.write(`[flow-obs] fatal: ${e.message}
265
- `),process.exit(0);});});var Ii=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,j]=process.argv;function ae(e,t){let r=e.indexOf(t);return r!==-1?e[r+1]:void 0}function ws(){let{bold:e,cyan:t,dim:r,green:n}=(le(),M(qt)),{version:s}=st();process.stdout.write(`
264
+ `),inputTokens:n,outputTokens:s,model:o}}catch{}return null}var Dr=T(()=>{"use strict";});function zn(e){return e.replace(":","/")}function Vt(e,t){if(!e)return null;let r=zn(e),n=[k.join(ke.homedir(),".claude","skills",r,"SKILL.md"),k.join(t??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(_.existsSync(s))try{return _.readFileSync(s,"utf8")}catch{}return null}function Zn(e){return e.split(`
265
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function Qn(e){return !!e.slashSkill||e.toolCalls.some(n=>n.tool==="Skill")?e.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||pi.has(n.tool))?"complete":"prerequisite_required":null}function Gt(e,t){if(!e)return null;let r=zn(e),n=[k.join(ke.homedir(),".claude","skills",r),k.join(t??"",".claude","skills",r)],s=null;for(let a of n)if(_.existsSync(k.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let p of _.readdirSync(a,{withFileTypes:true})){if(ci.has(p.name)||ui.has(p.name)||li.has(k.extname(p.name)))continue;let g=c?`${c}/${p.name}`:p.name;p.isDirectory()?i(k.join(a,p.name),g):o.push(g);}}return i(s,""),o.length>0?o:null}var ci,li,ui,pi,Jt=T(()=>{"use strict";ci=new Set([".venv","__pycache__",".git","node_modules"]),li=new Set([".pyc",".pyo"]),ui=new Set(["SKILL.md",".DS_Store",".gitignore"]);pi=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function mi(e){try{let t=e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(t,"base64").toString())}catch{return null}}function gi(e,t,r,n){return new Promise(s=>{let o=new URL(e),i=o.protocol==="https:",a=(i?Ms__default.default:ro__default.default).request({hostname:o.hostname,port:o.port||(i?443:80),path:o.pathname+o.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(t),Authorization:`Bearer ${String(r).replace(/[\r\n]/g,"")}`,FlowTenant:String(n).replace(/[\r\n]/g,"")}},c=>{c.resume(),s(c.statusCode??0);});a.on("error",()=>s(0)),a.setTimeout(5e3,()=>{a.destroy(),s(0);}),a.write(t),a.end();})}async function Ne(e,t={}){try{let r=ge(process.env[d.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,s=new Promise((u,E)=>{n=setTimeout(()=>E(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:o}=await Promise.race([z(r),s]);clearTimeout(n);let i=mi(o);if(!i)return;let a=i.tenant||r.tenant,c=JSON.stringify({action:e,booster:It().BOOSTER,metadata:t,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:i.email||"",id:i.sub||"",name:i.name||i.email||""}}),p=Ie(It().API_URL),g=await gi(p,c,o,a);l("metrics.logEvent",`action=${e} status=${g}`);}catch(r){l("metrics.logEvent",`silenced error: ${r.message}`);}}var Xt=T(()=>{"use strict";I();Le();H();x();});async function xr(e,t=false){if(t){process.stdout.write(JSON.stringify({decision:"block",reason:Ei})+`
266
+ `);return}let n=!!(await ae()).authError,s=e.session_id||"unknown",o=e.prompt||"",i=e.cwd||"",a=Jn(e.transcript_path)||Cr(),c=Zn(o),p=c?Vt(c,i):null,g=c?Gt(c,i):null;nt(s,{traceId:Cr(),spanId:Ce(),startNs:he(),sessionId:s,prompt:o,cwd:i,traceName:a,transcriptPath:e.transcript_path||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:p,skillArtifacts:g}),Ne("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),l("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),B(e);}var Ei,es=T(()=>{"use strict";Rt();Lt();Dr();Jt();tt();x();I();H();Xt();Ei=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${Oe()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;});async function ts(e){let t=e.session_id||"unknown",r=e.tool_name||"unknown",n=e.tool_input||{},s=rt(t);s&&(s.pendingTool={name:r,inputStr:ie(n,ee.TOOL_INPUT),startNs:he()},nt(t,s)),l("PreToolUse",`sid=${t}`,`tool=${r}`,`stateFound=${!!s}`),B(e);}var rs=T(()=>{"use strict";Rt();Lt();tt();x();I();});function h(e,t){return t==null||t===""?null:{key:e,value:{stringValue:String(t)}}}function $e(...e){return e.filter(t=>t!==null)}function ns(e,t){return {resourceSpans:[{resource:{attributes:e},scopeSpans:[{scope:hi,spans:Array.isArray(t)?t:[t]}]}]}}var hi,R,ss=T(()=>{"use strict";I();hi={name:Pt.SCOPE_NAME,version:Pt.SCOPE_VERSION},R={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 is(e,t,r,n,s){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:e,headers:t,body:JSON.parse(r)},response:{status:n,body:s}});try{_.writeFileSync(os,o+`
267
+ `,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${os}`);}catch(i){l("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Oi(e){let t=new URL(e),r=new URL(X().GATEWAY_HEALTH);return r.hostname=t.hostname,r.port=t.port,r.protocol=t.protocol,r}function as(e,t){return new Promise((r,n)=>{let s=e._isSSL?Ms__default.default:ro__default.default;e.headers=Object.assign({},e.headers,{Connection:"close"});let o=s.request(e,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}`))),t&&o.write(t),o.end();})}async function cs(e,t){let r;try{r=Oi(e);}catch{return false}let n=r.protocol==="https:";try{let s={};t&&(s.Authorization=String(t).replace(/[\r\n]/g,""));let o=await as({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 qt(e,t,r){let n=JSON.stringify(e),s=new URL(t),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 ${t}`),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 as({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}`),is(t,a,n,c.statusCode,c.body),c.statusCode}catch(c){return l("sendTraces:error",c.message),is(t,a,n,0,c.message),0}}var os,ls=T(()=>{"use strict";I();x();os=k.join(ke.tmpdir(),"flow-obs-requests.ndjson");});function Ai(){let e=parseInt(process.env[d.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(e)?Math.max(q.MIN_TTL_DAYS,Math.min(q.MAX_TTL_DAYS,e)):q.DEFAULT_TTL_DAYS)*24*60*60*1e3}function Ri(){let e=parseInt(process.env[d.BUFFER_MAX_FILES]??"",10);return Number.isFinite(e)?Math.max(q.MIN_MAX_FILES,Math.min(q.MAX_MAX_FILES,e)):q.DEFAULT_MAX_FILES}function ps(e){if(/[/\\]/.test(e))throw new Error(`Invalid buffer fileId: ${e}`);return k__namespace.default.join(ke__namespace.default.tmpdir(),`${q.FILE_PREFIX}${e}.json`)}function Hr(){let e=ke__namespace.default.tmpdir(),t;try{t=___namespace.default.readdirSync(e);}catch{return []}return t.filter(r=>r.startsWith(q.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=k__namespace.default.join(e,r),s=0;try{s=___namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function kt(e){try{let t=Ri(),r=Hr();if(r.length>=t){let o=r.slice(0,r.length-t+1);for(let i of o)try{___namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:e};return ___namespace.default.writeFileSync(ps(n),JSON.stringify(s),{encoding:"utf8",mode:384}),l("buffer",`saved fileId=${n}`),n}catch(t){return l("buffer",`saveToBuffer failed: ${t.message}`),null}}function ds(e){let t=Hr(),r=e!=null&&e>0?e:t.length,n=[];for(let s of t){if(n.length>=r)break;try{let o=___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 fs(e){try{___namespace.default.unlinkSync(ps(e)),l("buffer",`deleted fileId=${e}`);}catch{}}function ms(){let e=Date.now()-Ai();for(let t of Hr())try{let{mtimeMs:r}=___namespace.default.statSync(t);r<e&&(___namespace.default.unlinkSync(t),l("buffer",`evicted stale: ${k__namespace.default.basename(t)}`));}catch{}}var gs=T(()=>{"use strict";I();x();});async function Li(e){ms();let t=ds(q.REPLAY_BATCH_SIZE);t.length&&(l("replayBufferedTraces",`replaying ${t.length} buffered trace(s)`),await Promise.allSettled(t.map(async r=>{try{let n=await qt(r.payload,e.endpoint,e.authHeader);n>=200&&n<300?(fs(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 Es(e){let t=await ae();if(!t.length)return t.authError&&(l("postToLangfuse","auth refresh failed \u2014 buffering trace"),kt(e)),0;let r=await Promise.all(t.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await cs(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 Li(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"),kt(e),0;let c=await qt(e,o.endpoint,o.authHeader);return (c===0||c>=500)&&(l("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),kt(e)),c}let a=await qt(e,o.endpoint,o.authHeader);return (a===0||a>=500)&&(l("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),kt(e)),a}))).find(o=>o!==0)??0}var hs=T(()=>{"use strict";H();x();ls();gs();I();});var Br=T(()=>{"use strict";ss();hs();});function Te(e){if(e==null)return "";let t=typeof e=="string"?e:JSON.stringify(e);return vi.reduce((r,{re:n,replace:s})=>r.replace(n,s),t)}var Q,ki,Pi,Ii,_s,vi,Wr=T(()=>{"use strict";Q="[REDACTED]",ki="[REDACTED-EMAIL]",Pi="[REDACTED-CPF]",Ii="[REDACTED-CNPJ]",_s="[REDACTED-PHONE]",vi=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${Q}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${Q}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(e,t)=>`${t}${Q}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(e,t)=>`${t}${Q}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(e,t,r)=>`${t}
268
+ ${Q}
269
+ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${Q}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(e,t)=>`${t}${Q}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${Q}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${Q}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${Q}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(e,t,r)=>`${t}${r}${Q}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(e,t)=>`${t}:${Q}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>ki},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Pi},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Ii},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>_s},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>_s}];});async function Ts(e){let t=e.session_id||"unknown",r=e.tool_name||"unknown",n=e.tool_input||{},s=e.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=rt(t);if(!i){B(e);return}let a=he(),c=i.pendingTool,p=c?.name===r,g=p?c.startNs:String(BigInt(a)-200000000n),u=p?c.inputStr:ie(n,ee.TOOL_INPUT),E=u,y=null;if(r==="Skill"){let le=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);y=le?String(le).trim():null;let ye=y?Vt(y,i.cwd):null;ye&&(E=ye,i.skillContent||(i.skillContent=ye),i.skillArtifacts||(i.skillArtifacts=Gt(y,i.cwd))),y&&!i.slashSkill&&(i.slashSkill=y),l("PostToolUse","Skill tool detected",`skillName=${y}`,`contentFound=${!!ye}`);}let w=Te(ie(o,ee.TOOL_OUTPUT)),O=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(w.slice(0,500)),De=O?"ERROR":"DEFAULT",Se=Ce(),f=Math.round(Number(BigInt(a)-BigInt(g))/1e6),re={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",W=r==="Skill"&&y?y:jt(u,60);i.toolCalls.push({tool:r,brief:W,error:O,durationMs:f});let K=i.spans;K.push({traceId:i.traceId,spanId:Se,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:g,endTimeUnixNano:a,attributes:$e(h(R.OBS_NAME,r),h(R.OBS_TYPE,re),h(R.OBS_LEVEL,De),h(R.OBS_INPUT,Te(E)),h(R.OBS_OUTPUT,w),h("tool.name",r),h("tool.error",String(O)),r==="Skill"&&y?h("skill.name",y):null,r==="Skill"?h("skill.invocation","slash-command"):null),status:{code:O?2:1}}),i.pendingTool=null,nt(t,i),O&&Ne("TOOL_ERROR",{toolName:r}),l("PostToolUse",`sid=${t}`,`tool=${r}`,`error=${O}`,`durationMs=${f}`,`totalSpans=${K.length}`),B(e);}var Ss=T(()=>{"use strict";Rt();Lt();Br();tt();Jt();x();I();Wr();Xt();});function ws(e,t,r){let n=Object.keys(ys).find(i=>(e??"").toLowerCase().includes(i));if(!n)return;let s=ys[n],o=(t*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var ys,Os=T(()=>{"use strict";ys={"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 As(e){let t=e.session_id||"unknown",r=e.stop_reason||"end_turn",n=rt(t);if(!n){B(e);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(l("Stop",`sid=${t}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=he(),o=await gn(),i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(A=>A.tool==="Skill")){let A=Ce(),we=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:A,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:$e(h(R.OBS_NAME,"Skill"),h(R.OBS_TYPE,"TOOL"),h(R.OBS_LEVEL,"DEFAULT"),h(R.OBS_INPUT,we),h(R.OBS_OUTPUT,"loaded via slash command"),h("tool.name","Skill"),h("tool.error","false"),h("skill.name",n.slashSkill),h("skill.invocation","slash-command")),status:{code:1}}),l("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=e.transcript_path||n.transcriptPath||"",p=Fr(c);if(c&&(i.some(A=>A.tool==="Skill"&&!A.synthetic)||!!n.slashSkill)&&!p?.text){await new Promise(we=>setTimeout(we,500));let A=Fr(c);A?.text&&(p=A);}l("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${p?`text=${p.text.length}chars`:"null"}`);let u=i.length,E=i.filter(A=>A.error).length,y=Te(p?.text?ie(p.text,ee.TRACE_OUTPUT):u===0?"No tools used":i.map((A,we)=>`${we+1}. ${A.tool}${A.brief?` \u2192 ${A.brief}`:""}${A.error?" [ERROR]":""}`).join(`
270
+ `)),w=p?.inputTokens??0,O=p?.outputTokens??0,De=i.map((A,we)=>`${we+1}. ${A.tool}${A.brief?` \u2192 ${A.brief}`:""}${A.error?" [ERROR]":""} (${A.durationMs}ms)`),Se=!!(n.slashSkill||i.some(A=>A.tool==="Skill")),f=i.some(A=>A.tool==="Agent");if(!Se&&!f){l("Stop",`sid=${t}`,"skipping trace \u2014 no Skill or Agent calls found"),Ne("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),$r(t),B(e);return}let C=Se?"skill":"agent",re=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),W=p?.model||"",G=ws(W,w,O),K=Qn(n);K==="prerequisite_required"&&p?.text&&(K="complete"),K==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:Ce(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:$e(h(R.OBS_NAME,"prerequisite-check"),h(R.OBS_TYPE,"EVENT"),h(R.OBS_LEVEL,"WARNING"),h(R.OBS_OUTPUT,y),h("skill.name",n.slashSkill||void 0),h("execution_status","prerequisite_required")),status:{code:1}}),l("Stop",`sid=${t}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let le=(()=>{if(!(!Se||!n.prompt)){if(n.slashSkill){let A=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return A?ie(Te(A),ee.USER_INSTRUCTION):void 0}return ie(Te(n.prompt),ee.USER_INSTRUCTION)||void 0}})(),ye=JSON.stringify({trace_type:C,...K!==null&&{execution_status:K},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...le!==void 0&&{user_instruction:le},latency_ms:re,...w&&{tokens_input:w},...O&&{tokens_output:O},cost_usd:G,...W?{model:W}:{},toolCount:u,errorCount:E,stopReason:r,sessionId:n.sessionId,tools:De.length?De:void 0}),xe=Te(ie(n.prompt,ee.TRACE_INPUT)),Me=$e(h(R.TRACE_NAME,n.traceName),h(R.TRACE_INPUT,xe),h(R.TRACE_OUTPUT,y),h(R.OBS_INPUT,xe),h(R.OBS_OUTPUT,y),h(R.TRACE_METADATA,ye),h(R.SESSION_ID,n.sessionId),h(R.USER_ID,o.user),h(R.OBS_TYPE,"GENERATION"),h(R.MODEL,W),w?h(R.INPUT_TOKENS,w):null,O?h(R.OUTPUT_TOKENS,O):null,h("claude.stop_reason",r),h("claude.tool_count",String(u)),h("claude.error_count",String(E)),h("claude.session_id",n.sessionId),h("flow.trace_type",C),{key:R.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:C}]}}}),zt={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Me,status:{code:E>0?2:1}},Is=$e(h("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),h("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Kr=[...a,zt];l("Stop",`sid=${t}`,`totalTools=${u}`,`errorTools=${E}`,`spans=${Kr.length}`,`inputTokens=${w}`,`outputTokens=${O}`,`traceOutput="${jt(y,80)}"`);let vs=await Es(ns(Is,Kr));l("Stop",`POST status=${vs}`,`traceId=${n.traceId}`),Ne("TRACE_SENT",{latencyMs:re,totalTools:u,errorTools:E,inputTokens:w,outputTokens:O,costUsd:G}),$r(t),B(e);}var Rs=T(()=>{"use strict";Rt();Lt();Br();H();Os();Dr();tt();x();Jt();Wr();I();Xt();});var Fe,Ls=T(()=>{"use strict";H();tt();es();rs();Ss();Rs();Fe=class{static async userPromptSubmit(){let t=await At(),r;try{r=await ae();}catch{B(t);return}r.authError?await xr(t,!0):r.length>0?await xr(t):B(t);}static async preToolUse(){let t=await At();await ts(t);}static async postToolUse(){let t=await At();await Ts(t);}static async stop(){let t=await At();await As(t);}};});var Ui={};async function bi(){let e=process.argv[2];switch(e){case "UserPromptSubmit":await Fe.userPromptSubmit();break;case "PreToolUse":await Fe.preToolUse();break;case "PostToolUse":await Fe.postToolUse();break;case "Stop":await Fe.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${e}
271
+ `),process.stdin.on("data",t=>process.stdout.write(t));}}var ks=T(()=>{"use strict";Ls();bi().catch(e=>{process.stderr.write(`[flow-obs] fatal: ${e.message}
272
+ `),process.exit(0);});});var Ci=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,V]=process.argv;function ce(e,t){let r=e.indexOf(t);return r!==-1?e[r+1]:void 0}function Ps(){let{bold:e,cyan:t,dim:r,green:n}=(ue(),M(Qt)),{version:s}=ot();process.stdout.write(`
266
273
  `+e(" flow-ai-obs")+r(" v"+s)+`
267
274
 
268
275
  `),process.stdout.write(t(" init")+r(` Configure environment: Claude Code + Proxy + OTEL + Trace hooks
@@ -281,18 +288,18 @@ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${Z}`},{re:/(aws_secret_ac
281
288
 
282
289
  `)),process.stdout.write(r(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
283
290
 
284
- `));}if(j==="--version"||j==="-v")(async()=>{let{version:e}=st();process.stdout.write(e+`
285
- `);let t=(We(),M(Be)),r=await t.fetchLatestVersionAsync().catch(()=>null);if(r&&t.isNewer(e,r.version)){let{dim:n,yellow:s}=(le(),M(qt));process.stdout.write(s(`
291
+ `));}if(V==="--version"||V==="-v")(async()=>{let{version:e}=ot();process.stdout.write(e+`
292
+ `);let t=(Ke(),M(We)),r=await t.fetchLatestVersionAsync().catch(()=>null);if(r&&t.isNewer(e,r.version)){let{dim:n,yellow:s}=(ue(),M(Qt));process.stdout.write(s(`
286
293
  Update available: ${e} \u2192 ${r.version}
287
294
  `)+n(` Run: flow-ai-obs update
288
295
 
289
- `));}process.exit(0);})().catch(()=>process.exit(0));else if(j==="--help"||j==="-h")ws(),process.exit(0);else if(j==="init"||j==="install")(async()=>{j==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
290
- `),await(We(),M(Be)).checkForUpdateInteractive();let{runInit:e}=(kn(),M(Ln)),t=process.argv.slice(3);process.exit(await e({url:ae(t,"--custom-url"),noInteractive:t.includes("--no-interactive"),email:ae(t,"--custom-email"),clientId:ae(t,"--client-id"),clientSecret:ae(t,"--client-secret"),tenant:ae(t,"--tenant")}));})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
291
- `),process.exit(1);});else if(j==="login")(async()=>{await(We(),M(Be)).checkForUpdateInteractive();let{runLogin:e}=(St(),M(Tt)),t=process.argv.slice(3),r=await e({clientId:ae(t,"--client-id"),clientSecret:ae(t,"--client-secret"),tenant:ae(t,"--tenant")});process.exit(typeof r=="number"?r:r.code);})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
292
- `),process.exit(1);});else if(j==="status")(async()=>{await(We(),M(Be)).checkForUpdateInteractive();let{runStatus:e}=(Cn(),M(Un));process.exit(await e());})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
293
- `),process.exit(1);});else if(j==="update-api-key")(async()=>{let{runUpdateApiKey:e}=($n(),M(Nn)),t=process.argv.slice(3);process.exit(await e({key:ae(t,"--key")}));})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
294
- `),process.exit(1);});else if(j==="update")(async()=>{let e=(We(),M(Be)),{version:t}=st(),r=await e.fetchLatestVersionAsync();r||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
296
+ `));}process.exit(0);})().catch(()=>process.exit(0));else if(V==="--help"||V==="-h")Ps(),process.exit(0);else if(V==="init"||V==="install")(async()=>{V==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
297
+ `),await(Ke(),M(We)).checkForUpdateInteractive();let{runInit:e}=(Cn(),M(Un)),t=process.argv.slice(3);process.exit(await e({url:ce(t,"--custom-url"),noInteractive:t.includes("--no-interactive"),email:ce(t,"--custom-email"),clientId:ce(t,"--client-id"),clientSecret:ce(t,"--client-secret"),tenant:ce(t,"--tenant")}));})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
298
+ `),process.exit(1);});else if(V==="login")(async()=>{await(Ke(),M(We)).checkForUpdateInteractive();let{runLogin:e}=(yt(),M(St)),t=process.argv.slice(3),r=await e({clientId:ce(t,"--client-id"),clientSecret:ce(t,"--client-secret"),tenant:ce(t,"--tenant")});process.exit(typeof r=="number"?r:r.code);})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
299
+ `),process.exit(1);});else if(V==="status")(async()=>{await(Ke(),M(We)).checkForUpdateInteractive();let{runStatus:e}=(Mn(),M(xn));process.exit(await e());})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
300
+ `),process.exit(1);});else if(V==="update-api-key")(async()=>{let{runUpdateApiKey:e}=(Bn(),M(Hn)),t=process.argv.slice(3);process.exit(await e({key:ce(t,"--key")}));})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
301
+ `),process.exit(1);});else if(V==="update")(async()=>{let e=(Ke(),M(We)),{version:t}=ot(),r=await e.fetchLatestVersionAsync();r||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
295
302
  `),process.exit(1)),e.isNewer(t,r.version)||(process.stdout.write(` \u2713 Already up to date (v${t})
296
303
  `),process.exit(0)),await e.runUpdate(r.version),process.exit(0);})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
297
- `),process.exit(1);});else if(j==="otel-headers"){let{runOtelHeaders:e}=(Dn(),M(Fn));e().then(t=>process.exit(t)).catch(t=>{process.stderr.write(`[flow-ai-obs otel-headers] Unexpected error: ${t.message}
298
- `),process.exit(1);});}else Ii.has(j)?(ys(),M(Pi)):(ws(),process.exit(0));
304
+ `),process.exit(1);});else if(V==="otel-headers"){let{runOtelHeaders:e}=(Kn(),M(Wn));e().then(t=>process.exit(t)).catch(t=>{process.stderr.write(`[flow-ai-obs otel-headers] Unexpected error: ${t.message}
305
+ `),process.exit(1);});}else Ci.has(V)?(ks(),M(Ui)):(Ps(),process.exit(0));