@ciandt-flow/flow-ai-obs 0.14.0-beta.61 → 0.14.0-beta.73

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,102 +1,104 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var Vt=require('readline/promises'),Us=require('https'),_=require('fs'),Te=require('os'),k=require('path'),child_process=require('child_process'),Xs=require('http'),util=require('util'),wn=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 Vt__namespace=/*#__PURE__*/_interopNamespace(Vt);var Us__default=/*#__PURE__*/_interopDefault(Us);var ___namespace=/*#__PURE__*/_interopNamespace(_);var Te__namespace=/*#__PURE__*/_interopNamespace(Te);var k__namespace=/*#__PURE__*/_interopNamespace(k);var Xs__default=/*#__PURE__*/_interopDefault(Xs);var wn__namespace=/*#__PURE__*/_interopNamespace(wn);var Kt=Object.defineProperty;var Ls=Object.getOwnPropertyDescriptor;var ks=Object.getOwnPropertyNames;var Rs=Object.prototype.hasOwnProperty;var qe=(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 h=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var vs=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},H=(e,t)=>{for(var r in t)Kt(e,r,{get:t[r],enumerable:true});},Is=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ks(t))!Rs.call(e,s)&&s!==r&&Kt(e,s,{get:()=>t[s],enumerable:!(n=Ls(t,s))||n.enumerable});return e};var M=e=>Is(Kt({},"__esModule",{value:true}),e);var Gt={};H(Gt,{bold:()=>I,cyan:()=>C,dim:()=>m,green:()=>b,red:()=>N,yellow:()=>v});function Pe(e,t){return Ps?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var Ps,b,N,v,C,I,m,he=h(()=>{"use strict";Ps=!process.env.NO_COLOR&&process.stdout.isTTY;b=Pe("32","39"),N=Pe("31","39"),v=Pe("33","39"),C=Pe("36","39"),I=Pe("1","22"),m=Pe("2","22");});var Xe=vs((Mi,bs)=>{bs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.14.0-beta.61",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,optionalDependencies:{keytar:"7.9.0"},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 se(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function ze(e,t){let r=Vt__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 Jt(e,t){let r=Vt__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=h(()=>{"use strict";});var Ue={};H(Ue,{checkForUpdate:()=>Ds,checkForUpdateInteractive:()=>Ms,fetchLatestVersionAsync:()=>jr,isNewer:()=>be,primeUpdateCache:()=>Bs,runUpdate:()=>Hr});function j(){return Xt||(Xt=Xe()),Xt}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 Qt(){try{let e=JSON.parse(___namespace.default.readFileSync(Wr,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=$s?null:e}catch{return null}}function er(e,t,r=Date.now()){try{___namespace.default.writeFileSync(Wr,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function tr(e){let t=j().name,r=Us__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Fs},n=>{if(n.statusCode!==200)return n.resume(),e(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");e(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){e(o);}});});r.on("error",e),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function zt(e){let t=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(`
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-beta.73",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(`
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 Zt(e){let t=j().name;process.stderr.write(`
9
+ `);}function rr(e){let t=G().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=qe("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,d="\u2500".repeat(c);return process.stderr.write(`
13
- \u256D${d}\u256E
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(`
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
- \u2570${d}\u256F
18
- `),new Promise(E=>{let u=r.createInterface({input:process.stdin,output:void 0,terminal:false}),f=false;function S(y){f||(f=true,clearTimeout(T),u.close(),process.stderr.write(`
19
- `),E(y));}let T=setTimeout(()=>S(false),t);u.once("line",y=>S(y.trim().toLowerCase()==="y")),u.once("close",()=>S(false));})}async function Hr(e){let t=j().name;return process.stderr.write(` Installing ${t}@${e}...
17
+ \u2570${p}\u256F
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}...
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=>{tr((t,r)=>e(t||!r?null:r));})}function Ds(){try{let e=Qt();if(e){be(j().version,e.latestVersion)&&(e.updatePriority==="auto"?Zt(e.latestVersion):zt(e.latestVersion));return}setImmediate(()=>{tr((t,r)=>{t||!r||(er(r.version,r.updatePriority),be(j().version,r.version)&&(r.updatePriority==="auto"?Zt(r.version):zt(r.version)));});});}catch{}}async function Ms(e={}){try{let t=Qt();if(t){if(!be(j().version,t.latestVersion))return}else {let n=await jr();if(!n||(er(n.version,n.updatePriority),!be(j().version,n.version)))return;t={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(t.updatePriority==="auto"){Zt(t.latestVersion);return}if(!se()){zt(t.latestVersion);return}await xs(t.latestVersion,e.timeoutMs)&&await Hr(t.latestVersion);}catch{}}function Bs(){try{if(Qt())return;setImmediate(()=>{tr((e,t)=>{e||!t||be(j().version,t.version)&&er(t.version,t.updatePriority,0);});});}catch{}}var Xt,Wr,$s,Fs,Ne=h(()=>{"use strict";qt();Wr=k__namespace.default.join(Te__namespace.default.tmpdir(),"flow-obs-update-cache.json"),$s=1440*60*1e3,Fs=3e3;});var Yr={};H(Yr,{AUTH_ENGINE:()=>Ce,BUFFER:()=>Y,CLAUDE_DESKTOP:()=>U,CONFIG_DIR_NAME:()=>Qe,CONFIG_FILE_NAME:()=>et,DEBUG_LOG_FILENAME:()=>rr,ENV:()=>p,FEATURES:()=>js,FLOW_URLS:()=>Hs,HOOK_TIMEOUTS:()=>we,INSTALLER:()=>tt,NATIVE_OTEL:()=>oe,OTLP:()=>Ot,STATE_FILE_PREFIX:()=>Ys,TRACE_LIMITS:()=>q,VALIDATION:()=>B,VAULT:()=>Ze,getFlowBaseUrl:()=>Ee,getFlowUrls:()=>te,getMetrics:()=>At});function Ee(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ws}function te(){let e=Ee();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 At(){let e=Ee();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ws,Hs,Ze,Qe,et,Ot,oe,p,js,Ce,tt,we,Y,B,rr,q,U,Ys,R=h(()=>{"use strict";Ws="https://flow.ciandt.com";Hs=te(),Ze={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},Qe="FLOW-nodejs",et="config.json",Ot={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},oe={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"},p={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_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",FLOW_OBS_SKIP_DESKTOP_DETECTION:"FLOW_OBS_SKIP_DESKTOP_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"},js={KEYCHAIN_ENABLED:!1},Ce={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},tt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},we={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},Y={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},B={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[\x21-\x7E]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},rr="flow-ai-obs-debug.log",q={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};U={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"}},Ys="flow-obs-";});function l(...e){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let t=`[${new Date().toISOString()}] ${e.join(" ")}
25
- `;try{_.writeFileSync(Js,t,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
26
- `);}}var Js,$=h(()=>{"use strict";R();Js=k.join(Te.tmpdir(),rr);});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}`:"")),Kr[n.error]))return new _e(Kr[n.error],e)}catch{}return e===401||e===403||e===500?new _e("Invalid credentials",e):e>=400&&e<500?new _e("Authentication request was rejected",e):new Error("Authentication service unavailable, please try again later")}function K(e){return new Promise((t,r)=>{try{Zs(e.tenant);}catch(d){return r(d)}let n=JSON.stringify({clientSecret:e.clientSecret}),s=new URL(te().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?Us__default.default:Xs__default.default).request(i,d=>{let E=[];d.on("data",u=>E.push(u)),d.on("end",()=>{let u=E.join("");if((d.statusCode??0)>=400)return r(Qs(d.statusCode??0,u));let f;try{f=JSON.parse(u);}catch{return r(new Error("Invalid response from auth engine"))}let S=f.expires_at??new Date(Date.now()+(f.expires_in??3600)*1e3).toISOString();if(!f.access_token)return r(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));t({accessToken:f.access_token,expiresAt:S});});});c.on("error",d=>r(new Error(`Network error: ${d.message}`))),c.setTimeout(Ce.REQUEST_TIMEOUT_MS,()=>{c.destroy(new Error("Request timeout"));}),c.write(n),c.end();})}var _e,zs,Kr,Se=h(()=>{"use strict";R();$();_e=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]$/;Kr={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 Gr(){return process.platform==="win32"?false:process.getuid?.()===0}function Lt(){if(Gr())return process.stderr.write(`
27
- `+N(` \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=>{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.
28
28
 
29
- `)+C(` npm install -g @ciandt-flow/flow-ai-obs
29
+ `)+D(` npm install -g @ciandt-flow/flow-ai-obs
30
30
  `)+`
31
- `),1}var kt=h(()=>{"use strict";he();});function rt(){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:Te__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||Te__namespace.userInfo().username}}function Q(){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(Te__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||Te__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(Te__namespace.homedir(),".claude","settings.json")}var Rt=h(()=>{"use strict";kt();});function vt(){if(process.platform==="win32"){let r=process.env.APPDATA||k__namespace.join(Te__namespace.homedir(),"AppData","Roaming");return k__namespace.join(r,Vr,Jr)}let e=rt(),t=process.env.XDG_CONFIG_HOME||k__namespace.join(e.home,".config");return k__namespace.join(t,Vr,Jr)}function sr(){try{let e=___namespace.readFileSync(Q(),"utf8"),r=JSON.parse(e).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}var Vr,Jr,or=h(()=>{"use strict";Rt();Vr="flow-ai-obs",Jr="config.json";});function zr(e){try{let t=___namespace.statSync(e);Date.now()-t.mtimeMs>eo&&___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 Zr(e){try{___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 Qr(e,t){let r=Q(),n=r+".lock",s=[];___namespace.mkdirSync(k__namespace.dirname(r),{recursive:true}),zr(n);try{if(___namespace.existsSync(r)){___namespace.copyFileSync(r,r+".bkp");try{___namespace.chmodSync(r+".bkp",384);}catch{}}let o=vt();if(___namespace.existsSync(o)){let T=o+".bkp";___namespace.copyFileSync(o,T);try{___namespace.chmodSync(T,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}=(R(),M(Yr)),d=c().OTEL_ENDPOINT,E={...oe,OTEL_EXPORTER_OTLP_ENDPOINT:e??d};i.env={...a,...E,...t??{}},i.otelHeadersHelper="flow-ai-obs otel-headers",(!i.hooks||typeof i.hooks!="object"||Array.isArray(i.hooks))&&(i.hooks={});let u=(T,y)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${T}`,timeout:y}]}),f=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],S=i.hooks;for(let T of f){let y=to(S[T],u(T,we[T]));y.length>1&&s.push(T),S[T]=y;}___namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
32
- `,{encoding:"utf8",mode:384});try{___namespace.chmodSync(r,384);}catch{}}finally{Zr(n);}return {settingsPath:r,preserved:s}}function G(e){if(st===void 0)try{let r=___namespace.readFileSync(Q(),"utf8");st=JSON.parse(r).env??null;}catch{st=null;}if(!st)return null;let t=st[e];return typeof t=="string"?t:null}function Fe(e){let t=Q(),r=t+".lock";___namespace.mkdirSync(k__namespace.dirname(t),{recursive:true}),zr(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{Zr(r);}}function ot(e){let t=process.env[e];return t!==void 0?t!==""?t:void 0:G(e)??void 0}var eo,st,ie=h(()=>{"use strict";R();Se();Rt();or();eo=tt.LOCK_STALE_MS;});function it(){let e=Te__namespace.default.homedir();if(process.platform==="darwin")return k__namespace.default.join(e,"Library","Preferences",Qe,et);if(process.platform==="win32"){let r=process.env.APPDATA??k__namespace.default.join(e,"AppData","Roaming");return k__namespace.default.join(r,Qe,et)}let t=process.env.XDG_CONFIG_HOME??k__namespace.default.join(e,".config");return k__namespace.default.join(t,Qe,et)}function cr(){try{let e=___namespace.default.readFileSync(it(),"utf8");return JSON.parse(e)}catch{return {}}}function en(e){let t=it();___namespace.default.mkdirSync(k__namespace.default.dirname(t),{recursive:true}),___namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var ar,ct,tn=h(()=>{"use strict";R();ar={credentials:"credentials","token-cache":"tokenCache"};ct=class{static isAvailable(){return !0}static hasExistingData(){try{if(!___namespace.default.existsSync(it()))return !1;let t=JSON.parse(___namespace.default.readFileSync(it(),"utf8"));return !!(t&&t.credentials)}catch{return !1}}async getSecret(t,r){let n=cr(),s=ar[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,r,n){let s=cr(),o=ar[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;en(s);}async deleteSecret(t,r){let n=cr(),s=ar[r]??r;return s in n?(delete n[s],en(n),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${it()}`}};});var rn={};H(rn,{MacOsKeyVaultProvider:()=>ur});var lr,ur,nn=h(()=>{"use strict";lr=util.promisify(child_process.execFile),ur=class{static async isAvailable(){try{return _.accessSync("/usr/bin/security",_.constants.X_OK),!0}catch{return !1}}async getSecret(t,r){try{let{stdout:n}=await lr("security",["find-generic-password","-w","-a",r,"-s",t]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await lr("security",["add-generic-password","-U","-a",r,"-s",t,"-w",n]);}async deleteSecret(t,r){try{return await lr("security",["delete-generic-password","-a",r,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var on={};H(on,{LinuxKeyVaultProvider:()=>pr});var sn,pr,an=h(()=>{"use strict";sn=util.promisify(child_process.execFile),pr=class{static async isAvailable(){let t=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of t)try{return _.accessSync(r,_.constants.X_OK),!0}catch{}return !1}async getSecret(t,r){try{let{stdout:n}=await sn("secret-tool",["lookup","service",t,"account",r]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await new Promise((s,o)=>{let i=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",r]);i.on("error",o),i.on("close",a=>{a===0?s():o(new Error(`secret-tool exited with code ${a}`));}),i.stdin.write(n),i.stdin.end();});}async deleteSecret(t,r){try{return await sn("secret-tool",["clear","service",t,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var cn={};H(cn,{WindowsKeyVaultProvider:()=>dr});var dr,ln=h(()=>{"use strict";dr=class{static async isAvailable(){try{return await qe("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,r){return qe("keytar").getPassword(t,r)}async setSecret(t,r,n){await qe("keytar").setPassword(t,r,n);}async deleteSecret(t,r){return qe("keytar").deletePassword(t,r)}getStoragePath(){return "Windows Credential Manager"}};});async function un(){return process.env[p.FLOW_OBS_USE_JSON_VAULT]==="1"?new ct:await fo()??new ct}async function fo(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(nn(),rn));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(an(),on));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(ln(),cn));return await e.isAvailable()?new e:null}default:return null}}var pn=h(()=>{"use strict";R();tn();});var fn={};H(fn,{clearFlowCredentials:()=>go,getConfigPath:()=>Eo,getEmailFromToken:()=>Be,getFlowCredentials:()=>dn,getTokenCache:()=>lt,hasCredentials:()=>wo,isTokenValid:()=>ho,saveFlowCredentials:()=>mo,saveTokenCache:()=>ae});function Me(){return fr||(fr=un()),fr}async function dn(){let t=await(await Me()).getSecret(De,mr);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function mo(e){if(!e.clientId||!e.clientSecret||!e.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await Me()).setSecret(De,mr,JSON.stringify(e));}async function go(){let e=await Me();await e.deleteSecret(De,mr),await e.deleteSecret(De,gr);}async function ae(e){await(await Me()).setSecret(De,gr,JSON.stringify({accessToken:e.accessToken,expiresAt:e.expiresAt,lastAuthCheckAt:e.lastAuthCheckAt}));}async function lt(){let t=await(await Me()).getSecret(De,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 ho(){let e=await lt();return e?new Date(e.expiresAt)>new Date:false}async function Be(){let e=await lt();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 Eo(){let e=await Me();if(typeof e.getStoragePath=="function")return e.getStoragePath();let t=process.platform;return t==="darwin"?"macOS Keychain":t==="win32"?"Windows Credential Manager":"Linux Secret Service (libsecret)"}async function wo(){let e=await dn();return !!(e&&e.clientId&&e.clientSecret&&e.tenant)}var De,mr,gr,fr,We=h(()=>{"use strict";pn();R();De=Ze.SERVICE,mr=Ze.ACCOUNT_CREDS,gr=Ze.ACCOUNT_TOKEN,fr=null;});function mn(){return !!process.env[p.FLOW_USER_EMAIL]||!!G(p.FLOW_USER_EMAIL)}function hr(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 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:
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 Be().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&&B.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{Fe({[p.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 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.
38
38
  Run: flow-ai-obs init
39
- `);}}else process.stderr.write(t);}).catch(r=>{l("maybePersistUserEmail",`${e}: getEmailFromToken failed: ${r.message}`);})}var gn=h(()=>{"use strict";We();ie();$();R();});function To(e){return So.some(t=>t.test(e))}function yo(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 ce(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 hn(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 ye(e){let t;try{t=new URL(e);}catch{throw new Error(`Invalid URL: ${e}`)}let r=process.env[p.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&&To(t.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${t.hostname}`);return e}async function En(){let e=ce(process.env[p.ANTHROPIC_AUTH_TOKEN]);return e?{user:await Be().catch(()=>null)??e.clientId,tenant:e.tenant}:{user:"",tenant:""}}function Oo(e){let t=process.env[p.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 It(){let e=ot(p.FLOW_USER_EMAIL);if(e!==void 0){let r=e.replace(/[\r\n]/g,"").trim();if(r)if(r.length>B.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${B.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!B.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=Oo("x-flow-user");if(t){let r=t.replace(/[\r\n]/g,"").trim();if(r.length>B.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${B.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!B.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=Te__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 ut(){let e=process.env[p.FLOW_API_KEY];if(!e)return null;let t=e.replace(/[\r\n]/g,"").trim();return t?t.length>B.API_KEY_MAX_LENGTH?(l("resolveApiKey",`FLOW_API_KEY exceeds ${B.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):B.API_KEY_PATTERN.test(t)?t:(l("resolveApiKey","FLOW_API_KEY contains non-printable or control characters \u2014 rejected"),null):null}function Ao(){return new Date().toISOString().slice(0,10)}async function Lo(e){let t=Ao(),r=await lt();if(r?.lastAuthCheckAt!==t){l("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);let o=Ce.MAX_RETRY_ATTEMPTS;for(let i=1;i<=o;i++)try{let a=await K(e);try{await ae({...a,lastAuthCheckAt:t});}catch(d){l("getOrRefreshToken",`saveTokenCache failed (non-fatal): ${d.message}`);}return l("getOrRefreshToken",`daily check passed (attempt ${i}), expires=${a.expiresAt}`),ut()?mn()||await hr("api-key"):await hr("oauth"),a.accessToken}catch(a){if(a instanceof _e){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,Ce.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 K(e);try{await ae({...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 ko(e,t){let r=t&&t.accessToken?t.accessToken:"";return {endpoint:e.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function Ro(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 re(){let e=[],t=ce(process.env[p.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[p.FLOW_TELEMETRY]==="true",s=process.env[p.LANGFUSE_BASE_URL],o=process.env[p.LANGFUSE_PUBLIC_KEY],i=process.env[p.LANGFUSE_SECRET_KEY];if(n&&s&&o&&i){let u="",f=r;t&&(u=await Be().catch(()=>null)??t.clientId);let S={user:u??"",tenant:f??"",team:"",project:""};e.push({mode:"direct",...Ro(ye(s),o,i),...S}),l("resolveCredentials","direct mode active",`user=${S.user}`,`tenant=${S.tenant}`);}if(!t){if(e.length===0){let u=[];return u.authError=false,u}return e}let a;try{a=await Lo(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 f=[];return f.authError=true,f}let d={user:yo(a)??t.clientId,tenant:r,team:"",project:""},E=process.env[p.FLOW_TELEMETRY_GATEWAY]??Ee();return e.push({mode:"gateway",...ko(ye(E),{accessToken:a}),...d}),e}var So,X=h(()=>{"use strict";We();Se();R();$();gn();ie();So=[/^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 _n(){return !!(process.env.WSL_DISTRO_NAME&&process.platform==="linux")}function bt(){return process.platform==="win32"||_n()}function Io(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 Sn(){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,U.DIR_3P);return Pt(o)}}if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||k__namespace.join(Te__namespace.homedir(),"AppData","Local"),s=k__namespace.join(n,U.DIR_3P);return Pt(s)}if(process.platform==="darwin"){let n=k__namespace.join(Te__namespace.homedir(),"Library","Application Support",U.DIR_3P);return Pt(n)}let e=rt(),t=process.env.XDG_CONFIG_HOME||k__namespace.join(e.home,".config"),r=k__namespace.join(t,U.DIR_3P);return Pt(r)}function Pt(e){return {configDir:e,configLibraryDir:k__namespace.join(e,U.CONFIG_LIBRARY_DIR),desktopConfigPath:k__namespace.join(e,U.DESKTOP_CONFIG_FILE),metaPath:k__namespace.join(e,U.CONFIG_LIBRARY_DIR,U.META_FILE)}}function Po(){let e=Q(),t=k__namespace.dirname(e),r=bt()?U.WRAPPER_SCRIPT_WIN:U.WRAPPER_SCRIPT_UNIX;return k__namespace.join(t,r)}function Er(){if(process.env[p.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=Sn();if(___namespace.existsSync(e.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",k__namespace.join(Te__namespace.homedir(),"Applications","Claude.app")].some(r=>___namespace.existsSync(r));if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||k__namespace.join(Te__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=rt(),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 bo(){let e=Po(),t=k__namespace.dirname(e);___namespace.mkdirSync(t,{recursive:true});let r=bt()?No():Uo(),n=true;try{___namespace.readFileSync(e,"utf8")===r&&(n=!1);}catch{}if(n&&(___namespace.existsSync(e)&&___namespace.copyFileSync(e,e+".bkp"),___namespace.writeFileSync(e,r,{encoding:"utf8",mode:bt()?420:493})),!bt())try{___namespace.chmodSync(e,493);}catch{}return e}function Uo(){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 No(){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 $o(e){try{let t=___namespace.readFileSync(e,"utf8");try{let r=JSON.parse(t);if(r.appliedId&&typeof r.appliedId=="string"&&Co.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 wn__namespace.randomUUID()}function Fo(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:U.CONFIG_NAME});let s=JSON.stringify(n,null,2)+`
42
- `;try{if(___namespace.readFileSync(e,"utf8")===s)return}catch{}___namespace.existsSync(e)&&___namespace.copyFileSync(e,e+".bkp"),___namespace.writeFileSync(e,s,{encoding:"utf8",mode:384});try{___namespace.chmodSync(e,384);}catch{}}function xo(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[U.KEYS.OTLP_ENDPOINT]=r,i[U.KEYS.OTLP_PROTOCOL]=U.OTLP_PROTOCOL,i[U.KEYS.OTLP_HEADERS_HELPER]=_n()?Io(n):n;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 Do(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!==U.DEPLOYMENT_MODE){___namespace.existsSync(e)&&___namespace.copyFileSync(e,e+".bkp"),r.deploymentMode=U.DEPLOYMENT_MODE,___namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
44
- `,{encoding:"utf8",mode:384});try{___namespace.chmodSync(e,384);}catch{}}}function Tn(e){if(!Er())return {configured:false};let t=Sn(),r=e??te().OTEL_ENDPOINT,n=bo(),s=$o(t.metaPath),o=xo(t.configLibraryDir,s,r,n);return Fo(t.metaPath,s),Do(t.desktopConfigPath),{configured:true,configDir:t.configDir,configLibraryPath:o,uuid:s,wrapperScriptPath:n}}var Co,yn=h(()=>{"use strict";R();Rt();$();Co=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;});var An={};H(An,{clearLoggedOutMarker:()=>_r,isLoggedOut:()=>Wo,markLoggedOut:()=>Bo});function wr(){return k__namespace.default.join(Te__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function Bo(){try{let e=wr();___namespace.default.mkdirSync(k__namespace.default.dirname(e),{recursive:!0}),___namespace.default.writeFileSync(e,"",{mode:384});}catch{}}function _r(){try{___namespace.default.unlinkSync(wr());}catch{}}function Wo(){try{return ___namespace.default.existsSync(wr())}catch{return false}}var Sr=h(()=>{"use strict";});function Tr(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():G("FLOW_BASE_URL")}function Ho(){return G(p.ANTHROPIC_AUTH_TOKEN)??void 0}async function Nt(){let e=Tr();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=Ho(),r=ce(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 K({clientId:r.clientId,clientSecret:r.clientSecret,tenant:r.tenant});await ae({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 yr=h(()=>{"use strict";We();X();ie();R();Se();});var ft={};H(ft,{promptRaw:()=>dt,runLogin:()=>Ko});function z(e){return typeof e=="string"?e.replace(jo,""):e}function dt(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=E=>{if(E===""){d(),n(new Error("SIGINT"));return}if(E==="\r"||E===`
45
- `){d(),process.stdout.write(`
46
- `),r(i);return}if(E==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}E.startsWith("\x1B")||(i+=E,process.stdout.write(s?"*".repeat(E.length):E));};function d(){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 Ct(e,t=false){let r=Tr(),n=process.env.FLOW_BASE_URL;r&&(process.env.FLOW_BASE_URL=r);try{let{accessToken:s,expiresAt:o}=await K(e),i=hn(e);if(t)return {jwt:i,accessToken:s,expiresAt:o};Fe({[p.ANTHROPIC_AUTH_TOKEN]:i}),_r(),await ae({accessToken:s,expiresAt:o});}finally{n===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=n;}}async function Yo(e=false){try{let t=(await dt(C(" ? ")+"Client ID: ")).trim(),r=(await dt(C(" ? ")+"Client Secret: ",{masked:!0})).trim(),n=(await dt(C(" ? ")+"Tenant: ")).trim();if(!t||!r||!n)return process.stderr.write(N(` \u2717 All fields are required
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===`
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
47
49
  `)),1;if(process.stdout.write(m(` Authenticating...
48
- `)),e){let s=await Ct({clientId:t,clientSecret:r,tenant:n},!0);return process.stdout.write(`
49
- ${b("\u2713")} ${I("Authenticated")}
50
- `+m(` Tenant: ${z(n)}
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)}
51
53
  `)+m(` Storage: pending (will be written at end of init)
52
54
 
53
- `)),{code:0,result:s}}return await Ct({clientId:t,clientSecret:r,tenant:n}),process.stdout.write(`
54
- ${b("\u2713")} ${I("Authenticated")}
55
- `+m(` Tenant: ${z(n)}
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)}
56
58
  `)+m(` Storage: ANTHROPIC_AUTH_TOKEN (settings.json)
57
59
 
58
60
  `)),0}catch(t){if(t.message==="SIGINT"||t.message==="NOT_A_TTY")throw t;return process.stderr.write(`
59
- ${N("\u2717")} ${I("Authentication failed:")}
60
- ${z(t.message)}
61
+ ${$("\u2717")} ${b("Authentication failed:")}
62
+ ${ee(t.message)}
61
63
 
62
- `),1}}async function Ko(e={}){let t=Lt();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 Ct({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant},!0);return process.stdout.write(b(` \u2713 Authenticated. Tenant: ${z(e.tenant)}
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)}
63
65
 
64
- `)),{code:0,result:o}}return await Ct({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant}),process.stdout.write(b(` \u2713 Authenticated. Tenant: ${z(e.tenant)}
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)}
65
67
 
66
- `)),0}catch(o){return process.stderr.write(N(` \u2717 Authentication failed: ${z(o.message)}
67
- `)),1}let s=await Nt();if(!n){if(process.stdout.write(`
68
- `),process.stdout.write(I(` Auth
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(`
70
+ `),process.stdout.write(b(` Auth
69
71
  `)),s.notConfigured)return process.stdout.write(` ${v("\u26A0")} Not configured
70
72
  `),process.stdout.write(m(" Run `flow-ai-obs init` to set up the environment first.\n")),process.stdout.write(`
71
- `),1;if(s.ok){process.stdout.write(` ${b("\u2713")} Authenticated
72
- `),process.stdout.write(m(" URL: ")+z(s.baseUrl)+`
73
- `),process.stdout.write(m(" Tenant: ")+z(s.tenant)+`
74
- `),process.stdout.write(m(" User: ")+z(s.user)+`
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)+`
75
77
  `),process.stdout.write(`
76
- `);let o;try{o=await dt(C(" ? ")+"Re-authenticate? (y/N): ");}catch(i){if(i.message==="SIGINT")return process.stdout.write(`
77
- `),130;if(i.message==="NOT_A_TTY")return process.stdout.write(b(` \u2713 Using existing credentials.
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
80
 
79
- `)),0;throw i}if(o.trim().toLowerCase()!=="y")return process.stdout.write(b(` \u2713 Using existing credentials.
81
+ `)),0;throw i}if(o.trim().toLowerCase()!=="y")return process.stdout.write(I(` \u2713 Using existing credentials.
80
82
 
81
83
  `)),0}else s.error==="No credentials found"?(process.stdout.write(` ${v("\u26A0")} Not authenticated
82
84
  `),process.stdout.write(m(` URL: ${s.baseUrl}
83
85
  `)),process.stdout.write(`
84
86
  `)):(process.stdout.write(` ${v("\u26A0")} Session not valid for current endpoint
85
- `),process.stdout.write(m(" URL: ")+z(s.baseUrl)+`
86
- `),process.stdout.write(m(" Tenant: ")+z(s.tenant)+`
87
+ `),process.stdout.write(m(" URL: ")+ee(s.baseUrl)+`
88
+ `),process.stdout.write(m(" Tenant: ")+ee(s.tenant)+`
87
89
  `),process.stdout.write(m(" User: ")+m("(not authenticated)")+`
88
90
  `),process.stdout.write(`
89
- `));}try{return await Yo(r)}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
90
- `),130;if(o.message==="NOT_A_TTY")return process.stderr.write(N(` \u2717 No TTY available for interactive login.
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
93
  `)+` Pass --client-id, --client-secret and --tenant for non-interactive use.
92
94
 
93
- `),1;throw o}}var jo,mt=h(()=>{"use strict";We();Sr();Se();X();ie();R();he();kt();yr();jo=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var vn={};H(vn,{normalizeCustomUrl:()=>Rn,runInit:()=>Jo,validateCustomUrl:()=>Lr,validateEmail:()=>Ar});function $t(e,t,r){process.stdout.write(I(C(`
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(`
94
96
  [${e}/${t}] ${r}
95
- `)));}function He(e){process.stdout.write(` ${b("\u2713")} ${e}
96
- `);}function Et(e){process.stdout.write(` ${v("\u26A0")} ${e}
97
- `);}function gt(e){process.stdout.write(` ${m(e)}
98
- `);}function Ln(){return !!G(p.ANTHROPIC_AUTH_TOKEN)}function Go(){let e=sr();if(!e)return null;Fe({FLOW_BASE_URL:e});try{let t=vt(),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)+`
99
- `,{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 Lr(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 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.
100
102
  Received: ${e}
101
103
  Expected: https://tenant.example.com`);if(i.search)throw new Error(`Custom URL must not contain query parameters.
102
104
  Received: ${e}
@@ -104,29 +106,29 @@
104
106
  Received: ${e}
105
107
  Expected: https://tenant.example.com`);if(i.username||i.password)throw new Error(`Custom URL must not contain embedded credentials.
106
108
  Received: ${e}
107
- 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[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],ye(a);}finally{c!==void 0&&(process.env[p.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[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],ye(r);}finally{s!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function Or(){for(let e=1;e<=3;e++)try{let t=await Jt(" Enter your Flow domain (e.g., tenant.ciandt.com)");return Lr(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],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}
108
110
 
109
- `)),e===3)throw process.stderr.write(N(` Too many invalid attempts.
111
+ `)),e===3)throw process.stderr.write($(` Too many invalid attempts.
110
112
 
111
- `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function kn(e){return e.replace(/[\r\n]/g,"").trim()}function Ar(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 Vo(e,t,r){let n=G(p.FLOW_USER_EMAIL),s=It(),o=s??"(could not be derived)";if(!e||!se()){if(r){let c=kn(r);if(!c)throw new Error("--custom-email: value is empty after normalization");let d=Ar(c);if(d)throw new Error(`--custom-email: ${d}`);return He(`Email: ${I(c)}`),c}return n??s?He(`Email: ${I(n??s)}`):Et(`Email not configured \u2014 telemetry will not include user identity.
112
- To set it: flow-ai-obs init --custom-email <you@company.com>`),null}r&&Et("--custom-email is ignored in interactive mode. Use --no-interactive to apply it.");async function i(){for(let c=1;c<=3;c++){let d;try{d=await Jt(" Enter your corporate email (e.g., user@company.com)");}catch(f){throw process.stderr.write(N(` \u2717 Input error: ${f.message}
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
115
 
114
- `)),f}let E=kn(d),u=Ar(E);if(!u)return E;process.stderr.write(v(` \u2717 ${u}
116
+ `)),E}let g=An(p),u=Lr(g);if(!u)return g;process.stderr.write(v(` \u2717 ${u}
115
117
 
116
- `));}throw process.stderr.write(N(` Too many invalid attempts.
118
+ `));}throw process.stderr.write($(` Too many invalid attempts.
117
119
 
118
- `)),new Error("Too many invalid email attempts")}async function a(){let c=await i();return process.stdout.write(b(` \u2713 Email: ${c}
120
+ `)),new Error("Too many invalid email attempts")}async function a(){let c=await i();return process.stdout.write(I(` \u2713 Email: ${c}
119
121
 
120
- `)),c}return n?await ze(` Registered email: ${I(n)} \u2014 still correct?`,true)?(process.stdout.write(b(` \u2713 Email: ${I(n)}
122
+ `)),c}return n?await ot(` Registered email: ${b(n)} \u2014 still correct?`,true)?(process.stdout.write(I(` \u2713 Email: ${b(n)}
121
123
 
122
- `)),null):a():s?t?await ze(" Is your corporate email domain @ciandt.com?",true)?(process.stdout.write(b(` \u2713 Email: ${I(o)}
124
+ `)),null):a():s?t?await ot(" Is your corporate email domain @ciandt.com?",true)?(process.stdout.write(I(` \u2713 Email: ${b(o)}
123
125
 
124
- `)),s):a():(process.stdout.write(b(` \u2713 Email: ${I(o)}
126
+ `)),s):a():(process.stdout.write(I(` \u2713 Email: ${b(o)}
125
127
 
126
128
  `)),s):(process.stdout.write(v(`
127
129
  \u26A0 Could not derive email from OS username.
128
- `)),a())}function ht(){let e=G(p.FLOW_BASE_URL);return e&&e.trim()?e.trim():null}async function Jo(e={}){let t=Lt();if(t)return t;let r=e.url,n=!!ut();!n&&process.env[p.FLOW_API_KEY]&&Et(`FLOW_API_KEY appears to be misconfigured \u2014 authentication with Flow is required.
129
- To fix: unset FLOW_API_KEY && flow-ai-obs init`);let s=n?3:4;process.stdout.write(I(C(`
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.
131
+ To fix: unset FLOW_API_KEY && flow-ai-obs init`);let s=n?3:4;process.stdout.write(b(D(`
130
132
  flow-ai-obs init
131
133
  `))),process.stdout.write(m(` Configuring your development environment:
132
134
 
@@ -135,42 +137,42 @@
135
137
  `)),n?process.stdout.write(m(` [3/${s}] Observability OpenTelemetry metrics, logs and trace hooks
136
138
  `)):(process.stdout.write(m(` [3/${s}] Authentication Authenticate with Flow
137
139
  `)),process.stdout.write(m(` [4/${s}] Observability OpenTelemetry metrics, logs and trace hooks
138
- `))),$t(1,s,"Flow Environment Setup");let o=false;{let w=G(p.FLOW_BASE_URL);if(w&&(Et(`Base URL already configured (FLOW_BASE_URL=${w})`),!e.noInteractive&&se()))try{let{promptRaw:P}=await Promise.resolve().then(()=>(mt(),ft));o=(await P(C(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",o||gt("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
139
- `)+v(" on Windows too: ")+C(`npm install -g @ciandt-flow/flow-ai-obs
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
141
+ `)+v(" on Windows too: ")+D(`npm install -g @ciandt-flow/flow-ai-obs
140
142
  `)+v(` Without the Windows install, observability will not work for the Windows-side code assistant.
141
143
 
142
- `)),Go(),!r&&!e.noInteractive&&se()){let w=ht();o?r=await Or():w?(process.stdout.write(`
143
- Current base URL: ${I(w)}
144
- `),await ze(" Keep this URL?",true)||(r=await Or())):(process.stdout.write(`
145
- `),await ze(" Does your organization use a custom Flow URL?",false)?r=await Or():He("Using default Flow Base URL: https://flow.ciandt.com")),process.stdout.write(`
146
- `);}if(!r&&!e.noInteractive&&!se()){let w=ht();if(w)process.stdout.write(v(` \u26A0 Non-interactive environment detected.
147
- `)+m(` Using URL: ${w}
144
+ `)),Do(),!r&&!e.noInteractive&&ue()){let f=yt();o?r=await Rr():f?(process.stdout.write(`
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.
149
+ `)+m(` Using URL: ${f}
148
150
 
149
151
  `));else return process.stderr.write(` \u2717 No URL configured and no TTY available.
150
152
  Run: flow-ai-obs init --custom-url <URL>
151
153
 
152
- `),1}let i,a=false;if(r){let w;try{w=Lr(r,!0);}catch(Z){return process.stderr.write(`
153
- \u2717 Invalid --custom-url: ${Z.message}
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
156
 
155
- `),1}let P=ht();i=w,a=!!P&&P!==w,a?process.stdout.write(v(` \u26A0 Base URL changed \u2014 re-authentication required.
156
- `)+m(` Previous: ${P}
157
- `)+m(` New: ${w}
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}
159
+ `)+m(` New: ${f}
158
160
 
159
- `)):process.stdout.write(b(` \u2713 Base URL configured: ${w}
161
+ `)):process.stdout.write(I(` \u2713 Base URL configured: ${f}
160
162
 
161
- `));}else i=ht()??"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(b(`
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(`
162
164
  \u2713 Flow environment ready.
163
- `));let d=36;for(let[w,P]of Object.entries(c))process.stdout.write(m(` ${w.padEnd(d)}`)+P+`
164
- `);$t(2,s,"User Identity");let E=await Vo(!e.noInteractive,!!(r??sr()),e.email),u=null;if(n)l("init","FLOW_API_KEY detected \u2014 skipping OAuth authentication step");else {$t(3,s,"Authentication");let w=ht(),P=!!w&&w!==i;if(!Ln()||a||P)if(e.noInteractive||!se()){let{clientId:x,clientSecret:W,tenant:D}=e,ne=x&&W&&D;if(!ne&&(x||W||D)){let ve=[!x&&"--client-id",!W&&"--client-secret",!D&&"--tenant"].filter(Boolean).join(", ");return process.stderr.write(`
165
- ${N("\u2717")} Non-interactive mode requires all credential flags.
166
- Missing: ${ve}
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}
167
169
 
168
- `),1}if(ne){let{runLogin:ve}=await Promise.resolve().then(()=>(mt(),ft)),Ie;try{Ie=await ve({deferPersist:!0,clientId:x,clientSecret:W,tenant:D});}catch(Yt){return process.stderr.write(`
169
- ${N("\u2717")} Authentication failed unexpectedly.
170
- ${Yt.message}
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}
171
173
 
172
- `),1}if(typeof Ie=="number")return Ie;u=Ie.result;}else return process.stderr.write(`
173
- ${N("\u2717")} Authentication required.
174
+ `),1}if(typeof xe=="number")return xe;u=xe.result;}else return process.stderr.write(`
175
+ ${$("\u2717")} Authentication required.
174
176
  Run: flow-ai-obs login
175
177
 
176
178
  `),1}else {(e.clientId||e.clientSecret||e.tenant)&&process.stderr.write(`
@@ -180,78 +182,87 @@
180
182
  `),process.stdout.write(`
181
183
  ${v("\u26A0")} Authentication required for the new endpoint.
182
184
 
183
- `);let{runLogin:x}=await Promise.resolve().then(()=>(mt(),ft)),W=await x({deferPersist:true,skipAuthCheck:a});if(typeof W=="number")return W;u=W.result;}else He("Already authenticated \u2014 skipping."),gt("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");}let f=Ln()?G(p.ANTHROPIC_AUTH_TOKEN):null,S={...c,...E?{[p.FLOW_USER_EMAIL]:E}:{},...u?{[p.ANTHROPIC_AUTH_TOKEN]:u.jwt}:{},...f&&!u?{[p.ANTHROPIC_AUTH_TOKEN]:f}:{}},T,y;$t(n?3:4,s,"Observability (OpenTelemetry)"),process.stdout.write(`
184
- ${I("Metrics and Logs")}
185
- `);let Re={...oe,OTEL_EXPORTER_OTLP_ENDPOINT:c.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[w,P]of Object.entries(Re))process.stdout.write(m(` ${w.padEnd(36)}`)+P+`
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(`
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+`
186
188
  `);process.stdout.write(`
187
- `),process.stdout.write(` ${I("Trace (Hook)")}
188
- `);let fe=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"];for(let w of fe){let P=we[w];process.stdout.write(m(` ${w.padEnd(18)}`)+`\u2192 flow-ai-obs ${w} (timeout: ${P}s)
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)
189
191
  `);}process.stdout.write(`
190
- `);try{({settingsPath:T,preserved:y}=Qr(c.OTEL_EXPORTER_OTLP_ENDPOINT,S));}catch(w){return process.stderr.write(` \u2717 Failed to write settings: ${w.message}
191
- `),1}if(u){let{saveTokenCache:w}=await Promise.resolve().then(()=>(We(),fn));try{await w({accessToken:u.accessToken,expiresAt:u.expiresAt});}catch(Z){process.stderr.write(` ${v("\u26A0")} Token cache could not be saved: ${Z.message}
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
194
  Hooks will authenticate on first use.
193
- `);}let{clearLoggedOutMarker:P}=await Promise.resolve().then(()=>(Sr(),An));P();}if(He(`Settings written: ${T}`),y.length>0&&(process.stdout.write(`
194
- `),process.stdout.write(v(` \u26A0 Third-party hooks preserved on: ${y.join(", ")}
195
+ `);}let{clearLoggedOutMarker:U}=await Promise.resolve().then(()=>(wr(),wn));U();}if(ge(`Settings written: ${w}`),O.length>0&&(process.stdout.write(`
196
+ `),process.stdout.write(v(` \u26A0 Third-party hooks preserved on: ${O.join(", ")}
195
197
  `)),process.stdout.write(m(` flow-ai-obs was prepended \u2014 it executes first.
196
198
  `))),process.stdout.write(`
197
- `),Er()){process.stdout.write(` ${I("Claude Desktop")}
198
- `);try{let w=Tn(c.OTEL_EXPORTER_OTLP_ENDPOINT);w.configured&&(He(`Desktop config written: ${w.configLibraryPath}`),gt(`Wrapper script: ${w.wrapperScriptPath}`),gt(`Config UUID: ${w.uuid}`),process.stdout.write(m(` Relaunch Claude Desktop to activate OTLP telemetry.
199
- `)));}catch(w){Et(`Claude Desktop config failed: ${w.message}`),gt("CLI observability is configured \u2014 Desktop config can be retried.");}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(`
200
204
  `);}return e.skipHint||(process.stdout.write(`
201
- `),process.stdout.write(b(` \u2713 Setup complete.
205
+ `),process.stdout.write(I(` \u2713 Setup complete.
202
206
 
203
207
  `)),process.stdout.write(m(` Verify your configuration:
204
- `)+C(` flow-ai-obs status
208
+ `)+D(` flow-ai-obs status
205
209
 
206
210
  `)+m(` Start your code assistant and begin working.
207
211
 
208
- `))),0}var In=h(()=>{"use strict";ie();R();he();kt();or();X();qt();$();yn();});var Cn={};H(Cn,{runStatus:()=>Xo});function Pn(e){return !e||e.length<=8?"****":e.slice(0,4)+"****...****"+e.slice(-4)}function qo(e){process.stdout.write(` ${b("\u2713")} ${e}
209
- `);}function kr(e){process.stdout.write(` ${v("\u26A0")} ${e}
210
- `);}function wt(e){process.stdout.write(` ${b("\u2713")} ${e}
211
- `);}function Ft(e){process.stdout.write(` ${v("\u26A0")} ${e}
212
- `);}function xt(e){process.stdout.write(` ${N("\u2717")} ${e}
213
- `);}function Ye(e){process.stdout.write(` ${m(e)}
214
- `);}function bn(e){process.stdout.write(I(C(`
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(`
215
219
  ${e}
216
- `)));}function Un(e,t=false){let r=t?`${v("\u26A0")} ${I(v(e))}`:I(e);process.stdout.write(`
220
+ `)));}function vn(e,t=false){let r=t?`${v("\u26A0")} ${b(v(e))}`:b(e);process.stdout.write(`
217
221
  ${r}
218
- `);}function Rr(){process.stdout.write(`
219
- `);}async function Xo(){bn("Auth");let e=await Nt();e.notConfigured?(kr("Not configured."),process.stdout.write(`
222
+ `);}function Ir(){process.stdout.write(`
223
+ `);}async function Bo(){In("Auth");let e=await Dt();e.notConfigured?(Pr("Not configured."),process.stdout.write(`
220
224
  `),process.stdout.write(` ${m("Run `flow-ai-obs init` to set up.")}
221
- `)):!e.ok&&e.error==="No credentials found"?kr("Not authenticated. Run `flow-ai-obs login` to set up."):e.ok?(qo("Authenticated"),process.stdout.write(` ${m("URL: ")}${e.baseUrl}
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}
222
226
  `),process.stdout.write(` ${m("Tenant: ")}${e.tenant}
223
227
  `),process.stdout.write(` ${m("User: ")}${e.user}
224
228
  `),process.stdout.write(` ${m("Storage: ANTHROPIC_AUTH_TOKEN (settings.json)")}
225
- `)):kr(`Session rejected by ${e.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`);let t={},r={};try{let u=___namespace.readFileSync(Q(),"utf8");r=JSON.parse(u),t=r.env||{};}catch{}bn("Observability configuration (OpenTelemetry)");let n=Object.keys(oe).filter(u=>!t[u]);Un("Metrics and Logs",n.length>0),n.length===0?(wt("All OTEL env vars present in settings.json"),Ye(`Endpoint: ${t.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
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(`
226
230
  `),process.stdout.write(` ${m("Run: flow-ai-obs init (restores missing vars automatically)")}
227
231
  `),process.stdout.write(`
228
- `),Ft(`${n.length} OTEL var(s) missing from settings.json`),n.forEach(u=>xt(`Missing: ${u}`))),Rr();for(let u of Object.keys(oe)){let f=t[u]??N("(missing)");process.stdout.write(m(` ${u.padEnd(36)}`)+f+`
229
- `);}let s=r.hooks??{},o=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],i=o.every(u=>{let f=s[u];return Array.isArray(f)?f.some(S=>{let T=S;return Array.isArray(T?.hooks)&&T.hooks.some(y=>y?.command?.startsWith(tt.CLI))}):false});Un("Tracing",!i),i?wt("Hooks registered (trace capture)"):(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(`
230
234
  `),process.stdout.write(` ${m("Run `flow-ai-obs init` to configure.")}
231
235
  `),process.stdout.write(`
232
- `),Ft("Hooks NOT registered."));for(let u of o){let f=we[u];process.stdout.write(m(` ${u.padEnd(18)}`)+`\u2192 flow-ai-obs ${u} (timeout: ${f}s)
233
- `);}Rr();let a=process.env[p.FLOW_TELEMETRY]==="true",c=process.env[p.LANGFUSE_BASE_URL],d=process.env[p.LANGFUSE_PUBLIC_KEY],E=process.env[p.LANGFUSE_SECRET_KEY];if(a)if(c&&d&&E){let u=await re();for(let f of u)f.mode==="direct"&&(wt("FLOW_TELEMETRY=true (direct mode enabled)"),wt("Mode: direct"),Ye(`Endpoint: ${f.endpoint}`),Ye(`PK: ${Pn(d)}`),Ye(`SK: ${Pn(E)}`));}else Ft("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),c||xt("LANGFUSE_BASE_URL not set"),d||xt("LANGFUSE_PUBLIC_KEY not set"),E||xt("LANGFUSE_SECRET_KEY not set");else {let u=await re();if(u.length>0)for(let f of u)f.mode==="gateway"&&(wt("Mode: gateway"),Ye(`Endpoint: ${f.endpoint}`));else u.authError?Ft("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):Ye("No active tracing destination configured.");}return Rr(),0}var $n=h(()=>{"use strict";X();ie();R();he();yr();});var Fn={};H(Fn,{runOtelHeaders:()=>zo});async function zo(){let e=ut(),t=It(),r=ce(ot(p.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.
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.
238
+ `)+m(` Set FLOW_API_KEY=<key> in your environment and re-run.
239
+
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.
234
245
  Run: flow-ai-obs init --custom-email <EMAIL>
235
- `),1;if(!e&&process.env[p.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.
246
+ `),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.
236
247
  `),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)+`
237
248
  `),0}if(!r)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs login
238
- `),1;let n=ot(p.FLOW_BASE_URL),s=process.env[p.FLOW_BASE_URL];n&&(process.env[p.FLOW_BASE_URL]=n);let o;try{o=(await K(r)).accessToken;}catch(i){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${i.message}
239
- `),1}finally{s===void 0?delete process.env[p.FLOW_BASE_URL]:process.env[p.FLOW_BASE_URL]=s;}return o?(process.stdout.write(JSON.stringify({Authorization:`Bearer ${o.replace(/[\r\n]/g,"")}`})+`
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}
250
+ `),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,"")}`})+`
240
251
  `),0):(process.stderr.write(`[flow-ai-obs otel-headers] Empty token received
241
- `),1)}var xn=h(()=>{"use strict";Se();X();ie();R();});function ee(e,t){let r=typeof e=="object"?JSON.stringify(e):String(e??"");return r.length>t?r.slice(0,t)+" \u2026[truncated]":r}function Dt(e,t=100){return String(e??"").split(`
242
- `)[0].slice(0,t).trim()}function _t(){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 F(e){process.stdout.write(JSON.stringify(e));}var Ke=h(()=>{"use strict";});function le(){return String(BigInt(Date.now())*1000000n)}var vr,Oe,St=h(()=>{"use strict";vr=()=>wn.randomBytes(16).toString("hex"),Oe=()=>wn.randomBytes(8).toString("hex");});function ci(e,t){let r=k.resolve(e);if(!r.startsWith(t))throw new Error(`Path traversal detected: ${e}`);return r}function Ir(e){if(!ii.test(e))throw new Error(`Invalid session ID: ${e}`);return ci(k.join(Te.tmpdir(),`flow-obs-${e}.json`),ai)}function Ge(e){let t;try{t=Ir(e);}catch{return null}if(!_.existsSync(t))return null;try{return JSON.parse(_.readFileSync(t,"utf8"))}catch{return null}}function Ve(e,t){_.writeFileSync(Ir(e),JSON.stringify(t),{encoding:"utf8",mode:384});}function Pr(e){try{_.unlinkSync(Ir(e));}catch{}}var ii,ai,Tt=h(()=>{"use strict";ii=/^[0-9a-f-]{1,64}$/i,ai=k.normalize(Te.tmpdir())+k.sep;});function Hn(e){if(!e||!_.existsSync(e))return null;try{let t=_.readFileSync(e,"utf8").trimEnd().split(`
243
- `);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 br(e){if(!e||!_.existsSync(e))return null;try{let t=_.readFileSync(e,"utf8").trimEnd().split(`
244
- `),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 d=(a.message?.content??[]).filter(u=>u.type==="text").map(u=>u.text??"").join("");d&&r.unshift(d);let E=a.message?.usage??{};n+=(E.input_tokens??0)+(E.cache_read_input_tokens??0)+(E.cache_creation_input_tokens??0),s+=E.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
245
-
246
- `),inputTokens:n,outputTokens:s,model:o}}catch{}return null}var Ur=h(()=>{"use strict";});function Kn(e){return e.replace(":","/")}function Mt(e,t){if(!e)return null;let r=Kn(e),n=[k.join(Te.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 Gn(e){return e.split(`
247
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function Vn(e){return !!e.slashSkill||e.toolCalls.some(n=>n.tool==="Skill")?e.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||gi.has(n.tool))?"complete":"prerequisite_required":null}function Bt(e,t){if(!e)return null;let r=Kn(e),n=[k.join(Te.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 d of _.readdirSync(a,{withFileTypes:true})){if(di.has(d.name)||mi.has(d.name)||fi.has(k.extname(d.name)))continue;let E=c?`${c}/${d.name}`:d.name;d.isDirectory()?i(k.join(a,d.name),E):o.push(E);}}return i(s,""),o.length>0?o:null}var di,fi,mi,gi,Wt=h(()=>{"use strict";di=new Set([".venv","__pycache__",".git","node_modules"]),fi=new Set([".pyc",".pyo"]),mi=new Set(["SKILL.md",".DS_Store",".gitignore"]);gi=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function wi(e){try{let t=e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(t,"base64").toString())}catch{return null}}function _i(e,t,r,n){return new Promise(s=>{let o=new URL(e),i=o.protocol==="https:",a=(i?Us__default.default:Xs__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 Ae(e,t={}){try{let r=ce(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,s=new Promise((u,f)=>{n=setTimeout(()=>f(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:o}=await Promise.race([K(r),s]);clearTimeout(n);let i=wi(o);if(!i)return;let a=i.tenant||r.tenant,c=JSON.stringify({action:e,booster:At().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||""}}),d=ye(At().API_URL),E=await _i(d,c,o,a);l("metrics.logEvent",`action=${e} status=${E}`);}catch(r){l("metrics.logEvent",`silenced error: ${r.message}`);}}var Ht=h(()=>{"use strict";R();Se();X();$();});async function Nr(e,t=false){if(t){process.stdout.write(JSON.stringify({decision:"block",reason:Si})+`
248
- `);return}let n=!!(await re()).authError,s=e.session_id||"unknown",o=e.prompt||"",i=e.cwd||"",a=Hn(e.transcript_path)||vr(),c=Gn(o),d=c?Mt(c,i):null,E=c?Bt(c,i):null;Ve(s,{traceId:vr(),spanId:Oe(),startNs:le(),sessionId:s,prompt:o,cwd:i,traceName:a,transcriptPath:e.transcript_path||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:d,skillArtifacts:E}),Ae("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),l("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),F(e);}var Si,Jn=h(()=>{"use strict";St();Tt();Ur();Wt();Ke();$();R();X();Ht();Si=`\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 ${Ee()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;});async function qn(e){let t=e.session_id||"unknown",r=e.tool_name||"unknown",n=e.tool_input||{},s=Ge(t);s&&(s.pendingTool={name:r,inputStr:ee(n,q.TOOL_INPUT),startNs:le()},Ve(t,s)),l("PreToolUse",`sid=${t}`,`tool=${r}`,`stateFound=${!!s}`),F(e);}var Xn=h(()=>{"use strict";St();Tt();Ke();$();R();});function g(e,t){return t==null||t===""?null:{key:e,value:{stringValue:String(t)}}}function Le(...e){return e.filter(t=>t!==null)}function zn(e,t){return {resourceSpans:[{resource:{attributes:e},scopeSpans:[{scope:Ti,spans:Array.isArray(t)?t:[t]}]}]}}var Ti,A,Zn=h(()=>{"use strict";R();Ti={name:Ot.SCOPE_NAME,version:Ot.SCOPE_VERSION},A={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[p.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(Qn,o+`
249
- `,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${Qn}`);}catch(i){l("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Ri(e){let t=new URL(e),r=new URL(te().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?Us__default.default:Xs__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=Ri(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 jt(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=h(()=>{"use strict";R();$();Qn=k.join(Te.tmpdir(),"flow-obs-requests.ndjson");});function vi(){let e=parseInt(process.env[p.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(e)?Math.max(Y.MIN_TTL_DAYS,Math.min(Y.MAX_TTL_DAYS,e)):Y.DEFAULT_TTL_DAYS)*24*60*60*1e3}function Ii(){let e=parseInt(process.env[p.BUFFER_MAX_FILES]??"",10);return Number.isFinite(e)?Math.max(Y.MIN_MAX_FILES,Math.min(Y.MAX_MAX_FILES,e)):Y.DEFAULT_MAX_FILES}function os(e){if(/[/\\]/.test(e))throw new Error(`Invalid buffer fileId: ${e}`);return k__namespace.default.join(Te__namespace.default.tmpdir(),`${Y.FILE_PREFIX}${e}.json`)}function $r(){let e=Te__namespace.default.tmpdir(),t;try{t=___namespace.default.readdirSync(e);}catch{return []}return t.filter(r=>r.startsWith(Y.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 yt(e){try{let t=Ii(),r=$r();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(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=$r(),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 as(e){try{___namespace.default.unlinkSync(os(e)),l("buffer",`deleted fileId=${e}`);}catch{}}function cs(){let e=Date.now()-vi();for(let t of $r())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 ls=h(()=>{"use strict";R();$();});async function Pi(e){cs();let t=is(Y.REPLAY_BATCH_SIZE);t.length&&(l("replayBufferedTraces",`replaying ${t.length} buffered trace(s)`),await Promise.allSettled(t.map(async r=>{try{let n=await jt(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 re();if(!t.length)return t.authError&&(l("postToLangfuse","auth refresh failed \u2014 buffering trace"),yt(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 Pi(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"),yt(e),0;let c=await jt(e,o.endpoint,o.authHeader);return (c===0||c>=500)&&(l("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),yt(e)),c}let a=await jt(e,o.endpoint,o.authHeader);return (a===0||a>=500)&&(l("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),yt(e)),a}))).find(o=>o!==0)??0}var ps=h(()=>{"use strict";X();$();ns();ls();R();});var Fr=h(()=>{"use strict";Zn();ps();});function pe(e){if(e==null)return "";let t=typeof e=="string"?e:JSON.stringify(e);return Ci.reduce((r,{re:n,replace:s})=>r.replace(n,s),t)}var V,bi,Ui,Ni,ds,Ci,xr=h(()=>{"use strict";V="[REDACTED]",bi="[REDACTED-EMAIL]",Ui="[REDACTED-CPF]",Ni="[REDACTED-CNPJ]",ds="[REDACTED-PHONE]",Ci=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${V}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${V}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(e,t)=>`${t}${V}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(e,t)=>`${t}${V}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(e,t,r)=>`${t}
250
- ${V}
251
- ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${V}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(e,t)=>`${t}${V}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${V}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${V}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${V}`},{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}${V}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(e,t)=>`${t}:${V}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>bi},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Ui},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Ni},{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=Ge(t);if(!i){F(e);return}let a=le(),c=i.pendingTool,d=c?.name===r,E=d?c.startNs:String(BigInt(a)-200000000n),u=d?c.inputStr:ee(n,q.TOOL_INPUT),f=u,S=null;if(r==="Skill"){let ne=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);S=ne?String(ne).trim():null;let me=S?Mt(S,i.cwd):null;me&&(f=me,i.skillContent||(i.skillContent=me),i.skillArtifacts||(i.skillArtifacts=Bt(S,i.cwd))),S&&!i.slashSkill&&(i.slashSkill=S),l("PostToolUse","Skill tool detected",`skillName=${S}`,`contentFound=${!!me}`);}let T=pe(ee(o,q.TOOL_OUTPUT)),y=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(T.slice(0,500)),Re=y?"ERROR":"DEFAULT",fe=Oe(),w=Math.round(Number(BigInt(a)-BigInt(E))/1e6),Z={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",x=r==="Skill"&&S?S:Dt(u,60);i.toolCalls.push({tool:r,brief:x,error:y,durationMs:w});let D=i.spans;D.push({traceId:i.traceId,spanId:fe,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:E,endTimeUnixNano:a,attributes:Le(g(A.OBS_NAME,r),g(A.OBS_TYPE,Z),g(A.OBS_LEVEL,Re),g(A.OBS_INPUT,pe(f)),g(A.OBS_OUTPUT,T),g("tool.name",r),g("tool.error",String(y)),r==="Skill"&&S?g("skill.name",S):null,r==="Skill"?g("skill.invocation","slash-command"):null),status:{code:y?2:1}}),i.pendingTool=null,Ve(t,i),y&&Ae("TOOL_ERROR",{toolName:r}),l("PostToolUse",`sid=${t}`,`tool=${r}`,`error=${y}`,`durationMs=${w}`,`totalSpans=${D.length}`),F(e);}var ms=h(()=>{"use strict";St();Tt();Fr();Ke();Wt();$();R();xr();Ht();});function hs(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,Es=h(()=>{"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 ws(e){let t=e.session_id||"unknown",r=e.stop_reason||"end_turn",n=Ge(t);if(!n){F(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=le(),o=await En(),i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(O=>O.tool==="Skill")){let O=Oe(),ge=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:O,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:Le(g(A.OBS_NAME,"Skill"),g(A.OBS_TYPE,"TOOL"),g(A.OBS_LEVEL,"DEFAULT"),g(A.OBS_INPUT,ge),g(A.OBS_OUTPUT,"loaded via slash command"),g("tool.name","Skill"),g("tool.error","false"),g("skill.name",n.slashSkill),g("skill.invocation","slash-command")),status:{code:1}}),l("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=e.transcript_path||n.transcriptPath||"",d=br(c);if(c&&(i.some(O=>O.tool==="Skill"&&!O.synthetic)||!!n.slashSkill)&&!d?.text){await new Promise(ge=>setTimeout(ge,500));let O=br(c);O?.text&&(d=O);}l("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${d?`text=${d.text.length}chars`:"null"}`);let u=i.length,f=i.filter(O=>O.error).length,S=pe(d?.text?ee(d.text,q.TRACE_OUTPUT):u===0?"No tools used":i.map((O,ge)=>`${ge+1}. ${O.tool}${O.brief?` \u2192 ${O.brief}`:""}${O.error?" [ERROR]":""}`).join(`
252
- `)),T=d?.inputTokens??0,y=d?.outputTokens??0,Re=i.map((O,ge)=>`${ge+1}. ${O.tool}${O.brief?` \u2192 ${O.brief}`:""}${O.error?" [ERROR]":""} (${O.durationMs}ms)`),fe=!!(n.slashSkill||i.some(O=>O.tool==="Skill")),w=i.some(O=>O.tool==="Agent");if(!fe&&!w){l("Stop",`sid=${t}`,"skipping trace \u2014 no Skill or Agent calls found"),Ae("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),Pr(t),F(e);return}let P=fe?"skill":"agent",Z=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),x=d?.model||"",W=hs(x,T,y),D=Vn(n);D==="prerequisite_required"&&d?.text&&(D="complete"),D==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:Oe(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Le(g(A.OBS_NAME,"prerequisite-check"),g(A.OBS_TYPE,"EVENT"),g(A.OBS_LEVEL,"WARNING"),g(A.OBS_OUTPUT,S),g("skill.name",n.slashSkill||void 0),g("execution_status","prerequisite_required")),status:{code:1}}),l("Stop",`sid=${t}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let ne=(()=>{if(!(!fe||!n.prompt)){if(n.slashSkill){let O=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return O?ee(pe(O),q.USER_INSTRUCTION):void 0}return ee(pe(n.prompt),q.USER_INSTRUCTION)||void 0}})(),me=JSON.stringify({trace_type:P,...D!==null&&{execution_status:D},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...ne!==void 0&&{user_instruction:ne},latency_ms:Z,...T&&{tokens_input:T},...y&&{tokens_output:y},cost_usd:W,...x?{model:x}:{},toolCount:u,errorCount:f,stopReason:r,sessionId:n.sessionId,tools:Re.length?Re:void 0}),ve=pe(ee(n.prompt,q.TRACE_INPUT)),Ie=Le(g(A.TRACE_NAME,n.traceName),g(A.TRACE_INPUT,ve),g(A.TRACE_OUTPUT,S),g(A.OBS_INPUT,ve),g(A.OBS_OUTPUT,S),g(A.TRACE_METADATA,me),g(A.SESSION_ID,n.sessionId),g(A.USER_ID,o.user),g(A.OBS_TYPE,"GENERATION"),g(A.MODEL,x),T?g(A.INPUT_TOKENS,T):null,y?g(A.OUTPUT_TOKENS,y):null,g("claude.stop_reason",r),g("claude.tool_count",String(u)),g("claude.error_count",String(f)),g("claude.session_id",n.sessionId),g("flow.trace_type",P),{key:A.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:P}]}}}),Yt={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Ie,status:{code:f>0?2:1}},Os=Le(g("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),g("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Dr=[...a,Yt];l("Stop",`sid=${t}`,`totalTools=${u}`,`errorTools=${f}`,`spans=${Dr.length}`,`inputTokens=${T}`,`outputTokens=${y}`,`traceOutput="${Dt(S,80)}"`);let As=await us(zn(Os,Dr));l("Stop",`POST status=${As}`,`traceId=${n.traceId}`),Ae("TRACE_SENT",{latencyMs:Z,totalTools:u,errorTools:f,inputTokens:T,outputTokens:y,costUsd:W}),Pr(t),F(e);}var _s=h(()=>{"use strict";St();Tt();Fr();X();Es();Ur();Ke();$();Wt();xr();R();Ht();});var ke,Ss=h(()=>{"use strict";X();Ke();Jn();Xn();ms();_s();ke=class{static async userPromptSubmit(){let t=await _t(),r;try{r=await re();}catch{F(t);return}r.authError?await Nr(t,!0):r.length>0?await Nr(t):F(t);}static async preToolUse(){let t=await _t();await qn(t);}static async postToolUse(){let t=await _t();await fs(t);}static async stop(){let t=await _t();await ws(t);}};});var Fi={};async function $i(){let e=process.argv[2];switch(e){case "UserPromptSubmit":await ke.userPromptSubmit();break;case "PreToolUse":await ke.preToolUse();break;case "PostToolUse":await ke.postToolUse();break;case "Stop":await ke.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${e}
253
- `),process.stdin.on("data",t=>process.stdout.write(t));}}var Ts=h(()=>{"use strict";Ss();$i().catch(e=>{process.stderr.write(`[flow-obs] fatal: ${e.message}
254
- `),process.exit(0);});});var xi=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,J]=process.argv;function de(e,t){let r=e.indexOf(t);return r!==-1?e[r+1]:void 0}function ys(){let{bold:e,cyan:t,dim:r,green:n}=(he(),M(Gt)),{version:s}=Xe();process.stdout.write(`
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(`
255
+ `),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
+
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(`
255
266
  `+e(" flow-ai-obs")+r(" v"+s)+`
256
267
 
257
268
  `),process.stdout.write(t(" init")+r(` Configure environment: Claude Code + Proxy + OTEL + Trace hooks
@@ -270,17 +281,18 @@ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${V}`},{re:/(aws_secret_ac
270
281
 
271
282
  `)),process.stdout.write(r(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
272
283
 
273
- `));}if(J==="--version"||J==="-v")(async()=>{let{version:e}=Xe();process.stdout.write(e+`
274
- `);let t=(Ne(),M(Ue)),r=await t.fetchLatestVersionAsync().catch(()=>null);if(r&&t.isNewer(e,r.version)){let{dim:n,yellow:s}=(he(),M(Gt));process.stdout.write(s(`
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(`
275
286
  Update available: ${e} \u2192 ${r.version}
276
287
  `)+n(` Run: flow-ai-obs update
277
288
 
278
- `));}process.exit(0);})().catch(()=>process.exit(0));else if(J==="--help"||J==="-h")ys(),process.exit(0);else if(J==="init"||J==="install")(async()=>{J==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
279
- `),await(Ne(),M(Ue)).checkForUpdateInteractive();let{runInit:e}=(In(),M(vn)),t=process.argv.slice(3);process.exit(await e({url:de(t,"--custom-url"),noInteractive:t.includes("--no-interactive"),email:de(t,"--custom-email"),clientId:de(t,"--client-id"),clientSecret:de(t,"--client-secret"),tenant:de(t,"--tenant")}));})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
280
- `),process.exit(1);});else if(J==="login")(async()=>{await(Ne(),M(Ue)).checkForUpdateInteractive();let{runLogin:e}=(mt(),M(ft)),t=process.argv.slice(3),r=await e({clientId:de(t,"--client-id"),clientSecret:de(t,"--client-secret"),tenant:de(t,"--tenant")});process.exit(typeof r=="number"?r:r.code);})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
281
- `),process.exit(1);});else if(J==="status")(async()=>{await(Ne(),M(Ue)).checkForUpdateInteractive();let{runStatus:e}=($n(),M(Cn));process.exit(await e());})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
282
- `),process.exit(1);});else if(J==="update")(async()=>{let e=(Ne(),M(Ue)),{version:t}=Xe(),r=await e.fetchLatestVersionAsync();r||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
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.
283
295
  `),process.exit(1)),e.isNewer(t,r.version)||(process.stdout.write(` \u2713 Already up to date (v${t})
284
296
  `),process.exit(0)),await e.runUpdate(r.version),process.exit(0);})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
285
- `),process.exit(1);});else if(J==="otel-headers"){let{runOtelHeaders:e}=(xn(),M(Fn));e().then(t=>process.exit(t)).catch(t=>{process.stderr.write(`[flow-ai-obs otel-headers] Unexpected error: ${t.message}
286
- `),process.exit(1);});}else xi.has(J)?(Ts(),M(Fi)):(ys(),process.exit(0));
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));