@ciandt-flow/flow-ai-obs 0.7.0-beta.484 → 0.7.0-beta.524

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,177 +1,227 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var Gt=require('readline/promises'),qs=require('https'),_=require('fs'),j=require('os'),rt=require('path'),child_process=require('child_process'),crypto=require('crypto'),Dr=require('http');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Gt__namespace=/*#__PURE__*/_interopNamespace(Gt);var qs__default=/*#__PURE__*/_interopDefault(qs);var ___namespace=/*#__PURE__*/_interopNamespace(_);var j__namespace=/*#__PURE__*/_interopNamespace(j);var rt__namespace=/*#__PURE__*/_interopNamespace(rt);var Dr__default=/*#__PURE__*/_interopDefault(Dr);var jt=Object.defineProperty;var Ms=Object.getOwnPropertyDescriptor;var Bs=Object.getOwnPropertyNames;var Hs=Object.prototype.hasOwnProperty;var Ws=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,s)=>(typeof require<"u"?require:e)[s]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var f=(t,e,s)=>()=>{if(s)throw s[0];try{return t&&(e=t(t=0)),e}catch(r){throw s=[r],r}};var js=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(s){throw e=0,s}},ft=(t,e)=>{for(var s in e)jt(t,s,{get:e[s],enumerable:true});},Ys=(t,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Bs(e))!Hs.call(t,n)&&n!==s&&jt(t,n,{get:()=>e[n],enumerable:!(r=Ms(e,n))||r.enumerable});return t};var $=t=>Ys(jt({},"__esModule",{value:true}),t);var At=js((on,Gs)=>{Gs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.0-beta.484",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'})"`,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"},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:{},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",prettier:"^3.5.3","ts-jest":"^29.4.9",tsup:"^8.5.1",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});var Yt={};ft(Yt,{bold:()=>F,cyan:()=>bt,dim:()=>S,green:()=>U,red:()=>vt,yellow:()=>y});function et(t,e){return Xs?s=>`\x1B[${t}m${s}\x1B[${e}m`:s=>s}var Xs,U,vt,y,bt,F,S,mt=f(()=>{"use strict";Xs=!process.env.NO_COLOR&&process.stdout.isTTY;U=et("32","39"),vt=et("31","39"),y=et("33","39"),bt=et("36","39"),F=et("1","22"),S=et("2","22");});function st(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function kt(t,e){let s=Gt__namespace.createInterface({input:process.stdin,output:process.stdout}),n=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let l=(await s.question(n)).toLowerCase().replace(/[^a-z]/g,"");if(l===""&&e!==void 0)return s.close(),e;if(l==="y"||l==="yes")return s.close(),!0;if(l==="n"||l==="no")return s.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
- `);}catch(i){throw s.close(),i}if(s.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function Ut(t,e){let s=Gt__namespace.createInterface({input:process.stdin,output:process.stdout});try{let r=(await s.question(`${t}: `)).trim();if(e){let n=e(r);if(n)throw new Error(n)}return r}catch(r){throw r}finally{s.close();}}var Xt=f(()=>{"use strict";});var Pt={};ft(Pt,{checkForUpdate:()=>tr,checkForUpdateInteractive:()=>er,isNewer:()=>gt,primeUpdateCache:()=>sr});function A(){return qt||(qt=At()),qt}function gt(t,e){let s=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},r=s(t),n=s(e);return !r||!n?false:n[0]!==r[0]?n[0]>r[0]:n[1]!==r[1]?n[1]>r[1]:n[2]>r[2]}function zt(){try{let t=JSON.parse(___namespace.default.readFileSync(we,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=zs?null:t}catch{return null}}function Oe(t,e,s=Date.now()){try{___namespace.default.writeFileSync(we,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:s}),{mode:384});}catch{}}function Le(t){let e=A().name,s=qs__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:Ks},r=>{if(r.statusCode!==200)return r.resume(),t(new Error(`HTTP ${r.statusCode}`));let n="";r.setEncoding("utf8"),r.on("data",o=>{n+=o;}),r.on("end",()=>{try{let o=JSON.parse(n);if(typeof o.version!="string")throw new Error("no version field");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});s.on("error",t),s.on("timeout",()=>{s.destroy(new Error("timeout"));});}function Vt(t){let e=A().name,r=` Update available: ${A().version} \u2192 ${t}`,n=` Run: npm install -g ${e}`,o=Math.max(r.length,n.length)+2,i="\u2500".repeat(o);process.stderr.write(`
2
+ 'use strict';var ke=require('readline/promises'),as=require('https'),S=require('fs'),tt=require('os'),kt=require('path'),child_process=require('child_process'),ks=require('http'),util=require('util'),crypto=require('crypto');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var ke__namespace=/*#__PURE__*/_interopNamespace(ke);var as__namespace=/*#__PURE__*/_interopNamespace(as);var S__namespace=/*#__PURE__*/_interopNamespace(S);var tt__namespace=/*#__PURE__*/_interopNamespace(tt);var kt__namespace=/*#__PURE__*/_interopNamespace(kt);var ks__namespace=/*#__PURE__*/_interopNamespace(ks);var _e=Object.defineProperty;var ts=Object.getOwnPropertyDescriptor;var es=Object.getOwnPropertyNames;var rs=Object.prototype.hasOwnProperty;var Ft=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var m=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var ns=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},M=(t,e)=>{for(var r in e)_e(t,r,{get:e[r],enumerable:true});},ss=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of es(e))!rs.call(t,s)&&s!==r&&_e(t,s,{get:()=>e[s],enumerable:!(n=ts(e,s))||n.enumerable});return t};var v=t=>ss(_e({},"__esModule",{value:true}),t);var re=ns((zo,os)=>{os.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.0-beta.524",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'})"`,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"},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:{},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",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});var Oe={};M(Oe,{bold:()=>j,cyan:()=>H,dim:()=>w,green:()=>I,red:()=>B,yellow:()=>_});function mt(t,e){return is?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var is,I,B,_,H,j,w,gt=m(()=>{"use strict";is=!process.env.NO_COLOR&&process.stdout.isTTY;I=mt("32","39"),B=mt("31","39"),_=mt("33","39"),H=mt("36","39"),j=mt("1","22"),w=mt("2","22");});function ht(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function Ae(t,e){let r=ke__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&e!==void 0)return r.close(),e;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
+ `);}catch(i){throw r.close(),i}if(r.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function dr(t,e){let r=ke__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${t}: `)).trim();if(e);return n}catch(n){throw n}finally{r.close();}}var Le=m(()=>{"use strict";});var wt={};M(wt,{checkForUpdate:()=>ms,checkForUpdateInteractive:()=>gs,isNewer:()=>xt,primeUpdateCache:()=>hs});function U(){return ve||(ve=re()),ve}function xt(t,e){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(t),s=r(e);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function Re(){try{let t=JSON.parse(S__namespace.default.readFileSync(mr,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=us?null:t}catch{return null}}function gr(t,e,r=Date.now()){try{S__namespace.default.writeFileSync(mr,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:r}),{mode:384});}catch{}}function hr(t){let e=U().name,r=as__namespace.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:ds},n=>{if(n.statusCode!==200)return n.resume(),t(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});r.on("error",t),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function Ie(t){let e=U().name,n=` Update available: ${U().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
4
4
  \u256D${i}\u256E
5
- \u2502${r.padEnd(o)}\u2502
6
5
  \u2502${n.padEnd(o)}\u2502
6
+ \u2502${s.padEnd(o)}\u2502
7
7
  \u2570${i}\u256F
8
8
 
9
- `);}function Jt(t){let e=A().name;process.stderr.write(`
9
+ `);}function be(t){let e=U().name;process.stderr.write(`
10
10
  [${e}] Critical update detected \u2014 auto-updating to ${t}...
11
11
 
12
- `),child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",windowsHide:true}).unref();}async function Zs(t,e=1e4){let s=Ws("readline"),r=A().name,n=A().version;return process.stderr.write(`
13
- Update available: ${n} \u2192 ${t}
14
- Run: npm install -g ${r}@${t}
15
- Install now? [y/N]: `),new Promise(o=>{let i=s.createInterface({input:process.stdin,output:void 0,terminal:false}),l=false;function p(d){l||(l=true,clearTimeout(a),i.close(),process.stderr.write(`
16
- `),o(d));}let a=setTimeout(()=>p(false),e);i.once("line",d=>p(d.trim().toLowerCase()==="y")),i.once("close",()=>p(false));})}async function Qs(t){let e=A().name;return process.stderr.write(` Installing ${e}@${t}...
17
- `),new Promise(s=>{let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit"});r.on("close",n=>{n!==0?process.stderr.write(` \u2717 Update failed \u2014 continuing with current version.
12
+ `),child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",windowsHide:true}).unref();}async function ps(t,e=1e4){let r=Ft("readline"),n=U().name,s=U().version;return process.stderr.write(`
13
+ Update available: ${s} \u2192 ${t}
14
+ Run: npm install -g ${n}@${t}
15
+ Install now? [y/N]: `),new Promise(o=>{let i=r.createInterface({input:process.stdin,output:void 0,terminal:false}),c=false;function l(d){c||(c=true,clearTimeout(a),i.close(),process.stderr.write(`
16
+ `),o(d));}let a=setTimeout(()=>l(false),e);i.once("line",d=>l(d.trim().toLowerCase()==="y")),i.once("close",()=>l(false));})}async function fs(t){let e=U().name;return process.stderr.write(` Installing ${e}@${t}...
17
+ `),new Promise(r=>{let n=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit"});n.on("close",s=>{s!==0?process.stderr.write(` \u2717 Update failed \u2014 continuing with current version.
18
18
 
19
19
  `):process.stderr.write(` \u2713 Updated to ${t}. Please restart the command.
20
20
 
21
- `),s();}),r.on("error",()=>{process.stderr.write(` \u2717 Update failed \u2014 continuing with current version.
21
+ `),r();}),n.on("error",()=>{process.stderr.write(` \u2717 Update failed \u2014 continuing with current version.
22
22
 
23
- `),s();});})}function tr(){try{let t=zt();if(t){gt(A().version,t.latestVersion)&&(t.updatePriority==="auto"?Jt(t.latestVersion):Vt(t.latestVersion));return}setImmediate(()=>{Le((e,s)=>{e||!s||(Oe(s.version,s.updatePriority),gt(A().version,s.version)&&(s.updatePriority==="auto"?Jt(s.version):Vt(s.version)));});});}catch{}}async function er(t={}){try{let e=zt();if(!e||!gt(A().version,e.latestVersion))return;if(e.updatePriority==="auto"){Jt(e.latestVersion);return}if(!st()){Vt(e.latestVersion);return}await Zs(e.latestVersion,t.timeoutMs)&&await Qs(e.latestVersion);}catch{}}function sr(){try{if(zt())return;setImmediate(()=>{Le((t,e)=>{t||!e||gt(A().version,e.version)&&Oe(e.version,e.updatePriority,0);});});}catch{}}var qt,we,zs,Ks,It=f(()=>{"use strict";Xt();we=rt__namespace.default.join(j__namespace.default.tmpdir(),"flow-obs-update-cache.json"),zs=1440*60*1e3,Ks=3e3;});function ye(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:j__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||j__namespace.userInfo().username}}function Y(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let s=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();s&&/^[A-Za-z]:\\/.test(s)&&(t=s);}if(t){let e=t.replace(/^([A-Za-z]):/,(s,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return rt__namespace.join(e,".claude","settings.json")}return rt__namespace.join(j__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||j__namespace.homedir();return rt__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return rt__namespace.join(e,".claude","settings.json")}return rt__namespace.join(j__namespace.homedir(),".claude","settings.json")}function Re(){return process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER?`Running as root via sudo is not recommended.
23
+ `),r();});})}function ms(){try{let t=Re();if(t){xt(U().version,t.latestVersion)&&(t.updatePriority==="auto"?be(t.latestVersion):Ie(t.latestVersion));return}setImmediate(()=>{hr((e,r)=>{e||!r||(gr(r.version,r.updatePriority),xt(U().version,r.version)&&(r.updatePriority==="auto"?be(r.version):Ie(r.version)));});});}catch{}}async function gs(t={}){try{let e=Re();if(!e||!xt(U().version,e.latestVersion))return;if(e.updatePriority==="auto"){be(e.latestVersion);return}if(!ht()){Ie(e.latestVersion);return}await ps(e.latestVersion,t.timeoutMs)&&await fs(e.latestVersion);}catch{}}function hs(){try{if(Re())return;setImmediate(()=>{hr((t,e)=>{t||!e||xt(U().version,e.version)&&gr(e.version,e.updatePriority,0);});});}catch{}}var ve,mr,us,ds,Et=m(()=>{"use strict";Le();mr=kt__namespace.default.join(tt__namespace.default.tmpdir(),"flow-obs-update-cache.json"),us=1440*60*1e3,ds=3e3;});function wr(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:tt__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||tt__namespace.userInfo().username}}function G(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(t=r);}if(t){let e=t.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return kt__namespace.join(e,".claude","settings.json")}return kt__namespace.join(tt__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||tt__namespace.homedir();return kt__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return kt__namespace.join(e,".claude","settings.json")}return kt__namespace.join(tt__namespace.homedir(),".claude","settings.json")}function Er(){return process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER?`Running as root via sudo is not recommended.
24
24
  Configure npm to install globals without sudo:
25
25
  npm config set prefix '~/.npm-global'
26
- export PATH=~/.npm-global/bin:$PATH`:null}var Nt=f(()=>{"use strict";});function ke(){if(process.platform==="win32"){let s=process.env.APPDATA||rt__namespace.join(j__namespace.homedir(),"AppData","Roaming");return rt__namespace.join(s,Ae,ve)}let t=ye(),e=process.env.XDG_CONFIG_HOME||rt__namespace.join(t.home,".config");return rt__namespace.join(e,Ae,ve)}function Ue(){try{let t=___namespace.readFileSync(ke(),"utf8");return JSON.parse(t)}catch{return {}}}function X(){let{baseUrl:t}=Ue();return typeof t!="string"||t.trim()===""?null:t.trim().replace(/\/$/,"")}function Pe(t){let e=ke();___namespace.mkdirSync(rt__namespace.dirname(e),{recursive:true});let r={...Ue(),baseUrl:t};___namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
27
- `,{encoding:"utf8",mode:384});}var Ae,ve,Zt=f(()=>{"use strict";Nt();Ae="flow-ai-obs",ve="config.json";});function Qt(){return X()??process.env.FLOW_BASE_URL??rr}function te(){let t=Qt();return {GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}function Et(){let t=Qt();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function se(){let t=Qt();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var rr,nr,ee,q,E,Ie,Ne,v,Ce,P,w=f(()=>{"use strict";Zt();rr="https://flow.ciandt.com";nr=te(),ee={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};q={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:nr.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},E={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_MODEL:"ANTHROPIC_MODEL",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL"},Ie={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3},Ne={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15},v={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},Ce="flow-ai-obs-debug.log",P={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};});function $e(t){try{let e=___namespace.statSync(t);Date.now()-e.mtimeMs>or&&___namespace.unlinkSync(t);}catch{}try{___namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function Fe(t){try{___namespace.unlinkSync(t);}catch{}}function ir(t,e){let r=(Array.isArray(t)?t:[]).map(n=>{if(!Array.isArray(n?.hooks))return null;let o=n.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...n,hooks:o}:null}).filter(n=>n!=null);return [e,...r]}function xe(){let t=Y(),e=t+".lock",s=[];___namespace.mkdirSync(rt__namespace.dirname(t),{recursive:true}),$e(e);try{if(___namespace.existsSync(t)){___namespace.copyFileSync(t,t+".bkp");try{___namespace.chmodSync(t+".bkp",384);}catch{}}let r={};if(___namespace.existsSync(t)){try{r=JSON.parse(___namespace.readFileSync(t,"utf8"));}catch{}"otelHeadersHelper"in r&&delete r.otelHeadersHelper;}let n=r.env&&typeof r.env=="object"?r.env:{};r.env={...q,...Et(),...n},(!r.hooks||typeof r.hooks!="object"||Array.isArray(r.hooks))&&(r.hooks={});let o=(p,a)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${p}`,timeout:a}]}),i=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],l=r.hooks;for(let p of i){let a=ir(l[p],o(p,Ne[p]));a.length>1&&s.push(p),l[p]=a;}___namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
28
- `,{encoding:"utf8",mode:384});try{___namespace.chmodSync(t,384);}catch{}}finally{Fe(e);}return {settingsPath:t,preserved:s}}function ot(t){let e=Y(),s=e+".lock";___namespace.mkdirSync(rt__namespace.dirname(e),{recursive:true}),$e(s);try{let r={};try{r=JSON.parse(___namespace.readFileSync(e,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,t),___namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
29
- `,{encoding:"utf8",mode:384});try{___namespace.chmodSync(e,384);}catch{}}finally{Fe(s);}}var or,Ct=f(()=>{"use strict";w();Nt();or=Ie.LOCK_STALE_MS;});function c(...t){if(process.env[E.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
30
- `;try{_.writeFileSync(ur,e,{flag:"a"});}catch(s){process.stderr.write(`[flow-obs debug ERROR] ${s.message}
31
- `);}}var ur,I=f(()=>{"use strict";w();ur=rt.join(j.tmpdir(),Ce);});function dr(t){return pr.some(e=>e.test(t))}function V(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let s=process.env[E.FLOW_OBS_ALLOW_HTTP]==="true";if(!s&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!s&&dr(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}function fr(t){if(!t||!t.trim())return [];let e=[];for(let s of t.split(",")){let r=s.indexOf("=");if(r===-1)continue;let n=s.slice(0,r).trim(),o=s.slice(r+1).trim();n&&e.push([n,o]);}return e}function mr(t,e,s){let r=Buffer.from(`${e}:${s}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",headers:[["Authorization",`Basic ${r}`]]}}async function _t(){let t=[],e=process.env[E.ANTHROPIC_MODEL]??"",s=process.env.OTEL_EXPORTER_OTLP_HEADERS??"",r=fr(s);s.trim()?c("resolveCredentials",`parsed ${r.length} header(s) from OTEL_EXPORTER_OTLP_HEADERS`):(c("resolveCredentials","OTEL_EXPORTER_OTLP_HEADERS not set \u2014 no extra headers will be forwarded"),console.warn("[flow-ai-obs] OTEL_EXPORTER_OTLP_HEADERS is not set. No extra headers will be forwarded to the OTLP gateway."));let n=process.env[E.FLOW_TELEMETRY]==="true",o=process.env[E.LANGFUSE_BASE_URL],i=process.env[E.LANGFUSE_PUBLIC_KEY],l=process.env[E.LANGFUSE_SECRET_KEY];if(n&&o&&i&&l){let{endpoint:d,headers:h}=mr(V(o),i,l);return t.push({mode:"direct",endpoint:d,headers:h,user:"",tenant:"",team:"",project:"",model:e}),c("resolveCredentials","direct mode active",`endpoint=${d}`),t}let p=process.env[E.FLOW_TELEMETRY_GATEWAY];if(p)return t.push({mode:"gateway",endpoint:V(p).replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",headers:r,user:"",tenant:"",team:"",project:"",model:e}),c("resolveCredentials","gateway mode active via FLOW_TELEMETRY_GATEWAY_URL"),t;let a=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;return a?(t.push({mode:"otel",endpoint:V(a),headers:r,user:"",tenant:"",team:"",project:"",model:e}),c("resolveCredentials","otel mode active",`endpoint=${a}`),t):(c("resolveCredentials","no destination configured \u2014 returning empty"),t)}async function ne(){return (await _t()).length>0}function x(){let t=process.env[E.FLOW_USER_EMAIL];if(t)return c("resolveUserEmail",`using FLOW_USER_EMAIL override: ${t}`),t;try{let e=j__namespace.userInfo().username||process.env.USERNAME||process.env.USER||"",s=e.lastIndexOf("\\");if(s!==-1&&(e=e.slice(s+1)),e=e.trim().replace(/[^a-zA-Z0-9._%+\-]/g,""),!e)return c("resolveUserEmail","username empty after sanitisation \u2014 omitting x-flow-user"),console.warn("[flow-ai-obs] Could not derive x-flow-user: username is empty. Set FLOW_USER_EMAIL to fix this."),null;let r=`${e}@ciandt.com`;return c("resolveUserEmail",`derived email: ${r}`),r}catch(e){return c("resolveUserEmail",`os.userInfo() threw: ${e.message} \u2014 omitting x-flow-user`),console.warn("[flow-ai-obs] Could not derive x-flow-user from OS username. Set FLOW_USER_EMAIL to fix this."),null}}var pr,J=f(()=>{"use strict";w();I();pr=[/^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];});var je={};ft(je,{runInit:()=>oe});function gr(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux")return child_process.spawnSync("cmd.exe",["/c","where","claude"],{encoding:"utf8",timeout:5e3}).status===0;let t=process.platform==="win32"?"where":"which";return child_process.spawnSync(t,["claude"],{encoding:"utf8",timeout:5e3}).status===0}function We(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}if(e.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);let s=process.env[E.FLOW_OBS_ALLOW_HTTP];try{delete process.env[E.FLOW_OBS_ALLOW_HTTP],V(t);}finally{s!==void 0&&(process.env[E.FLOW_OBS_ALLOW_HTTP]=s);}if(e.pathname!=="/"&&e.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
26
+ export PATH=~/.npm-global/bin:$PATH`:null}var ne=m(()=>{"use strict";});function se(){if(process.platform==="win32"){let r=process.env.APPDATA||kt__namespace.join(tt__namespace.homedir(),"AppData","Roaming");return kt__namespace.join(r,Sr,Tr)}let t=wr(),e=process.env.XDG_CONFIG_HOME||kt__namespace.join(t.home,".config");return kt__namespace.join(e,Sr,Tr)}function _r(){try{let t=S__namespace.readFileSync(se(),"utf8");return JSON.parse(t)}catch{return {}}}function rt(){let{baseUrl:t}=_r();return typeof t!="string"||t.trim()===""?null:t.trim().replace(/\/$/,"")}function Or(t){let e=se();S__namespace.mkdirSync(kt__namespace.dirname(e),{recursive:true});let n={..._r(),baseUrl:t};S__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
27
+ `,{encoding:"utf8",mode:384});}var Sr,Tr,oe=m(()=>{"use strict";ne();Sr="flow-ai-obs",Tr="config.json";});function nt(){return rt()??process.env.FLOW_BASE_URL??ws}function st(){let t=nt();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}function Dt(){let t=nt();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function Ce(){let t=nt();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var ws,Es,ie,ae,ce,Ne,ot,f,le,yt,kr,$,Ar,V,O=m(()=>{"use strict";oe();ws="https://flow.ciandt.com";Es=st(),ie={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},ae="FLOW-nodejs",ce="config.json",Ne={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};ot={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:Es.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},f={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_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"},le={KEYCHAIN_ENABLED:!1},yt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3},kr={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15},$={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},Ar="flow-ai-obs-debug.log",V={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};});function u(...t){if(process.env[f.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
28
+ `;try{S.writeFileSync(_s,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
29
+ `);}}var _s,F=m(()=>{"use strict";O();_s=kt.join(tt.tmpdir(),Ar);});function Ls(t){if(!As.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function vs(t,e){let r=e.length>400?e.slice(0,400)+"\u2026":e;u("toAuthError",`status=${t} body=${r}`);try{let n=JSON.parse(e);if(typeof n.error=="string"&&(u("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),Lr[n.error]))return new it(Lr[n.error])}catch{}return t===401||t===403||t===500?new it("Invalid credentials"):t>=400&&t<500?new it("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function x(t){return new Promise((e,r)=>{try{Ls(t.tenant);}catch(a){return r(a)}let n=JSON.stringify({clientSecret:t.clientSecret}),s=new URL(st().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:t.tenant}};u("getToken",`requesting token tenant=${t.tenant} host=${i.hostname} path=${i.path}`);let l=(o?as__namespace.default:ks__namespace.default).request(i,a=>{let d=[];a.on("data",y=>d.push(y)),a.on("end",()=>{let y=d.join("");if((a.statusCode??0)>=400)return r(vs(a.statusCode??0,y));let E;try{E=JSON.parse(y);}catch{return r(new Error("Invalid response from auth engine"))}let T=E.expires_at??new Date(Date.now()+(E.expires_in??3600)*1e3).toISOString();e({accessToken:E.access_token??"",expiresAt:T});});});l.on("error",a=>r(new Error(`Network error: ${a.message}`))),l.write(n),l.end();})}var it,As,Lr,_t=m(()=>{"use strict";O();F();it=class extends Error{constructor(e){super(e),this.name="AuthError";}},As=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;Lr={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 vr(t){try{let e=S__namespace.statSync(t);Date.now()-e.mtimeMs>Rs&&S__namespace.unlinkSync(t);}catch{}try{S__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function Ir(t){try{S__namespace.unlinkSync(t);}catch{}}function Ps(t,e){let n=(Array.isArray(t)?t:[]).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 [e,...n]}function br(){let t=G(),e=t+".lock",r=[];S__namespace.mkdirSync(kt__namespace.dirname(t),{recursive:true}),vr(e);try{if(S__namespace.existsSync(t)){S__namespace.copyFileSync(t,t+".bkp");try{S__namespace.chmodSync(t+".bkp",384);}catch{}}let n=se();if(S__namespace.existsSync(n)){let a=n+".bkp";S__namespace.copyFileSync(n,a);try{S__namespace.chmodSync(a,384);}catch{}}let s={};try{s=JSON.parse(S__namespace.readFileSync(t,"utf8"));}catch{}let o=s.env&&typeof s.env=="object"?s.env:{};s.env={...ot,...Dt(),...o},s.otelHeadersHelper="flow-ai-obs otel-headers",(!s.hooks||typeof s.hooks!="object"||Array.isArray(s.hooks))&&(s.hooks={});let i=(a,d)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${a}`,timeout:d}]}),c=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],l=s.hooks;for(let a of c){let d=Ps(l[a],i(a,kr[a]));d.length>1&&r.push(a),l[a]=d;}S__namespace.writeFileSync(t,JSON.stringify(s,null,2)+`
30
+ `,{encoding:"utf8",mode:384});try{S__namespace.chmodSync(t,384);}catch{}}finally{Ir(e);}return {settingsPath:t,preserved:r}}async function Rr(t){let e;try{e=(await x(t)).accessToken;}catch{return false}return e?new Promise(r=>{Ue(`Bearer ${e}`,r,1);}):false}function Ue(t,e,r){let n=new URL(st().GATEWAY_TRACES),s=JSON.stringify({resourceSpans:[],validation_run:true}),o=n.protocol==="https:",i={hostname:n.hostname,port:n.port||(o?443:80),path:n.pathname,method:"POST",headers:{"Content-Type":"application/json",Authorization:t,"Content-Length":Buffer.byteLength(s)}},l=(o?as__namespace:ks__namespace).request(i,a=>{a.resume(),a.statusCode===200||a.statusCode===204?e(true):r<yt.CONNECTIVITY_MAX_RETRY?setTimeout(()=>Ue(t,e,r+1),yt.CONNECTIVITY_RETRY_MS):e(false);});l.on("error",()=>{r<yt.CONNECTIVITY_MAX_RETRY?setTimeout(()=>Ue(t,e,r+1),yt.CONNECTIVITY_RETRY_MS):e(false);}),l.write(s),l.end();}function Ot(t){let e=G(),r=e+".lock";S__namespace.mkdirSync(kt__namespace.dirname(e),{recursive:true}),vr(r);try{let n={};try{n=JSON.parse(S__namespace.readFileSync(e,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,t),S__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
31
+ `,{encoding:"utf8",mode:384});try{S__namespace.chmodSync(e,384);}catch{}}finally{Ir(r);}}var Rs,Mt=m(()=>{"use strict";O();_t();ne();oe();Rs=yt.LOCK_STALE_MS;});function Bt(){let t=tt__namespace.default.homedir();if(process.platform==="darwin")return kt__namespace.default.join(t,"Library","Preferences",ae,ce);if(process.platform==="win32"){let r=process.env.APPDATA??kt__namespace.default.join(t,"AppData","Roaming");return kt__namespace.default.join(r,ae,ce)}let e=process.env.XDG_CONFIG_HOME??kt__namespace.default.join(t,".config");return kt__namespace.default.join(e,ae,ce)}function xe(){try{let t=S__namespace.default.readFileSync(Bt(),"utf8");return JSON.parse(t)}catch{return {}}}function Pr(t){let e=Bt();S__namespace.default.mkdirSync(kt__namespace.default.dirname(e),{recursive:true}),S__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var Fe,ue,Nr=m(()=>{"use strict";O();Fe={credentials:"credentials","token-cache":"tokenCache"};ue=class{static isAvailable(){return !0}static hasExistingData(){try{if(!S__namespace.default.existsSync(Bt()))return !1;let e=JSON.parse(S__namespace.default.readFileSync(Bt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,r){let n=xe(),s=Fe[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(e,r,n){let s=xe(),o=Fe[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;Pr(s);}async deleteSecret(e,r){let n=xe(),s=Fe[r]??r;return s in n?(delete n[s],Pr(n),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Bt()}`}};});var Cr={};M(Cr,{MacOsKeyVaultProvider:()=>Me});var De,Me,Ur=m(()=>{"use strict";De=util.promisify(child_process.execFile),Me=class{static async isAvailable(){try{return S.accessSync("/usr/bin/security",S.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await De("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await De("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await De("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Fr={};M(Fr,{LinuxKeyVaultProvider:()=>Be});var $r,Be,xr=m(()=>{"use strict";$r=util.promisify(child_process.execFile),Be=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of e)try{return S.accessSync(r,S.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await $r("secret-tool",["lookup","service",e,"account",r]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await new Promise((s,o)=>{let i=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",r]);i.on("error",o),i.on("close",c=>{c===0?s():o(new Error(`secret-tool exited with code ${c}`));}),i.stdin.write(n),i.stdin.end();});}async deleteSecret(e,r){try{return await $r("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Dr={};M(Dr,{WindowsKeyVaultProvider:()=>He});var He,Mr=m(()=>{"use strict";He=class{static async isAvailable(){try{return await Ft("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return Ft("keytar").getPassword(e,r)}async setSecret(e,r,n){await Ft("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return Ft("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});async function Br(){return await js()??new ue}async function js(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Ur(),Cr));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(xr(),Fr));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Mr(),Dr));return await t.isAvailable()?new t:null}default:return null}}var Hr=m(()=>{"use strict";Nr();});function Lt(){return je||(je=Br()),je}async function A(){let e=await(await Lt()).getSecret(At,Ve);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function We(t){if(!t.clientId||!t.clientSecret||!t.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await Lt()).setSecret(At,Ve,JSON.stringify(t));}async function jr(){let t=await Lt();await t.deleteSecret(At,Ve),await t.deleteSecret(At,Ye);}async function jt(t){await(await Lt()).setSecret(At,Ye,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function vt(){let e=await(await Lt()).getSecret(At,Ye);if(!e)return null;try{let r=JSON.parse(e);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function de(){let t=await vt();return t?new Date(t.expiresAt)>new Date:false}async function at(){let t=await vt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}async function Ge(){let t=await Lt();if(typeof t.getStoragePath=="function")return t.getStoragePath();let e=process.platform;return e==="darwin"?"macOS Keychain":e==="win32"?"Windows Credential Manager":"Linux Secret Service (libsecret)"}async function Vr(){let t=await A();return !!(t&&t.clientId&&t.clientSecret&&t.tenant)}var At,Ve,Ye,je,It=m(()=>{"use strict";Hr();O();At=ie.SERVICE,Ve=ie.ACCOUNT_CREDS,Ye=ie.ACCOUNT_TOKEN,je=null;});function Ys(t){return Vs.some(e=>e.test(t))}function Ws(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function b(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[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 Yr(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${r}.`}function ct(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[f.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&Ys(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Wr(){let t=b(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(t)return {user:await at().catch(()=>null)??t.clientId,tenant:t.tenant};if(le.KEYCHAIN_ENABLED)try{let e=await A();if(!e)return {user:"",tenant:""};let r=await at()??e.clientId??"",n=e.tenant??"";return {user:r,tenant:n}}catch{return {user:"",tenant:""}}return {user:"",tenant:""}}function Gs(){return new Date().toISOString().slice(0,10)}async function Ks(t){let e=Gs(),r=await vt();if(r?.lastAuthCheckAt!==e){u("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let o=await x(t);try{await jt({...o,lastAuthCheckAt:e});}catch{}return u("getOrRefreshToken",`daily check passed, expires=${o.expiresAt}`),o.accessToken}catch(o){if(o instanceof it)throw o;u("getOrRefreshToken",`daily check network error \u2014 using cache: ${o.message}`);}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(u("getOrRefreshToken",`cacheValid=${n}`),n)return u("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;u("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let s=await x(t);try{await jt({...s,lastAuthCheckAt:e});}catch(o){u("getOrRefreshToken",`token cache save failed (non-fatal): ${o.message}`);}return u("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function qs(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function Js(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function K(){let t=[],e=process.env[f.ANTHROPIC_MODEL]??"",r=b(process.env[f.ANTHROPIC_AUTH_TOKEN]);u("resolveCredentials",r?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),r&&u("resolveCredentials",`clientId=${r.clientId}`,`tenant=${r.tenant}`),!r&&le.KEYCHAIN_ENABLED&&(r=await A(),r&&u("resolveCredentials","credentials resolved from keychain (FEATURES.KEYCHAIN_ENABLED=true)"));let n=r?r.tenant:"",s=process.env[f.FLOW_TELEMETRY]==="true",o=process.env[f.LANGFUSE_BASE_URL],i=process.env[f.LANGFUSE_PUBLIC_KEY],c=process.env[f.LANGFUSE_SECRET_KEY];if(s&&o&&i&&c){let E="",T=n;if(r)E=await at().catch(()=>null)??r.clientId;else if(le.KEYCHAIN_ENABLED)try{let k=await A();k&&(E=await at()??k.clientId,T=k.tenant);}catch{}let L={user:E??"",tenant:T??"",team:"",project:"",model:e};t.push({mode:"direct",...Js(ct(o),i,c),...L}),u("resolveCredentials","direct mode active",`user=${L.user}`,`tenant=${L.tenant}`);}if(!r){if(t.length===0){let E=[];return E.authError=false,E}return t}let l;try{l=await Ks(r);}catch(E){if(u("resolveCredentials",`token refresh failed: ${E.message}`,`(tenant=${r.tenant} clientId=${r.clientId})`),t.length>0)return t.authError=true,t;let T=[];return T.authError=true,T}let d={user:Ws(l)??r.clientId,tenant:n,team:"",project:"",model:e},y=process.env[f.FLOW_TELEMETRY_GATEWAY]??nt();return t.push({mode:"gateway",...qs(ct(y),{accessToken:l}),...d}),t}async function Gr(){return (await K()).length>0}var Vs,Y=m(()=>{"use strict";It();_t();O();F();Vs=[/^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 Ke(){return kt__namespace.default.join(tt__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function qr(){try{let t=Ke();S__namespace.default.mkdirSync(kt__namespace.default.dirname(t),{recursive:!0}),S__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function Jr(){try{S__namespace.default.unlinkSync(Ke());}catch{}}function fe(){try{return S__namespace.default.existsSync(Ke())}catch{return false}}var zr=m(()=>{"use strict";});var qe={};M(qe,{runLogin:()=>bt,runLogout:()=>eo,runStatus:()=>ro});function q(t){return typeof t=="string"?t.replace(Xs,""):t}function Vt(t,e={}){return new Promise((r,n)=>{let{masked:s=false,defaultValue:o=""}=e;process.stdout.write(t+o);let i=o;function c(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",c),process.once("unhandledRejection",c);let l=d=>{if(d===""){a(),n(new Error("SIGINT"));return}if(d==="\r"||d===`
32
+ `){a(),process.stdout.write(`
33
+ `),r(i);return}if(d==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}d.startsWith("\x1B")||(i+=d,process.stdout.write(s?"*".repeat(d.length):d));};function a(){process.stdin.setRawMode(false),process.stdin.removeListener("data",l),process.removeListener("uncaughtException",c),process.removeListener("unhandledRejection",c);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",l);})}async function Xr(t){if(!fe())try{await A()||await We(t);}catch{}}async function Zr(t){let{accessToken:e,expiresAt:r}=await x(t);await We(t),await jt({accessToken:e,expiresAt:r}),Jr();try{let n=Yr(t);Ot({[f.ANTHROPIC_AUTH_TOKEN]:n});}catch{}}async function Zs(t){try{return await Zr(t),process.stdout.write(I(` \u2713 Setup complete. Tenant: ${q(t.tenant)}
34
+
35
+ `)),0}catch(e){return process.stderr.write(B(` \u2717 Authentication failed: ${q(e.message)}
36
+ `)),1}}async function Qs(){try{process.stdout.write(`
37
+ `);let t=(await Vt(H(" ? ")+"Client ID: ")).trim(),e=(await Vt(H(" ? ")+"Client Secret: ",{masked:!0})).trim(),r=(await Vt(H(" ? ")+"Tenant: ")).trim();if(!t||!e||!r)return process.stderr.write(B(` \u2717 All fields are required
38
+ `)),1;try{await Zr({clientId:t,clientSecret:e,tenant:r});}catch(n){return process.stderr.write(B(` \u2717 Authentication failed: ${q(n.message)}
39
+ `)),1}return process.stdout.write(I(` \u2713 Setup complete. Tenant: ${q(r)}
40
+ `)),process.stdout.write(` Storage: ${await Ge()}
41
+
42
+ `),0}catch(t){if(t.message==="SIGINT")throw t;return process.stderr.write(B(` \u2717 Unexpected error: ${t.message}
43
+ `)),1}}async function bt(t={}){if(t.clientId&&t.clientSecret&&t.tenant)return Zs({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant});let e=fe()?null:b(process.env[f.ANTHROPIC_AUTH_TOKEN]);e&&await Xr(e);let r=e||await A();if(r){process.stdout.write(`
44
+ `),process.stdout.write(j(` Already authenticated
45
+ `)),process.stdout.write(w(" Tenant: ")+q(r.tenant)+`
46
+ `),process.stdout.write(w(" Client ID: ")+q(r.clientId)+`
47
+ `),process.stdout.write(`
48
+ `);let n;try{n=await Vt(H(" ? ")+"Re-authenticate? (y/N): ");}catch(s){if(s.message==="SIGINT")return process.stdout.write(`
49
+ `),130;throw s}if(n.trim().toLowerCase()!=="y")return process.stdout.write(I(` \u2713 Using existing credentials.
50
+
51
+ `)),0}try{return await Qs()}catch(n){if(n.message==="SIGINT")return process.stdout.write(`
52
+ `),130;throw n}}async function to(){try{return process.stdout.write(`
53
+ `),(await Vt(H(" ? ")+"Are you sure? This will remove your local credentials. (y/N): ")).toLowerCase()!=="y"?(process.stdout.write(_(` \u26A0 Logout cancelled
54
+ `)),0):null}catch(t){if(t.message==="SIGINT")return process.stdout.write(`
55
+ `),130;throw t}}async function eo(t=false){if(!await Vr())return process.stdout.write(_(` \u26A0 You are not authenticated
56
+ `)),0;if(!t){let e=await to();if(e!==null)return e}try{return await jr(),qr(),process.stdout.write(I(` \u2713 Credentials removed successfully
57
+ `)),0}catch{return process.stderr.write(B(` \u2717 Error removing credentials
58
+ `)),1}}async function ro(){if(fe())return process.stdout.write(_(" \u26A0 Not authenticated. Run `flow-ai-obs auth login` to set up.\n")),0;let t=b(process.env[f.ANTHROPIC_AUTH_TOKEN]);t&&await Xr(t);let e=t||await A();if(!e)return process.stdout.write(_(" \u26A0 Not authenticated. Run `flow-ai-obs auth login` to set up.\n")),0;if(!t&&!await de())return process.stdout.write(_(" \u26A0 Session expired. Run `flow-ai-obs auth login` to re-authenticate.\n")),0;let r=e.clientSecret.length>4?"****...****"+e.clientSecret.slice(-4):"****",n=t?"ANTHROPIC_AUTH_TOKEN (settings.json)":await Ge();return process.stdout.write(`
59
+ `+j(` Authenticated
60
+ `)),process.stdout.write(w(" Tenant: ")+q(e.tenant)+`
61
+ `),process.stdout.write(w(" Client ID: ")+q(e.clientId)+`
62
+ `),process.stdout.write(w(" Client Secret: ")+r+`
63
+ `),process.stdout.write(w(" Storage: ")+n+`
64
+
65
+ `),0}var Xs,Yt=m(()=>{"use strict";It();zr();_t();Y();Mt();O();gt();Xs=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var sn={};M(sn,{normalizeCustomUrl:()=>nn,runInit:()=>ze,validateCustomUrl:()=>Je});function no(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux")return child_process.spawnSync("cmd.exe",["/c","where","claude"],{encoding:"utf8",timeout:5e3}).status===0;let t=process.platform==="win32"?"where":"which";return child_process.spawnSync(t,["claude"],{encoding:"utf8",timeout:5e3}).status===0}function so(){try{let t=S__namespace.readFileSync(G(),"utf8"),e=JSON.parse(t);return !!(e.env&&e.env[f.ANTHROPIC_AUTH_TOKEN])}catch{return false}}function nn(t){let e=t.trim().replace(/\\/g,"/");/^https?:\/\//i.test(e)||(e=`https://${e}`);try{let r=new URL(e);return `${r.protocol}//${r.host}`}catch{return e}}function Je(t,e=false){if(e){let o;try{o=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}if(o.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(o.pathname!=="/"&&o.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
32
66
  Received: ${t}
33
- Expected: https://tenant.example.com`);if(e.search)throw new Error(`Custom URL must not contain query parameters.
67
+ Expected: https://tenant.example.com`);if(o.search)throw new Error(`Custom URL must not contain query parameters.
34
68
  Received: ${t}
35
- Expected: https://tenant.example.com`);if(e.hash)throw new Error(`Custom URL must not contain fragment.
69
+ Expected: https://tenant.example.com`);if(o.hash)throw new Error(`Custom URL must not contain a fragment.
36
70
  Received: ${t}
37
- Expected: https://tenant.example.com`);return t.replace(/\/$/,"")}async function He(){for(let t=1;t<=3;t++)try{let e=await Ut(" Enter your Flow base URL (e.g., https://tenant.ciandt.com)");return We(e)}catch(e){if(process.stderr.write(y(` \u2717 ${e.message}
38
-
39
- `)),t===3)throw process.stderr.write(vt(` Too many invalid attempts.
40
-
41
- `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}async function Er(t){let e=x(),s=e??"(could not be derived)";if(!t||!st()){process.stdout.write(S(` x-flow-user: ${s}
42
- `)+(e?S(` To use a different email, set FLOW_USER_EMAIL in ~/.claude/settings.json env block.
43
- `):y(` Could not derive your email. Set FLOW_USER_EMAIL before running hooks.
44
- `)));return}if(!e){process.stdout.write(y(`
45
- \u26A0 Could not derive email from OS username.
46
- `));let n=await Ut(" Enter your corporate email",o=>o.includes("@")?null:"Email must contain @");ot({[E.FLOW_USER_EMAIL]:n}),process.stdout.write(U(` \u2713 Email saved: ${n}
47
-
48
- `));return}if(await kt(" Is your corporate email @ciandt.com?",true))process.stdout.write(U(` \u2713 Email: ${F(s)}
71
+ Expected: https://tenant.example.com`);let i=process.env[f.FLOW_OBS_ALLOW_HTTP];try{delete process.env[f.FLOW_OBS_ALLOW_HTTP],ct(t);}finally{i!==void 0&&(process.env[f.FLOW_OBS_ALLOW_HTTP]=i);}return t.replace(/\/$/,"")}let r=nn(t),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${t}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!n.hostname.includes("."))throw new Error(`Invalid domain: ${n.hostname}. Expected format: tenant.example.com`);let s=process.env[f.FLOW_OBS_ALLOW_HTTP];try{delete process.env[f.FLOW_OBS_ALLOW_HTTP],ct(r);}finally{s!==void 0&&(process.env[f.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function en(){for(let t=1;t<=3;t++)try{let e=await dr(" Enter your Flow domain (e.g., tenant.ciandt.com)");return Je(e)}catch(e){if(process.stderr.write(_(` \u2717 ${e.message}
49
72
 
50
- `));else {let n=await Ut(" Enter your corporate email",o=>o.includes("@")?null:"Email must contain @");ot({[E.FLOW_USER_EMAIL]:n}),process.stdout.write(U(` \u2713 Email saved: ${n}
73
+ `)),t===3)throw process.stderr.write(B(` Too many invalid attempts.
51
74
 
52
- `));}}async function oe(t={}){let e=t.url;if(!gr()){let a=Be[process.platform]||Be.linux;return process.stderr.write(`
53
- `+vt(` \u2717 Claude Code is not installed or not found in PATH.
75
+ `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}async function ze(t={}){let e=t.url;if(!no()){let a=tn[process.platform]||tn.linux;return process.stderr.write(`
76
+ `+B(` \u2717 Claude Code is not installed or not found in PATH.
54
77
 
55
78
  `)+` flow-ai-obs requires Claude Code to function.
56
79
  Install it with:
57
80
 
58
- `+bt(` ${a}`)+`
81
+ `+H(` ${a}`)+`
59
82
 
60
- `),1}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(y(` \u26A0 WSL detected. If Claude Code is installed on Windows, install flow-ai-obs
61
- `)+y(" on Windows too: ")+bt(`npm install -g @ciandt-flow/flow-ai-obs
62
- `)+y(` Running Claude (Windows) + flow-ai-obs (WSL) is not a supported configuration.
83
+ `),1}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(_(` \u26A0 WSL detected. If Claude Code is installed on Windows, install flow-ai-obs
84
+ `)+_(" on Windows too: ")+H(`npm install -g @ciandt-flow/flow-ai-obs
85
+ `)+_(` Running Claude (Windows) + flow-ai-obs (WSL) is not a supported configuration.
63
86
 
64
- `)),!e&&!t.noInteractive&&st()){let a=X();try{a?(process.stdout.write(`
65
- Current base URL: ${F(a)}
66
- `),await kt(" Keep this URL?",!0)||(e=await He())):(process.stdout.write(`
67
- `),await kt(" Does your organization use a custom Flow URL?",!1)&&(e=await He()));}catch{return 1}process.stdout.write(`
68
- `);}if(!e&&!t.noInteractive&&!st()){let a=X(),d=process.env.FLOW_BASE_URL,h=a??d??"https://flow.ciandt.com",O=!!(a??d);process.stdout.write(y(` \u26A0 Non-interactive environment detected.
69
- `)+S(` Using URL: ${h}
70
- `)+(O?"":S(` Run with --custom-url to configure a custom domain.
87
+ `)),!e&&!t.noInteractive&&ht()){let a=rt();try{a?(process.stdout.write(`
88
+ Current base URL: ${j(a)}
89
+ `),await Ae(" Keep this URL?",!0)||(e=await en())):(process.stdout.write(`
90
+ `),await Ae(" Does your organization use a custom Flow URL?",!1)&&(e=await en()));}catch{return 1}process.stdout.write(`
91
+ `);}if(!e&&!t.noInteractive&&!ht()){let a=rt(),d=process.env.FLOW_BASE_URL,y=a??d??"https://flow.ciandt.com",E=!!(a??d);process.stdout.write(_(` \u26A0 Non-interactive environment detected.
92
+ `)+w(` Using URL: ${y}
93
+ `)+(E?"":w(` Run with --custom-url to configure a custom domain.
71
94
  `))+`
72
- `);}let s=null,r=null;if(e){let a;try{a=We(e);}catch(h){return process.stderr.write(`
73
- \u2717 Invalid --custom-url: ${h.message}
95
+ `);}let r=null,n=null;if(e){let a;try{a=Je(e,!0);}catch(y){return process.stderr.write(`
96
+ \u2717 Invalid --custom-url: ${y.message}
74
97
 
75
- `),1}let d=X();try{Pe(a);}catch(h){return process.stderr.write(`
76
- \u2717 Failed to persist custom URL: ${h.message}
98
+ `),1}let d=rt();try{Or(a);}catch(y){return process.stderr.write(`
99
+ \u2717 Failed to persist custom URL: ${y.message}
77
100
 
78
- `),1}s=a,r={OTEL_EXPORTER_OTLP_ENDPOINT:`${a}/otel`,ANTHROPIC_BASE_URL:`${a}/flow-llm-proxy/`},d&&d!==a?process.stdout.write(y(` \u26A0 Base URL updated.
79
- `)+S(` Previous: ${d}
80
- `)+S(` New: ${a}
101
+ `),1}r=a,n={OTEL_EXPORTER_OTLP_ENDPOINT:`${a}/otel`,ANTHROPIC_BASE_URL:`${a}/flow-llm-proxy/`},d&&d!==a?process.stdout.write(_(` \u26A0 Base URL updated.
102
+ `)+w(` Previous: ${d}
103
+ `)+w(` New: ${a}
81
104
 
82
- `)):process.stdout.write(U(` \u2713 Base URL configured: ${a}
105
+ `)):process.stdout.write(I(` \u2713 Base URL configured: ${a}
83
106
 
84
- `));}await Er(!t.noInteractive);let n,o;try{(({settingsPath:n,preserved:o}=xe())),r&&ot(r);}catch(a){return process.stderr.write(` \u2717 Failed to write settings: ${a.message}
107
+ `));}if(!so())if(t.noInteractive||!ht())process.stdout.write(_(" \u26A0 No credentials found in settings.json \u2014 run `flow-ai-obs auth login` to authenticate.\n\n"));else {process.stdout.write(_(` \u26A0 No credentials found in settings.json \u2014 authentication required.
108
+
109
+ `));let{runLogin:a}=await Promise.resolve().then(()=>(Yt(),qe)),d=await a();if(d!==0)return d}let s,o;try{(({settingsPath:s,preserved:o}=br())),n&&Ot(n);}catch(a){return process.stderr.write(` \u2717 Failed to write settings: ${a.message}
85
110
  `),1}process.stdout.write(`
86
- `+F(" Native OTEL configured")+` (metrics & logs)
87
- `);let i=r?{...q,OTEL_EXPORTER_OTLP_ENDPOINT:r.OTEL_EXPORTER_OTLP_ENDPOINT}:q;for(let[a,d]of Object.entries(i))process.stdout.write(S(` ${a.padEnd(36)}`)+d+`
111
+ `+j(" Native OTEL configured")+` (metrics & logs)
112
+ `);let i=n?{...ot,OTEL_EXPORTER_OTLP_ENDPOINT:n.OTEL_EXPORTER_OTLP_ENDPOINT}:ot;for(let[a,d]of Object.entries(i))process.stdout.write(w(` ${a.padEnd(36)}`)+d+`
88
113
  `);process.stdout.write(`
89
- `),process.stdout.write(F(" Hooks registered")+` (Langfuse trace capture)
90
- `),process.stdout.write(S(" UserPromptSubmit")+` \u2192 flow-ai-obs UserPromptSubmit (timeout: 5s)
91
- `),process.stdout.write(S(" PreToolUse ")+` \u2192 flow-ai-obs PreToolUse (timeout: 3s)
92
- `),process.stdout.write(S(" PostToolUse ")+` \u2192 flow-ai-obs PostToolUse (timeout: 10s)
93
- `),process.stdout.write(S(" Stop ")+` \u2192 flow-ai-obs Stop (timeout: 15s)
114
+ `),process.stdout.write(j(" Hooks registered")+` (Langfuse trace capture)
115
+ `),process.stdout.write(w(" UserPromptSubmit")+` \u2192 flow-ai-obs UserPromptSubmit (timeout: 5s)
116
+ `),process.stdout.write(w(" PreToolUse ")+` \u2192 flow-ai-obs PreToolUse (timeout: 3s)
117
+ `),process.stdout.write(w(" PostToolUse ")+` \u2192 flow-ai-obs PostToolUse (timeout: 10s)
118
+ `),process.stdout.write(w(" Stop ")+` \u2192 flow-ai-obs Stop (timeout: 15s)
94
119
  `),o.length>0&&(process.stdout.write(`
95
- `),process.stdout.write(y(` \u26A0 Third-party hooks detected and preserved on: ${o.join(", ")}
96
- `)),process.stdout.write(S(` flow-ai-obs was prepended \u2014 it executes first.
120
+ `),process.stdout.write(_(` \u26A0 Third-party hooks detected and preserved on: ${o.join(", ")}
121
+ `)),process.stdout.write(w(` flow-ai-obs was prepended \u2014 it executes first.
97
122
  `))),process.stdout.write(`
98
- `),process.stdout.write(S(" Settings: ")+n+`
99
- `),process.stdout.write(S(" Backup: ")+n+`.bkp
100
- `);let l=s??X()??process.env.FLOW_BASE_URL??"https://flow.ciandt.com";process.stdout.write(S(" Base URL: ")+l+`
123
+ `),process.stdout.write(w(" Settings: ")+s+`
124
+ `),process.stdout.write(w(" Backup: ")+s+`.bkp
125
+ `),process.stdout.write(w(" OTEL auth: flow-ai-obs otel-headers")+w(` (reads keychain at runtime)
126
+ `));let c=r??rt()??process.env.FLOW_BASE_URL??"https://flow.ciandt.com";process.stdout.write(w(" Base URL: ")+c+`
101
127
  `),process.stdout.write(`
102
- `),process.stdout.write(U(` \u2713 Ready. Native OTEL + Langfuse trace capture active.
103
- `)),process.stdout.write(S(" Run `flow-ai-obs setup` to also configure the Flow LLM Proxy.\n\n"));let p=Re();return p&&process.stdout.write(y(` \u26A0 ${p}
128
+ `),process.stdout.write(I(` \u2713 Ready. Native OTEL + Langfuse trace capture active.
129
+ `)),process.stdout.write(w(" Run `flow-ai-obs setup` to also configure the Flow LLM Proxy.\n\n"));let l=Er();return l&&process.stdout.write(_(` \u26A0 ${l}
104
130
 
105
- `)),0}var Be,ie=f(()=>{"use strict";Ct();w();mt();Nt();Zt();J();Xt();Be={darwin:`npm install -g @anthropic-ai/claude-code
131
+ `)),0}var tn,Xe=m(()=>{"use strict";Mt();O();gt();ne();oe();Y();Le();tn={darwin:`npm install -g @anthropic-ai/claude-code
106
132
  or visit: https://claude.ai/download`,linux:"npm install -g @anthropic-ai/claude-code",win32:`npm install -g @anthropic-ai/claude-code
107
- or visit: https://claude.ai/download`};});var Ye={};ft(Ye,{runSetup:()=>_r});async function _r(){process.stdout.write(`
133
+ or visit: https://claude.ai/download`};});var on={};M(on,{runSetup:()=>oo});async function oo(t={}){process.stdout.write(`
108
134
  \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
109
135
  `),process.stdout.write(`\u2551 flow-ai-obs \u2014 setup \u2551
110
136
  `),process.stdout.write(`\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
111
137
 
112
- `);let t=await oe({noInteractive:true});if(t!==0)return t;try{ot(Et());}catch(e){process.stderr.write(` \u26A0 Could not write LLM Proxy config: ${e.message}
113
- `);}process.stdout.write(F(" Flow LLM Proxy configured")+` (model provider)
114
- `);for(let[e,s]of Object.entries(Et()))process.stdout.write(S(` ${e.padEnd(36)}`)+s+`
115
- `);return process.stdout.write(`
116
- `),process.env.OTEL_EXPORTER_OTLP_HEADERS?process.stdout.write(U(` \u2713 OTEL_EXPORTER_OTLP_HEADERS is configured.
117
-
118
- `)):process.stdout.write(y(` \u26A0 OTEL_EXPORTER_OTLP_HEADERS is not set.
119
- Set it with your API key to authenticate traces:
120
- export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic <base64>"
121
-
122
- `)),process.stdout.write(U(` \u2713 Setup complete!
123
- `)),process.stdout.write(S(` Settings: ${Y()}
124
-
125
- `)),0}var Ge=f(()=>{"use strict";w();mt();ie();Ct();});var Ve={};ft(Ve,{runCheck:()=>hr});function $t(t){process.stdout.write(` \u2713 ${t}
126
- `);}function Xe(t){process.stdout.write(` \u26A0 ${t}
127
- `);}function ae(t){process.stdout.write(` \u2717 ${t}
128
- `);}function it(t){process.stdout.write(` ${t}
129
- `);}function z(){process.stdout.write(`
130
- `);}async function hr(){z(),process.stdout.write(` flow-claude-observability \u2014 configuration check
131
- `),z(),process.stdout.write(` Auth
132
- `);let t=process.env.OTEL_EXPORTER_OTLP_HEADERS??"";t.trim()?($t("OTEL_EXPORTER_OTLP_HEADERS is set"),it(`Headers: ${t.slice(0,60)}${t.length>60?"\u2026":""}`)):Xe("OTEL_EXPORTER_OTLP_HEADERS is not set \u2014 traces will be sent without extra auth headers");let e=x();e?$t(`x-flow-user: ${e}`):ae("x-flow-user could not be derived \u2014 set FLOW_USER_EMAIL to fix this"),z(),process.stdout.write(` Native OTEL
133
- `);let s={};try{let o=___namespace.readFileSync(Y(),"utf8");s=JSON.parse(o).env||{};}catch{}let r=Object.keys(q).filter(o=>!s[o]);r.length===0?($t("All OTEL env vars present in settings.json"),it(`Endpoint: ${s.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(Xe(`${r.length} OTEL var(s) missing from settings.json \u2014 native metrics/logs disabled`),r.forEach(o=>ae(`Missing: ${o}`)),it("Run: flow-ai-obs init (restores missing vars automatically)")),z(),process.stdout.write(` Tracing
134
- `);let n=await _t();if(!n||n.length===0)return ae("No active destinations \u2014 no traces will be sent"),it("Set OTEL_EXPORTER_OTLP_ENDPOINT or FLOW_TELEMETRY_GATEWAY_URL"),z(),1;for(let o of n)$t(`Mode: ${o.mode}`),it(`Endpoint: ${o.endpoint}`),it(`Headers: ${o.headers.map(([i])=>i).join(", ")||"(none)"}`);return z(),process.stdout.write(` All checks passed \u2014 observability is active.
135
- `),z(),0}var Je=f(()=>{"use strict";J();Ct();w();});function N(t,e){let s=typeof t=="object"?JSON.stringify(t):String(t??"");return s.length>e?s.slice(0,e)+" \u2026[truncated]":s}function Ft(t,e=100){return String(t??"").split(`
136
- `)[0].slice(0,e).trim()}function ce(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",s=>{e+=s;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function b(t){process.stdout.write(JSON.stringify(t));}var at=f(()=>{"use strict";});function D(){return String(BigInt(Date.now())*1000000n)}var le,K,ht=f(()=>{"use strict";le=()=>crypto.randomBytes(16).toString("hex"),K=()=>crypto.randomBytes(8).toString("hex");});function kr(t,e){let s=rt.resolve(t);if(!s.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return s}function ue(t){if(!vr.test(t))throw new Error(`Invalid session ID: ${t}`);return kr(rt.join(j.tmpdir(),`flow-obs-${t}.json`),br)}function ct(t){let e=ue(t);if(!_.existsSync(e))return null;try{return JSON.parse(_.readFileSync(e,"utf8"))}catch{return null}}function lt(t,e){_.writeFileSync(ue(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function pe(t){try{_.unlinkSync(ue(t));}catch{}}var vr,br,St=f(()=>{"use strict";vr=/^[0-9a-f-]{1,64}$/i,br=rt.normalize(j.tmpdir())+rt.sep;});function ts(t){if(!t||!_.existsSync(t))return null;try{let e=_.readFileSync(t,"utf8").trimEnd().split(`
137
- `);for(let s=e.length-1;s>=0;s--)try{let r=JSON.parse(e[s]);if(r.type==="user"&&r.uuid)return r.uuid}catch{}}catch{}return null}function de(t){if(!t||!_.existsSync(t))return null;try{let e=_.readFileSync(t,"utf8").trimEnd().split(`
138
- `),s=[],r=0,n=0;for(let o=e.length-1;o>=0;o--)try{let i=JSON.parse(e[o]);if(i.type==="user")break;if(i.type==="assistant"){let p=(i.message?.content??[]).filter(d=>d.type==="text").map(d=>d.text??"").join("");p&&s.unshift(p);let a=i.message?.usage??{};r+=(a.input_tokens??0)+(a.cache_read_input_tokens??0)+(a.cache_creation_input_tokens??0),n+=a.output_tokens??0;}}catch{}return !s.length&&r===0?null:{text:s.join(`
139
-
140
- `),inputTokens:r,outputTokens:n}}catch{}return null}var fe=f(()=>{"use strict";});function rs(t){return t.replace(":","/")}function xt(t,e){if(!t)return null;let s=rs(t),r=[rt.join(j.homedir(),".claude","skills",s,"SKILL.md"),rt.join(e??"",".claude","skills",s,"SKILL.md")];for(let n of r)if(_.existsSync(n))try{return _.readFileSync(n,"utf8")}catch{}return null}function ns(t){return t.split(`
141
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function os(t){return !!t.slashSkill||t.toolCalls.some(r=>r.tool==="Skill")?t.toolCalls.some(r=>r.tool==="Skill"&&!r.synthetic||Fr.has(r.tool))?"complete":"prerequisite_required":null}function Dt(t,e){if(!t)return null;let s=rs(t),r=[rt.join(j.homedir(),".claude","skills",s),rt.join(e??"",".claude","skills",s)],n=null;for(let l of r)if(_.existsSync(rt.join(l,"SKILL.md"))){n=l;break}if(!n)return null;let o=[];function i(l,p){for(let a of _.readdirSync(l,{withFileTypes:true})){if(Nr.has(a.name)||$r.has(a.name)||Cr.has(rt.extname(a.name)))continue;let d=p?`${p}/${a.name}`:a.name;a.isDirectory()?i(rt.join(l,a.name),d):o.push(d);}}return i(n,""),o.length>0?o:null}var Nr,Cr,$r,Fr,Mt=f(()=>{"use strict";Nr=new Set([".venv","__pycache__",".git","node_modules"]),Cr=new Set([".pyc",".pyo"]),$r=new Set(["SKILL.md",".DS_Store",".gitignore"]);Fr=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function Mr(t,e){return new Promise(s=>{let r=new URL(t),n=r.protocol==="https:",o=(n?qs__default.default:Dr__default.default).request({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname+r.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e)}},i=>{i.resume(),s(i.statusCode??0);});o.on("error",()=>s(0)),o.setTimeout(5e3,()=>{o.destroy(),s(0);}),o.write(e),o.end();})}async function Z(t,e={}){try{let s=JSON.stringify({action:t,booster:se().BOOSTER,metadata:e,success:!0,timestamp:new Date().toISOString(),os:process.platform,user:{email:process.env[E.FLOW_USER_EMAIL]||"",id:"",name:""}}),r=V(se().API_URL),n=await Mr(r,s);c("metrics.logEvent",`action=${t} status=${n}`);}catch(s){c("metrics.logEvent",`silenced error: ${s.message}`);}}var Bt=f(()=>{"use strict";w();J();I();});async function is(t){let e=t.cwd||"",s=t.session_id||"unknown",r=t.prompt||"",n=ts(t.transcript_path)||le(),o=ns(r),i=o?xt(o,e):null,l=o?Dt(o,e):null;lt(s,{traceId:le(),spanId:K(),startNs:D(),sessionId:s,prompt:r,cwd:e,traceName:n,transcriptPath:t.transcript_path||"",model:process.env[E.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:o,skillContent:i,skillArtifacts:l}),Z("SESSION_STARTED",{traceType:o?"skill":"prompt",slashSkill:o}),c("UserPromptSubmit",`sid=${s}`,`traceName=${n}`,`slashSkill=${o}`),b(t);}var as=f(()=>{"use strict";ht();St();fe();Mt();at();I();w();Bt();});async function cs(t){let e=t.session_id||"unknown",s=t.tool_name||"unknown",r=t.tool_input||{},n=ct(e);n&&(n.pendingTool={name:s,inputStr:N(r,P.TOOL_INPUT),startNs:D()},lt(e,n)),c("PreToolUse",`sid=${e}`,`tool=${s}`,`stateFound=${!!n}`),b(t);}var ls=f(()=>{"use strict";ht();St();at();I();w();});function u(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function Q(...t){return t.filter(e=>e!==null)}function us(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Br,spans:Array.isArray(e)?e:[e]}]}]}}var Br,g,ps=f(()=>{"use strict";w();Br={name:ee.SCOPE_NAME,version:ee.SCOPE_VERSION},g={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 fs(t,e,s,r,n){if(process.env[E.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(s)},response:{status:r,body:n}});try{_.writeFileSync(ds,o+`
142
- `,{flag:"a",encoding:"utf8",mode:384}),c("sendTraces:dump",`request appendada em ${ds}`);}catch(i){c("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Xr(t){let e=new URL(t),s=new URL(te().GATEWAY_HEALTH);return s.hostname=e.hostname,s.port=e.port,s.protocol=e.protocol,s}function ms(t,e){return new Promise((s,r)=>{let n=t._isSSL?qs__default.default:Dr__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=n.request(t,i=>{let l=[];i.on("data",p=>l.push(p)),i.on("end",()=>s({statusCode:i.statusCode??0,body:l.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>r(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}function gs(t){let e={};for(let[s,r]of t){let n=String(r).replace(/[\r\n]/g,""),o=e[s];o===void 0?e[s]=n:Array.isArray(o)?o.push(n):e[s]=[o,n];}return e}async function Es(t,e){let s;try{s=Xr(t);}catch{return false}let r=s.protocol==="https:";try{let n=gs(e??[]),o=await ms({hostname:s.hostname,port:s.port||(r?443:80),path:s.pathname,method:"GET",headers:n,_isSSL:r},null);return c("checkHealth",`url=${s.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function Ht(t,e,s){let r=JSON.stringify(t),n=new URL(e),o=n.protocol==="https:",i={...gs(s??[]),"Content-Type":"application/json","Content-Length":Buffer.byteLength(r)};c("sendTraces:request",`POST ${e}`),c("sendTraces:request",`headers=${JSON.stringify(Object.keys(i))}`),c("sendTraces:request",`body=${r.slice(0,500)}${r.length>500?"\u2026":""}`);try{let l=await ms({hostname:n.hostname,port:n.port||(o?443:80),path:n.pathname,method:"POST",headers:i,_isSSL:o},r);return c("sendTraces:response",`status=${l.statusCode}`),fs(e,i,r,l.statusCode,l.body),l.statusCode}catch(l){return c("sendTraces:error",l.message),fs(e,i,r,0,l.message),0}}var ds,_s=f(()=>{"use strict";w();I();ds=rt.join(j.tmpdir(),"flow-obs-requests.ndjson");});function qr(){let t=parseInt(process.env[E.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(v.MIN_TTL_DAYS,Math.min(v.MAX_TTL_DAYS,t)):v.DEFAULT_TTL_DAYS)*24*60*60*1e3}function Vr(){let t=parseInt(process.env[E.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(v.MIN_MAX_FILES,Math.min(v.MAX_MAX_FILES,t)):v.DEFAULT_MAX_FILES}function Ss(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return rt__namespace.default.join(j__namespace.default.tmpdir(),`${v.FILE_PREFIX}${t}.json`)}function ge(){let t=j__namespace.default.tmpdir(),e;try{e=___namespace.default.readdirSync(t);}catch{return []}return e.filter(s=>s.startsWith(v.FILE_PREFIX)&&s.endsWith(".json")).map(s=>{let r=rt__namespace.default.join(t,s),n=0;try{n=___namespace.default.statSync(r).mtimeMs;}catch{}return {full:r,mtime:n}}).sort((s,r)=>s.mtime-r.mtime).map(s=>s.full)}function Wt(t){try{let e=Vr(),s=ge();if(s.length>=e){let o=s.slice(0,s.length-e+1);for(let i of o)try{___namespace.default.unlinkSync(i);}catch{}}let r=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,n={fileId:r,bufferedAt:Date.now(),payload:t};return ___namespace.default.writeFileSync(Ss(r),JSON.stringify(n),{encoding:"utf8",mode:384}),c("buffer",`saved fileId=${r}`),r}catch(e){return c("buffer",`saveToBuffer failed: ${e.message}`),null}}function Ts(t){let e=ge(),s=t!=null&&t>0?t:e.length,r=[];for(let n of e){if(r.length>=s)break;try{let o=___namespace.default.readFileSync(n,"utf8"),i=JSON.parse(o);i&&i.fileId&&i.payload&&r.push(i);}catch{c("buffer",`skipping malformed file: ${n}`);}}return r}function ws(t){try{___namespace.default.unlinkSync(Ss(t)),c("buffer",`deleted fileId=${t}`);}catch{}}function Os(){let t=Date.now()-qr();for(let e of ge())try{let{mtimeMs:s}=___namespace.default.statSync(e);s<t&&(___namespace.default.unlinkSync(e),c("buffer",`evicted stale: ${rt__namespace.default.basename(e)}`));}catch{}}var Ls=f(()=>{"use strict";w();I();});async function Jr(t,e=[]){Os();let s=Ts(v.REPLAY_BATCH_SIZE);s.length&&(c("replayBufferedTraces",`replaying ${s.length} buffered trace(s)`),await Promise.allSettled(s.map(async r=>{try{let n=await Ht(r.payload,t.endpoint,[...t.headers,...e]);n>=200&&n<300?(ws(r.fileId),c("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):c("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){c("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function ys(t){let e=await _t();if(!e.length)return 0;let s=x(),n=(process.env.OTEL_EXPORTER_OTLP_HEADERS??"").split(",").some(a=>a.trim().toLowerCase().replace(/\s*=\s*/,"=").startsWith("x-flow-user=")),o=s&&!n?[["x-flow-user",s]]:[],i=await Promise.all(e.map(async a=>{if(a.mode!=="gateway")return {creds:a,healthy:true};let d=await Es(a.endpoint,[...a.headers,...o]);return {creds:a,healthy:d}})),l=i.find(a=>a.creds.mode==="gateway"&&a.healthy)?.creds??i.find(a=>a.creds.mode!=="gateway")?.creds;return l&&await Jr(l,o),(await Promise.all(i.map(async({creds:a,healthy:d})=>{if(a.mode==="gateway"){if(!d)return c("postToLangfuse","gateway health check failed \u2014 buffering trace"),Wt(t),0;let O=await Ht(t,a.endpoint,[...a.headers,...o]);return (O===0||O>=500)&&(c("postToLangfuse",`gateway send failed (status ${O}) \u2014 buffering trace`),Wt(t)),O}let h=await Ht(t,a.endpoint,[...a.headers,...o]);return (h===0||h>=500)&&(c("postToLangfuse",`endpoint unavailable (status ${h}) \u2014 buffering trace`),Wt(t)),h}))).find(a=>a!==0)??0}var Rs=f(()=>{"use strict";J();I();_s();Ls();w();});var Ee=f(()=>{"use strict";ps();Rs();});function B(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Qr.reduce((s,{re:r,replace:n})=>s.replace(r,n),e)}var R,zr,Kr,Zr,As,Qr,_e=f(()=>{"use strict";R="[REDACTED]",zr="[REDACTED-EMAIL]",Kr="[REDACTED-CPF]",Zr="[REDACTED-CNPJ]",As="[REDACTED-PHONE]",Qr=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${R}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${R}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${R}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${R}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,s)=>`${e}
143
- ${R}
144
- ${s}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${R}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${R}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${R}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${R}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${R}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,s)=>`${e}${s}${R}${s}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${R}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>zr},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Kr},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Zr},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>As},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>As}];});async function vs(t){let e=t.session_id||"unknown",s=t.tool_name||"unknown",r=t.tool_input||{},n=t.tool_response,o=n!==null&&typeof n=="object"?n.output??JSON.stringify(n):n??"",i=ct(e);if(!i){b(t);return}let l=D(),p=i.pendingTool,a=p?.name===s,d=a?p.startNs:String(BigInt(l)-200000000n),h=a?p.inputStr:N(r,P.TOOL_INPUT),O=h,T=null;if(s==="Skill"){let Rt=typeof r=="object"&&r!==null?r.skill||r.name||r.skillName||r.commandName||String(Object.values(r)[0]??""):String(r);T=Rt?String(Rt).trim():null;let H=T?xt(T,i.cwd):null;H&&(O=H,i.skillContent||(i.skillContent=H),i.skillArtifacts||(i.skillArtifacts=Dt(T,i.cwd))),T&&!i.slashSkill&&(i.slashSkill=T),c("PostToolUse","Skill tool detected",`skillName=${T}`,`contentFound=${!!H}`);}let k=B(N(o,P.TOOL_OUTPUT)),L=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(k.slice(0,500)),Tt=L?"ERROR":"DEFAULT",pt=K(),wt=Math.round(Number(BigInt(l)-BigInt(d))/1e6),Lt={Agent:"AGENT",Task:"AGENT"}[s]??"TOOL",yt=s==="Skill"&&T?T:Ft(h,60);i.toolCalls.push({tool:s,brief:yt,error:L,durationMs:wt});let dt=i.spans;dt.push({traceId:i.traceId,spanId:pt,parentSpanId:i.spanId,name:s,kind:3,startTimeUnixNano:d,endTimeUnixNano:l,attributes:Q(u(g.OBS_NAME,s),u(g.OBS_TYPE,Lt),u(g.OBS_LEVEL,Tt),u(g.OBS_INPUT,B(O)),u(g.OBS_OUTPUT,k),u("tool.name",s),u("tool.error",String(L)),s==="Skill"&&T?u("skill.name",T):null,s==="Skill"?u("skill.invocation","slash-command"):null),status:{code:L?2:1}}),i.pendingTool=null,lt(e,i),L&&Z("TOOL_ERROR",{toolName:s}),c("PostToolUse",`sid=${e}`,`tool=${s}`,`error=${L}`,`durationMs=${wt}`,`totalSpans=${dt.length}`),b(t);}var bs=f(()=>{"use strict";ht();St();Ee();at();Mt();I();w();_e();Bt();});function Us(t,e,s){let r=Object.keys(ks).find(i=>(t??"").toLowerCase().includes(i));if(!r)return;let n=ks[r],o=(e*n.input+s*n.output)/1e6;return Math.round(o*1e6)/1e6}var ks,Ps=f(()=>{"use strict";ks={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"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 Is(t){let e=t.session_id||"unknown",s=t.stop_reason||"end_turn",r=ct(e);if(!r){b(t);return}r.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(r.slashSkill)&&(c("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${r.slashSkill}"`),r.slashSkill=null);let n=D(),o=x()??"",i=r.toolCalls,l=r.spans;if(r.slashSkill&&!i.some(m=>m.tool==="Skill")){let m=K(),W=r.skillContent?r.skillContent:JSON.stringify({skill:r.slashSkill});i.push({tool:"Skill",brief:r.slashSkill,error:false,durationMs:0,synthetic:true}),l.push({traceId:r.traceId,spanId:m,parentSpanId:r.spanId,name:"Skill",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:r.startNs,attributes:Q(u(g.OBS_NAME,"Skill"),u(g.OBS_TYPE,"TOOL"),u(g.OBS_LEVEL,"DEFAULT"),u(g.OBS_INPUT,W),u(g.OBS_OUTPUT,"loaded via slash command"),u("tool.name","Skill"),u("tool.error","false"),u("skill.name",r.slashSkill),u("skill.invocation","slash-command")),status:{code:1}}),c("Stop",`slashSkill=${r.slashSkill}`,"synthetic span injected");}let p=t.transcript_path||r.transcriptPath||"",a=de(p);if(p&&(i.some(m=>m.tool==="Skill"&&!m.synthetic)||!!r.slashSkill)&&!a?.text){await new Promise(W=>setTimeout(W,500));let m=de(p);m?.text&&(a=m);}c("Stop",`transcriptPath=${p||"(empty)"}`,`assistantOut=${a?`text=${a.text.length}chars`:"null"}`);let h=i.length,O=i.filter(m=>m.error).length,T=B(a?.text?N(a.text,P.TRACE_OUTPUT):h===0?"No tools used":i.map((m,W)=>`${W+1}. ${m.tool}${m.brief?` \u2192 ${m.brief}`:""}${m.error?" [ERROR]":""}`).join(`
145
- `)),k=a?.inputTokens??0,L=a?.outputTokens??0,Tt=i.map((m,W)=>`${W+1}. ${m.tool}${m.brief?` \u2192 ${m.brief}`:""}${m.error?" [ERROR]":""} (${m.durationMs}ms)`),pt=!!(r.slashSkill||i.some(m=>m.tool==="Skill")),wt=i.some(m=>m.tool==="Agent");if(!pt&&!wt){c("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),Z("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),pe(e),b(t);return}let Ot=pt?"skill":"agent",Lt=Math.round(Number(BigInt(n)-BigInt(r.startNs))/1e6),yt=Us(r.model,k,L),tt=os(r);tt==="prerequisite_required"&&a?.text&&(tt="complete"),tt==="prerequisite_required"&&(l.push({traceId:r.traceId,spanId:K(),parentSpanId:r.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:n,attributes:Q(u(g.OBS_NAME,"prerequisite-check"),u(g.OBS_TYPE,"EVENT"),u(g.OBS_LEVEL,"WARNING"),u(g.OBS_OUTPUT,T),u("skill.name",r.slashSkill||void 0),u("execution_status","prerequisite_required")),status:{code:1}}),c("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${r.slashSkill}`));let dt=(()=>{if(!(!pt||!r.prompt)){if(r.slashSkill){let m=r.prompt.replace(new RegExp(`^\\/${r.slashSkill}\\s*`,"i"),"").trim();return m?N(B(m),P.USER_INSTRUCTION):void 0}return N(B(r.prompt),P.USER_INSTRUCTION)||void 0}})(),Rt=JSON.stringify({trace_type:Ot,...tt!==null&&{execution_status:tt},...r.slashSkill?{skill_name:r.slashSkill}:{},...r.skillArtifacts?.length&&{skill_artifacts:r.skillArtifacts},...dt!==void 0&&{user_instruction:dt},latency_ms:Lt,...k&&{tokens_input:k},...L&&{tokens_output:L},cost_usd:yt,...r.model?{model:r.model}:{},toolCount:h,errorCount:O,stopReason:s,sessionId:r.sessionId,tools:Tt.length?Tt:void 0}),H=B(N(r.prompt,P.TRACE_INPUT)),$s=Q(u(g.TRACE_NAME,r.traceName),u(g.TRACE_INPUT,H),u(g.TRACE_OUTPUT,T),u(g.OBS_INPUT,H),u(g.OBS_OUTPUT,T),u(g.TRACE_METADATA,Rt),u(g.SESSION_ID,r.sessionId),u(g.USER_ID,o),u(g.OBS_TYPE,"GENERATION"),u(g.MODEL,r.model),k?u(g.INPUT_TOKENS,k):null,L?u(g.OUTPUT_TOKENS,L):null,u("claude.stop_reason",s),u("claude.tool_count",String(h)),u("claude.error_count",String(O)),u("claude.session_id",r.sessionId),u("flow.trace_type",Ot),{key:g.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Ot}]}}}),Fs={traceId:r.traceId,spanId:r.spanId,name:r.traceName,kind:1,startTimeUnixNano:r.startNs,endTimeUnixNano:n,attributes:$s,status:{code:O>0?2:1}},xs=Q(u("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),u("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),he=[...l,Fs];c("Stop",`sid=${e}`,`totalTools=${h}`,`errorTools=${O}`,`spans=${he.length}`,`inputTokens=${k}`,`outputTokens=${L}`,`traceOutput="${Ft(T,80)}"`);let Ds=await ys(us(xs,he));c("Stop",`POST status=${Ds}`,`traceId=${r.traceId}`),Z("TRACE_SENT",{latencyMs:Lt,totalTools:h,errorTools:O,inputTokens:k,outputTokens:L,costUsd:yt}),pe(e),b(t);}var Ns=f(()=>{"use strict";ht();St();Ee();Ps();fe();at();I();Mt();_e();w();Bt();J();});async function tn(){let t=process.argv[2];if(t==="UserPromptSubmit"){let s=await ce(),r=false;try{r=await ne();}catch{process.stdout.write(JSON.stringify(s));return}r?await is(s):process.stdout.write(JSON.stringify(s));return}if(!await ne()){let s=[];process.stdin.on("data",r=>s.push(r)),process.stdin.on("end",()=>process.stdout.write(s.join("")));return}let e=await ce();switch(t){case "PreToolUse":await cs(e);break;case "PostToolUse":await vs(e);break;case "Stop":await Is(e);break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
146
- `),process.stdout.write(JSON.stringify(e));}}var Cs=f(()=>{"use strict";J();at();as();ls();bs();Ns();tn().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
147
- `),process.exit(0);});});var sn=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,C]=process.argv;function rn(t,e){let s=t.indexOf(e);return s!==-1?t[s+1]:void 0}if(C==="--version"||C==="-v"){let{version:t}=At();process.stdout.write(t+`
148
- `),process.exit(0);}else if(C==="--help"||C==="-h"){let{bold:t,cyan:e,dim:s}=(mt(),$(Yt)),{version:r}=At();process.stdout.write(`
149
- `+t(" flow-ai-obs")+s(" v"+r)+`
150
-
151
- `),process.stdout.write(e(" init")+s(` Install hooks + native OTEL
152
- `)),process.stdout.write(s(` --custom-url <URL> Set a custom Flow base URL
153
- `)),process.stdout.write(s(` --no-interactive Suppress interactive prompts (for CI/CD)
154
- `)),process.stdout.write(e(" setup")+s(` Install hooks + OTEL + LLM proxy
155
- `)),process.stdout.write(e(" check")+s(` Validate full observability setup
156
-
157
- `)),process.stdout.write(s(` Flags: --version, -v Show version
158
- `)),process.stdout.write(s(` --help, -h Show this help
159
-
160
- `)),process.stdout.write(s(` Auth: set OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic <base64>"
161
-
162
- `)),process.stdout.write(s(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
138
+ `);let e=await bt(t);if(e!==0)return process.stderr.write(`
139
+ Setup aborted. Run \`flow-ai-obs auth login\` to retry.
140
+
141
+ `),e;process.stdout.write(`
142
+ `);let r=await ze({noInteractive:true});if(r!==0)return r;try{Ot(Dt());}catch(s){process.stderr.write(` \u26A0 Could not write LLM Proxy config: ${s.message}
143
+ `);}process.stdout.write(j(" Flow LLM Proxy configured")+` (model provider)
144
+ `);for(let[s,o]of Object.entries(Dt()))process.stdout.write(w(` ${s.padEnd(36)}`)+o+`
145
+ `);process.stdout.write(`
146
+ `),process.stdout.write(` Validating connectivity to Flow OTEL endpoint\u2026
147
+ `);let n=await A();return n?await Rr(n)?process.stdout.write(I(` \u2713 Connectivity validated \u2014 telemetry is active.
148
+
149
+ `)):process.stdout.write(_(` \u26A0 Could not reach the OTEL endpoint. Telemetry will activate once connectivity is restored.
150
+
151
+ `)):process.stdout.write(_(` \u26A0 Could not read stored credentials \u2014 skipping connectivity check.
152
+
153
+ `)),process.stdout.write(I(` \u2713 Setup complete!
154
+ `)),process.stdout.write(w(` Settings: ${G()}
155
+
156
+ `)),0}var an=m(()=>{"use strict";O();gt();Yt();Xe();Mt();It();});var cn={};M(cn,{runOtelHeaders:()=>io});async function io(){let t=b(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(!t)try{t=await A();}catch{return process.stderr.write(`[flow-ai-obs otel-headers] Failed to read credentials
157
+ `),1}if(!t)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs auth login
158
+ `),1;let e;try{e=(await x(t)).accessToken;}catch(r){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${r.message}
159
+ `),1}return e?(process.stdout.write(`{"Authorization": "Bearer ${e}"}
160
+ `),0):(process.stderr.write(`[flow-ai-obs otel-headers] Empty token received
161
+ `),1)}var ln=m(()=>{"use strict";It();_t();Y();O();});var dn={};M(dn,{runCheck:()=>ao});function Ze(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function Wt(t){process.stdout.write(` \u2713 ${t}
162
+ `);}function me(t){process.stdout.write(` \u26A0 ${t}
163
+ `);}function ge(t){process.stdout.write(` \u2717 ${t}
164
+ `);}function R(t){process.stdout.write(` ${t}
165
+ `);}function P(){process.stdout.write(`
166
+ `);}async function ao(){P(),process.stdout.write(` flow-claude-observability \u2014 configuration check
167
+ `),P(),process.stdout.write(` Auth
168
+ `);let t=b(process.env[f.ANTHROPIC_AUTH_TOKEN]),e=t||await A();if(!e){me("Not authenticated \u2014 starting setup..."),P();let c=await bt();if(c!==0)return c;if(t=b(process.env[f.ANTHROPIC_AUTH_TOKEN]),e=t||await A(),!e)return ge("Authentication failed"),P(),1;P(),process.stdout.write(` Auth
169
+ `);}if(!t&&!await de()){me("Session expired \u2014 re-authenticating..."),P();let c=await bt();if(c!==0)return c;P(),process.stdout.write(` Auth
170
+ `);}let r=await at()||e.clientId;Wt("Authenticated"),R(`Tenant: ${e.tenant}`),R(`User: ${r}`),P(),process.stdout.write(` Native OTEL
171
+ `);let n={};try{let c=S__namespace.readFileSync(G(),"utf8");n=JSON.parse(c).env||{};}catch{}let s=Object.keys(ot).filter(c=>!n[c]);if(s.length===0?(Wt("All OTEL env vars present in settings.json"),R(`Endpoint: ${n.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(me(`${s.length} OTEL var(s) missing from settings.json \u2014 native metrics/logs disabled`),s.forEach(c=>ge(`Missing: ${c}`)),R("Run: flow-ai-obs init (restores missing vars automatically)")),P(),process.stdout.write(` Tracing
172
+ `),process.env[f.FLOW_TELEMETRY]==="true"){Wt("FLOW_TELEMETRY=true (direct mode enabled)");let c=[f.LANGFUSE_BASE_URL,f.LANGFUSE_PUBLIC_KEY,f.LANGFUSE_SECRET_KEY].filter(l=>!process.env[l]);c.length>0&&c.forEach(l=>me(`Missing: ${l}`));}else R("FLOW_TELEMETRY not set \u2014 direct mode inactive (gateway mode may still be active)");let i=await K();if(!i||i.length===0)return i&&i.authError?ge("Token refresh failed \u2014 gateway mode could not activate"):(ge("No active destinations \u2014 no traces will be sent"),R("For direct mode: set FLOW_TELEMETRY=true + LANGFUSE_BASE_URL + LANGFUSE_PUBLIC_KEY + LANGFUSE_SECRET_KEY"),R("For gateway mode: run flow-claude-observability auth login")),P(),1;for(let c of i)if(c.mode==="gateway"){let l=await vt();Wt("Mode: gateway"),R(`Endpoint: ${c.endpoint}`),R(`Token: ${Ze(l?.accessToken)}`);}else c.mode==="direct"&&(Wt("Mode: direct"),R(`Endpoint: ${c.endpoint}`),R(`PK: ${Ze(process.env[f.LANGFUSE_PUBLIC_KEY])}`),R(`SK: ${Ze(process.env[f.LANGFUSE_SECRET_KEY])}`));return P(),process.stdout.write(` All checks passed \u2014 observability is active.
173
+ `),P(),0}var pn=m(()=>{"use strict";It();Y();Mt();O();Yt();});function W(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function he(t,e=100){return String(t??"").split(`
174
+ `)[0].slice(0,e).trim()}function Qe(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function D(t){process.stdout.write(JSON.stringify(t));}var Rt=m(()=>{"use strict";});function J(){return String(BigInt(Date.now())*1000000n)}var tr,lt,Gt=m(()=>{"use strict";tr=()=>crypto.randomBytes(16).toString("hex"),lt=()=>crypto.randomBytes(8).toString("hex");});function So(t,e){let r=kt.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function er(t){if(!wo.test(t))throw new Error(`Invalid session ID: ${t}`);return So(kt.join(tt.tmpdir(),`flow-obs-${t}.json`),Eo)}function Pt(t){let e=er(t);if(!S.existsSync(e))return null;try{return JSON.parse(S.readFileSync(e,"utf8"))}catch{return null}}function Nt(t,e){S.writeFileSync(er(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function rr(t){try{S.unlinkSync(er(t));}catch{}}var wo,Eo,Kt=m(()=>{"use strict";wo=/^[0-9a-f-]{1,64}$/i,Eo=kt.normalize(tt.tmpdir())+kt.sep;});function wn(t){if(!t||!S.existsSync(t))return null;try{let e=S.readFileSync(t,"utf8").trimEnd().split(`
175
+ `);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function nr(t){if(!t||!S.existsSync(t))return null;try{let e=S.readFileSync(t,"utf8").trimEnd().split(`
176
+ `),r=[],n=0,s=0;for(let o=e.length-1;o>=0;o--)try{let i=JSON.parse(e[o]);if(i.type==="user")break;if(i.type==="assistant"){let l=(i.message?.content??[]).filter(d=>d.type==="text").map(d=>d.text??"").join("");l&&r.unshift(l);let a=i.message?.usage??{};n+=(a.input_tokens??0)+(a.cache_read_input_tokens??0)+(a.cache_creation_input_tokens??0),s+=a.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
177
+
178
+ `),inputTokens:n,outputTokens:s}}catch{}return null}var sr=m(()=>{"use strict";});function Tn(t){return t.replace(":","/")}function we(t,e){if(!t)return null;let r=Tn(t),n=[kt.join(tt.homedir(),".claude","skills",r,"SKILL.md"),kt.join(e??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(S.existsSync(s))try{return S.readFileSync(s,"utf8")}catch{}return null}function yn(t){return t.split(`
179
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function _n(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Lo.has(n.tool))?"complete":"prerequisite_required":null}function Ee(t,e){if(!t)return null;let r=Tn(t),n=[kt.join(tt.homedir(),".claude","skills",r),kt.join(e??"",".claude","skills",r)],s=null;for(let c of n)if(S.existsSync(kt.join(c,"SKILL.md"))){s=c;break}if(!s)return null;let o=[];function i(c,l){for(let a of S.readdirSync(c,{withFileTypes:true})){if(Oo.has(a.name)||Ao.has(a.name)||ko.has(kt.extname(a.name)))continue;let d=l?`${l}/${a.name}`:a.name;a.isDirectory()?i(kt.join(c,a.name),d):o.push(d);}}return i(s,""),o.length>0?o:null}var Oo,ko,Ao,Lo,Se=m(()=>{"use strict";Oo=new Set([".venv","__pycache__",".git","node_modules"]),ko=new Set([".pyc",".pyo"]),Ao=new Set(["SKILL.md",".DS_Store",".gitignore"]);Lo=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function bo(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Ro(t,e,r,n){return new Promise(s=>{let o=new URL(t),i=o.protocol==="https:",c=(i?as__namespace.default:ks__namespace.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(e),Authorization:`Bearer ${String(r).replace(/[\r\n]/g,"")}`,FlowTenant:String(n).replace(/[\r\n]/g,"")}},l=>{l.resume(),s(l.statusCode??0);});c.on("error",()=>s(0)),c.setTimeout(5e3,()=>{c.destroy(),s(0);}),c.write(e),c.end();})}async function ut(t,e={}){try{let r=b(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,s=new Promise((y,E)=>{n=setTimeout(()=>E(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:o}=await Promise.race([x(r),s]);clearTimeout(n);let i=bo(o);if(!i)return;let c=i.tenant||r.tenant,l=JSON.stringify({action:t,booster:Ce().BOOSTER,metadata:e,success:!0,tenant:c,timestamp:new Date().toISOString(),os:process.platform,user:{email:i.email||"",id:i.sub||"",name:i.name||i.email||""}}),a=ct(Ce().API_URL),d=await Ro(a,l,o,c);u("metrics.logEvent",`action=${t} status=${d}`);}catch(r){u("metrics.logEvent",`silenced error: ${r.message}`);}}var Te=m(()=>{"use strict";O();_t();Y();F();});async function or(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Po})+`
180
+ `);return}let n=!!(await K()).authError,s=t.session_id||"unknown",o=t.prompt||"",i=t.cwd||"",c=wn(t.transcript_path)||tr(),l=yn(o),a=l?we(l,i):null,d=l?Ee(l,i):null;Nt(s,{traceId:tr(),spanId:lt(),startNs:J(),sessionId:s,prompt:o,cwd:i,traceName:c,transcriptPath:t.transcript_path||"",model:process.env[f.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:l,skillContent:a,skillArtifacts:d}),ut("SESSION_STARTED",{traceType:l?"skill":"prompt",slashSkill:l,clientIdExpired:n}),u("UserPromptSubmit",`sid=${s}`,`traceName=${c}`,`slashSkill=${l}`),D(t);}var Po,On=m(()=>{"use strict";Gt();Kt();sr();Se();Rt();F();O();Y();Te();Po=`\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 ${nt()}/settings/api-keys to generate a new API key, then run: flow-ai-obs auth login`;});async function kn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=Pt(e);s&&(s.pendingTool={name:r,inputStr:W(n,V.TOOL_INPUT),startNs:J()},Nt(e,s)),u("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!s}`),D(t);}var An=m(()=>{"use strict";Gt();Kt();Rt();F();O();});function p(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function dt(...t){return t.filter(e=>e!==null)}function Ln(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:No,spans:Array.isArray(e)?e:[e]}]}]}}var No,h,vn=m(()=>{"use strict";O();No={name:Ne.SCOPE_NAME,version:Ne.SCOPE_VERSION},h={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 bn(t,e,r,n,s){if(process.env[f.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:s}});try{S.writeFileSync(In,o+`
181
+ `,{flag:"a",encoding:"utf8",mode:384}),u("sendTraces:dump",`request appendada em ${In}`);}catch(i){u("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Do(t){let e=new URL(t),r=new URL(st().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function Rn(t,e){return new Promise((r,n)=>{let s=t._isSSL?as__namespace.default:ks__namespace.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=s.request(t,i=>{let c=[];i.on("data",l=>c.push(l)),i.on("end",()=>r({statusCode:i.statusCode??0,body:c.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}async function Pn(t,e){let r;try{r=Do(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let o=await Rn({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:s,_isSSL:n},null);return u("checkHealth",`url=${r.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function ye(t,e,r){let n=JSON.stringify(t),s=new URL(e),o=s.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),c={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};u("sendTraces:request",`POST ${e}`),u("sendTraces:request",`headers=${JSON.stringify({...c,Authorization:i.slice(0,20)+"\u2026"})}`),u("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let l=await Rn({hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname,method:"POST",headers:c,_isSSL:o},n);return u("sendTraces:response",`status=${l.statusCode}`),bn(e,c,n,l.statusCode,l.body),l.statusCode}catch(l){return u("sendTraces:error",l.message),bn(e,c,n,0,l.message),0}}var In,Nn=m(()=>{"use strict";O();F();In=kt.join(tt.tmpdir(),"flow-obs-requests.ndjson");});function Mo(){let t=parseInt(process.env[f.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max($.MIN_TTL_DAYS,Math.min($.MAX_TTL_DAYS,t)):$.DEFAULT_TTL_DAYS)*24*60*60*1e3}function Bo(){let t=parseInt(process.env[f.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max($.MIN_MAX_FILES,Math.min($.MAX_MAX_FILES,t)):$.DEFAULT_MAX_FILES}function Un(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return kt__namespace.default.join(tt__namespace.default.tmpdir(),`${$.FILE_PREFIX}${t}.json`)}function ar(){let t=tt__namespace.default.tmpdir(),e;try{e=S__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith($.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=kt__namespace.default.join(t,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 qt(t){try{let e=Bo(),r=ar();if(r.length>=e){let o=r.slice(0,r.length-e+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:t};return S__namespace.default.writeFileSync(Un(n),JSON.stringify(s),{encoding:"utf8",mode:384}),u("buffer",`saved fileId=${n}`),n}catch(e){return u("buffer",`saveToBuffer failed: ${e.message}`),null}}function $n(t){let e=ar(),r=t!=null&&t>0?t:e.length,n=[];for(let s of e){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{u("buffer",`skipping malformed file: ${s}`);}}return n}function Fn(t){try{S__namespace.default.unlinkSync(Un(t)),u("buffer",`deleted fileId=${t}`);}catch{}}function xn(){let t=Date.now()-Mo();for(let e of ar())try{let{mtimeMs:r}=S__namespace.default.statSync(e);r<t&&(S__namespace.default.unlinkSync(e),u("buffer",`evicted stale: ${kt__namespace.default.basename(e)}`));}catch{}}var Dn=m(()=>{"use strict";O();F();});async function Ho(t){xn();let e=$n($.REPLAY_BATCH_SIZE);e.length&&(u("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await ye(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(Fn(r.fileId),u("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):u("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){u("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function Mn(t){let e=await K();if(!e.length)return e.authError&&(u("postToLangfuse","auth refresh failed \u2014 buffering trace"),qt(t)),0;let r=await Promise.all(e.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await Pn(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 Ho(n),(await Promise.all(r.map(async({creds:o,healthy:i})=>{if(o.mode==="gateway"){if(!i)return u("postToLangfuse","gateway health check failed \u2014 buffering trace"),qt(t),0;let l=await ye(t,o.endpoint,o.authHeader);return (l===0||l>=500)&&(u("postToLangfuse",`gateway send failed (status ${l}) \u2014 buffering trace`),qt(t)),l}let c=await ye(t,o.endpoint,o.authHeader);return (c===0||c>=500)&&(u("postToLangfuse",`direct endpoint unavailable (status ${c}) \u2014 buffering trace`),qt(t)),c}))).find(o=>o!==0)??0}var Bn=m(()=>{"use strict";Y();F();Nn();Dn();O();});var cr=m(()=>{"use strict";vn();Bn();});function X(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Wo.reduce((r,{re:n,replace:s})=>r.replace(n,s),e)}var N,jo,Vo,Yo,Hn,Wo,lr=m(()=>{"use strict";N="[REDACTED]",jo="[REDACTED-EMAIL]",Vo="[REDACTED-CPF]",Yo="[REDACTED-CNPJ]",Hn="[REDACTED-PHONE]",Wo=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${N}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${N}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${N}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${N}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
182
+ ${N}
183
+ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${N}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${N}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${N}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${N}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${N}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${N}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${N}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>jo},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Vo},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Yo},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Hn},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Hn}];});async function jn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=t.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=Pt(e);if(!i){D(t);return}let c=J(),l=i.pendingTool,a=l?.name===r,d=a?l.startNs:String(BigInt(c)-200000000n),y=a?l.inputStr:W(n,V.TOOL_INPUT),E=y,T=null;if(r==="Skill"){let ee=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);T=ee?String(ee).trim():null;let Z=T?we(T,i.cwd):null;Z&&(E=Z,i.skillContent||(i.skillContent=Z),i.skillArtifacts||(i.skillArtifacts=Ee(T,i.cwd))),T&&!i.slashSkill&&(i.slashSkill=T),u("PostToolUse","Skill tool detected",`skillName=${T}`,`contentFound=${!!Z}`);}let L=X(W(o,V.TOOL_OUTPUT)),k=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(L.slice(0,500)),zt=k?"ERROR":"DEFAULT",Ut=lt(),Xt=Math.round(Number(BigInt(c)-BigInt(d))/1e6),Qt={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",te=r==="Skill"&&T?T:he(y,60);i.toolCalls.push({tool:r,brief:te,error:k,durationMs:Xt});let $t=i.spans;$t.push({traceId:i.traceId,spanId:Ut,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:d,endTimeUnixNano:c,attributes:dt(p(h.OBS_NAME,r),p(h.OBS_TYPE,Qt),p(h.OBS_LEVEL,zt),p(h.OBS_INPUT,X(E)),p(h.OBS_OUTPUT,L),p("tool.name",r),p("tool.error",String(k)),r==="Skill"&&T?p("skill.name",T):null,r==="Skill"?p("skill.invocation","slash-command"):null),status:{code:k?2:1}}),i.pendingTool=null,Nt(e,i),k&&ut("TOOL_ERROR",{toolName:r}),u("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${k}`,`durationMs=${Xt}`,`totalSpans=${$t.length}`),D(t);}var Vn=m(()=>{"use strict";Gt();Kt();cr();Rt();Se();F();O();lr();Te();});function Wn(t,e,r){let n=Object.keys(Yn).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let s=Yn[n],o=(e*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var Yn,Gn=m(()=>{"use strict";Yn={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};});async function Kn(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=Pt(e);if(!n){D(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(u("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=J(),o=await Wr(),i=n.toolCalls,c=n.spans;if(n.slashSkill&&!i.some(g=>g.tool==="Skill")){let g=lt(),Q=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});i.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),c.push({traceId:n.traceId,spanId:g,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:dt(p(h.OBS_NAME,"Skill"),p(h.OBS_TYPE,"TOOL"),p(h.OBS_LEVEL,"DEFAULT"),p(h.OBS_INPUT,Q),p(h.OBS_OUTPUT,"loaded via slash command"),p("tool.name","Skill"),p("tool.error","false"),p("skill.name",n.slashSkill),p("skill.invocation","slash-command")),status:{code:1}}),u("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let l=t.transcript_path||n.transcriptPath||"",a=nr(l);if(l&&(i.some(g=>g.tool==="Skill"&&!g.synthetic)||!!n.slashSkill)&&!a?.text){await new Promise(Q=>setTimeout(Q,500));let g=nr(l);g?.text&&(a=g);}u("Stop",`transcriptPath=${l||"(empty)"}`,`assistantOut=${a?`text=${a.text.length}chars`:"null"}`);let y=i.length,E=i.filter(g=>g.error).length,T=X(a?.text?W(a.text,V.TRACE_OUTPUT):y===0?"No tools used":i.map((g,Q)=>`${Q+1}. ${g.tool}${g.brief?` \u2192 ${g.brief}`:""}${g.error?" [ERROR]":""}`).join(`
184
+ `)),L=a?.inputTokens??0,k=a?.outputTokens??0,zt=i.map((g,Q)=>`${Q+1}. ${g.tool}${g.brief?` \u2192 ${g.brief}`:""}${g.error?" [ERROR]":""} (${g.durationMs}ms)`),Ut=!!(n.slashSkill||i.some(g=>g.tool==="Skill")),Xt=i.some(g=>g.tool==="Agent");if(!Ut&&!Xt){u("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),ut("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),rr(e),D(t);return}let Zt=Ut?"skill":"agent",Qt=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),te=Wn(n.model,L,k),ft=_n(n);ft==="prerequisite_required"&&a?.text&&(ft="complete"),ft==="prerequisite_required"&&(c.push({traceId:n.traceId,spanId:lt(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:dt(p(h.OBS_NAME,"prerequisite-check"),p(h.OBS_TYPE,"EVENT"),p(h.OBS_LEVEL,"WARNING"),p(h.OBS_OUTPUT,T),p("skill.name",n.slashSkill||void 0),p("execution_status","prerequisite_required")),status:{code:1}}),u("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let $t=(()=>{if(!(!Ut||!n.prompt)){if(n.slashSkill){let g=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return g?W(X(g),V.USER_INSTRUCTION):void 0}return W(X(n.prompt),V.USER_INSTRUCTION)||void 0}})(),ee=JSON.stringify({trace_type:Zt,...ft!==null&&{execution_status:ft},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...$t!==void 0&&{user_instruction:$t},latency_ms:Qt,...L&&{tokens_input:L},...k&&{tokens_output:k},cost_usd:te,...n.model?{model:n.model}:{},toolCount:y,errorCount:E,stopReason:r,sessionId:n.sessionId,tools:zt.length?zt:void 0}),Z=X(W(n.prompt,V.TRACE_INPUT)),zn=dt(p(h.TRACE_NAME,n.traceName),p(h.TRACE_INPUT,Z),p(h.TRACE_OUTPUT,T),p(h.OBS_INPUT,Z),p(h.OBS_OUTPUT,T),p(h.TRACE_METADATA,ee),p(h.SESSION_ID,n.sessionId),p(h.USER_ID,o.user),p(h.OBS_TYPE,"GENERATION"),p(h.MODEL,n.model),L?p(h.INPUT_TOKENS,L):null,k?p(h.OUTPUT_TOKENS,k):null,p("claude.stop_reason",r),p("claude.tool_count",String(y)),p("claude.error_count",String(E)),p("claude.session_id",n.sessionId),p("flow.trace_type",Zt),{key:h.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Zt}]}}}),Xn={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:zn,status:{code:E>0?2:1}},Zn=dt(p("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),p("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),ur=[...c,Xn];u("Stop",`sid=${e}`,`totalTools=${y}`,`errorTools=${E}`,`spans=${ur.length}`,`inputTokens=${L}`,`outputTokens=${k}`,`traceOutput="${he(T,80)}"`);let Qn=await Mn(Ln(Zn,ur));u("Stop",`POST status=${Qn}`,`traceId=${n.traceId}`),ut("TRACE_SENT",{latencyMs:Qt,totalTools:y,errorTools:E,inputTokens:L,outputTokens:k,costUsd:te}),rr(e),D(t);}var qn=m(()=>{"use strict";Gt();Kt();cr();Y();Gn();sr();Rt();F();Se();lr();O();Te();});async function Go(){let t=process.argv[2];if(t==="UserPromptSubmit"){let r=await Qe(),n;try{n=await K();}catch{process.stdout.write(JSON.stringify(r));return}n.authError?await or(r,true):n.length>0?await or(r):process.stdout.write(JSON.stringify(r));return}if(!await Gr()){let r=[];process.stdin.on("data",n=>r.push(n)),process.stdin.on("end",()=>process.stdout.write(r.join("")));return}let e=await Qe();switch(t){case "PreToolUse":await kn(e);break;case "PostToolUse":await jn(e);break;case "Stop":await Kn(e);break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
185
+ `),process.stdout.write(JSON.stringify(e));}}var Jn=m(()=>{"use strict";Y();Rt();On();An();Vn();qn();Go().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
186
+ `),process.exit(0);});});var qo=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,C,Jt]=process.argv;function pt(t,e){let r=t.indexOf(e);return r!==-1?t[r+1]:void 0}if(C==="--version"||C==="-v"){let{version:t}=re();process.stdout.write(t+`
187
+ `),process.exit(0);}else if(C==="--help"||C==="-h"){let{bold:t,cyan:e,dim:r}=(gt(),v(Oe)),{version:n}=re();process.stdout.write(`
188
+ `+t(" flow-ai-obs")+r(" v"+n)+`
189
+
190
+ `),process.stdout.write(e(" init")+r(` Auth (if needed) + hooks + native OTEL
191
+ `)),process.stdout.write(r(` --custom-url <URL> Set a custom Flow base URL (e.g. https://tenant.example.com)
192
+ `)),process.stdout.write(r(` --no-interactive Suppress interactive prompts (for CI/CD)
193
+ `)),process.stdout.write(e(" setup")+r(` Full Flow wizard: auth + hooks + OTEL + LLM proxy + connectivity
194
+ `)),process.stdout.write(e(" auth login")+r(` Authenticate with Flow (clientId / clientSecret / tenant)
195
+ `)),process.stdout.write(e(" auth logout")+r(` Remove credentials
196
+ `)),process.stdout.write(e(" auth status")+r(` Show current auth status
197
+ `)),process.stdout.write(e(" check")+r(` Validate full observability setup
198
+
199
+ `)),process.stdout.write(r(` Flags: --version, -v Show version
200
+ `)),process.stdout.write(r(` --help, -h Show this help
201
+ `)),process.stdout.write(r(` --no-interactive Skip interactive prompts
202
+
203
+ `)),process.stdout.write(r(` Aliases: install \u2192 init (deprecated)
204
+
205
+ `)),process.stdout.write(r(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
163
206
 
164
207
  `)),process.exit(0);}else if(C==="init"||C==="install")(async()=>{C==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
165
- `),await(It(),$(Pt)).checkForUpdateInteractive();let{runInit:t}=(ie(),$(je)),e=process.argv.slice(3);process.exit(await t({url:rn(e,"--custom-url"),noInteractive:e.includes("--no-interactive")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
166
- `),process.exit(1);});else if(C==="setup")(async()=>{await(It(),$(Pt)).checkForUpdateInteractive();let{runSetup:t}=(Ge(),$(Ye));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
167
- `),process.exit(1);});else if(C==="check")(async()=>{await(It(),$(Pt)).checkForUpdateInteractive();let{runCheck:t}=(Je(),$(Ve));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
168
- `),process.exit(1);});else if(sn.has(C))Cs();else {let{bold:t,cyan:e,dim:s}=(mt(),$(Yt));process.stdout.write(`
208
+ `),await(Et(),v(wt)).checkForUpdateInteractive();let{runInit:t}=(Xe(),v(sn)),e=process.argv.slice(3);process.exit(await t({url:pt(e,"--custom-url"),noInteractive:e.includes("--no-interactive")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
209
+ `),process.exit(1);});else if(C==="setup")(async()=>{await(Et(),v(wt)).checkForUpdateInteractive();let{runSetup:t}=(an(),v(on)),e=process.argv.slice(3);process.exit(await t({clientId:pt(e,"--client-id"),clientSecret:pt(e,"--client-secret"),tenant:pt(e,"--tenant")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
210
+ `),process.exit(1);});else if(C==="auth")(async()=>{let{runLogin:t,runLogout:e,runStatus:r}=(Yt(),v(qe)),n=0;if(Jt==="login"||!Jt){await(Et(),v(wt)).checkForUpdateInteractive();let s=process.argv.slice(4);n=await t({clientId:pt(s,"--client-id"),clientSecret:pt(s,"--client-secret"),tenant:pt(s,"--tenant")});}else if(Jt==="logout"){let s=process.argv.includes("--force");n=await e(s);}else Jt==="status"?(await(Et(),v(wt)).checkForUpdateInteractive(),n=await r()):(process.stderr.write(`Unknown auth subcommand: ${Jt}
211
+ `),process.stderr.write(`Usage: flow-ai-obs auth [login|logout|status]
212
+ `),n=1);process.exit(n);})();else if(C==="otel-headers"){let{runOtelHeaders:t}=(ln(),v(cn));t().then(e=>process.exit(e)).catch(()=>process.exit(1));}else if(C==="check")(async()=>{await(Et(),v(wt)).checkForUpdateInteractive();let{runCheck:t}=(pn(),v(dn));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
213
+ `),process.exit(1);});else if(qo.has(C))Jn();else {let{bold:t,cyan:e,dim:r}=(gt(),v(Oe));process.stdout.write(`
169
214
  `+t(" flow-ai-obs")+`
170
215
 
171
- `),process.stdout.write(e(" init")+s(` Install hooks + native OTEL
172
- `)),process.stdout.write(e(" setup")+s(` Install hooks + OTEL + LLM proxy
173
- `)),process.stdout.write(e(" check")+s(` Validate observability setup
216
+ `),process.stdout.write(e(" init")+r(` Auth (if needed) + hooks + native OTEL
217
+ `)),process.stdout.write(r(` --custom-url <URL> Set a custom Flow base URL (e.g. https://tenant.example.com)
218
+ `)),process.stdout.write(r(` --no-interactive Suppress interactive prompts (for CI/CD)
219
+ `)),process.stdout.write(e(" setup")+r(` Full Flow wizard: auth + hooks + OTEL + LLM proxy + connectivity
220
+ `)),process.stdout.write(e(" auth login")+r(` Authenticate with Flow (clientId / clientSecret / tenant)
221
+ `)),process.stdout.write(e(" auth logout")+r(` Remove credentials
222
+ `)),process.stdout.write(e(" auth status")+r(` Show current auth status
223
+ `)),process.stdout.write(e(" check")+r(` Validate full observability setup
174
224
 
175
- `)),process.stdout.write(s(` Auth: set OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic <base64>"
225
+ `)),process.stdout.write(r(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
176
226
 
177
227
  `)),process.exit(0);}
package/dist/index.js CHANGED
@@ -1,15 +1,16 @@
1
- 'use strict';var z=require('os'),k=require('fs'),$=require('path'),child_process=require('child_process'),crypto=require('crypto'),Ce=require('https'),ve=require('http');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var z__namespace=/*#__PURE__*/_interopNamespace(z);var k__namespace=/*#__PURE__*/_interopNamespace(k);var $__namespace=/*#__PURE__*/_interopNamespace($);var Ce__default=/*#__PURE__*/_interopDefault(Ce);var ve__default=/*#__PURE__*/_interopDefault(ve);function gt(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:z__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||z__namespace.userInfo().username}}var Et="flow-ai-obs",_t="config.json";function se(){if(process.platform==="win32"){let s=process.env.APPDATA||$__namespace.join(z__namespace.homedir(),"AppData","Roaming");return $__namespace.join(s,Et,_t)}let t=gt(),e=process.env.XDG_CONFIG_HOME||$__namespace.join(t.home,".config");return $__namespace.join(e,Et,_t)}function re(){try{let t=k__namespace.readFileSync(se(),"utf8");return JSON.parse(t)}catch{return {}}}function Tt(){let{baseUrl:t}=re();return typeof t!="string"||t.trim()===""?null:t.trim().replace(/\/$/,"")}var oe="https://flow.ciandt.com";function ht(){return Tt()??process.env.FLOW_BASE_URL??oe}function nt(){let t=ht();return {GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}nt();var st={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};var m={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL"};var O={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},Ot="flow-ai-obs-debug.log",R={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4};function rt(){let t=ht();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var ue=$.join(z.tmpdir(),Ot);function a(...t){if(process.env[m.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
2
- `;try{k.writeFileSync(ue,e,{flag:"a"});}catch(s){process.stderr.write(`[flow-obs debug ERROR] ${s.message}
3
- `);}}var pe=[/^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 de(t){return pe.some(e=>e.test(t))}function W(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let s=process.env[m.FLOW_OBS_ALLOW_HTTP]==="true";if(!s&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!s&&de(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}function fe(t){if(!t||!t.trim())return [];let e=[];for(let s of t.split(",")){let n=s.indexOf("=");if(n===-1)continue;let r=s.slice(0,n).trim(),i=s.slice(n+1).trim();r&&e.push([r,i]);}return e}function me(t,e,s){let n=Buffer.from(`${e}:${s}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",headers:[["Authorization",`Basic ${n}`]]}}async function ot(){let t=[],e=process.env[m.ANTHROPIC_MODEL]??"",s=process.env.OTEL_EXPORTER_OTLP_HEADERS??"",n=fe(s);s.trim()?a("resolveCredentials",`parsed ${n.length} header(s) from OTEL_EXPORTER_OTLP_HEADERS`):(a("resolveCredentials","OTEL_EXPORTER_OTLP_HEADERS not set \u2014 no extra headers will be forwarded"),console.warn("[flow-ai-obs] OTEL_EXPORTER_OTLP_HEADERS is not set. No extra headers will be forwarded to the OTLP gateway."));let r=process.env[m.FLOW_TELEMETRY]==="true",i=process.env[m.LANGFUSE_BASE_URL],o=process.env[m.LANGFUSE_PUBLIC_KEY],u=process.env[m.LANGFUSE_SECRET_KEY];if(r&&i&&o&&u){let{endpoint:g,headers:_}=me(W(i),o,u);return t.push({mode:"direct",endpoint:g,headers:_,user:"",tenant:"",team:"",project:"",model:e}),a("resolveCredentials","direct mode active",`endpoint=${g}`),t}let f=process.env[m.FLOW_TELEMETRY_GATEWAY];if(f)return t.push({mode:"gateway",endpoint:W(f).replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",headers:n,user:"",tenant:"",team:"",project:"",model:e}),a("resolveCredentials","gateway mode active via FLOW_TELEMETRY_GATEWAY_URL"),t;let l=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;return l?(t.push({mode:"otel",endpoint:W(l),headers:n,user:"",tenant:"",team:"",project:"",model:e}),a("resolveCredentials","otel mode active",`endpoint=${l}`),t):(a("resolveCredentials","no destination configured \u2014 returning empty"),t)}async function it(){return (await ot()).length>0}function V(){let t=process.env[m.FLOW_USER_EMAIL];if(t)return a("resolveUserEmail",`using FLOW_USER_EMAIL override: ${t}`),t;try{let e=z__namespace.userInfo().username||process.env.USERNAME||process.env.USER||"",s=e.lastIndexOf("\\");if(s!==-1&&(e=e.slice(s+1)),e=e.trim().replace(/[^a-zA-Z0-9._%+\-]/g,""),!e)return a("resolveUserEmail","username empty after sanitisation \u2014 omitting x-flow-user"),console.warn("[flow-ai-obs] Could not derive x-flow-user: username is empty. Set FLOW_USER_EMAIL to fix this."),null;let n=`${e}@ciandt.com`;return a("resolveUserEmail",`derived email: ${n}`),n}catch(e){return a("resolveUserEmail",`os.userInfo() threw: ${e.message} \u2014 omitting x-flow-user`),console.warn("[flow-ai-obs] Could not derive x-flow-user from OS username. Set FLOW_USER_EMAIL to fix this."),null}}function I(t,e){let s=typeof t=="object"?JSON.stringify(t):String(t??"");return s.length>e?s.slice(0,e)+" \u2026[truncated]":s}function K(t,e=100){return String(t??"").split(`
4
- `)[0].slice(0,e).trim()}function at(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",s=>{e+=s;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function L(t){process.stdout.write(JSON.stringify(t));}var lt=()=>crypto.randomBytes(16).toString("hex"),P=()=>crypto.randomBytes(8).toString("hex");function U(){return String(BigInt(Date.now())*1000000n)}var Ae=/^[0-9a-f-]{1,64}$/i,Re=$.normalize(z.tmpdir())+$.sep;function Ie(t,e){let s=$.resolve(t);if(!s.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return s}function ct(t){if(!Ae.test(t))throw new Error(`Invalid session ID: ${t}`);return Ie($.join(z.tmpdir(),`flow-obs-${t}.json`),Re)}function F(t){let e=ct(t);if(!k.existsSync(e))return null;try{return JSON.parse(k.readFileSync(e,"utf8"))}catch{return null}}function D(t,e){k.writeFileSync(ct(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function ut(t){try{k.unlinkSync(ct(t));}catch{}}function kt(t){if(!t||!k.existsSync(t))return null;try{let e=k.readFileSync(t,"utf8").trimEnd().split(`
5
- `);for(let s=e.length-1;s>=0;s--)try{let n=JSON.parse(e[s]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function pt(t){if(!t||!k.existsSync(t))return null;try{let e=k.readFileSync(t,"utf8").trimEnd().split(`
6
- `),s=[],n=0,r=0;for(let i=e.length-1;i>=0;i--)try{let o=JSON.parse(e[i]);if(o.type==="user")break;if(o.type==="assistant"){let f=(o.message?.content??[]).filter(g=>g.type==="text").map(g=>g.text??"").join("");f&&s.unshift(f);let l=o.message?.usage??{};n+=(l.input_tokens??0)+(l.cache_read_input_tokens??0)+(l.cache_creation_input_tokens??0),r+=l.output_tokens??0;}}catch{}return !s.length&&n===0?null:{text:s.join(`
1
+ 'use strict';var child_process=require('child_process'),util=require('util'),L=require('fs'),B=require('path'),st=require('os'),ir=require('https'),ar=require('http'),crypto=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 L__namespace=/*#__PURE__*/_interopNamespace(L);var B__namespace=/*#__PURE__*/_interopNamespace(B);var st__namespace=/*#__PURE__*/_interopNamespace(st);var ir__default=/*#__PURE__*/_interopDefault(ir);var ar__default=/*#__PURE__*/_interopDefault(ar);var xe=Object.defineProperty;var nt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var Et=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var Tt=(t,e)=>{for(var r in e)xe(t,r,{get:e[r],enumerable:true});};var qt={};Tt(qt,{MacOsKeyVaultProvider:()=>kt});var wt,kt,zt=Et(()=>{"use strict";wt=util.promisify(child_process.execFile),kt=class{static async isAvailable(){try{return L.accessSync("/usr/bin/security",L.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await wt("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await wt("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await wt("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Zt={};Tt(Zt,{LinuxKeyVaultProvider:()=>It});var Xt,It,Qt=Et(()=>{"use strict";Xt=util.promisify(child_process.execFile),It=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of e)try{return L.accessSync(r,L.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await Xt("secret-tool",["lookup","service",e,"account",r]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await new Promise((o,s)=>{let i=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",r]);i.on("error",s),i.on("close",l=>{l===0?o():s(new Error(`secret-tool exited with code ${l}`));}),i.stdin.write(n),i.stdin.end();});}async deleteSecret(e,r){try{return await Xt("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var te={};Tt(te,{WindowsKeyVaultProvider:()=>Lt});var Lt,ee=Et(()=>{"use strict";Lt=class{static async isAvailable(){try{return await nt("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return nt("keytar").getPassword(e,r)}async setSecret(e,r,n){await nt("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return nt("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});function Yt(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:st__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||st__namespace.userInfo().username}}var Gt="flow-ai-obs",jt="config.json";function Me(){if(process.platform==="win32"){let r=process.env.APPDATA||B__namespace.join(st__namespace.homedir(),"AppData","Roaming");return B__namespace.join(r,Gt,jt)}let t=Yt(),e=process.env.XDG_CONFIG_HOME||B__namespace.join(t.home,".config");return B__namespace.join(e,Gt,jt)}function He(){try{let t=L__namespace.readFileSync(Me(),"utf8");return JSON.parse(t)}catch{return {}}}function Wt(){let{baseUrl:t}=He();return typeof t!="string"||t.trim()===""?null:t.trim().replace(/\/$/,"")}var Ye="https://flow.ciandt.com";function x(){return Wt()??process.env.FLOW_BASE_URL??Ye}function V(){let t=x();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}V();var it={SERVICE:"flow-plugins-cli",ACCOUNT_TOKEN:"token-cache"},at="FLOW-nodejs",ct="config.json",ht={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};var S={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_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var 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},Jt="flow-ai-obs-debug.log",w={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4};function At(){let t=x();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var yt={credentials:"credentials","token-cache":"tokenCache"};function W(){let t=st__namespace.default.homedir();if(process.platform==="darwin")return B__namespace.default.join(t,"Library","Preferences",at,ct);if(process.platform==="win32"){let r=process.env.APPDATA??B__namespace.default.join(t,"AppData","Roaming");return B__namespace.default.join(r,at,ct)}let e=process.env.XDG_CONFIG_HOME??B__namespace.default.join(t,".config");return B__namespace.default.join(e,at,ct)}function Ot(){try{let t=L__namespace.default.readFileSync(W(),"utf8");return JSON.parse(t)}catch{return {}}}function Kt(t){let e=W();L__namespace.default.mkdirSync(B__namespace.default.dirname(e),{recursive:true}),L__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var ut=class{static isAvailable(){return true}static hasExistingData(){try{if(!L__namespace.default.existsSync(W()))return !1;let e=JSON.parse(L__namespace.default.readFileSync(W(),"utf8"));return !!(e&&e.credentials)}catch{return false}}async getSecret(e,r){let n=Ot(),o=yt[r]??r,s=n[o];return s?typeof s=="string"?s:JSON.stringify(s):null}async setSecret(e,r,n){let o=Ot(),s=yt[r]??r;if(r==="token-cache")try{o[s]=JSON.parse(n);}catch{o[s]=n;}else o[s]=n;Kt(o);}async deleteSecret(e,r){let n=Ot(),o=yt[r]??r;return o in n?(delete n[o],Kt(n),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${W()}`}};async function re(){return await tr()??new ut}async function tr(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(zt(),qt));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Qt(),Zt));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(ee(),te));return await t.isAvailable()?new t:null}default:return null}}var Nt=it.SERVICE,ne=it.ACCOUNT_TOKEN,Rt=null;function Pt(){return Rt||(Rt=re()),Rt}async function bt(t){await(await Pt()).setSecret(Nt,ne,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function Ut(){let e=await(await Pt()).getSecret(Nt,ne);if(!e)return null;try{let r=JSON.parse(e);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function K(){let t=await Ut();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}var or=B.join(st.tmpdir(),Jt);function a(...t){if(process.env[S.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
2
+ `;try{L.writeFileSync(or,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
3
+ `);}}var b=class extends Error{constructor(e){super(e),this.name="AuthError";}},cr=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;function lr(t){if(!cr.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var se={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 ur(t,e){let r=e.length>400?e.slice(0,400)+"\u2026":e;a("toAuthError",`status=${t} body=${r}`);try{let n=JSON.parse(e);if(typeof n.error=="string"&&(a("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),se[n.error]))return new b(se[n.error])}catch{}return t===401||t===403||t===500?new b("Invalid credentials"):t>=400&&t<500?new b("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function q(t){return new Promise((e,r)=>{try{lr(t.tenant);}catch(p){return r(p)}let n=JSON.stringify({clientSecret:t.clientSecret}),o=new URL(V().AUTH_ENGINE),s=o.protocol==="https:",i={hostname:o.hostname,port:o.port||(s?443:80),path:o.pathname+o.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),FlowTenant:t.tenant}};a("getToken",`requesting token tenant=${t.tenant} host=${i.hostname} path=${i.path}`);let c=(s?ir__default.default:ar__default.default).request(i,p=>{let _=[];p.on("data",T=>_.push(T)),p.on("end",()=>{let T=_.join("");if((p.statusCode??0)>=400)return r(ur(p.statusCode??0,T));let m;try{m=JSON.parse(T);}catch{return r(new Error("Invalid response from auth engine"))}let g=m.expires_at??new Date(Date.now()+(m.expires_in??3600)*1e3).toISOString();e({accessToken:m.access_token??"",expiresAt:g});});});c.on("error",p=>r(new Error(`Network error: ${p.message}`))),c.write(n),c.end();})}var pr=[/^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 dr(t){return pr.some(e=>e.test(t))}function fr(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function ft(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:o,tenant:s}=r;return !n||!o||!s?null:{clientId:n,clientSecret:o,tenant:s}}catch{return null}}function dt(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[S.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&dr(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function oe(){let t=ft(process.env[S.ANTHROPIC_AUTH_TOKEN]);if(t)return {user:await K().catch(()=>null)??t.clientId,tenant:t.tenant};return {user:"",tenant:""}}function mr(){return new Date().toISOString().slice(0,10)}async function gr(t){let e=mr(),r=await Ut();if(r?.lastAuthCheckAt!==e){a("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let s=await q(t);try{await bt({...s,lastAuthCheckAt:e});}catch{}return a("getOrRefreshToken",`daily check passed, expires=${s.expiresAt}`),s.accessToken}catch(s){if(s instanceof b)throw s;a("getOrRefreshToken",`daily check network error \u2014 using cache: ${s.message}`);}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(a("getOrRefreshToken",`cacheValid=${n}`),n)return a("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;a("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let o=await q(t);try{await bt({...o,lastAuthCheckAt:e});}catch(s){a("getOrRefreshToken",`token cache save failed (non-fatal): ${s.message}`);}return a("getOrRefreshToken",`token refreshed, expires=${o.expiresAt}`),o.accessToken}function Sr(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function _r(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function U(){let t=[],e=process.env[S.ANTHROPIC_MODEL]??"",r=ft(process.env[S.ANTHROPIC_AUTH_TOKEN]);a("resolveCredentials",r?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),r&&a("resolveCredentials",`clientId=${r.clientId}`,`tenant=${r.tenant}`);let n=r?r.tenant:"",o=process.env[S.FLOW_TELEMETRY]==="true",s=process.env[S.LANGFUSE_BASE_URL],i=process.env[S.LANGFUSE_PUBLIC_KEY],l=process.env[S.LANGFUSE_SECRET_KEY];if(o&&s&&i&&l){let m="",g=n;if(r)m=await K().catch(()=>null)??r.clientId;let h={user:m??"",tenant:g??"",team:"",project:"",model:e};t.push({mode:"direct",..._r(dt(s),i,l),...h}),a("resolveCredentials","direct mode active",`user=${h.user}`,`tenant=${h.tenant}`);}if(!r){if(t.length===0){let m=[];return m.authError=false,m}return t}let c;try{c=await gr(r);}catch(m){if(a("resolveCredentials",`token refresh failed: ${m.message}`,`(tenant=${r.tenant} clientId=${r.clientId})`),t.length>0)return t.authError=true,t;let g=[];return g.authError=true,g}let _={user:fr(c)??r.clientId,tenant:n,team:"",project:"",model:e},T=process.env[S.FLOW_TELEMETRY_GATEWAY]??x();return t.push({mode:"gateway",...Sr(dt(T),{accessToken:c}),..._}),t}async function ie(){return (await U()).length>0}function k(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function mt(t,e=100){return String(t??"").split(`
4
+ `)[0].slice(0,e).trim()}function Ct(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function O(t){process.stdout.write(JSON.stringify(t));}var vt=()=>crypto.randomBytes(16).toString("hex"),C=()=>crypto.randomBytes(8).toString("hex");function I(){return String(BigInt(Date.now())*1000000n)}var Ir=/^[0-9a-f-]{1,64}$/i,Lr=B.normalize(st.tmpdir())+B.sep;function Rr(t,e){let r=B.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function Ft(t){if(!Ir.test(t))throw new Error(`Invalid session ID: ${t}`);return Rr(B.join(st.tmpdir(),`flow-obs-${t}.json`),Lr)}function M(t){let e=Ft(t);if(!L.existsSync(e))return null;try{return JSON.parse(L.readFileSync(e,"utf8"))}catch{return null}}function H(t,e){L.writeFileSync(Ft(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function $t(t){try{L.unlinkSync(Ft(t));}catch{}}function pe(t){if(!t||!L.existsSync(t))return null;try{let e=L.readFileSync(t,"utf8").trimEnd().split(`
5
+ `);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function Dt(t){if(!t||!L.existsSync(t))return null;try{let e=L.readFileSync(t,"utf8").trimEnd().split(`
6
+ `),r=[],n=0,o=0;for(let s=e.length-1;s>=0;s--)try{let i=JSON.parse(e[s]);if(i.type==="user")break;if(i.type==="assistant"){let c=(i.message?.content??[]).filter(_=>_.type==="text").map(_=>_.text??"").join("");c&&r.unshift(c);let p=i.message?.usage??{};n+=(p.input_tokens??0)+(p.cache_read_input_tokens??0)+(p.cache_creation_input_tokens??0),o+=p.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
7
7
 
8
- `),inputTokens:n,outputTokens:r}}catch{}return null}var we=new Set([".venv","__pycache__",".git","node_modules"]),be=new Set([".pyc",".pyo"]),Pe=new Set(["SKILL.md",".DS_Store",".gitignore"]);function bt(t){return t.replace(":","/")}function Z(t,e){if(!t)return null;let s=bt(t),n=[$.join(z.homedir(),".claude","skills",s,"SKILL.md"),$.join(e??"",".claude","skills",s,"SKILL.md")];for(let r of n)if(k.existsSync(r))try{return k.readFileSync(r,"utf8")}catch{}return null}function Pt(t){return t.split(`
9
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}var Ne=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);function Nt(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Ne.has(n.tool))?"complete":"prerequisite_required":null}function Q(t,e){if(!t)return null;let s=bt(t),n=[$.join(z.homedir(),".claude","skills",s),$.join(e??"",".claude","skills",s)],r=null;for(let u of n)if(k.existsSync($.join(u,"SKILL.md"))){r=u;break}if(!r)return null;let i=[];function o(u,f){for(let l of k.readdirSync(u,{withFileTypes:true})){if(we.has(l.name)||Pe.has(l.name)||be.has($.extname(l.name)))continue;let g=f?`${f}/${l.name}`:l.name;l.isDirectory()?o($.join(u,l.name),g):i.push(g);}}return o(r,""),i.length>0?i:null}function $e(t,e){return new Promise(s=>{let n=new URL(t),r=n.protocol==="https:",i=(r?Ce__default.default:ve__default.default).request({hostname:n.hostname,port:n.port||(r?443:80),path:n.pathname+n.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e)}},o=>{o.resume(),s(o.statusCode??0);});i.on("error",()=>s(0)),i.setTimeout(5e3,()=>{i.destroy(),s(0);}),i.write(e),i.end();})}async function N(t,e={}){try{let s=JSON.stringify({action:t,booster:rt().BOOSTER,metadata:e,success:!0,timestamp:new Date().toISOString(),os:process.platform,user:{email:process.env[m.FLOW_USER_EMAIL]||"",id:"",name:""}}),n=W(rt().API_URL),r=await $e(n,s);a("metrics.logEvent",`action=${t} status=${r}`);}catch(s){a("metrics.logEvent",`silenced error: ${s.message}`);}}async function Ct(t){let e=t.cwd||"",s=t.session_id||"unknown",n=t.prompt||"",r=kt(t.transcript_path)||lt(),i=Pt(n),o=i?Z(i,e):null,u=i?Q(i,e):null;D(s,{traceId:lt(),spanId:P(),startNs:U(),sessionId:s,prompt:n,cwd:e,traceName:r,transcriptPath:t.transcript_path||"",model:process.env[m.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:i,skillContent:o,skillArtifacts:u}),N("SESSION_STARTED",{traceType:i?"skill":"prompt",slashSkill:i}),a("UserPromptSubmit",`sid=${s}`,`traceName=${r}`,`slashSkill=${i}`),L(t);}async function vt(t){let e=t.session_id||"unknown",s=t.tool_name||"unknown",n=t.tool_input||{},r=F(e);r&&(r.pendingTool={name:s,inputStr:I(n,R.TOOL_INPUT),startNs:U()},D(e,r)),a("PreToolUse",`sid=${e}`,`tool=${s}`,`stateFound=${!!r}`),L(t);}var Fe={name:st.SCOPE_NAME,version:st.SCOPE_VERSION},d={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 c(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function C(...t){return t.filter(e=>e!==null)}function $t(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Fe,spans:Array.isArray(e)?e:[e]}]}]}}var Ft=$.join(z.tmpdir(),"flow-obs-requests.ndjson");function Dt(t,e,s,n,r){if(process.env[m.FLOW_OBS_DEBUG]!=="1")return;let i=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(s)},response:{status:n,body:r}});try{k.writeFileSync(Ft,i+`
10
- `,{flag:"a",encoding:"utf8",mode:384}),a("sendTraces:dump",`request appendada em ${Ft}`);}catch(o){a("sendTraces:dump",`falha ao salvar: ${o.message}`);}}function je(t){let e=new URL(t),s=new URL(nt().GATEWAY_HEALTH);return s.hostname=e.hostname,s.port=e.port,s.protocol=e.protocol,s}function Mt(t,e){return new Promise((s,n)=>{let r=t._isSSL?Ce__default.default:ve__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let i=r.request(t,o=>{let u=[];o.on("data",f=>u.push(f)),o.on("end",()=>s({statusCode:o.statusCode??0,body:u.join("")}));});i.setTimeout(1e4,()=>{i.destroy(new Error("Request timeout"));}),i.on("error",o=>n(new Error(`Network error: ${o.message}`))),e&&i.write(e),i.end();})}function Bt(t){let e={};for(let[s,n]of t){let r=String(n).replace(/[\r\n]/g,""),i=e[s];i===void 0?e[s]=r:Array.isArray(i)?i.push(r):e[s]=[i,r];}return e}async function xt(t,e){let s;try{s=je(t);}catch{return false}let n=s.protocol==="https:";try{let r=Bt(e??[]),i=await Mt({hostname:s.hostname,port:s.port||(n?443:80),path:s.pathname,method:"GET",headers:r,_isSSL:n},null);return a("checkHealth",`url=${s.href} status=${i.statusCode}`),i.statusCode>=200&&i.statusCode<300}catch{return false}}async function tt(t,e,s){let n=JSON.stringify(t),r=new URL(e),i=r.protocol==="https:",o={...Bt(s??[]),"Content-Type":"application/json","Content-Length":Buffer.byteLength(n)};a("sendTraces:request",`POST ${e}`),a("sendTraces:request",`headers=${JSON.stringify(Object.keys(o))}`),a("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let u=await Mt({hostname:r.hostname,port:r.port||(i?443:80),path:r.pathname,method:"POST",headers:o,_isSSL:i},n);return a("sendTraces:response",`status=${u.statusCode}`),Dt(e,o,n,u.statusCode,u.body),u.statusCode}catch(u){return a("sendTraces:error",u.message),Dt(e,o,n,0,u.message),0}}function Ye(){let t=parseInt(process.env[m.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(O.MIN_TTL_DAYS,Math.min(O.MAX_TTL_DAYS,t)):O.DEFAULT_TTL_DAYS)*24*60*60*1e3}function Ge(){let t=parseInt(process.env[m.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(O.MIN_MAX_FILES,Math.min(O.MAX_MAX_FILES,t)):O.DEFAULT_MAX_FILES}function jt(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return $__namespace.default.join(z__namespace.default.tmpdir(),`${O.FILE_PREFIX}${t}.json`)}function ft(){let t=z__namespace.default.tmpdir(),e;try{e=k__namespace.default.readdirSync(t);}catch{return []}return e.filter(s=>s.startsWith(O.FILE_PREFIX)&&s.endsWith(".json")).map(s=>{let n=$__namespace.default.join(t,s),r=0;try{r=k__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:r}}).sort((s,n)=>s.mtime-n.mtime).map(s=>s.full)}function et(t){try{let e=Ge(),s=ft();if(s.length>=e){let i=s.slice(0,s.length-e+1);for(let o of i)try{k__namespace.default.unlinkSync(o);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,r={fileId:n,bufferedAt:Date.now(),payload:t};return k__namespace.default.writeFileSync(jt(n),JSON.stringify(r),{encoding:"utf8",mode:384}),a("buffer",`saved fileId=${n}`),n}catch(e){return a("buffer",`saveToBuffer failed: ${e.message}`),null}}function Yt(t){let e=ft(),s=t,n=[];for(let r of e){if(n.length>=s)break;try{let i=k__namespace.default.readFileSync(r,"utf8"),o=JSON.parse(i);o&&o.fileId&&o.payload&&n.push(o);}catch{a("buffer",`skipping malformed file: ${r}`);}}return n}function Gt(t){try{k__namespace.default.unlinkSync(jt(t)),a("buffer",`deleted fileId=${t}`);}catch{}}function Ht(){let t=Date.now()-Ye();for(let e of ft())try{let{mtimeMs:s}=k__namespace.default.statSync(e);s<t&&(k__namespace.default.unlinkSync(e),a("buffer",`evicted stale: ${$__namespace.default.basename(e)}`));}catch{}}async function He(t,e=[]){Ht();let s=Yt(O.REPLAY_BATCH_SIZE);s.length&&(a("replayBufferedTraces",`replaying ${s.length} buffered trace(s)`),await Promise.allSettled(s.map(async n=>{try{let r=await tt(n.payload,t.endpoint,[...t.headers,...e]);r>=200&&r<300?(Gt(n.fileId),a("replayBufferedTraces",`replayed fileId=${n.fileId} status=${r}`)):a("replayBufferedTraces",`replay failed fileId=${n.fileId} status=${r}`);}catch(r){a("replayBufferedTraces",`replay error fileId=${n.fileId}: ${r.message}`);}})));}async function Xt(t){let e=await ot();if(!e.length)return 0;let s=V(),r=(process.env.OTEL_EXPORTER_OTLP_HEADERS??"").split(",").some(l=>l.trim().toLowerCase().replace(/\s*=\s*/,"=").startsWith("x-flow-user=")),i=s&&!r?[["x-flow-user",s]]:[],o=await Promise.all(e.map(async l=>{if(l.mode!=="gateway")return {creds:l,healthy:true};let g=await xt(l.endpoint,[...l.headers,...i]);return {creds:l,healthy:g}})),u=o.find(l=>l.creds.mode==="gateway"&&l.healthy)?.creds??o.find(l=>l.creds.mode!=="gateway")?.creds;return u&&await He(u,i),(await Promise.all(o.map(async({creds:l,healthy:g})=>{if(l.mode==="gateway"){if(!g)return a("postToLangfuse","gateway health check failed \u2014 buffering trace"),et(t),0;let T=await tt(t,l.endpoint,[...l.headers,...i]);return (T===0||T>=500)&&(a("postToLangfuse",`gateway send failed (status ${T}) \u2014 buffering trace`),et(t)),T}let _=await tt(t,l.endpoint,[...l.headers,...i]);return (_===0||_>=500)&&(a("postToLangfuse",`endpoint unavailable (status ${_}) \u2014 buffering trace`),et(t)),_}))).find(l=>l!==0)??0}var h="[REDACTED]",Xe="[REDACTED-EMAIL]",qe="[REDACTED-CPF]",ze="[REDACTED-CNPJ]",qt="[REDACTED-PHONE]",Je=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${h}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${h}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${h}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${h}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,s)=>`${e}
11
- ${h}
12
- ${s}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${h}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${h}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${h}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${h}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${h}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,s)=>`${e}${s}${h}${s}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${h}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>Xe},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>qe},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>ze},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>qt},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>qt}];function y(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Je.reduce((s,{re:n,replace:r})=>s.replace(n,r),e)}async function zt(t){let e=t.session_id||"unknown",s=t.tool_name||"unknown",n=t.tool_input||{},r=t.tool_response,i=r!==null&&typeof r=="object"?r.output??JSON.stringify(r):r??"",o=F(e);if(!o){L(t);return}let u=U(),f=o.pendingTool,l=f?.name===s,g=l?f.startNs:String(BigInt(u)-200000000n),_=l?f.inputStr:I(n,R.TOOL_INPUT),T=_,E=null;if(s==="Skill"){let q=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);E=q?String(q).trim():null;let w=E?Z(E,o.cwd):null;w&&(T=w,o.skillContent||(o.skillContent=w),o.skillArtifacts||(o.skillArtifacts=Q(E,o.cwd))),E&&!o.slashSkill&&(o.slashSkill=E),a("PostToolUse","Skill tool detected",`skillName=${E}`,`contentFound=${!!w}`);}let A=y(I(i,R.TOOL_OUTPUT)),S=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(A.slice(0,500)),j=S?"ERROR":"DEFAULT",B=P(),Y=Math.round(Number(BigInt(u)-BigInt(g))/1e6),H={Agent:"AGENT",Task:"AGENT"}[s]??"TOOL",X=s==="Skill"&&E?E:K(_,60);o.toolCalls.push({tool:s,brief:X,error:S,durationMs:Y});let x=o.spans;x.push({traceId:o.traceId,spanId:B,parentSpanId:o.spanId,name:s,kind:3,startTimeUnixNano:g,endTimeUnixNano:u,attributes:C(c(d.OBS_NAME,s),c(d.OBS_TYPE,H),c(d.OBS_LEVEL,j),c(d.OBS_INPUT,y(T)),c(d.OBS_OUTPUT,A),c("tool.name",s),c("tool.error",String(S)),s==="Skill"&&E?c("skill.name",E):null,s==="Skill"?c("skill.invocation","slash-command"):null),status:{code:S?2:1}}),o.pendingTool=null,D(e,o),S&&N("TOOL_ERROR",{toolName:s}),a("PostToolUse",`sid=${e}`,`tool=${s}`,`error=${S}`,`durationMs=${Y}`,`totalSpans=${x.length}`),L(t);}var Jt={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"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}};function Vt(t,e,s){let n=Object.keys(Jt).find(o=>(t??"").toLowerCase().includes(o));if(!n)return;let r=Jt[n],i=(e*r.input+s*r.output)/1e6;return Math.round(i*1e6)/1e6}async function Kt(t){let e=t.session_id||"unknown",s=t.stop_reason||"end_turn",n=F(e);if(!n){L(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(a("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let r=U(),i=V()??"",o=n.toolCalls,u=n.spans;if(n.slashSkill&&!o.some(p=>p.tool==="Skill")){let p=P(),b=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});o.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),u.push({traceId:n.traceId,spanId:p,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:C(c(d.OBS_NAME,"Skill"),c(d.OBS_TYPE,"TOOL"),c(d.OBS_LEVEL,"DEFAULT"),c(d.OBS_INPUT,b),c(d.OBS_OUTPUT,"loaded via slash command"),c("tool.name","Skill"),c("tool.error","false"),c("skill.name",n.slashSkill),c("skill.invocation","slash-command")),status:{code:1}}),a("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let f=t.transcript_path||n.transcriptPath||"",l=pt(f);if(f&&(o.some(p=>p.tool==="Skill"&&!p.synthetic)||!!n.slashSkill)&&!l?.text){await new Promise(b=>setTimeout(b,500));let p=pt(f);p?.text&&(l=p);}a("Stop",`transcriptPath=${f||"(empty)"}`,`assistantOut=${l?`text=${l.text.length}chars`:"null"}`);let _=o.length,T=o.filter(p=>p.error).length,E=y(l?.text?I(l.text,R.TRACE_OUTPUT):_===0?"No tools used":o.map((p,b)=>`${b+1}. ${p.tool}${p.brief?` \u2192 ${p.brief}`:""}${p.error?" [ERROR]":""}`).join(`
13
- `)),A=l?.inputTokens??0,S=l?.outputTokens??0,j=o.map((p,b)=>`${b+1}. ${p.tool}${p.brief?` \u2192 ${p.brief}`:""}${p.error?" [ERROR]":""} (${p.durationMs}ms)`),B=!!(n.slashSkill||o.some(p=>p.tool==="Skill")),Y=o.some(p=>p.tool==="Agent");if(!B&&!Y){a("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),N("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),ut(e),L(t);return}let G=B?"skill":"agent",H=Math.round(Number(BigInt(r)-BigInt(n.startNs))/1e6),X=Vt(n.model,A,S),v=Nt(n);v==="prerequisite_required"&&l?.text&&(v="complete"),v==="prerequisite_required"&&(u.push({traceId:n.traceId,spanId:P(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:r,attributes:C(c(d.OBS_NAME,"prerequisite-check"),c(d.OBS_TYPE,"EVENT"),c(d.OBS_LEVEL,"WARNING"),c(d.OBS_OUTPUT,E),c("skill.name",n.slashSkill||void 0),c("execution_status","prerequisite_required")),status:{code:1}}),a("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let x=(()=>{if(!(!B||!n.prompt)){if(n.slashSkill){let p=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return p?I(y(p),R.USER_INSTRUCTION):void 0}return I(y(n.prompt),R.USER_INSTRUCTION)||void 0}})(),q=JSON.stringify({trace_type:G,...v!==null&&{execution_status:v},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...x!==void 0&&{user_instruction:x},latency_ms:H,...A&&{tokens_input:A},...S&&{tokens_output:S},cost_usd:X,...n.model?{model:n.model}:{},toolCount:_,errorCount:T,stopReason:s,sessionId:n.sessionId,tools:j.length?j:void 0}),w=y(I(n.prompt,R.TRACE_INPUT)),Zt=C(c(d.TRACE_NAME,n.traceName),c(d.TRACE_INPUT,w),c(d.TRACE_OUTPUT,E),c(d.OBS_INPUT,w),c(d.OBS_OUTPUT,E),c(d.TRACE_METADATA,q),c(d.SESSION_ID,n.sessionId),c(d.USER_ID,i),c(d.OBS_TYPE,"GENERATION"),c(d.MODEL,n.model),A?c(d.INPUT_TOKENS,A):null,S?c(d.OUTPUT_TOKENS,S):null,c("claude.stop_reason",s),c("claude.tool_count",String(_)),c("claude.error_count",String(T)),c("claude.session_id",n.sessionId),c("flow.trace_type",G),{key:d.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:G}]}}}),Qt={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:r,attributes:Zt,status:{code:T>0?2:1}},te=C(c("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),c("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),mt=[...u,Qt];a("Stop",`sid=${e}`,`totalTools=${_}`,`errorTools=${T}`,`spans=${mt.length}`,`inputTokens=${A}`,`outputTokens=${S}`,`traceOutput="${K(E,80)}"`);let ee=await Xt($t(te,mt));a("Stop",`POST status=${ee}`,`traceId=${n.traceId}`),N("TRACE_SENT",{latencyMs:H,totalTools:_,errorTools:T,inputTokens:A,outputTokens:S,costUsd:X}),ut(e),L(t);}async function Ve(){let t=process.argv[2];if(t==="UserPromptSubmit"){let s=await at(),n=false;try{n=await it();}catch{process.stdout.write(JSON.stringify(s));return}n?await Ct(s):process.stdout.write(JSON.stringify(s));return}if(!await it()){let s=[];process.stdin.on("data",n=>s.push(n)),process.stdin.on("end",()=>process.stdout.write(s.join("")));return}let e=await at();switch(t){case "PreToolUse":await vt(e);break;case "PostToolUse":await zt(e);break;case "Stop":await Kt(e);break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
14
- `),process.stdout.write(JSON.stringify(e));}}Ve().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
8
+ `),inputTokens:n,outputTokens:o}}catch{}return null}var Ur=new Set([".venv","__pycache__",".git","node_modules"]),Cr=new Set([".pyc",".pyo"]),vr=new Set(["SKILL.md",".DS_Store",".gitignore"]);function me(t){return t.replace(":","/")}function gt(t,e){if(!t)return null;let r=me(t),n=[B.join(st.homedir(),".claude","skills",r,"SKILL.md"),B.join(e??"",".claude","skills",r,"SKILL.md")];for(let o of n)if(L.existsSync(o))try{return L.readFileSync(o,"utf8")}catch{}return null}function ge(t){return t.split(`
9
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}var Fr=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);function Se(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Fr.has(n.tool))?"complete":"prerequisite_required":null}function St(t,e){if(!t)return null;let r=me(t),n=[B.join(st.homedir(),".claude","skills",r),B.join(e??"",".claude","skills",r)],o=null;for(let l of n)if(L.existsSync(B.join(l,"SKILL.md"))){o=l;break}if(!o)return null;let s=[];function i(l,c){for(let p of L.readdirSync(l,{withFileTypes:true})){if(Ur.has(p.name)||vr.has(p.name)||Cr.has(B.extname(p.name)))continue;let _=c?`${c}/${p.name}`:p.name;p.isDirectory()?i(B.join(l,p.name),_):s.push(_);}}return i(o,""),s.length>0?s:null}function xr(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Br(t,e,r,n){return new Promise(o=>{let s=new URL(t),i=s.protocol==="https:",l=(i?ir__default.default:ar__default.default).request({hostname:s.hostname,port:s.port||(i?443:80),path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),Authorization:`Bearer ${String(r).replace(/[\r\n]/g,"")}`,FlowTenant:String(n).replace(/[\r\n]/g,"")}},c=>{c.resume(),o(c.statusCode??0);});l.on("error",()=>o(0)),l.setTimeout(5e3,()=>{l.destroy(),o(0);}),l.write(e),l.end();})}async function v(t,e={}){try{let r=ft(process.env[S.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,o=new Promise((T,m)=>{n=setTimeout(()=>m(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:s}=await Promise.race([q(r),o]);clearTimeout(n);let i=xr(s);if(!i)return;let l=i.tenant||r.tenant,c=JSON.stringify({action:t,booster:At().BOOSTER,metadata:e,success:!0,tenant:l,timestamp:new Date().toISOString(),os:process.platform,user:{email:i.email||"",id:i.sub||"",name:i.name||i.email||""}}),p=dt(At().API_URL),_=await Br(p,c,s,l);a("metrics.logEvent",`action=${t} status=${_}`);}catch(r){a("metrics.logEvent",`silenced error: ${r.message}`);}}var Mr=`\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 ${x()}/settings/api-keys to generate a new API key, then run: flow-ai-obs auth login`;async function xt(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Mr})+`
10
+ `);return}let n=!!(await U()).authError,o=t.session_id||"unknown",s=t.prompt||"",i=t.cwd||"",l=pe(t.transcript_path)||vt(),c=ge(s),p=c?gt(c,i):null,_=c?St(c,i):null;H(o,{traceId:vt(),spanId:C(),startNs:I(),sessionId:o,prompt:s,cwd:i,traceName:l,transcriptPath:t.transcript_path||"",model:process.env[S.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:p,skillArtifacts:_}),v("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),a("UserPromptSubmit",`sid=${o}`,`traceName=${l}`,`slashSkill=${c}`),O(t);}async function _e(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},o=M(e);o&&(o.pendingTool={name:r,inputStr:k(n,w.TOOL_INPUT),startNs:I()},H(e,o)),a("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!o}`),O(t);}var Hr={name:ht.SCOPE_NAME,version:ht.SCOPE_VERSION},f={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 u(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function F(...t){return t.filter(e=>e!==null)}function Ee(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Hr,spans:Array.isArray(e)?e:[e]}]}]}}var Te=B.join(st.tmpdir(),"flow-obs-requests.ndjson");function he(t,e,r,n,o){if(process.env[S.FLOW_OBS_DEBUG]!=="1")return;let s=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:o}});try{L.writeFileSync(Te,s+`
11
+ `,{flag:"a",encoding:"utf8",mode:384}),a("sendTraces:dump",`request appendada em ${Te}`);}catch(i){a("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Jr(t){let e=new URL(t),r=new URL(V().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function Ae(t,e){return new Promise((r,n)=>{let o=t._isSSL?ir__default.default:ar__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let s=o.request(t,i=>{let l=[];i.on("data",c=>l.push(c)),i.on("end",()=>r({statusCode:i.statusCode??0,body:l.join("")}));});s.setTimeout(1e4,()=>{s.destroy(new Error("Request timeout"));}),s.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&s.write(e),s.end();})}async function ye(t,e){let r;try{r=Jr(t);}catch{return false}let n=r.protocol==="https:";try{let o={};e&&(o.Authorization=String(e).replace(/[\r\n]/g,""));let s=await Ae({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:o,_isSSL:n},null);return a("checkHealth",`url=${r.href} status=${s.statusCode}`),s.statusCode>=200&&s.statusCode<300}catch{return false}}async function _t(t,e,r){let n=JSON.stringify(t),o=new URL(e),s=o.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),l={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};a("sendTraces:request",`POST ${e}`),a("sendTraces:request",`headers=${JSON.stringify({...l,Authorization:i.slice(0,20)+"\u2026"})}`),a("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let c=await Ae({hostname:o.hostname,port:o.port||(s?443:80),path:o.pathname,method:"POST",headers:l,_isSSL:s},n);return a("sendTraces:response",`status=${c.statusCode}`),he(e,l,n,c.statusCode,c.body),c.statusCode}catch(c){return a("sendTraces:error",c.message),he(e,l,n,0,c.message),0}}function Kr(){let t=parseInt(process.env[S.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(y.MIN_TTL_DAYS,Math.min(y.MAX_TTL_DAYS,t)):y.DEFAULT_TTL_DAYS)*24*60*60*1e3}function qr(){let t=parseInt(process.env[S.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(y.MIN_MAX_FILES,Math.min(y.MAX_MAX_FILES,t)):y.DEFAULT_MAX_FILES}function we(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return B__namespace.default.join(st__namespace.default.tmpdir(),`${y.FILE_PREFIX}${t}.json`)}function Mt(){let t=st__namespace.default.tmpdir(),e;try{e=L__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(y.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=B__namespace.default.join(t,r),o=0;try{o=L__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:o}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function z(t){try{let e=qr(),r=Mt();if(r.length>=e){let s=r.slice(0,r.length-e+1);for(let i of s)try{L__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,o={fileId:n,bufferedAt:Date.now(),payload:t};return L__namespace.default.writeFileSync(we(n),JSON.stringify(o),{encoding:"utf8",mode:384}),a("buffer",`saved fileId=${n}`),n}catch(e){return a("buffer",`saveToBuffer failed: ${e.message}`),null}}function ke(t){let e=Mt(),r=t,n=[];for(let o of e){if(n.length>=r)break;try{let s=L__namespace.default.readFileSync(o,"utf8"),i=JSON.parse(s);i&&i.fileId&&i.payload&&n.push(i);}catch{a("buffer",`skipping malformed file: ${o}`);}}return n}function Ie(t){try{L__namespace.default.unlinkSync(we(t)),a("buffer",`deleted fileId=${t}`);}catch{}}function Le(){let t=Date.now()-Kr();for(let e of Mt())try{let{mtimeMs:r}=L__namespace.default.statSync(e);r<t&&(L__namespace.default.unlinkSync(e),a("buffer",`evicted stale: ${B__namespace.default.basename(e)}`));}catch{}}async function zr(t){Le();let e=ke(y.REPLAY_BATCH_SIZE);e.length&&(a("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await _t(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(Ie(r.fileId),a("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):a("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){a("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function Re(t){let e=await U();if(!e.length)return e.authError&&(a("postToLangfuse","auth refresh failed \u2014 buffering trace"),z(t)),0;let r=await Promise.all(e.map(async s=>{if(s.mode!=="gateway")return {creds:s,healthy:true};let i=await ye(s.endpoint,s.authHeader);return {creds:s,healthy:i}})),n=r.find(s=>s.creds.mode==="gateway"&&s.healthy)?.creds??r.find(s=>s.creds.mode==="direct")?.creds;return n&&await zr(n),(await Promise.all(r.map(async({creds:s,healthy:i})=>{if(s.mode==="gateway"){if(!i)return a("postToLangfuse","gateway health check failed \u2014 buffering trace"),z(t),0;let c=await _t(t,s.endpoint,s.authHeader);return (c===0||c>=500)&&(a("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),z(t)),c}let l=await _t(t,s.endpoint,s.authHeader);return (l===0||l>=500)&&(a("postToLangfuse",`direct endpoint unavailable (status ${l}) \u2014 buffering trace`),z(t)),l}))).find(s=>s!==0)??0}var A="[REDACTED]",Xr="[REDACTED-EMAIL]",Zr="[REDACTED-CPF]",Qr="[REDACTED-CNPJ]",Ne="[REDACTED-PHONE]",tn=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${A}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${A}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${A}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${A}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
12
+ ${A}
13
+ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${A}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${A}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${A}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${A}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${A}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${A}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${A}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>Xr},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Zr},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Qr},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Ne},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Ne}];function R(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return tn.reduce((r,{re:n,replace:o})=>r.replace(n,o),e)}async function Pe(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},o=t.tool_response,s=o!==null&&typeof o=="object"?o.output??JSON.stringify(o):o??"",i=M(e);if(!i){O(t);return}let l=I(),c=i.pendingTool,p=c?.name===r,_=p?c.startNs:String(BigInt(l)-200000000n),T=p?c.inputStr:k(n,w.TOOL_INPUT),m=T,g=null;if(r==="Skill"){let rt=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);g=rt?String(rt).trim():null;let N=g?gt(g,i.cwd):null;N&&(m=N,i.skillContent||(i.skillContent=N),i.skillArtifacts||(i.skillArtifacts=St(g,i.cwd))),g&&!i.slashSkill&&(i.slashSkill=g),a("PostToolUse","Skill tool detected",`skillName=${g}`,`contentFound=${!!N}`);}let h=R(k(s,w.TOOL_OUTPUT)),E=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(h.slice(0,500)),X=E?"ERROR":"DEFAULT",G=C(),Z=Math.round(Number(BigInt(l)-BigInt(_))/1e6),tt={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",et=r==="Skill"&&g?g:mt(T,60);i.toolCalls.push({tool:r,brief:et,error:E,durationMs:Z});let j=i.spans;j.push({traceId:i.traceId,spanId:G,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:_,endTimeUnixNano:l,attributes:F(u(f.OBS_NAME,r),u(f.OBS_TYPE,tt),u(f.OBS_LEVEL,X),u(f.OBS_INPUT,R(m)),u(f.OBS_OUTPUT,h),u("tool.name",r),u("tool.error",String(E)),r==="Skill"&&g?u("skill.name",g):null,r==="Skill"?u("skill.invocation","slash-command"):null),status:{code:E?2:1}}),i.pendingTool=null,H(e,i),E&&v("TOOL_ERROR",{toolName:r}),a("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${E}`,`durationMs=${Z}`,`totalSpans=${j.length}`),O(t);}var be={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"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}};function Ue(t,e,r){let n=Object.keys(be).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let o=be[n],s=(e*o.input+r*o.output)/1e6;return Math.round(s*1e6)/1e6}async function Ce(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=M(e);if(!n){O(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(a("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let o=I(),s=await oe(),i=n.toolCalls,l=n.spans;if(n.slashSkill&&!i.some(d=>d.tool==="Skill")){let d=C(),P=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});i.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),l.push({traceId:n.traceId,spanId:d,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:F(u(f.OBS_NAME,"Skill"),u(f.OBS_TYPE,"TOOL"),u(f.OBS_LEVEL,"DEFAULT"),u(f.OBS_INPUT,P),u(f.OBS_OUTPUT,"loaded via slash command"),u("tool.name","Skill"),u("tool.error","false"),u("skill.name",n.slashSkill),u("skill.invocation","slash-command")),status:{code:1}}),a("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||n.transcriptPath||"",p=Dt(c);if(c&&(i.some(d=>d.tool==="Skill"&&!d.synthetic)||!!n.slashSkill)&&!p?.text){await new Promise(P=>setTimeout(P,500));let d=Dt(c);d?.text&&(p=d);}a("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${p?`text=${p.text.length}chars`:"null"}`);let T=i.length,m=i.filter(d=>d.error).length,g=R(p?.text?k(p.text,w.TRACE_OUTPUT):T===0?"No tools used":i.map((d,P)=>`${P+1}. ${d.tool}${d.brief?` \u2192 ${d.brief}`:""}${d.error?" [ERROR]":""}`).join(`
14
+ `)),h=p?.inputTokens??0,E=p?.outputTokens??0,X=i.map((d,P)=>`${P+1}. ${d.tool}${d.brief?` \u2192 ${d.brief}`:""}${d.error?" [ERROR]":""} (${d.durationMs}ms)`),G=!!(n.slashSkill||i.some(d=>d.tool==="Skill")),Z=i.some(d=>d.tool==="Agent");if(!G&&!Z){a("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),v("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),$t(e),O(t);return}let Q=G?"skill":"agent",tt=Math.round(Number(BigInt(o)-BigInt(n.startNs))/1e6),et=Ue(n.model,h,E),$=Se(n);$==="prerequisite_required"&&p?.text&&($="complete"),$==="prerequisite_required"&&(l.push({traceId:n.traceId,spanId:C(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:o,attributes:F(u(f.OBS_NAME,"prerequisite-check"),u(f.OBS_TYPE,"EVENT"),u(f.OBS_LEVEL,"WARNING"),u(f.OBS_OUTPUT,g),u("skill.name",n.slashSkill||void 0),u("execution_status","prerequisite_required")),status:{code:1}}),a("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let j=(()=>{if(!(!G||!n.prompt)){if(n.slashSkill){let d=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return d?k(R(d),w.USER_INSTRUCTION):void 0}return k(R(n.prompt),w.USER_INSTRUCTION)||void 0}})(),rt=JSON.stringify({trace_type:Q,...$!==null&&{execution_status:$},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...j!==void 0&&{user_instruction:j},latency_ms:tt,...h&&{tokens_input:h},...E&&{tokens_output:E},cost_usd:et,...n.model?{model:n.model}:{},toolCount:T,errorCount:m,stopReason:r,sessionId:n.sessionId,tools:X.length?X:void 0}),N=R(k(n.prompt,w.TRACE_INPUT)),ve=F(u(f.TRACE_NAME,n.traceName),u(f.TRACE_INPUT,N),u(f.TRACE_OUTPUT,g),u(f.OBS_INPUT,N),u(f.OBS_OUTPUT,g),u(f.TRACE_METADATA,rt),u(f.SESSION_ID,n.sessionId),u(f.USER_ID,s.user),u(f.OBS_TYPE,"GENERATION"),u(f.MODEL,n.model),h?u(f.INPUT_TOKENS,h):null,E?u(f.OUTPUT_TOKENS,E):null,u("claude.stop_reason",r),u("claude.tool_count",String(T)),u("claude.error_count",String(m)),u("claude.session_id",n.sessionId),u("flow.trace_type",Q),{key:f.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Q}]}}}),Fe={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:o,attributes:ve,status:{code:m>0?2:1}},$e=F(u("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),u("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Ht=[...l,Fe];a("Stop",`sid=${e}`,`totalTools=${T}`,`errorTools=${m}`,`spans=${Ht.length}`,`inputTokens=${h}`,`outputTokens=${E}`,`traceOutput="${mt(g,80)}"`);let De=await Re(Ee($e,Ht));a("Stop",`POST status=${De}`,`traceId=${n.traceId}`),v("TRACE_SENT",{latencyMs:tt,totalTools:T,errorTools:m,inputTokens:h,outputTokens:E,costUsd:et}),$t(e),O(t);}async function en(){let t=process.argv[2];if(t==="UserPromptSubmit"){let r=await Ct(),n;try{n=await U();}catch{process.stdout.write(JSON.stringify(r));return}n.authError?await xt(r,true):n.length>0?await xt(r):process.stdout.write(JSON.stringify(r));return}if(!await ie()){let r=[];process.stdin.on("data",n=>r.push(n)),process.stdin.on("end",()=>process.stdout.write(r.join("")));return}let e=await Ct();switch(t){case "PreToolUse":await _e(e);break;case "PostToolUse":await Pe(e);break;case "Stop":await Ce(e);break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
15
+ `),process.stdout.write(JSON.stringify(e));}}en().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
15
16
  `),process.exit(0);});
package/dist/setup.js CHANGED
@@ -1,3 +1,8 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var l=require('path'),o=require('fs'),u=require('os'),child_process=require('child_process'),J=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var l__namespace=/*#__PURE__*/_interopNamespace(l);var o__namespace=/*#__PURE__*/_interopNamespace(o);var u__namespace=/*#__PURE__*/_interopNamespace(u);var J__default=/*#__PURE__*/_interopDefault(J);var M=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(s){throw e=0,s}};var P=M((_t,V)=>{V.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.0-beta.484",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'})"`,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"},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:{},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",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 _(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:u__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||u__namespace.userInfo().username}}function h(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let s=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();s&&/^[A-Za-z]:\\/.test(s)&&(t=s);}if(t){let e=t.replace(/^([A-Za-z]):/,(s,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return l__namespace.join(e,".claude","settings.json")}return l__namespace.join(u__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||u__namespace.homedir();return l__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return l__namespace.join(e,".claude","settings.json")}return l__namespace.join(u__namespace.homedir(),".claude","settings.json")}var L="flow-ai-obs",T="config.json";function D(){if(process.platform==="win32"){let s=process.env.APPDATA||l__namespace.join(u__namespace.homedir(),"AppData","Roaming");return l__namespace.join(s,L,T)}let t=_(),e=process.env.XDG_CONFIG_HOME||l__namespace.join(t.home,".config");return l__namespace.join(e,L,T)}function j(){try{let t=o__namespace.readFileSync(D(),"utf8");return JSON.parse(t)}catch{return {}}}function O(){let{baseUrl:t}=j();return typeof t!="string"||t.trim()===""?null:t.trim().replace(/\/$/,"")}var H="https://flow.ciandt.com";function y(){return O()??process.env.FLOW_BASE_URL??H}function W(){let t=y();return {GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}var Y=W();function R(){let t=y();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}var v={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:Y.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"};var U={LOCK_STALE_MS:3e4},w={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15};var $=U.LOCK_STALE_MS;function G(t){try{let e=o__namespace.statSync(t);Date.now()-e.mtimeMs>$&&o__namespace.unlinkSync(t);}catch{}try{o__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function x(t){try{o__namespace.unlinkSync(t);}catch{}}function B(t,e){let n=(Array.isArray(t)?t:[]).map(r=>{if(!Array.isArray(r?.hooks))return null;let i=r.hooks.filter(c=>!c.command?.startsWith?.("flow-ai-obs "));return i.length>0?{...r,hooks:i}:null}).filter(r=>r!=null);return [e,...n]}function I(){let t=h(),e=t+".lock",s=[];o__namespace.mkdirSync(l__namespace.dirname(t),{recursive:true}),G(e);try{if(o__namespace.existsSync(t)){o__namespace.copyFileSync(t,t+".bkp");try{o__namespace.chmodSync(t+".bkp",384);}catch{}}let n={};if(o__namespace.existsSync(t)){try{n=JSON.parse(o__namespace.readFileSync(t,"utf8"));}catch{}"otelHeadersHelper"in n&&delete n.otelHeadersHelper;}let r=n.env&&typeof n.env=="object"?n.env:{};n.env={...v,...R(),...r},(!n.hooks||typeof n.hooks!="object"||Array.isArray(n.hooks))&&(n.hooks={});let i=(a,d)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${a}`,timeout:d}]}),c=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],g=n.hooks;for(let a of c){let d=B(g[a],i(a,w[a]));d.length>1&&s.push(a),g[a]=d;}o__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
3
- `,{encoding:"utf8",mode:384});try{o__namespace.chmodSync(t,384);}catch{}}finally{x(e);}return {settingsPath:t,preserved:s}}var E;function F(){return E||(E=P()),E}var b=l__namespace.default.join(u__namespace.default.tmpdir(),"flow-obs-update-cache.json"),z=1440*60*1e3,Z=3e3;function Q(t,e){let s=i=>{let c=String(i).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return c?[+c[1],+c[2],+c[3]]:null},n=s(t),r=s(e);return !n||!r?false:r[0]!==n[0]?r[0]>n[0]:r[1]!==n[1]?r[1]>n[1]:r[2]>n[2]}function tt(){try{let t=JSON.parse(o__namespace.default.readFileSync(b,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=z?null:t}catch{return null}}function et(t,e,s=Date.now()){try{o__namespace.default.writeFileSync(b,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:s}),{mode:384});}catch{}}function nt(t){let e=F().name,s=J__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:Z},n=>{if(n.statusCode!==200)return n.resume(),t(new Error(`HTTP ${n.statusCode}`));let r="";n.setEncoding("utf8"),n.on("data",i=>{r+=i;}),n.on("end",()=>{try{let i=JSON.parse(r);if(typeof i.version!="string")throw new Error("no version field");t(null,{version:i.version,updatePriority:typeof i.updatePriority=="string"?i.updatePriority:null});}catch(i){t(i);}});});s.on("error",t),s.on("timeout",()=>{s.destroy(new Error("timeout"));});}function N(){try{if(tt())return;setImmediate(()=>{nt((t,e)=>{t||!e||Q(F().version,e.version)&&et(e.version,e.updatePriority,0);});});}catch{}}var st=l__namespace.default.resolve(__dirname,".."),ot=process.env.INIT_CWD?l__namespace.default.resolve(process.env.INIT_CWD):null;ot===st&&process.exit(0);async function rt(){try{I();}catch{}}rt().catch(()=>{}).finally(()=>N());
2
+ 'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),f=require('path'),l=require('os'),We=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var i__namespace=/*#__PURE__*/_interopNamespace(i);var f__namespace=/*#__PURE__*/_interopNamespace(f);var l__namespace=/*#__PURE__*/_interopNamespace(l);var We__default=/*#__PURE__*/_interopDefault(We);var Te=Object.defineProperty;var y=(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 v=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var _e=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},O=(e,t)=>{for(var r in t)Te(e,r,{get:t[r],enumerable:true});};var Q={};O(Q,{MacOsKeyVaultProvider:()=>b});var U,b,ee=v(()=>{"use strict";U=util.promisify(child_process.execFile),b=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(t,r){try{let{stdout:n}=await U("security",["find-generic-password","-w","-a",r,"-s",t]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await U("security",["add-generic-password","-U","-a",r,"-s",t,"-w",n]);}async deleteSecret(t,r){try{return await U("security",["delete-generic-password","-a",r,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var re={};O(re,{LinuxKeyVaultProvider:()=>F});var te,F,ne=v(()=>{"use strict";te=util.promisify(child_process.execFile),F=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 i.accessSync(r,i.constants.X_OK),!0}catch{}return !1}async getSecret(t,r){try{let{stdout:n}=await te("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 a=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",r]);a.on("error",o),a.on("close",h=>{h===0?s():o(new Error(`secret-tool exited with code ${h}`));}),a.stdin.write(n),a.stdin.end();});}async deleteSecret(t,r){try{return await te("secret-tool",["clear","service",t,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var se={};O(se,{WindowsKeyVaultProvider:()=>D});var D,oe=v(()=>{"use strict";D=class{static async isAvailable(){try{return await y("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,r){return y("keytar").getPassword(t,r)}async setSecret(t,r,n){await y("keytar").setPassword(t,r,n);}async deleteSecret(t,r){return y("keytar").deletePassword(t,r)}getStoragePath(){return "Windows Credential Manager"}};});var de=_e((Zt,Be)=>{Be.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.0-beta.524",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'})"`,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"},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:{},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",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",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 Y(){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:l__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||l__namespace.userInfo().username}}function P(){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 f__namespace.join(t,".claude","settings.json")}return f__namespace.join(l__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||l__namespace.homedir();return f__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 f__namespace.join(t,".claude","settings.json")}return f__namespace.join(l__namespace.homedir(),".claude","settings.json")}var j="flow-ai-obs",G="config.json";function R(){if(process.platform==="win32"){let r=process.env.APPDATA||f__namespace.join(l__namespace.homedir(),"AppData","Roaming");return f__namespace.join(r,j,G)}let e=Y(),t=process.env.XDG_CONFIG_HOME||f__namespace.join(e.home,".config");return f__namespace.join(t,j,G)}function Se(){try{let e=i__namespace.readFileSync(R(),"utf8");return JSON.parse(e)}catch{return {}}}function W(){let{baseUrl:e}=Se();return typeof e!="string"||e.trim()===""?null:e.trim().replace(/\/$/,"")}var we="https://flow.ciandt.com";function I(){return W()??process.env.FLOW_BASE_URL??we}function C(){let e=I();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`}}var Ae=C(),_={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials"},S="FLOW-nodejs",w="config.json";function K(){let e=I();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${e}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}var J={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:Ae.OTEL_ENDPOINT,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_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var X={LOCK_STALE_MS:3e4},q={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15};var z="flow-ai-obs-debug.log";var k={credentials:"credentials","token-cache":"tokenCache"};function m(){let e=l__namespace.default.homedir();if(process.platform==="darwin")return f__namespace.default.join(e,"Library","Preferences",S,w);if(process.platform==="win32"){let r=process.env.APPDATA??f__namespace.default.join(e,"AppData","Roaming");return f__namespace.default.join(r,S,w)}let t=process.env.XDG_CONFIG_HOME??f__namespace.default.join(e,".config");return f__namespace.default.join(t,S,w)}function N(){try{let e=i__namespace.default.readFileSync(m(),"utf8");return JSON.parse(e)}catch{return {}}}function Z(e){let t=m();i__namespace.default.mkdirSync(f__namespace.default.dirname(t),{recursive:true}),i__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var A=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(m()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(m(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,r){let n=N(),s=k[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,r,n){let s=N(),o=k[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;Z(s);}async deleteSecret(t,r){let n=N(),s=k[r]??r;return s in n?(delete n[s],Z(n),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${m()}`}};async function ie(){return await be()??new A}async function be(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(ee(),Q));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(ne(),re));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(oe(),se));return await e.isAvailable()?new e:null}default:return null}}var Fe=_.SERVICE,De=_.ACCOUNT_CREDS,$=null;function $e(){return $||($=ie()),$}async function H(){let t=await(await $e()).getSecret(Fe,De);if(!t)return null;try{return JSON.parse(t)}catch{return null}}f.join(l.tmpdir(),z);var Ye=X.LOCK_STALE_MS;function ae(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>Ye&&i__namespace.unlinkSync(e);}catch{}try{i__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 ce(e){try{i__namespace.unlinkSync(e);}catch{}}function je(e,t){let n=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(a=>!a.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [t,...n]}function le(){let e=P(),t=e+".lock",r=[];i__namespace.mkdirSync(f__namespace.dirname(e),{recursive:true}),ae(t);try{if(i__namespace.existsSync(e)){i__namespace.copyFileSync(e,e+".bkp");try{i__namespace.chmodSync(e+".bkp",384);}catch{}}let n=R();if(i__namespace.existsSync(n)){let c=n+".bkp";i__namespace.copyFileSync(n,c);try{i__namespace.chmodSync(c,384);}catch{}}let s={};try{s=JSON.parse(i__namespace.readFileSync(e,"utf8"));}catch{}let o=s.env&&typeof s.env=="object"?s.env:{};s.env={...J,...K(),...o},s.otelHeadersHelper="flow-ai-obs otel-headers",(!s.hooks||typeof s.hooks!="object"||Array.isArray(s.hooks))&&(s.hooks={});let a=(c,E)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:E}]}),h=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],V=s.hooks;for(let c of h){let E=je(V[c],a(c,q[c]));E.length>1&&r.push(c),V[c]=E;}i__namespace.writeFileSync(e,JSON.stringify(s,null,2)+`
3
+ `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(e,384);}catch{}}finally{ce(t);}return {settingsPath:e,preserved:r}}function ue(e){let t=P(),r=t+".lock";i__namespace.mkdirSync(f__namespace.dirname(t),{recursive:true}),ae(r);try{let n={};try{n=JSON.parse(i__namespace.readFileSync(t,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,e),i__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
4
+ `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}}finally{ce(r);}}function pe(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 fe(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}.`}var M;function ge(){return M||(M=de()),M}var he=f__namespace.default.join(l__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Xe=1440*60*1e3,qe=3e3;function ze(e,t){let r=o=>{let a=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[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 Ze(){try{let e=JSON.parse(i__namespace.default.readFileSync(he,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=Xe?null:e}catch{return null}}function Qe(e,t,r=Date.now()){try{i__namespace.default.writeFileSync(he,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function et(e){let t=ge().name,r=We__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:qe},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 Ee(){try{if(Ze())return;setImmediate(()=>{et((e,t)=>{e||!t||ze(ge().version,t.version)&&Qe(t.version,t.updatePriority,0);});});}catch{}}var tt=f__namespace.default.resolve(__dirname,".."),rt=process.env.INIT_CWD?f__namespace.default.resolve(process.env.INIT_CWD):null;rt===tt&&process.exit(0);async function nt(){try{le();}catch{}let e=await H();if(!e){process.stderr.write(`
5
+ [flow-ai-obs] No credentials found.
6
+ Run \`flow-ai-obs auth login\` to authenticate and enable telemetry.
7
+
8
+ `);return}let t=pe(process.env[d.ANTHROPIC_AUTH_TOKEN]);if(!t||t.clientId!==e.clientId||t.clientSecret!==e.clientSecret||t.tenant!==e.tenant)try{let n=fe(e);ue({[d.ANTHROPIC_AUTH_TOKEN]:n});}catch{}}nt().catch(()=>{}).finally(()=>Ee());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.7.0-beta.484",
3
+ "version": "0.7.0-beta.524",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -54,11 +54,11 @@
54
54
  "@changesets/cli": "^2.30.0",
55
55
  "@types/jest": "^30.0.0",
56
56
  "@types/node": "^25.8.0",
57
- "eslint-config-prettier": "^10.1.5",
58
57
  "jest": "^30.4.2",
59
- "prettier": "^3.5.3",
60
58
  "ts-jest": "^29.4.9",
61
59
  "tsup": "^8.5.1",
60
+ "eslint-config-prettier": "^10.1.5",
61
+ "prettier": "^3.5.3",
62
62
  "typescript": "^6.0.3",
63
63
  "typescript-eslint": "^8.33.0"
64
64
  },