@ciandt-flow/flow-ai-obs 0.11.0 → 0.12.0-beta.803

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,66 +1,66 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var Re=require('readline/promises'),ls=require('https'),k=require('fs'),ht=require('os'),bt=require('path'),child_process=require('child_process'),Rs=require('http'),util=require('util'),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 Re__namespace=/*#__PURE__*/_interopNamespace(Re);var ls__default=/*#__PURE__*/_interopDefault(ls);var k__namespace=/*#__PURE__*/_interopNamespace(k);var ht__namespace=/*#__PURE__*/_interopNamespace(ht);var bt__namespace=/*#__PURE__*/_interopNamespace(bt);var Rs__default=/*#__PURE__*/_interopDefault(Rs);var Le=Object.defineProperty;var ns=Object.getOwnPropertyDescriptor;var rs=Object.getOwnPropertyNames;var ss=Object.prototype.hasOwnProperty;var xt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var g=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var os=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}},$=(t,e)=>{for(var n in e)Le(t,n,{get:e[n],enumerable:true});},is=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of rs(e))!ss.call(t,s)&&s!==n&&Le(t,s,{get:()=>e[s],enumerable:!(r=ns(e,s))||r.enumerable});return t};var N=t=>is(Le({},"__esModule",{value:true}),t);var ve={};$(ve,{bold:()=>I,cyan:()=>P,dim:()=>m,green:()=>R,red:()=>b,yellow:()=>v});function At(t,e){return as?n=>`\x1B[${t}m${n}\x1B[${e}m`:n=>n}var as,R,b,v,P,I,m,ut=g(()=>{"use strict";as=!process.env.NO_COLOR&&process.stdout.isTTY;R=At("32","39"),b=At("31","39"),v=At("33","39"),P=At("36","39"),I=At("1","22"),m=At("2","22");});var Dt=os((si,cs)=>{cs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.11.0",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},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 dt(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function be(t,e){let n=Re__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let i=1;i<=3;i++)try{let o=(await n.question(s)).trim().toLowerCase();if(o===""&&e!==void 0)return n.close(),e;if(o==="y"||o==="yes")return n.close(),!0;if(o==="n"||o==="no")return n.close(),!1;i<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
- `);}catch(o){throw n.close(),o}if(n.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function yn(t,e){let n=Re__namespace.createInterface({input:process.stdin,output:process.stdout});try{let r=(await n.question(`${t}: `)).trim();if(e);return r}catch(r){throw r}finally{n.close();}}var Pe=g(()=>{"use strict";});var Lt={};$(Lt,{checkForUpdate:()=>gs,checkForUpdateInteractive:()=>hs,fetchLatestVersionAsync:()=>Ln,isNewer:()=>kt,primeUpdateCache:()=>Es,runUpdate:()=>kn});function F(){return Ie||(Ie=Dt()),Ie}function kt(t,e){let n=i=>{let o=String(i).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return o?[+o[1],+o[2],+o[3]]:null},r=n(t),s=n(e);return !r||!s?false:s[0]!==r[0]?s[0]>r[0]:s[1]!==r[1]?s[1]>r[1]:s[2]>r[2]}function Ce(){try{let t=JSON.parse(k__namespace.default.readFileSync(An,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=ps?null:t}catch{return null}}function $e(t,e,n=Date.now()){try{k__namespace.default.writeFileSync(An,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:n}),{mode:384});}catch{}}function Fe(t){let e=F().name,n=ls__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:fs},r=>{if(r.statusCode!==200)return r.resume(),t(new Error(`HTTP ${r.statusCode}`));let s="";r.setEncoding("utf8"),r.on("data",i=>{s+=i;}),r.on("end",()=>{try{let i=JSON.parse(s);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);}});});n.on("error",t),n.on("timeout",()=>{n.destroy(new Error("timeout"));});}function Ue(t){let e=F().name,r=` Update available: ${F().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,i=Math.max(r.length,s.length)+2,o="\u2500".repeat(i);process.stderr.write(`
2
+ 'use strict';var ve=require('readline/promises'),cs=require('https'),k=require('fs'),ht=require('os'),bt=require('path'),child_process=require('child_process'),vs=require('http'),util=require('util'),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 ve__namespace=/*#__PURE__*/_interopNamespace(ve);var cs__default=/*#__PURE__*/_interopDefault(cs);var k__namespace=/*#__PURE__*/_interopNamespace(k);var ht__namespace=/*#__PURE__*/_interopNamespace(ht);var bt__namespace=/*#__PURE__*/_interopNamespace(bt);var vs__default=/*#__PURE__*/_interopDefault(vs);var ke=Object.defineProperty;var es=Object.getOwnPropertyDescriptor;var ns=Object.getOwnPropertyNames;var rs=Object.prototype.hasOwnProperty;var xt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var g=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var ss=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}},F=(t,e)=>{for(var n in e)ke(t,n,{get:e[n],enumerable:true});},os=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ns(e))!rs.call(t,s)&&s!==n&&ke(t,s,{get:()=>e[s],enumerable:!(r=es(e,s))||r.enumerable});return t};var C=t=>os(ke({},"__esModule",{value:true}),t);var Le={};F(Le,{bold:()=>I,cyan:()=>P,dim:()=>m,green:()=>R,red:()=>b,yellow:()=>v});function At(t,e){return is?n=>`\x1B[${t}m${n}\x1B[${e}m`:n=>n}var is,R,b,v,P,I,m,ut=g(()=>{"use strict";is=!process.env.NO_COLOR&&process.stdout.isTTY;R=At("32","39"),b=At("31","39"),v=At("33","39"),P=At("36","39"),I=At("1","22"),m=At("2","22");});var Dt=ss((ri,as)=>{as.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.12.0-beta.803",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",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},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 dt(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function Re(t,e){let n=ve__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let i=1;i<=3;i++)try{let o=(await n.question(s)).trim().toLowerCase();if(o===""&&e!==void 0)return n.close(),e;if(o==="y"||o==="yes")return n.close(),!0;if(o==="n"||o==="no")return n.close(),!1;i<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
+ `);}catch(o){throw n.close(),o}if(n.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function Tn(t,e){let n=ve__namespace.createInterface({input:process.stdin,output:process.stdout});try{let r=(await n.question(`${t}: `)).trim();if(e);return r}catch(r){throw r}finally{n.close();}}var be=g(()=>{"use strict";});var Lt={};F(Lt,{checkForUpdate:()=>ms,checkForUpdateInteractive:()=>gs,fetchLatestVersionAsync:()=>kn,isNewer:()=>kt,primeUpdateCache:()=>hs,runUpdate:()=>An});function x(){return Pe||(Pe=Dt()),Pe}function kt(t,e){let n=i=>{let o=String(i).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return o?[+o[1],+o[2],+o[3]]:null},r=n(t),s=n(e);return !r||!s?false:s[0]!==r[0]?s[0]>r[0]:s[1]!==r[1]?s[1]>r[1]:s[2]>r[2]}function Ne(){try{let t=JSON.parse(k__namespace.default.readFileSync(On,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=ds?null:t}catch{return null}}function Ce(t,e,n=Date.now()){try{k__namespace.default.writeFileSync(On,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:n}),{mode:384});}catch{}}function $e(t){let e=x().name,n=cs__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:ps},r=>{if(r.statusCode!==200)return r.resume(),t(new Error(`HTTP ${r.statusCode}`));let s="";r.setEncoding("utf8"),r.on("data",i=>{s+=i;}),r.on("end",()=>{try{let i=JSON.parse(s);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);}});});n.on("error",t),n.on("timeout",()=>{n.destroy(new Error("timeout"));});}function Ie(t){let e=x().name,r=` Update available: ${x().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,i=Math.max(r.length,s.length)+2,o="\u2500".repeat(i);process.stderr.write(`
4
4
  \u256D${o}\u256E
5
5
  \u2502${r.padEnd(i)}\u2502
6
6
  \u2502${s.padEnd(i)}\u2502
7
7
  \u2570${o}\u256F
8
8
 
9
- `);}function Ne(t){let e=F().name;process.stderr.write(`
9
+ `);}function Ue(t){let e=x().name;process.stderr.write(`
10
10
  [${e}] Critical update detected \u2014 auto-updating to ${t}...
11
11
 
12
- `);let n=child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});n.on("error",()=>{}),n.unref();}async function ms(t,e=1e4){let n=xt("readline"),r=F().name,i=` Update available: ${F().version} \u2192 ${t}`,o=` Run: npm install -g ${r}`,a=" Install now? [y/N]: ",c=Math.max(i.length,o.length,a.length-2)+2,l="\u2500".repeat(c);return process.stderr.write(`
12
+ `);let n=child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});n.on("error",()=>{}),n.unref();}async function fs(t,e=1e4){let n=xt("readline"),r=x().name,i=` Update available: ${x().version} \u2192 ${t}`,o=` Run: npm install -g ${r}`,a=" Install now? [y/N]: ",c=Math.max(i.length,o.length,a.length-2)+2,l="\u2500".repeat(c);return process.stderr.write(`
13
13
  \u256D${l}\u256E
14
14
  \u2502${i.padEnd(c)}\u2502
15
15
  \u2502${o.padEnd(c)}\u2502
16
16
  \u2502${a.padEnd(c)}\u2502
17
17
  \u2570${l}\u256F
18
18
  `),new Promise(S=>{let A=n.createInterface({input:process.stdin,output:void 0,terminal:false}),T=false;function w(h){T||(T=true,clearTimeout(d),A.close(),process.stderr.write(`
19
- `),S(h));}let d=setTimeout(()=>w(false),e);A.once("line",h=>w(h.trim().toLowerCase()==="y")),A.once("close",()=>w(false));})}async function kn(t){let e=F().name;return process.stderr.write(` Installing ${e}@${t}...
19
+ `),S(h));}let d=setTimeout(()=>w(false),e);A.once("line",h=>w(h.trim().toLowerCase()==="y")),A.once("close",()=>w(false));})}async function An(t){let e=x().name;return process.stderr.write(` Installing ${e}@${t}...
20
20
  `),new Promise(n=>{let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit",shell:process.platform==="win32"}),s=false;function i(o,a){if(!s){if(s=true,o)process.stderr.write(` \u2713 Updated to ${t}. Please restart the command.
21
21
 
22
22
  `);else {let c=a?` (${a})`:"";process.stderr.write(` \u2717 Update failed${c} \u2014 continuing with current version.
23
23
 
24
- `);}n();}}r.on("close",(o,a)=>i(o===0,a??void 0)),r.on("error",o=>i(false,o.code));})}function Ln(){return new Promise(t=>{Fe((e,n)=>t(e||!n?null:n));})}function gs(){try{let t=Ce();if(t){kt(F().version,t.latestVersion)&&(t.updatePriority==="auto"?Ne(t.latestVersion):Ue(t.latestVersion));return}setImmediate(()=>{Fe((e,n)=>{e||!n||($e(n.version,n.updatePriority),kt(F().version,n.version)&&(n.updatePriority==="auto"?Ne(n.version):Ue(n.version)));});});}catch{}}async function hs(t={}){try{let e=Ce();if(e){if(!kt(F().version,e.latestVersion))return}else {let r=await Ln();if(!r||($e(r.version,r.updatePriority),!kt(F().version,r.version)))return;e={latestVersion:r.version,updatePriority:r.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Ne(e.latestVersion);return}if(!dt()){Ue(e.latestVersion);return}await ms(e.latestVersion,t.timeoutMs)&&await kn(e.latestVersion);}catch{}}function Es(){try{if(Ce())return;setImmediate(()=>{Fe((t,e)=>{t||!e||kt(F().version,e.version)&&$e(e.version,e.updatePriority,0);});});}catch{}}var Ie,An,ps,fs,vt=g(()=>{"use strict";Pe();An=bt__namespace.default.join(ht__namespace.default.tmpdir(),"flow-obs-update-cache.json"),ps=1440*60*1e3,fs=3e3;});var vn={};$(vn,{BUFFER:()=>x,CONFIG_DIR_NAME:()=>Mt,CONFIG_FILE_NAME:()=>Ht,DEBUG_LOG_FILENAME:()=>xe,ENV:()=>p,FEATURES:()=>ys,FLOW_URLS:()=>ws,HOOK_TIMEOUTS:()=>ft,INSTALLER:()=>jt,NATIVE_OTEL:()=>nt,OTLP:()=>ie,STATE_FILE_PREFIX:()=>_s,TRACE_LIMITS:()=>j,VAULT:()=>Bt,getFlowBaseUrl:()=>et,getFlowUrls:()=>pt,getLlmProxy:()=>Ts,getMetrics:()=>ae});function et(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Ss}function pt(){let t=et();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 Ts(){let t=et();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-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function ae(){let t=et();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ss,ws,Bt,Mt,Ht,ie,nt,p,ys,jt,ft,x,xe,j,_s,L=g(()=>{"use strict";Ss="https://flow.ciandt.com";ws=pt(),Bt={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},Mt="FLOW-nodejs",Ht="config.json",ie={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};nt={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},p={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"},ys={KEYCHAIN_ENABLED:!1},jt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},ft={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},x={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},xe="flow-ai-obs-debug.log",j={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};_s="flow-obs-";});function u(...t){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
25
- `;try{k.writeFileSync(Ls,e,{flag:"a"});}catch(n){process.stderr.write(`[flow-obs debug ERROR] ${n.message}
26
- `);}}var Ls,W=g(()=>{"use strict";L();Ls=bt.join(ht.tmpdir(),xe);});function Ps(t){if(!bs.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Is(t,e){let n=e.length>400?e.slice(0,400)+"\u2026":e;u("toAuthError",`status=${t} body=${n}`);try{let r=JSON.parse(e);if(typeof r.error=="string"&&(u("toAuthError",`api_error_code=${r.error}`+(r.message?` api_message=${r.message}`:"")),Rn[r.error]))return new mt(Rn[r.error])}catch{}return t===401||t===403||t===500?new mt("Invalid credentials"):t>=400&&t<500?new mt("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function D(t){return new Promise((e,n)=>{try{Ps(t.tenant);}catch(l){return n(l)}let r=JSON.stringify({clientSecret:t.clientSecret}),s=new URL(pt().AUTH_ENGINE),i=s.protocol==="https:",o={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(r),FlowTenant:t.tenant}};u("getToken",`requesting token tenant=${t.tenant} host=${o.hostname} path=${o.path}`);let c=(i?ls__default.default:Rs__default.default).request(o,l=>{let S=[];l.on("data",A=>S.push(A)),l.on("end",()=>{let A=S.join("");if((l.statusCode??0)>=400)return n(Is(l.statusCode??0,A));let T;try{T=JSON.parse(A);}catch{return n(new Error("Invalid response from auth engine"))}let w=T.expires_at??new Date(Date.now()+(T.expires_in??3600)*1e3).toISOString();if(!T.access_token)return n(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));e({accessToken:T.access_token,expiresAt:w});});});c.on("error",l=>n(new Error(`Network error: ${l.message}`))),c.write(r),c.end();})}var mt,bs,Rn,gt=g(()=>{"use strict";L();W();mt=class extends Error{constructor(e){super(e),this.name="AuthError";}},bs=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;Rn={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 bn(){return process.platform==="win32"?false:process.getuid?.()===0}function ce(){if(bn())return process.stderr.write(`
24
+ `);}n();}}r.on("close",(o,a)=>i(o===0,a??void 0)),r.on("error",o=>i(false,o.code));})}function kn(){return new Promise(t=>{$e((e,n)=>t(e||!n?null:n));})}function ms(){try{let t=Ne();if(t){kt(x().version,t.latestVersion)&&(t.updatePriority==="auto"?Ue(t.latestVersion):Ie(t.latestVersion));return}setImmediate(()=>{$e((e,n)=>{e||!n||(Ce(n.version,n.updatePriority),kt(x().version,n.version)&&(n.updatePriority==="auto"?Ue(n.version):Ie(n.version)));});});}catch{}}async function gs(t={}){try{let e=Ne();if(e){if(!kt(x().version,e.latestVersion))return}else {let r=await kn();if(!r||(Ce(r.version,r.updatePriority),!kt(x().version,r.version)))return;e={latestVersion:r.version,updatePriority:r.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Ue(e.latestVersion);return}if(!dt()){Ie(e.latestVersion);return}await fs(e.latestVersion,t.timeoutMs)&&await An(e.latestVersion);}catch{}}function hs(){try{if(Ne())return;setImmediate(()=>{$e((t,e)=>{t||!e||kt(x().version,e.version)&&Ce(e.version,e.updatePriority,0);});});}catch{}}var Pe,On,ds,ps,vt=g(()=>{"use strict";be();On=bt__namespace.default.join(ht__namespace.default.tmpdir(),"flow-obs-update-cache.json"),ds=1440*60*1e3,ps=3e3;});var Ln={};F(Ln,{BUFFER:()=>D,CONFIG_DIR_NAME:()=>Mt,CONFIG_FILE_NAME:()=>Ht,DEBUG_LOG_FILENAME:()=>Fe,ENV:()=>p,FEATURES:()=>Ts,FLOW_URLS:()=>Ss,HOOK_TIMEOUTS:()=>ft,INSTALLER:()=>jt,NATIVE_OTEL:()=>nt,OTLP:()=>ie,STATE_FILE_PREFIX:()=>ys,TRACE_LIMITS:()=>W,VAULT:()=>Bt,getFlowBaseUrl:()=>et,getFlowUrls:()=>pt,getLlmProxy:()=>ws,getMetrics:()=>ae});function et(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Es}function pt(){let t=et();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 ws(){let t=et();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-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function ae(){let t=et();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Es,Ss,Bt,Mt,Ht,ie,nt,p,Ts,jt,ft,D,Fe,W,ys,L=g(()=>{"use strict";Es="https://flow.ciandt.com";Ss=pt(),Bt={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},Mt="FLOW-nodejs",Ht="config.json",ie={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};nt={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},p={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"},Ts={KEYCHAIN_ENABLED:!1},jt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},ft={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},D={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},Fe="flow-ai-obs-debug.log",W={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};ys="flow-obs-";});function u(...t){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
25
+ `;try{k.writeFileSync(ks,e,{flag:"a"});}catch(n){process.stderr.write(`[flow-obs debug ERROR] ${n.message}
26
+ `);}}var ks,V=g(()=>{"use strict";L();ks=bt.join(ht.tmpdir(),Fe);});function bs(t){if(!Rs.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Ps(t,e){let n=e.length>400?e.slice(0,400)+"\u2026":e;u("toAuthError",`status=${t} body=${n}`);try{let r=JSON.parse(e);if(typeof r.error=="string"&&(u("toAuthError",`api_error_code=${r.error}`+(r.message?` api_message=${r.message}`:"")),vn[r.error]))return new mt(vn[r.error])}catch{}return t===401||t===403||t===500?new mt("Invalid credentials"):t>=400&&t<500?new mt("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function B(t){return new Promise((e,n)=>{try{bs(t.tenant);}catch(l){return n(l)}let r=JSON.stringify({clientSecret:t.clientSecret}),s=new URL(pt().AUTH_ENGINE),i=s.protocol==="https:",o={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(r),FlowTenant:t.tenant}};u("getToken",`requesting token tenant=${t.tenant} host=${o.hostname} path=${o.path}`);let c=(i?cs__default.default:vs__default.default).request(o,l=>{let S=[];l.on("data",A=>S.push(A)),l.on("end",()=>{let A=S.join("");if((l.statusCode??0)>=400)return n(Ps(l.statusCode??0,A));let T;try{T=JSON.parse(A);}catch{return n(new Error("Invalid response from auth engine"))}let w=T.expires_at??new Date(Date.now()+(T.expires_in??3600)*1e3).toISOString();if(!T.access_token)return n(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));e({accessToken:T.access_token,expiresAt:w});});});c.on("error",l=>n(new Error(`Network error: ${l.message}`))),c.write(r),c.end();})}var mt,Rs,vn,gt=g(()=>{"use strict";L();V();mt=class extends Error{constructor(e){super(e),this.name="AuthError";}},Rs=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;vn={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 Rn(){return process.platform==="win32"?false:process.getuid?.()===0}function ce(){if(Rn())return process.stderr.write(`
27
27
  `+b(` \u2717 flow-ai-obs is not supported in a sudo context.
28
28
 
29
29
  `)+P(` npm install -g @ciandt-flow/flow-ai-obs
30
30
  `)+`
31
- `),1}var le=g(()=>{"use strict";ut();});function Pn(){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:ht__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||ht__namespace.userInfo().username}}function B(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(t=n);}if(t){let e=t.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return bt__namespace.join(e,".claude","settings.json")}return bt__namespace.join(ht__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||ht__namespace.homedir();return bt__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 bt__namespace.join(e,".claude","settings.json")}return bt__namespace.join(ht__namespace.homedir(),".claude","settings.json")}var ue=g(()=>{"use strict";le();});function de(){if(process.platform==="win32"){let n=process.env.APPDATA||bt__namespace.join(ht__namespace.homedir(),"AppData","Roaming");return bt__namespace.join(n,In,Un)}let t=Pn(),e=process.env.XDG_CONFIG_HOME||bt__namespace.join(t.home,".config");return bt__namespace.join(e,In,Un)}function $n(){try{let t=k__namespace.readFileSync(B(),"utf8"),n=JSON.parse(t).env?.FLOW_BASE_URL;return typeof n=="string"&&n.trim()?n.trim():null}catch{return null}}var In,Un,Be=g(()=>{"use strict";ue();In="flow-ai-obs",Un="config.json";});function Fn(t){try{let e=k__namespace.statSync(t);Date.now()-e.mtimeMs>Us&&k__namespace.unlinkSync(t);}catch{}try{k__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 xn(t){try{k__namespace.unlinkSync(t);}catch{}}function Ns(t,e){let r=(Array.isArray(t)?t:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let i=s.hooks.filter(o=>!o.command?.startsWith?.("flow-ai-obs "));return i.length>0?{...s,hooks:i}:null}).filter(s=>s!=null);return [e,...r]}function Dn(t,e){let n=B(),r=n+".lock",s=[];k__namespace.mkdirSync(bt__namespace.dirname(n),{recursive:true}),Fn(r);try{if(k__namespace.existsSync(n)){k__namespace.copyFileSync(n,n+".bkp");try{k__namespace.chmodSync(n+".bkp",384);}catch{}}let i=de();if(k__namespace.existsSync(i)){let d=i+".bkp";k__namespace.copyFileSync(i,d);try{k__namespace.chmodSync(d,384);}catch{}}let o={};try{o=JSON.parse(k__namespace.readFileSync(n,"utf8"));}catch{}let a=o.env&&typeof o.env=="object"?o.env:{};delete a.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:c}=(L(),N(vn)),l=c().OTEL_ENDPOINT,S={...nt,OTEL_EXPORTER_OTLP_ENDPOINT:t??l};o.env={...a,...S,...e??{}},o.otelHeadersHelper="flow-ai-obs otel-headers",(!o.hooks||typeof o.hooks!="object"||Array.isArray(o.hooks))&&(o.hooks={});let A=(d,h)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${d}`,timeout:h}]}),T=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],w=o.hooks;for(let d of T){let h=Ns(w[d],A(d,ft[d]));h.length>1&&s.push(d),w[d]=h;}k__namespace.writeFileSync(n,JSON.stringify(o,null,2)+`
32
- `,{encoding:"utf8",mode:384});try{k__namespace.chmodSync(n,384);}catch{}}finally{xn(r);}return {settingsPath:n,preserved:s}}function He(t){try{let e=k__namespace.readFileSync(B(),"utf8"),r=JSON.parse(e).env?.[t];return typeof r=="string"?r:null}catch{return null}}function pe(t){let e=B(),n=e+".lock";k__namespace.mkdirSync(bt__namespace.dirname(e),{recursive:true}),Fn(n);try{let r={};try{r=JSON.parse(k__namespace.readFileSync(e,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,t),k__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
33
- `,{encoding:"utf8",mode:384});try{k__namespace.chmodSync(e,384);}catch{}}finally{xn(n);}}var Us,Vt=g(()=>{"use strict";L();gt();ue();Be();Us=jt.LOCK_STALE_MS;});function Yt(){let t=ht__namespace.default.homedir();if(process.platform==="darwin")return bt__namespace.default.join(t,"Library","Preferences",Mt,Ht);if(process.platform==="win32"){let n=process.env.APPDATA??bt__namespace.default.join(t,"AppData","Roaming");return bt__namespace.default.join(n,Mt,Ht)}let e=process.env.XDG_CONFIG_HOME??bt__namespace.default.join(t,".config");return bt__namespace.default.join(e,Mt,Ht)}function We(){try{let t=k__namespace.default.readFileSync(Yt(),"utf8");return JSON.parse(t)}catch{return {}}}function Bn(t){let e=Yt();k__namespace.default.mkdirSync(bt__namespace.default.dirname(e),{recursive:true}),k__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var je,Jt,Mn=g(()=>{"use strict";L();je={credentials:"credentials","token-cache":"tokenCache"};Jt=class{static isAvailable(){return !0}static hasExistingData(){try{if(!k__namespace.default.existsSync(Yt()))return !1;let e=JSON.parse(k__namespace.default.readFileSync(Yt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,n){let r=We(),s=je[n]??n,i=r[s];return i?typeof i=="string"?i:JSON.stringify(i):null}async setSecret(e,n,r){let s=We(),i=je[n]??n;if(n==="token-cache")try{s[i]=JSON.parse(r);}catch{s[i]=r;}else s[i]=r;Bn(s);}async deleteSecret(e,n){let r=We(),s=je[n]??n;return s in r?(delete r[s],Bn(r),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Yt()}`}};});var Hn={};$(Hn,{MacOsKeyVaultProvider:()=>Ye});var Ve,Ye,jn=g(()=>{"use strict";Ve=util.promisify(child_process.execFile),Ye=class{static async isAvailable(){try{return k.accessSync("/usr/bin/security",k.constants.X_OK),!0}catch{return !1}}async getSecret(e,n){try{let{stdout:r}=await Ve("security",["find-generic-password","-w","-a",n,"-s",e]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await Ve("security",["add-generic-password","-U","-a",n,"-s",e,"-w",r]);}async deleteSecret(e,n){try{return await Ve("security",["delete-generic-password","-a",n,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Vn={};$(Vn,{LinuxKeyVaultProvider:()=>Ge});var Wn,Ge,Yn=g(()=>{"use strict";Wn=util.promisify(child_process.execFile),Ge=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of e)try{return k.accessSync(n,k.constants.X_OK),!0}catch{}return !1}async getSecret(e,n){try{let{stdout:r}=await Wn("secret-tool",["lookup","service",e,"account",n]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await new Promise((s,i)=>{let o=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",n]);o.on("error",i),o.on("close",a=>{a===0?s():i(new Error(`secret-tool exited with code ${a}`));}),o.stdin.write(r),o.stdin.end();});}async deleteSecret(e,n){try{return await Wn("secret-tool",["clear","service",e,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Gn={};$(Gn,{WindowsKeyVaultProvider:()=>Je});var Je,Jn=g(()=>{"use strict";Je=class{static async isAvailable(){try{return await xt("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,n){return xt("keytar").getPassword(e,n)}async setSecret(e,n,r){await xt("keytar").setPassword(e,n,r);}async deleteSecret(e,n){return xt("keytar").deletePassword(e,n)}getStoragePath(){return "Windows Credential Manager"}};});async function qn(){return process.env[p.FLOW_OBS_USE_JSON_VAULT]==="1"?new Jt:await Vs()??new Jt}async function Vs(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(jn(),Hn));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Yn(),Vn));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Jn(),Gn));return await t.isAvailable()?new t:null}default:return null}}var Kn=g(()=>{"use strict";L();Mn();});var zn={};$(zn,{clearFlowCredentials:()=>Gs,getConfigPath:()=>qs,getEmailFromToken:()=>fe,getFlowCredentials:()=>Xn,getTokenCache:()=>qt,hasCredentials:()=>Ks,isTokenValid:()=>Js,saveFlowCredentials:()=>Ys,saveTokenCache:()=>rt});function It(){return qe||(qe=qn()),qe}async function Xn(){let e=await(await It()).getSecret(Pt,Ke);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Ys(t){if(!t.clientId||!t.clientSecret||!t.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await It()).setSecret(Pt,Ke,JSON.stringify(t));}async function Gs(){let t=await It();await t.deleteSecret(Pt,Ke),await t.deleteSecret(Pt,Xe);}async function rt(t){await(await It()).setSecret(Pt,Xe,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function qt(){let e=await(await It()).getSecret(Pt,Xe);if(!e)return null;try{let n=JSON.parse(e);return {accessToken:n.accessToken,expiresAt:n.expiresAt,lastAuthCheckAt:n.lastAuthCheckAt}}catch{return null}}async function Js(){let t=await qt();return t?new Date(t.expiresAt)>new Date:false}async function fe(){let t=await qt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email??n.preferred_username??n.upn??n.sub??null}catch{return null}}async function qs(){let t=await It();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 Ks(){let t=await Xn();return !!(t&&t.clientId&&t.clientSecret&&t.tenant)}var Pt,Ke,Xe,qe,Kt=g(()=>{"use strict";Kn();L();Pt=Bt.SERVICE,Ke=Bt.ACCOUNT_CREDS,Xe=Bt.ACCOUNT_TOKEN,qe=null;});function zs(t){return Xs.some(e=>e.test(t))}function Zs(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email||n.preferred_username||n.upn||n.sub||null}catch{return null}}function st(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:s,tenant:i}=n;return !r||!s||!i?null:{clientId:r,clientSecret:s,tenant:i}}catch{return null}}function Zn(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),n=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${n}.`}function Et(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let n=process.env[p.FLOW_OBS_ALLOW_HTTP]==="true";if(!n&&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(!n&&zs(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Qn(){let t=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);return t?{user:await fe().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function Qs(){return new Date().toISOString().slice(0,10)}async function to(t){let e=Qs(),n=await qt();if(n?.lastAuthCheckAt!==e){u("getOrRefreshToken",`daily auth check (last: ${n?.lastAuthCheckAt??"never"})`);try{let i=await D(t);try{await rt({...i,lastAuthCheckAt:e});}catch{}return u("getOrRefreshToken",`daily check passed, expires=${i.expiresAt}`),i.accessToken}catch(i){if(i instanceof mt)throw i;u("getOrRefreshToken",`daily check network error \u2014 using cache: ${i.message}`);}}let r=n!=null&&new Date(n.expiresAt)>new Date;if(u("getOrRefreshToken",`cacheValid=${r}`),r)return u("getOrRefreshToken",`using cached token, expires=${n.expiresAt}`),n.accessToken;u("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let s=await D(t);try{await rt({...s,lastAuthCheckAt:e});}catch(i){u("getOrRefreshToken",`token cache save failed (non-fatal): ${i.message}`);}return u("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function eo(t,e){let n=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${n}`}}function no(t,e,n){let r=Buffer.from(`${e}:${n}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${r}`}}async function K(){let t=[],e=process.env[p.ANTHROPIC_MODEL]??"",n=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);u("resolveCredentials",n?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),n&&u("resolveCredentials",`clientId=${n.clientId}`,`tenant=${n.tenant}`);let r=n?n.tenant:"",s=process.env[p.FLOW_TELEMETRY]==="true",i=process.env[p.LANGFUSE_BASE_URL],o=process.env[p.LANGFUSE_PUBLIC_KEY],a=process.env[p.LANGFUSE_SECRET_KEY];if(s&&i&&o&&a){let T="",w=r;n&&(T=await fe().catch(()=>null)??n.clientId);let d={user:T??"",tenant:w??"",team:"",project:"",model:e};t.push({mode:"direct",...no(Et(i),o,a),...d}),u("resolveCredentials","direct mode active",`user=${d.user}`,`tenant=${d.tenant}`);}if(!n){if(t.length===0){let T=[];return T.authError=false,T}return t}let c;try{c=await to(n);}catch(T){if(u("resolveCredentials",`token refresh failed: ${T.message}`,`(tenant=${n.tenant} clientId=${n.clientId})`),t.length>0)return t.authError=true,t;let w=[];return w.authError=true,w}let S={user:Zs(c)??n.clientId,tenant:r,team:"",project:"",model:e},A=process.env[p.FLOW_TELEMETRY_GATEWAY]??et();return t.push({mode:"gateway",...eo(Et(A),{accessToken:c}),...S}),t}async function me(){return (await K()).length>0}var Xs,V=g(()=>{"use strict";Kt();gt();L();W();Xs=[/^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 er={};$(er,{clearLoggedOutMarker:()=>Ze,isLoggedOut:()=>oo,markLoggedOut:()=>so});function ze(){return bt__namespace.default.join(ht__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function so(){try{let t=ze();k__namespace.default.mkdirSync(bt__namespace.default.dirname(t),{recursive:!0}),k__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function Ze(){try{k__namespace.default.unlinkSync(ze());}catch{}}function oo(){try{return k__namespace.default.existsSync(ze())}catch{return false}}var Qe=g(()=>{"use strict";});function tn(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():He("FLOW_BASE_URL")}function io(){return He(p.ANTHROPIC_AUTH_TOKEN)??void 0}async function he(){let t=tn();if(!t)return {ok:false,baseUrl:"",user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let s=new URL(t);if(s.protocol!=="https:"&&s.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:t,user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"}}let e=io(),n=st(e);if(!n)return {ok:false,baseUrl:t,user:"",tenant:"",error:"No credentials found"};let r=process.env.FLOW_BASE_URL;process.env.FLOW_BASE_URL=t;try{let s=await D({clientId:n.clientId,clientSecret:n.clientSecret,tenant:n.tenant});await rt({accessToken:s.accessToken,expiresAt:s.expiresAt});let i=n.clientId;try{let o=s.accessToken.split(".");if(o.length>=2){let a=JSON.parse(Buffer.from(o[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));i=a.email??a.preferred_username??a.upn??a.sub??i;}}catch{}return {ok:!0,baseUrl:t,user:i,tenant:n.tenant}}catch(s){return {ok:false,baseUrl:t,user:n.clientId,tenant:n.tenant,error:s.message}}finally{r===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=r;}}var en=g(()=>{"use strict";Kt();V();Vt();L();gt();});var zt={};$(zt,{promptRaw:()=>Xt,runLogin:()=>lo});function Y(t){return typeof t=="string"?t.replace(ao,""):t}function Xt(t,e={}){return new Promise((n,r)=>{if(typeof process.stdin.setRawMode!="function"){r(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:i=""}=e;process.stdout.write(t+i);let o=i;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=S=>{if(S===""){l(),r(new Error("SIGINT"));return}if(S==="\r"||S===`
31
+ `),1}var le=g(()=>{"use strict";ut();});function bn(){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:ht__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||ht__namespace.userInfo().username}}function M(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(t=n);}if(t){let e=t.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return bt__namespace.join(e,".claude","settings.json")}return bt__namespace.join(ht__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||ht__namespace.homedir();return bt__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 bt__namespace.join(e,".claude","settings.json")}return bt__namespace.join(ht__namespace.homedir(),".claude","settings.json")}var ue=g(()=>{"use strict";le();});function de(){if(process.platform==="win32"){let n=process.env.APPDATA||bt__namespace.join(ht__namespace.homedir(),"AppData","Roaming");return bt__namespace.join(n,Pn,In)}let t=bn(),e=process.env.XDG_CONFIG_HOME||bt__namespace.join(t.home,".config");return bt__namespace.join(e,Pn,In)}function Cn(){try{let t=k__namespace.readFileSync(M(),"utf8"),n=JSON.parse(t).env?.FLOW_BASE_URL;return typeof n=="string"&&n.trim()?n.trim():null}catch{return null}}var Pn,In,De=g(()=>{"use strict";ue();Pn="flow-ai-obs",In="config.json";});function $n(t){try{let e=k__namespace.statSync(t);Date.now()-e.mtimeMs>Is&&k__namespace.unlinkSync(t);}catch{}try{k__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 Fn(t){try{k__namespace.unlinkSync(t);}catch{}}function Us(t,e){let r=(Array.isArray(t)?t:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let i=s.hooks.filter(o=>!o.command?.startsWith?.("flow-ai-obs "));return i.length>0?{...s,hooks:i}:null}).filter(s=>s!=null);return [e,...r]}function xn(t,e){let n=M(),r=n+".lock",s=[];k__namespace.mkdirSync(bt__namespace.dirname(n),{recursive:true}),$n(r);try{if(k__namespace.existsSync(n)){k__namespace.copyFileSync(n,n+".bkp");try{k__namespace.chmodSync(n+".bkp",384);}catch{}}let i=de();if(k__namespace.existsSync(i)){let d=i+".bkp";k__namespace.copyFileSync(i,d);try{k__namespace.chmodSync(d,384);}catch{}}let o={};try{o=JSON.parse(k__namespace.readFileSync(n,"utf8"));}catch{}let a=o.env&&typeof o.env=="object"?o.env:{};delete a.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:c}=(L(),C(Ln)),l=c().OTEL_ENDPOINT,S={...nt,OTEL_EXPORTER_OTLP_ENDPOINT:t??l};o.env={...a,...S,...e??{}},o.otelHeadersHelper="flow-ai-obs otel-headers",(!o.hooks||typeof o.hooks!="object"||Array.isArray(o.hooks))&&(o.hooks={});let A=(d,h)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${d}`,timeout:h}]}),T=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],w=o.hooks;for(let d of T){let h=Us(w[d],A(d,ft[d]));h.length>1&&s.push(d),w[d]=h;}k__namespace.writeFileSync(n,JSON.stringify(o,null,2)+`
32
+ `,{encoding:"utf8",mode:384});try{k__namespace.chmodSync(n,384);}catch{}}finally{Fn(r);}return {settingsPath:n,preserved:s}}function Me(t){try{let e=k__namespace.readFileSync(M(),"utf8"),r=JSON.parse(e).env?.[t];return typeof r=="string"?r:null}catch{return null}}function pe(t){let e=M(),n=e+".lock";k__namespace.mkdirSync(bt__namespace.dirname(e),{recursive:true}),$n(n);try{let r={};try{r=JSON.parse(k__namespace.readFileSync(e,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,t),k__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
33
+ `,{encoding:"utf8",mode:384});try{k__namespace.chmodSync(e,384);}catch{}}finally{Fn(n);}}var Is,Vt=g(()=>{"use strict";L();gt();ue();De();Is=jt.LOCK_STALE_MS;});function Yt(){let t=ht__namespace.default.homedir();if(process.platform==="darwin")return bt__namespace.default.join(t,"Library","Preferences",Mt,Ht);if(process.platform==="win32"){let n=process.env.APPDATA??bt__namespace.default.join(t,"AppData","Roaming");return bt__namespace.default.join(n,Mt,Ht)}let e=process.env.XDG_CONFIG_HOME??bt__namespace.default.join(t,".config");return bt__namespace.default.join(e,Mt,Ht)}function je(){try{let t=k__namespace.default.readFileSync(Yt(),"utf8");return JSON.parse(t)}catch{return {}}}function Dn(t){let e=Yt();k__namespace.default.mkdirSync(bt__namespace.default.dirname(e),{recursive:true}),k__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var He,Jt,Bn=g(()=>{"use strict";L();He={credentials:"credentials","token-cache":"tokenCache"};Jt=class{static isAvailable(){return !0}static hasExistingData(){try{if(!k__namespace.default.existsSync(Yt()))return !1;let e=JSON.parse(k__namespace.default.readFileSync(Yt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,n){let r=je(),s=He[n]??n,i=r[s];return i?typeof i=="string"?i:JSON.stringify(i):null}async setSecret(e,n,r){let s=je(),i=He[n]??n;if(n==="token-cache")try{s[i]=JSON.parse(r);}catch{s[i]=r;}else s[i]=r;Dn(s);}async deleteSecret(e,n){let r=je(),s=He[n]??n;return s in r?(delete r[s],Dn(r),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Yt()}`}};});var Mn={};F(Mn,{MacOsKeyVaultProvider:()=>Ve});var We,Ve,Hn=g(()=>{"use strict";We=util.promisify(child_process.execFile),Ve=class{static async isAvailable(){try{return k.accessSync("/usr/bin/security",k.constants.X_OK),!0}catch{return !1}}async getSecret(e,n){try{let{stdout:r}=await We("security",["find-generic-password","-w","-a",n,"-s",e]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await We("security",["add-generic-password","-U","-a",n,"-s",e,"-w",r]);}async deleteSecret(e,n){try{return await We("security",["delete-generic-password","-a",n,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Wn={};F(Wn,{LinuxKeyVaultProvider:()=>Ye});var jn,Ye,Vn=g(()=>{"use strict";jn=util.promisify(child_process.execFile),Ye=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of e)try{return k.accessSync(n,k.constants.X_OK),!0}catch{}return !1}async getSecret(e,n){try{let{stdout:r}=await jn("secret-tool",["lookup","service",e,"account",n]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await new Promise((s,i)=>{let o=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",n]);o.on("error",i),o.on("close",a=>{a===0?s():i(new Error(`secret-tool exited with code ${a}`));}),o.stdin.write(r),o.stdin.end();});}async deleteSecret(e,n){try{return await jn("secret-tool",["clear","service",e,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Yn={};F(Yn,{WindowsKeyVaultProvider:()=>Ge});var Ge,Gn=g(()=>{"use strict";Ge=class{static async isAvailable(){try{return await xt("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,n){return xt("keytar").getPassword(e,n)}async setSecret(e,n,r){await xt("keytar").setPassword(e,n,r);}async deleteSecret(e,n){return xt("keytar").deletePassword(e,n)}getStoragePath(){return "Windows Credential Manager"}};});async function Jn(){return process.env[p.FLOW_OBS_USE_JSON_VAULT]==="1"?new Jt:await Ws()??new Jt}async function Ws(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Hn(),Mn));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Vn(),Wn));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Gn(),Yn));return await t.isAvailable()?new t:null}default:return null}}var qn=g(()=>{"use strict";L();Bn();});var Xn={};F(Xn,{clearFlowCredentials:()=>Ys,getConfigPath:()=>Js,getEmailFromToken:()=>fe,getFlowCredentials:()=>Kn,getTokenCache:()=>qt,hasCredentials:()=>qs,isTokenValid:()=>Gs,saveFlowCredentials:()=>Vs,saveTokenCache:()=>rt});function It(){return Je||(Je=Jn()),Je}async function Kn(){let e=await(await It()).getSecret(Pt,qe);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Vs(t){if(!t.clientId||!t.clientSecret||!t.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await It()).setSecret(Pt,qe,JSON.stringify(t));}async function Ys(){let t=await It();await t.deleteSecret(Pt,qe),await t.deleteSecret(Pt,Ke);}async function rt(t){await(await It()).setSecret(Pt,Ke,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function qt(){let e=await(await It()).getSecret(Pt,Ke);if(!e)return null;try{let n=JSON.parse(e);return {accessToken:n.accessToken,expiresAt:n.expiresAt,lastAuthCheckAt:n.lastAuthCheckAt}}catch{return null}}async function Gs(){let t=await qt();return t?new Date(t.expiresAt)>new Date:false}async function fe(){let t=await qt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email??n.preferred_username??n.upn??n.sub??null}catch{return null}}async function Js(){let t=await It();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 qs(){let t=await Kn();return !!(t&&t.clientId&&t.clientSecret&&t.tenant)}var Pt,qe,Ke,Je,Kt=g(()=>{"use strict";qn();L();Pt=Bt.SERVICE,qe=Bt.ACCOUNT_CREDS,Ke=Bt.ACCOUNT_TOKEN,Je=null;});function Xs(t){return Ks.some(e=>e.test(t))}function zs(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email||n.preferred_username||n.upn||n.sub||null}catch{return null}}function st(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:s,tenant:i}=n;return !r||!s||!i?null:{clientId:r,clientSecret:s,tenant:i}}catch{return null}}function zn(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),n=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${n}.`}function Et(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let n=process.env[p.FLOW_OBS_ALLOW_HTTP]==="true";if(!n&&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(!n&&Xs(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Zn(){let t=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);return t?{user:await fe().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function Zs(){return new Date().toISOString().slice(0,10)}async function Qs(t){let e=Zs(),n=await qt();if(n?.lastAuthCheckAt!==e){u("getOrRefreshToken",`daily auth check (last: ${n?.lastAuthCheckAt??"never"})`);try{let i=await B(t);try{await rt({...i,lastAuthCheckAt:e});}catch{}return u("getOrRefreshToken",`daily check passed, expires=${i.expiresAt}`),i.accessToken}catch(i){if(i instanceof mt)throw i;u("getOrRefreshToken",`daily check network error \u2014 using cache: ${i.message}`);}}let r=n!=null&&new Date(n.expiresAt)>new Date;if(u("getOrRefreshToken",`cacheValid=${r}`),r)return u("getOrRefreshToken",`using cached token, expires=${n.expiresAt}`),n.accessToken;u("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let s=await B(t);try{await rt({...s,lastAuthCheckAt:e});}catch(i){u("getOrRefreshToken",`token cache save failed (non-fatal): ${i.message}`);}return u("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function to(t,e){let n=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${n}`}}function eo(t,e,n){let r=Buffer.from(`${e}:${n}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${r}`}}async function z(){let t=[],e=process.env[p.ANTHROPIC_MODEL]??"",n=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);u("resolveCredentials",n?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),n&&u("resolveCredentials",`clientId=${n.clientId}`,`tenant=${n.tenant}`);let r=n?n.tenant:"",s=process.env[p.FLOW_TELEMETRY]==="true",i=process.env[p.LANGFUSE_BASE_URL],o=process.env[p.LANGFUSE_PUBLIC_KEY],a=process.env[p.LANGFUSE_SECRET_KEY];if(s&&i&&o&&a){let T="",w=r;n&&(T=await fe().catch(()=>null)??n.clientId);let d={user:T??"",tenant:w??"",team:"",project:"",model:e};t.push({mode:"direct",...eo(Et(i),o,a),...d}),u("resolveCredentials","direct mode active",`user=${d.user}`,`tenant=${d.tenant}`);}if(!n){if(t.length===0){let T=[];return T.authError=false,T}return t}let c;try{c=await Qs(n);}catch(T){if(u("resolveCredentials",`token refresh failed: ${T.message}`,`(tenant=${n.tenant} clientId=${n.clientId})`),t.length>0)return t.authError=true,t;let w=[];return w.authError=true,w}let S={user:zs(c)??n.clientId,tenant:r,team:"",project:"",model:e},A=process.env[p.FLOW_TELEMETRY_GATEWAY]??et();return t.push({mode:"gateway",...to(Et(A),{accessToken:c}),...S}),t}var Ks,Y=g(()=>{"use strict";Kt();gt();L();V();Ks=[/^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 tr={};F(tr,{clearLoggedOutMarker:()=>ze,isLoggedOut:()=>so,markLoggedOut:()=>ro});function Xe(){return bt__namespace.default.join(ht__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function ro(){try{let t=Xe();k__namespace.default.mkdirSync(bt__namespace.default.dirname(t),{recursive:!0}),k__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function ze(){try{k__namespace.default.unlinkSync(Xe());}catch{}}function so(){try{return k__namespace.default.existsSync(Xe())}catch{return false}}var Ze=g(()=>{"use strict";});function Qe(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Me("FLOW_BASE_URL")}function oo(){return Me(p.ANTHROPIC_AUTH_TOKEN)??void 0}async function ge(){let t=Qe();if(!t)return {ok:false,baseUrl:"",user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let s=new URL(t);if(s.protocol!=="https:"&&s.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:t,user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"}}let e=oo(),n=st(e);if(!n)return {ok:false,baseUrl:t,user:"",tenant:"",error:"No credentials found"};let r=process.env.FLOW_BASE_URL;process.env.FLOW_BASE_URL=t;try{let s=await B({clientId:n.clientId,clientSecret:n.clientSecret,tenant:n.tenant});await rt({accessToken:s.accessToken,expiresAt:s.expiresAt});let i=n.clientId;try{let o=s.accessToken.split(".");if(o.length>=2){let a=JSON.parse(Buffer.from(o[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));i=a.email??a.preferred_username??a.upn??a.sub??i;}}catch{}return {ok:!0,baseUrl:t,user:i,tenant:n.tenant}}catch(s){return {ok:false,baseUrl:t,user:n.clientId,tenant:n.tenant,error:s.message}}finally{r===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=r;}}var tn=g(()=>{"use strict";Kt();Y();Vt();L();gt();});var zt={};F(zt,{promptRaw:()=>Xt,runLogin:()=>co});function G(t){return typeof t=="string"?t.replace(io,""):t}function Xt(t,e={}){return new Promise((n,r)=>{if(typeof process.stdin.setRawMode!="function"){r(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:i=""}=e;process.stdout.write(t+i);let o=i;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=S=>{if(S===""){l(),r(new Error("SIGINT"));return}if(S==="\r"||S===`
34
34
  `){l(),process.stdout.write(`
35
- `),n(o);return}if(S==="\x7F"){o.length>0&&(o=o.slice(0,-1),process.stdout.write("\b \b"));return}S.startsWith("\x1B")||(o+=S,process.stdout.write(s?"*".repeat(S.length):S));};function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",a),process.removeListener("unhandledRejection",a);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}async function Ee(t,e=false){let n=tn(),r=process.env.FLOW_BASE_URL;n&&(process.env.FLOW_BASE_URL=n);try{let{accessToken:s,expiresAt:i}=await D(t),o=Zn(t);if(e)return {jwt:o,accessToken:s,expiresAt:i};pe({[p.ANTHROPIC_AUTH_TOKEN]:o}),Ze(),await rt({accessToken:s,expiresAt:i});}finally{r===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=r;}}async function co(t=false){try{let e=(await Xt(P(" ? ")+"Client ID: ")).trim(),n=(await Xt(P(" ? ")+"Client Secret: ",{masked:!0})).trim(),r=(await Xt(P(" ? ")+"Tenant: ")).trim();if(!e||!n||!r)return process.stderr.write(b(` \u2717 All fields are required
35
+ `),n(o);return}if(S==="\x7F"){o.length>0&&(o=o.slice(0,-1),process.stdout.write("\b \b"));return}S.startsWith("\x1B")||(o+=S,process.stdout.write(s?"*".repeat(S.length):S));};function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",a),process.removeListener("unhandledRejection",a);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}async function he(t,e=false){let n=Qe(),r=process.env.FLOW_BASE_URL;n&&(process.env.FLOW_BASE_URL=n);try{let{accessToken:s,expiresAt:i}=await B(t),o=zn(t);if(e)return {jwt:o,accessToken:s,expiresAt:i};pe({[p.ANTHROPIC_AUTH_TOKEN]:o}),ze(),await rt({accessToken:s,expiresAt:i});}finally{r===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=r;}}async function ao(t=false){try{let e=(await Xt(P(" ? ")+"Client ID: ")).trim(),n=(await Xt(P(" ? ")+"Client Secret: ",{masked:!0})).trim(),r=(await Xt(P(" ? ")+"Tenant: ")).trim();if(!e||!n||!r)return process.stderr.write(b(` \u2717 All fields are required
36
36
  `)),1;if(process.stdout.write(m(` Authenticating...
37
- `)),t){let s=await Ee({clientId:e,clientSecret:n,tenant:r},!0);return process.stdout.write(`
37
+ `)),t){let s=await he({clientId:e,clientSecret:n,tenant:r},!0);return process.stdout.write(`
38
38
  ${R("\u2713")} ${I("Authenticated")}
39
- `+m(` Tenant: ${Y(r)}
39
+ `+m(` Tenant: ${G(r)}
40
40
  `)+m(` Storage: pending (will be written at end of init)
41
41
 
42
- `)),{code:0,result:s}}return await Ee({clientId:e,clientSecret:n,tenant:r}),process.stdout.write(`
42
+ `)),{code:0,result:s}}return await he({clientId:e,clientSecret:n,tenant:r}),process.stdout.write(`
43
43
  ${R("\u2713")} ${I("Authenticated")}
44
- `+m(` Tenant: ${Y(r)}
44
+ `+m(` Tenant: ${G(r)}
45
45
  `)+m(` Storage: ANTHROPIC_AUTH_TOKEN (settings.json)
46
46
 
47
47
  `)),0}catch(e){if(e.message==="SIGINT"||e.message==="NOT_A_TTY")throw e;return process.stderr.write(`
48
48
  ${b("\u2717")} ${I("Authentication failed:")}
49
- ${Y(e.message)}
49
+ ${G(e.message)}
50
50
 
51
- `),1}}async function lo(t={}){let e=ce();if(e)return e;let{deferPersist:n=false,skipAuthCheck:r=false}=t;if(t.clientId&&t.clientSecret&&t.tenant)try{if(n){let i=await Ee({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant},!0);return process.stdout.write(R(` \u2713 Authenticated. Tenant: ${Y(t.tenant)}
51
+ `),1}}async function co(t={}){let e=ce();if(e)return e;let{deferPersist:n=false,skipAuthCheck:r=false}=t;if(t.clientId&&t.clientSecret&&t.tenant)try{if(n){let i=await he({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant},!0);return process.stdout.write(R(` \u2713 Authenticated. Tenant: ${G(t.tenant)}
52
52
 
53
- `)),{code:0,result:i}}return await Ee({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant}),process.stdout.write(R(` \u2713 Authenticated. Tenant: ${Y(t.tenant)}
53
+ `)),{code:0,result:i}}return await he({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant}),process.stdout.write(R(` \u2713 Authenticated. Tenant: ${G(t.tenant)}
54
54
 
55
- `)),0}catch(i){return process.stderr.write(b(` \u2717 Authentication failed: ${Y(i.message)}
56
- `)),1}let s=await he();if(!r){if(process.stdout.write(`
55
+ `)),0}catch(i){return process.stderr.write(b(` \u2717 Authentication failed: ${G(i.message)}
56
+ `)),1}let s=await ge();if(!r){if(process.stdout.write(`
57
57
  `),process.stdout.write(I(` Auth
58
58
  `)),s.notConfigured)return process.stdout.write(` ${v("\u26A0")} Not configured
59
59
  `),process.stdout.write(m(" Run `flow-ai-obs init` to set up the environment first.\n")),process.stdout.write(`
60
60
  `),1;if(s.ok){process.stdout.write(` ${R("\u2713")} Authenticated
61
- `),process.stdout.write(m(" URL: ")+Y(s.baseUrl)+`
62
- `),process.stdout.write(m(" Tenant: ")+Y(s.tenant)+`
63
- `),process.stdout.write(m(" User: ")+Y(s.user)+`
61
+ `),process.stdout.write(m(" URL: ")+G(s.baseUrl)+`
62
+ `),process.stdout.write(m(" Tenant: ")+G(s.tenant)+`
63
+ `),process.stdout.write(m(" User: ")+G(s.user)+`
64
64
  `),process.stdout.write(`
65
65
  `);let i;try{i=await Xt(P(" ? ")+"Re-authenticate? (y/N): ");}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
66
66
  `),130;if(o.message==="NOT_A_TTY")return process.stdout.write(R(` \u2713 Using existing credentials.
@@ -71,21 +71,21 @@
71
71
  `),process.stdout.write(m(` URL: ${s.baseUrl}
72
72
  `)),process.stdout.write(`
73
73
  `)):(process.stdout.write(` ${v("\u26A0")} Session not valid for current endpoint
74
- `),process.stdout.write(m(" URL: ")+Y(s.baseUrl)+`
75
- `),process.stdout.write(m(" Tenant: ")+Y(s.tenant)+`
74
+ `),process.stdout.write(m(" URL: ")+G(s.baseUrl)+`
75
+ `),process.stdout.write(m(" Tenant: ")+G(s.tenant)+`
76
76
  `),process.stdout.write(m(" User: ")+m("(not authenticated)")+`
77
77
  `),process.stdout.write(`
78
- `));}try{return await co(n)}catch(i){if(i.message==="SIGINT")return process.stdout.write(`
78
+ `));}try{return await ao(n)}catch(i){if(i.message==="SIGINT")return process.stdout.write(`
79
79
  `),130;if(i.message==="NOT_A_TTY")return process.stderr.write(b(` \u2717 No TTY available for interactive login.
80
80
  `)+` Pass --client-id, --client-secret and --tenant for non-interactive use.
81
81
 
82
- `),1;throw i}}var ao,Zt=g(()=>{"use strict";Kt();Qe();gt();V();Vt();L();ut();le();en();ao=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var ir={};$(ir,{normalizeCustomUrl:()=>or,runInit:()=>fo,validateCustomUrl:()=>on});function nn(t,e,n){process.stdout.write(I(P(`
82
+ `),1;throw i}}var io,Zt=g(()=>{"use strict";Kt();Ze();gt();Y();Vt();L();ut();le();tn();io=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var or={};F(or,{normalizeCustomUrl:()=>sr,runInit:()=>po,validateCustomUrl:()=>sn});function en(t,e,n){process.stdout.write(I(P(`
83
83
  [${t}/${e}] ${n}
84
- `)));}function rn(t){process.stdout.write(` ${R("\u2713")} ${t}
85
- `);}function uo(t){process.stdout.write(` ${v("\u26A0")} ${t}
86
- `);}function nr(t){process.stdout.write(` ${m(t)}
87
- `);}function rr(){try{let t=k__namespace.readFileSync(B(),"utf8");return JSON.parse(t).env||{}}catch{return {}}}function sr(){try{let t=k__namespace.readFileSync(B(),"utf8"),e=JSON.parse(t);return !!(e.env&&e.env[p.ANTHROPIC_AUTH_TOKEN])}catch{return false}}function po(){let t=$n();if(!t)return null;pe({FLOW_BASE_URL:t});try{let e=de(),n={};try{n=JSON.parse(k__namespace.readFileSync(e,"utf8"));}catch{return t}delete n.baseUrl,Object.keys(n).length===0?k__namespace.unlinkSync(e):k__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
88
- `,{encoding:"utf8",mode:384});}catch{}return t}function or(t){let e=t.trim().replace(/\\/g,"/");/^https?:\/\//i.test(e)||(e=`https://${e}`);try{let n=new URL(e);return `${n.protocol}//${n.host}`}catch{return e}}function on(t,e=false){if(e){let i=/^https?:\/\//i.test(t.trim())?t.trim().replace(/\\/g,"/"):`https://${t.trim().replace(/\\/g,"/")}`,o;try{o=new URL(i);}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.
84
+ `)));}function nn(t){process.stdout.write(` ${R("\u2713")} ${t}
85
+ `);}function lo(t){process.stdout.write(` ${v("\u26A0")} ${t}
86
+ `);}function er(t){process.stdout.write(` ${m(t)}
87
+ `);}function nr(){try{let t=k__namespace.readFileSync(M(),"utf8");return JSON.parse(t).env||{}}catch{return {}}}function rr(){try{let t=k__namespace.readFileSync(M(),"utf8"),e=JSON.parse(t);return !!(e.env&&e.env[p.ANTHROPIC_AUTH_TOKEN])}catch{return false}}function uo(){let t=Cn();if(!t)return null;pe({FLOW_BASE_URL:t});try{let e=de(),n={};try{n=JSON.parse(k__namespace.readFileSync(e,"utf8"));}catch{return t}delete n.baseUrl,Object.keys(n).length===0?k__namespace.unlinkSync(e):k__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
88
+ `,{encoding:"utf8",mode:384});}catch{}return t}function sr(t){let e=t.trim().replace(/\\/g,"/");/^https?:\/\//i.test(e)||(e=`https://${e}`);try{let n=new URL(e);return `${n.protocol}//${n.host}`}catch{return e}}function sn(t,e=false){if(e){let i=/^https?:\/\//i.test(t.trim())?t.trim().replace(/\\/g,"/"):`https://${t.trim().replace(/\\/g,"/")}`,o;try{o=new URL(i);}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.
89
89
  Received: ${t}
90
90
  Expected: https://tenant.example.com`);if(o.search)throw new Error(`Custom URL must not contain query parameters.
91
91
  Received: ${t}
@@ -93,32 +93,32 @@
93
93
  Received: ${t}
94
94
  Expected: https://tenant.example.com`);if(o.username||o.password)throw new Error(`Custom URL must not contain embedded credentials.
95
95
  Received: ${t}
96
- Expected: https://tenant.example.com`);if(!o.hostname.includes("."))throw new Error(`Invalid domain: ${o.hostname}. Expected format: tenant.example.com`);let a=`${o.protocol}//${o.host}`,c=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],Et(a);}finally{c!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=c);}return a}let n=or(t),r;try{r=new URL(n);}catch{throw new Error(`Invalid URL: ${t}`)}if(r.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!r.hostname.includes("."))throw new Error(`Invalid domain: ${r.hostname}. Expected format: tenant.example.com`);let s=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],Et(n);}finally{s!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=s);}return n.replace(/\/$/,"")}async function sn(){for(let t=1;t<=3;t++)try{let e=await yn(" Enter your Flow domain (e.g., tenant.ciandt.com)");return on(e)}catch(e){if(process.stderr.write(v(` \u2717 ${e.message}
96
+ Expected: https://tenant.example.com`);if(!o.hostname.includes("."))throw new Error(`Invalid domain: ${o.hostname}. Expected format: tenant.example.com`);let a=`${o.protocol}//${o.host}`,c=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],Et(a);}finally{c!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=c);}return a}let n=sr(t),r;try{r=new URL(n);}catch{throw new Error(`Invalid URL: ${t}`)}if(r.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!r.hostname.includes("."))throw new Error(`Invalid domain: ${r.hostname}. Expected format: tenant.example.com`);let s=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],Et(n);}finally{s!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=s);}return n.replace(/\/$/,"")}async function rn(){for(let t=1;t<=3;t++)try{let e=await Tn(" Enter your Flow domain (e.g., tenant.ciandt.com)");return sn(e)}catch(e){if(process.stderr.write(v(` \u2717 ${e.message}
97
97
 
98
98
  `)),t===3)throw process.stderr.write(b(` Too many invalid attempts.
99
99
 
100
- `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function Qt(){try{let t=k__namespace.readFileSync(B(),"utf8"),n=JSON.parse(t).env?.FLOW_BASE_URL;return typeof n=="string"&&n.trim()?n.trim():null}catch{return null}}async function fo(t={}){let e=ce();if(e)return e;let n=t.url,r=3;process.stdout.write(I(P(`
100
+ `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function Qt(){try{let t=k__namespace.readFileSync(M(),"utf8"),n=JSON.parse(t).env?.FLOW_BASE_URL;return typeof n=="string"&&n.trim()?n.trim():null}catch{return null}}async function po(t={}){let e=ce();if(e)return e;let n=t.url,r=3;process.stdout.write(I(P(`
101
101
  flow-ai-obs init
102
102
  `))),process.stdout.write(m(` Configuring your development environment:
103
103
 
104
104
  `)),process.stdout.write(m(` [1/3] Flow Environment Setup Configure Flow URLs and LLM routing
105
105
  `)),process.stdout.write(m(` [2/3] Authentication Authenticate with Flow
106
106
  `)),process.stdout.write(m(` [3/3] Observability OpenTelemetry metrics, logs and trace hooks
107
- `)),nn(1,r,"Flow Environment Setup");let s=false;{let E=rr().FLOW_BASE_URL;if(E&&(uo(`Base URL already configured (FLOW_BASE_URL=${E})`),!t.noInteractive&&dt()))try{let{promptRaw:y}=await Promise.resolve().then(()=>(Zt(),zt));s=(await y(P(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",s||nr("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(v(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
107
+ `)),en(1,r,"Flow Environment Setup");let s=false;{let E=nr().FLOW_BASE_URL;if(E&&(lo(`Base URL already configured (FLOW_BASE_URL=${E})`),!t.noInteractive&&dt()))try{let{promptRaw:y}=await Promise.resolve().then(()=>(Zt(),zt));s=(await y(P(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",s||er("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(v(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
108
108
  `)+v(" on Windows too: ")+P(`npm install -g @ciandt-flow/flow-ai-obs
109
109
  `)+v(` Running a Windows code assistant + flow-ai-obs (WSL) is not a supported configuration.
110
110
 
111
- `)),po(),!n&&!t.noInteractive&&dt()){let E=Qt();try{s?n=await sn():E?(process.stdout.write(`
111
+ `)),uo(),!n&&!t.noInteractive&&dt()){let E=Qt();try{s?n=await rn():E?(process.stdout.write(`
112
112
  Current base URL: ${I(E)}
113
- `),await be(" Keep this URL?",!0)||(n=await sn())):(process.stdout.write(`
114
- `),await be(" Does your organization use a custom Flow URL?",!1)?n=await sn():rn("Using default Flow Base URL: https://flow.ciandt.com"));}catch{return 1}process.stdout.write(`
113
+ `),await Re(" Keep this URL?",!0)||(n=await rn())):(process.stdout.write(`
114
+ `),await Re(" Does your organization use a custom Flow URL?",!1)?n=await rn():nn("Using default Flow Base URL: https://flow.ciandt.com"));}catch{return 1}process.stdout.write(`
115
115
  `);}if(!n&&!t.noInteractive&&!dt()){let E=Qt();if(E)process.stdout.write(v(` \u26A0 Non-interactive environment detected.
116
116
  `)+m(` Using URL: ${E}
117
117
 
118
118
  `));else return process.stderr.write(` \u2717 No URL configured and no TTY available.
119
119
  Run: flow-ai-obs init --custom-url <URL>
120
120
 
121
- `),1}let i,o=false;if(n){let E;try{E=on(n,!0);}catch(U){return process.stderr.write(`
121
+ `),1}let i,o=false;if(n){let E;try{E=sn(n,!0);}catch(U){return process.stderr.write(`
122
122
  \u2717 Invalid --custom-url: ${U.message}
123
123
 
124
124
  `),1}let y=Qt();i=E,o=!!y&&y!==E,o?process.stdout.write(v(` \u26A0 Base URL changed \u2014 re-authentication required.
@@ -130,15 +130,15 @@
130
130
  `));}else i=Qt()??"https://flow.ciandt.com";let a={FLOW_BASE_URL:i,OTEL_EXPORTER_OTLP_ENDPOINT:`${i}/otel`,ANTHROPIC_BASE_URL:`${i}/flow-llm-proxy/`,ANTHROPIC_MODEL:"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"};process.env.FLOW_BASE_URL=i,process.stdout.write(R(`
131
131
  \u2713 Flow environment ready.
132
132
  `));let c=36;for(let[E,y]of Object.entries(a))process.stdout.write(m(` ${E.padEnd(c)}`)+y+`
133
- `);nn(2,r,"Authentication");let l=null,S=Qt(),A=!!S&&S!==i;if(!sr()||o||A)if(t.noInteractive||!dt()){let{clientId:E,clientSecret:y,tenant:U}=t,z=E&&y&&U;if(!z&&(E||y||U)){let tt=[!E&&"--client-id",!y&&"--client-secret",!U&&"--tenant"].filter(Boolean).join(", ");return process.stderr.write(`
133
+ `);en(2,r,"Authentication");let l=null,S=Qt(),A=!!S&&S!==i;if(!rr()||o||A)if(t.noInteractive||!dt()){let{clientId:E,clientSecret:y,tenant:U}=t,X=E&&y&&U;if(!X&&(E||y||U)){let tt=[!E&&"--client-id",!y&&"--client-secret",!U&&"--tenant"].filter(Boolean).join(", ");return process.stderr.write(`
134
134
  ${b("\u2717")} Non-interactive mode requires all credential flags.
135
135
  Missing: ${tt}
136
136
 
137
- `),1}if(z){let{runLogin:tt}=await Promise.resolve().then(()=>(Zt(),zt)),C;try{C=await tt({deferPersist:!0,clientId:E,clientSecret:y,tenant:U});}catch(ke){return process.stderr.write(`
137
+ `),1}if(X){let{runLogin:tt}=await Promise.resolve().then(()=>(Zt(),zt)),$;try{$=await tt({deferPersist:!0,clientId:E,clientSecret:y,tenant:U});}catch(Ae){return process.stderr.write(`
138
138
  ${b("\u2717")} Authentication failed unexpectedly.
139
- ${ke.message}
139
+ ${Ae.message}
140
140
 
141
- `),1}if(typeof C=="number")return C;l=C.result;}else return process.stderr.write(`
141
+ `),1}if(typeof $=="number")return $;l=$.result;}else return process.stderr.write(`
142
142
  ${b("\u2717")} Authentication required.
143
143
  Run: flow-ai-obs login
144
144
 
@@ -149,17 +149,17 @@
149
149
  `),process.stdout.write(`
150
150
  ${v("\u26A0")} Authentication required for the new endpoint.
151
151
 
152
- `);let{runLogin:E}=await Promise.resolve().then(()=>(Zt(),zt)),y=await E({deferPersist:true,skipAuthCheck:o});if(typeof y=="number")return y;l=y.result;}else rn("Already authenticated \u2014 skipping."),nr("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");let w=sr()?rr()[p.ANTHROPIC_AUTH_TOKEN]:null,d={...a,...l?{[p.ANTHROPIC_AUTH_TOKEN]:l.jwt}:{},...w&&!l?{[p.ANTHROPIC_AUTH_TOKEN]:w}:{}},h,J;nn(3,r,"Observability (OpenTelemetry)"),process.stdout.write(`
152
+ `);let{runLogin:E}=await Promise.resolve().then(()=>(Zt(),zt)),y=await E({deferPersist:true,skipAuthCheck:o});if(typeof y=="number")return y;l=y.result;}else nn("Already authenticated \u2014 skipping."),er("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");let w=rr()?nr()[p.ANTHROPIC_AUTH_TOKEN]:null,d={...a,...l?{[p.ANTHROPIC_AUTH_TOKEN]:l.jwt}:{},...w&&!l?{[p.ANTHROPIC_AUTH_TOKEN]:w}:{}},h,J;en(3,r,"Observability (OpenTelemetry)"),process.stdout.write(`
153
153
  ${I("Metrics and Logs")}
154
154
  `);let q={...nt,OTEL_EXPORTER_OTLP_ENDPOINT:a.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[E,y]of Object.entries(q))process.stdout.write(m(` ${E.padEnd(36)}`)+y+`
155
155
  `);process.stdout.write(`
156
156
  `),process.stdout.write(` ${I("Trace (Hook)")}
157
157
  `);let Q=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"];for(let E of Q){let y=ft[E];process.stdout.write(m(` ${E.padEnd(18)}`)+`\u2192 flow-ai-obs ${E} (timeout: ${y}s)
158
158
  `);}process.stdout.write(`
159
- `);try{({settingsPath:h,preserved:J}=Dn(a.OTEL_EXPORTER_OTLP_ENDPOINT,d));}catch(E){return process.stderr.write(` \u2717 Failed to write settings: ${E.message}
160
- `),1}if(l){let{saveTokenCache:E}=await Promise.resolve().then(()=>(Kt(),zn));try{await E({accessToken:l.accessToken,expiresAt:l.expiresAt});}catch(U){process.stderr.write(` ${v("\u26A0")} Token cache could not be saved: ${U.message}
159
+ `);try{({settingsPath:h,preserved:J}=xn(a.OTEL_EXPORTER_OTLP_ENDPOINT,d));}catch(E){return process.stderr.write(` \u2717 Failed to write settings: ${E.message}
160
+ `),1}if(l){let{saveTokenCache:E}=await Promise.resolve().then(()=>(Kt(),Xn));try{await E({accessToken:l.accessToken,expiresAt:l.expiresAt});}catch(U){process.stderr.write(` ${v("\u26A0")} Token cache could not be saved: ${U.message}
161
161
  Hooks will authenticate on first use.
162
- `);}let{clearLoggedOutMarker:y}=await Promise.resolve().then(()=>(Qe(),er));y();}return rn(`Settings written: ${h}`),J.length>0&&(process.stdout.write(`
162
+ `);}let{clearLoggedOutMarker:y}=await Promise.resolve().then(()=>(Ze(),tr));y();}return nn(`Settings written: ${h}`),J.length>0&&(process.stdout.write(`
163
163
  `),process.stdout.write(v(` \u26A0 Third-party hooks preserved on: ${J.join(", ")}
164
164
  `)),process.stdout.write(m(` flow-ai-obs was prepended \u2014 it executes first.
165
165
  `))),process.stdout.write(`
@@ -171,53 +171,53 @@
171
171
 
172
172
  `)+m(` Start your code assistant and begin working.
173
173
 
174
- `))),0}var ar=g(()=>{"use strict";Vt();L();ut();ue();le();Be();V();Pe();});var ur={};$(ur,{runStatus:()=>go});function cr(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function mo(t){process.stdout.write(` ${R("\u2713")} ${t}
175
- `);}function an(t){process.stdout.write(` ${v("\u26A0")} ${t}
174
+ `))),0}var ir=g(()=>{"use strict";Vt();L();ut();ue();le();De();Y();be();});var lr={};F(lr,{runStatus:()=>mo});function ar(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function fo(t){process.stdout.write(` ${R("\u2713")} ${t}
175
+ `);}function on(t){process.stdout.write(` ${v("\u26A0")} ${t}
176
176
  `);}function Ut(t){process.stdout.write(` ${R("\u2713")} ${t}
177
177
  `);}function te(t){process.stdout.write(` ${v("\u26A0")} ${t}
178
178
  `);}function ee(t){process.stdout.write(` ${b("\u2717")} ${t}
179
179
  `);}function ot(t){process.stdout.write(` ${m(t)}
180
- `);}function cn(t){process.stdout.write(I(P(`
180
+ `);}function an(t){process.stdout.write(I(P(`
181
181
  ${t}
182
- `)));}function ln(t,e=false){let n=e?`${v("\u26A0")} ${I(v(t))}`:I(t);process.stdout.write(`
182
+ `)));}function cn(t,e=false){let n=e?`${v("\u26A0")} ${I(v(t))}`:I(t);process.stdout.write(`
183
183
  ${n}
184
- `);}function Se(){process.stdout.write(`
185
- `);}async function go(){cn("Auth");let t=await he();t.notConfigured?(an("Not configured."),process.stdout.write(`
184
+ `);}function Ee(){process.stdout.write(`
185
+ `);}async function mo(){an("Auth");let t=await ge();t.notConfigured?(on("Not configured."),process.stdout.write(`
186
186
  `),process.stdout.write(` ${m("Run `flow-ai-obs init` to set up.")}
187
- `)):!t.ok&&t.error==="No credentials found"?an("Not authenticated. Run `flow-ai-obs login` to set up."):t.ok?(mo("Authenticated"),process.stdout.write(` ${m("URL: ")}${t.baseUrl}
187
+ `)):!t.ok&&t.error==="No credentials found"?on("Not authenticated. Run `flow-ai-obs login` to set up."):t.ok?(fo("Authenticated"),process.stdout.write(` ${m("URL: ")}${t.baseUrl}
188
188
  `),process.stdout.write(` ${m("Tenant: ")}${t.tenant}
189
189
  `),process.stdout.write(` ${m("User: ")}${t.user}
190
190
  `),process.stdout.write(` ${m("Storage: ANTHROPIC_AUTH_TOKEN (settings.json)")}
191
- `)):an(`Session rejected by ${t.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`),cn("Flow Provider Configuration");let e=["ANTHROPIC_BASE_URL","ANTHROPIC_MODEL","ANTHROPIC_SMALL_FAST_MODEL","CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS"],n={},r={};try{let d=k__namespace.readFileSync(B(),"utf8");r=JSON.parse(d),n=r.env||{};}catch{}let s=e.filter(d=>!n[d]),i=s.length===0;ln("LLM Proxy",!i),i?(Ut("Flow LLM Proxy configured"),ot(`Endpoint: ${n.ANTHROPIC_BASE_URL}`),ot(`Model: ${n.ANTHROPIC_MODEL}`)):(process.stdout.write(`
191
+ `)):on(`Session rejected by ${t.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`),an("Flow Provider Configuration");let e=["ANTHROPIC_BASE_URL","ANTHROPIC_MODEL","ANTHROPIC_SMALL_FAST_MODEL","CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS"],n={},r={};try{let d=k__namespace.readFileSync(M(),"utf8");r=JSON.parse(d),n=r.env||{};}catch{}let s=e.filter(d=>!n[d]),i=s.length===0;cn("LLM Proxy",!i),i?(Ut("Flow LLM Proxy configured"),ot(`Endpoint: ${n.ANTHROPIC_BASE_URL}`),ot(`Model: ${n.ANTHROPIC_MODEL}`)):(process.stdout.write(`
192
192
  `),process.stdout.write(` ${m("Run: flow-ai-obs init (configures the Flow LLM proxy)")}
193
193
  `),process.stdout.write(`
194
- `),te(`${s.length} proxy var(s) missing from settings.json`),s.forEach(d=>ee(`Missing: ${d}`))),Se();for(let d of e){let h=n[d]??b("(missing)");process.stdout.write(m(` ${d.padEnd(36)}`)+h+`
195
- `);}cn("Observability configuration (OpenTelemetry)");let o=Object.keys(nt).filter(d=>!n[d]);ln("Metrics and Logs",o.length>0),o.length===0?(Ut("All OTEL env vars present in settings.json"),ot(`Endpoint: ${n.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
194
+ `),te(`${s.length} proxy var(s) missing from settings.json`),s.forEach(d=>ee(`Missing: ${d}`))),Ee();for(let d of e){let h=n[d]??b("(missing)");process.stdout.write(m(` ${d.padEnd(36)}`)+h+`
195
+ `);}an("Observability configuration (OpenTelemetry)");let o=Object.keys(nt).filter(d=>!n[d]);cn("Metrics and Logs",o.length>0),o.length===0?(Ut("All OTEL env vars present in settings.json"),ot(`Endpoint: ${n.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
196
196
  `),process.stdout.write(` ${m("Run: flow-ai-obs init (restores missing vars automatically)")}
197
197
  `),process.stdout.write(`
198
- `),te(`${o.length} OTEL var(s) missing from settings.json`),o.forEach(d=>ee(`Missing: ${d}`))),Se();for(let d of Object.keys(nt)){let h=n[d]??b("(missing)");process.stdout.write(m(` ${d.padEnd(36)}`)+h+`
199
- `);}let a=r.hooks??{},c=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],l=c.every(d=>{let h=a[d];return Array.isArray(h)?h.some(J=>{let q=J;return Array.isArray(q?.hooks)&&q.hooks.some(Q=>Q?.command?.startsWith(jt.CLI))}):false});ln("Tracing",!l),l?Ut("Hooks registered (trace capture)"):(process.stdout.write(`
198
+ `),te(`${o.length} OTEL var(s) missing from settings.json`),o.forEach(d=>ee(`Missing: ${d}`))),Ee();for(let d of Object.keys(nt)){let h=n[d]??b("(missing)");process.stdout.write(m(` ${d.padEnd(36)}`)+h+`
199
+ `);}let a=r.hooks??{},c=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],l=c.every(d=>{let h=a[d];return Array.isArray(h)?h.some(J=>{let q=J;return Array.isArray(q?.hooks)&&q.hooks.some(Q=>Q?.command?.startsWith(jt.CLI))}):false});cn("Tracing",!l),l?Ut("Hooks registered (trace capture)"):(process.stdout.write(`
200
200
  `),process.stdout.write(` ${m("Run `flow-ai-obs init` to configure.")}
201
201
  `),process.stdout.write(`
202
202
  `),te("Hooks NOT registered."));for(let d of c){let h=ft[d];process.stdout.write(m(` ${d.padEnd(18)}`)+`\u2192 flow-ai-obs ${d} (timeout: ${h}s)
203
- `);}Se();let S=process.env[p.FLOW_TELEMETRY]==="true",A=process.env[p.LANGFUSE_BASE_URL],T=process.env[p.LANGFUSE_PUBLIC_KEY],w=process.env[p.LANGFUSE_SECRET_KEY];if(S)if(A&&T&&w){let d=await K();for(let h of d)h.mode==="direct"&&(Ut("FLOW_TELEMETRY=true (direct mode enabled)"),Ut("Mode: direct"),ot(`Endpoint: ${h.endpoint}`),ot(`PK: ${cr(T)}`),ot(`SK: ${cr(w)}`));}else te("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),A||ee("LANGFUSE_BASE_URL not set"),T||ee("LANGFUSE_PUBLIC_KEY not set"),w||ee("LANGFUSE_SECRET_KEY not set");else {let d=await K();if(d.length>0)for(let h of d)h.mode==="gateway"&&(Ut("Mode: gateway"),ot(`Endpoint: ${h.endpoint}`));else d.authError?te("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):ot("No active tracing destination configured.");}return Se(),0}var dr=g(()=>{"use strict";V();Vt();L();ut();en();});var pr={};$(pr,{runOtelHeaders:()=>ho});async function ho(){let t=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!t)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs auth login
204
- `),1;let e;try{e=(await D(t)).accessToken;}catch(n){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${n.message}
203
+ `);}Ee();let S=process.env[p.FLOW_TELEMETRY]==="true",A=process.env[p.LANGFUSE_BASE_URL],T=process.env[p.LANGFUSE_PUBLIC_KEY],w=process.env[p.LANGFUSE_SECRET_KEY];if(S)if(A&&T&&w){let d=await z();for(let h of d)h.mode==="direct"&&(Ut("FLOW_TELEMETRY=true (direct mode enabled)"),Ut("Mode: direct"),ot(`Endpoint: ${h.endpoint}`),ot(`PK: ${ar(T)}`),ot(`SK: ${ar(w)}`));}else te("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),A||ee("LANGFUSE_BASE_URL not set"),T||ee("LANGFUSE_PUBLIC_KEY not set"),w||ee("LANGFUSE_SECRET_KEY not set");else {let d=await z();if(d.length>0)for(let h of d)h.mode==="gateway"&&(Ut("Mode: gateway"),ot(`Endpoint: ${h.endpoint}`));else d.authError?te("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):ot("No active tracing destination configured.");}return Ee(),0}var ur=g(()=>{"use strict";Y();Vt();L();ut();tn();});var dr={};F(dr,{runOtelHeaders:()=>go});async function go(){let t=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!t)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs auth login
204
+ `),1;let e;try{e=(await B(t)).accessToken;}catch(n){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${n.message}
205
205
  `),1}return e?(process.stdout.write(`{"Authorization": "Bearer ${e}"}
206
206
  `),0):(process.stderr.write(`[flow-ai-obs otel-headers] Empty token received
207
- `),1)}var fr=g(()=>{"use strict";gt();V();L();});function X(t,e){let n=typeof t=="object"?JSON.stringify(t):String(t??"");return n.length>e?n.slice(0,e)+" \u2026[truncated]":n}function we(t,e=100){return String(t??"").split(`
208
- `)[0].slice(0,e).trim()}function ne(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function G(t){process.stdout.write(JSON.stringify(t));}var Nt=g(()=>{"use strict";});function it(){return String(BigInt(Date.now())*1000000n)}var un,St,re=g(()=>{"use strict";un=()=>crypto.randomBytes(16).toString("hex"),St=()=>crypto.randomBytes(8).toString("hex");});function vo(t,e){let n=bt.resolve(t);if(!n.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return n}function dn(t){if(!ko.test(t))throw new Error(`Invalid session ID: ${t}`);return vo(bt.join(ht.tmpdir(),`flow-obs-${t}.json`),Lo)}function Ct(t){let e=dn(t);if(!k.existsSync(e))return null;try{return JSON.parse(k.readFileSync(e,"utf8"))}catch{return null}}function $t(t,e){k.writeFileSync(dn(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function pn(t){try{k.unlinkSync(dn(t));}catch{}}var ko,Lo,se=g(()=>{"use strict";ko=/^[0-9a-f-]{1,64}$/i,Lo=bt.normalize(ht.tmpdir())+bt.sep;});function Sr(t){if(!t||!k.existsSync(t))return null;try{let e=k.readFileSync(t,"utf8").trimEnd().split(`
209
- `);for(let n=e.length-1;n>=0;n--)try{let r=JSON.parse(e[n]);if(r.type==="user"&&r.uuid)return r.uuid}catch{}}catch{}return null}function fn(t){if(!t||!k.existsSync(t))return null;try{let e=k.readFileSync(t,"utf8").trimEnd().split(`
207
+ `),1)}var pr=g(()=>{"use strict";gt();Y();L();});function K(t,e){let n=typeof t=="object"?JSON.stringify(t):String(t??"");return n.length>e?n.slice(0,e)+" \u2026[truncated]":n}function Se(t,e=100){return String(t??"").split(`
208
+ `)[0].slice(0,e).trim()}function ne(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function N(t){process.stdout.write(JSON.stringify(t));}var Nt=g(()=>{"use strict";});function it(){return String(BigInt(Date.now())*1000000n)}var ln,St,re=g(()=>{"use strict";ln=()=>crypto.randomBytes(16).toString("hex"),St=()=>crypto.randomBytes(8).toString("hex");});function Lo(t,e){let n=bt.resolve(t);if(!n.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return n}function un(t){if(!Ao.test(t))throw new Error(`Invalid session ID: ${t}`);return Lo(bt.join(ht.tmpdir(),`flow-obs-${t}.json`),ko)}function Ct(t){let e;try{e=un(t);}catch{return null}if(!k.existsSync(e))return null;try{return JSON.parse(k.readFileSync(e,"utf8"))}catch{return null}}function $t(t,e){k.writeFileSync(un(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function dn(t){try{k.unlinkSync(un(t));}catch{}}var Ao,ko,se=g(()=>{"use strict";Ao=/^[0-9a-f-]{1,64}$/i,ko=bt.normalize(ht.tmpdir())+bt.sep;});function Er(t){if(!t||!k.existsSync(t))return null;try{let e=k.readFileSync(t,"utf8").trimEnd().split(`
209
+ `);for(let n=e.length-1;n>=0;n--)try{let r=JSON.parse(e[n]);if(r.type==="user"&&r.uuid)return r.uuid}catch{}}catch{}return null}function pn(t){if(!t||!k.existsSync(t))return null;try{let e=k.readFileSync(t,"utf8").trimEnd().split(`
210
210
  `),n=[],r=0,s=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 c=(o.message?.content??[]).filter(S=>S.type==="text").map(S=>S.text??"").join("");c&&n.unshift(c);let l=o.message?.usage??{};r+=(l.input_tokens??0)+(l.cache_read_input_tokens??0)+(l.cache_creation_input_tokens??0),s+=l.output_tokens??0;}}catch{}return !n.length&&r===0?null:{text:n.join(`
211
211
 
212
- `),inputTokens:r,outputTokens:s}}catch{}return null}var mn=g(()=>{"use strict";});function yr(t){return t.replace(":","/")}function Te(t,e){if(!t)return null;let n=yr(t),r=[bt.join(ht.homedir(),".claude","skills",n,"SKILL.md"),bt.join(e??"",".claude","skills",n,"SKILL.md")];for(let s of r)if(k.existsSync(s))try{return k.readFileSync(s,"utf8")}catch{}return null}function _r(t){return t.split(`
213
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function Or(t){return !!t.slashSkill||t.toolCalls.some(r=>r.tool==="Skill")?t.toolCalls.some(r=>r.tool==="Skill"&&!r.synthetic||Co.has(r.tool))?"complete":"prerequisite_required":null}function ye(t,e){if(!t)return null;let n=yr(t),r=[bt.join(ht.homedir(),".claude","skills",n),bt.join(e??"",".claude","skills",n)],s=null;for(let a of r)if(k.existsSync(bt.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let i=[];function o(a,c){for(let l of k.readdirSync(a,{withFileTypes:true})){if(Io.has(l.name)||No.has(l.name)||Uo.has(bt.extname(l.name)))continue;let S=c?`${c}/${l.name}`:l.name;l.isDirectory()?o(bt.join(a,l.name),S):i.push(S);}}return o(s,""),i.length>0?i:null}var Io,Uo,No,Co,_e=g(()=>{"use strict";Io=new Set([".venv","__pycache__",".git","node_modules"]),Uo=new Set([".pyc",".pyo"]),No=new Set(["SKILL.md",".DS_Store",".gitignore"]);Co=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function xo(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Do(t,e,n,r){return new Promise(s=>{let i=new URL(t),o=i.protocol==="https:",a=(o?ls__default.default:Rs__default.default).request({hostname:i.hostname,port:i.port||(o?443:80),path:i.pathname+i.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),Authorization:`Bearer ${String(n).replace(/[\r\n]/g,"")}`,FlowTenant:String(r).replace(/[\r\n]/g,"")}},c=>{c.resume(),s(c.statusCode??0);});a.on("error",()=>s(0)),a.setTimeout(5e3,()=>{a.destroy(),s(0);}),a.write(e),a.end();})}async function wt(t,e={}){try{let n=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!n)return;let r,s=new Promise((A,T)=>{r=setTimeout(()=>T(new Error("getToken timeout")),4e3),r.unref();}),{accessToken:i}=await Promise.race([D(n),s]);clearTimeout(r);let o=xo(i);if(!o)return;let a=o.tenant||n.tenant,c=JSON.stringify({action:t,booster:ae().BOOSTER,metadata:e,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:o.email||"",id:o.sub||"",name:o.name||o.email||""}}),l=Et(ae().API_URL),S=await Do(l,c,i,a);u("metrics.logEvent",`action=${t} status=${S}`);}catch(n){u("metrics.logEvent",`silenced error: ${n.message}`);}}var Oe=g(()=>{"use strict";L();gt();V();W();});async function gn(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Bo})+`
214
- `);return}let r=!!(await K()).authError,s=t.session_id||"unknown",i=t.prompt||"",o=t.cwd||"",a=Sr(t.transcript_path)||un(),c=_r(i),l=c?Te(c,o):null,S=c?ye(c,o):null;$t(s,{traceId:un(),spanId:St(),startNs:it(),sessionId:s,prompt:i,cwd:o,traceName:a,transcriptPath:t.transcript_path||"",model:process.env[p.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:l,skillArtifacts:S}),wt("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:r}),u("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),G(t);}var Bo,Ar=g(()=>{"use strict";re();se();mn();_e();Nt();W();L();V();Oe();Bo=`\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 ${et()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;});async function kr(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},s=Ct(e);s&&(s.pendingTool={name:n,inputStr:X(r,j.TOOL_INPUT),startNs:it()},$t(e,s)),u("PreToolUse",`sid=${e}`,`tool=${n}`,`stateFound=${!!s}`),G(t);}var Lr=g(()=>{"use strict";re();se();Nt();W();L();});function f(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function Tt(...t){return t.filter(e=>e!==null)}function vr(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Mo,spans:Array.isArray(e)?e:[e]}]}]}}var Mo,O,Rr=g(()=>{"use strict";L();Mo={name:ie.SCOPE_NAME,version:ie.SCOPE_VERSION},O={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 Pr(t,e,n,r,s){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let i=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(n)},response:{status:r,body:s}});try{k.writeFileSync(br,i+`
215
- `,{flag:"a",encoding:"utf8",mode:384}),u("sendTraces:dump",`request appendada em ${br}`);}catch(o){u("sendTraces:dump",`falha ao salvar: ${o.message}`);}}function Go(t){let e=new URL(t),n=new URL(pt().GATEWAY_HEALTH);return n.hostname=e.hostname,n.port=e.port,n.protocol=e.protocol,n}function Ir(t,e){return new Promise((n,r)=>{let s=t._isSSL?ls__default.default:Rs__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let i=s.request(t,o=>{let a=[];o.on("data",c=>a.push(c)),o.on("end",()=>n({statusCode:o.statusCode??0,body:a.join("")}));});i.setTimeout(1e4,()=>{i.destroy(new Error("Request timeout"));}),i.on("error",o=>r(new Error(`Network error: ${o.message}`))),e&&i.write(e),i.end();})}async function Ur(t,e){let n;try{n=Go(t);}catch{return false}let r=n.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let i=await Ir({hostname:n.hostname,port:n.port||(r?443:80),path:n.pathname,method:"GET",headers:s,_isSSL:r},null);return u("checkHealth",`url=${n.href} status=${i.statusCode}`),i.statusCode>=200&&i.statusCode<300}catch{return false}}async function Ae(t,e,n){let r=JSON.stringify(t),s=new URL(e),i=s.protocol==="https:",o=String(n).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:o,"Content-Length":Buffer.byteLength(r)};u("sendTraces:request",`POST ${e}`),u("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:o.slice(0,20)+"\u2026"})}`),u("sendTraces:request",`body=${r.slice(0,500)}${r.length>500?"\u2026":""}`);try{let c=await Ir({hostname:s.hostname,port:s.port||(i?443:80),path:s.pathname,method:"POST",headers:a,_isSSL:i},r);return u("sendTraces:response",`status=${c.statusCode}`),Pr(e,a,r,c.statusCode,c.body),c.statusCode}catch(c){return u("sendTraces:error",c.message),Pr(e,a,r,0,c.message),0}}var br,Nr=g(()=>{"use strict";L();W();br=bt.join(ht.tmpdir(),"flow-obs-requests.ndjson");});function Jo(){let t=parseInt(process.env[p.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(x.MIN_TTL_DAYS,Math.min(x.MAX_TTL_DAYS,t)):x.DEFAULT_TTL_DAYS)*24*60*60*1e3}function qo(){let t=parseInt(process.env[p.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(x.MIN_MAX_FILES,Math.min(x.MAX_MAX_FILES,t)):x.DEFAULT_MAX_FILES}function $r(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return bt__namespace.default.join(ht__namespace.default.tmpdir(),`${x.FILE_PREFIX}${t}.json`)}function En(){let t=ht__namespace.default.tmpdir(),e;try{e=k__namespace.default.readdirSync(t);}catch{return []}return e.filter(n=>n.startsWith(x.FILE_PREFIX)&&n.endsWith(".json")).map(n=>{let r=bt__namespace.default.join(t,n),s=0;try{s=k__namespace.default.statSync(r).mtimeMs;}catch{}return {full:r,mtime:s}}).sort((n,r)=>n.mtime-r.mtime).map(n=>n.full)}function oe(t){try{let e=qo(),n=En();if(n.length>=e){let i=n.slice(0,n.length-e+1);for(let o of i)try{k__namespace.default.unlinkSync(o);}catch{}}let r=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:r,bufferedAt:Date.now(),payload:t};return k__namespace.default.writeFileSync($r(r),JSON.stringify(s),{encoding:"utf8",mode:384}),u("buffer",`saved fileId=${r}`),r}catch(e){return u("buffer",`saveToBuffer failed: ${e.message}`),null}}function Fr(t){let e=En(),n=t!=null&&t>0?t:e.length,r=[];for(let s of e){if(r.length>=n)break;try{let i=k__namespace.default.readFileSync(s,"utf8"),o=JSON.parse(i);o&&o.fileId&&o.payload&&r.push(o);}catch{u("buffer",`skipping malformed file: ${s}`);}}return r}function xr(t){try{k__namespace.default.unlinkSync($r(t)),u("buffer",`deleted fileId=${t}`);}catch{}}function Dr(){let t=Date.now()-Jo();for(let e of En())try{let{mtimeMs:n}=k__namespace.default.statSync(e);n<t&&(k__namespace.default.unlinkSync(e),u("buffer",`evicted stale: ${bt__namespace.default.basename(e)}`));}catch{}}var Br=g(()=>{"use strict";L();W();});async function Ko(t){Dr();let e=Fr(x.REPLAY_BATCH_SIZE);e.length&&(u("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async n=>{try{let r=await Ae(n.payload,t.endpoint,t.authHeader);r>=200&&r<300?(xr(n.fileId),u("replayBufferedTraces",`replayed fileId=${n.fileId} status=${r}`)):u("replayBufferedTraces",`replay failed fileId=${n.fileId} status=${r}`);}catch(r){u("replayBufferedTraces",`replay error fileId=${n.fileId}: ${r.message}`);}})));}async function Mr(t){let e=await K();if(!e.length)return e.authError&&(u("postToLangfuse","auth refresh failed \u2014 buffering trace"),oe(t)),0;let n=await Promise.all(e.map(async i=>{if(i.mode!=="gateway")return {creds:i,healthy:true};let o=await Ur(i.endpoint,i.authHeader);return {creds:i,healthy:o}})),r=n.find(i=>i.creds.mode==="gateway"&&i.healthy)?.creds??n.find(i=>i.creds.mode==="direct")?.creds;return r&&await Ko(r),(await Promise.all(n.map(async({creds:i,healthy:o})=>{if(i.mode==="gateway"){if(!o)return u("postToLangfuse","gateway health check failed \u2014 buffering trace"),oe(t),0;let c=await Ae(t,i.endpoint,i.authHeader);return (c===0||c>=500)&&(u("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),oe(t)),c}let a=await Ae(t,i.endpoint,i.authHeader);return (a===0||a>=500)&&(u("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),oe(t)),a}))).find(i=>i!==0)??0}var Hr=g(()=>{"use strict";V();W();Nr();Br();L();});var Sn=g(()=>{"use strict";Rr();Hr();});function ct(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Qo.reduce((n,{re:r,replace:s})=>n.replace(r,s),e)}var M,Xo,zo,Zo,jr,Qo,wn=g(()=>{"use strict";M="[REDACTED]",Xo="[REDACTED-EMAIL]",zo="[REDACTED-CPF]",Zo="[REDACTED-CNPJ]",jr="[REDACTED-PHONE]",Qo=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${M}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${M}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${M}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${M}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,n)=>`${e}
216
- ${M}
217
- ${n}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${M}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${M}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${M}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${M}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${M}`},{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,n)=>`${e}${n}${M}${n}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${M}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>Xo},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>zo},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Zo},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>jr},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>jr}];});async function Wr(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},s=t.tool_response,i=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",o=Ct(e);if(!o){G(t);return}let a=it(),c=o.pendingTool,l=c?.name===n,S=l?c.startNs:String(BigInt(a)-200000000n),A=l?c.inputStr:X(r,j.TOOL_INPUT),T=A,w=null;if(n==="Skill"){let tt=typeof r=="object"&&r!==null?r.skill||r.name||r.skillName||r.commandName||String(Object.values(r)[0]??""):String(r);w=tt?String(tt).trim():null;let C=w?Te(w,o.cwd):null;C&&(T=C,o.skillContent||(o.skillContent=C),o.skillArtifacts||(o.skillArtifacts=ye(w,o.cwd))),w&&!o.slashSkill&&(o.slashSkill=w),u("PostToolUse","Skill tool detected",`skillName=${w}`,`contentFound=${!!C}`);}let d=ct(X(i,j.TOOL_OUTPUT)),h=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(d.slice(0,500)),J=h?"ERROR":"DEFAULT",q=St(),Q=Math.round(Number(BigInt(a)-BigInt(S))/1e6),y={Agent:"AGENT",Task:"AGENT"}[n]??"TOOL",U=n==="Skill"&&w?w:we(A,60);o.toolCalls.push({tool:n,brief:U,error:h,durationMs:Q});let Ot=o.spans;Ot.push({traceId:o.traceId,spanId:q,parentSpanId:o.spanId,name:n,kind:3,startTimeUnixNano:S,endTimeUnixNano:a,attributes:Tt(f(O.OBS_NAME,n),f(O.OBS_TYPE,y),f(O.OBS_LEVEL,J),f(O.OBS_INPUT,ct(T)),f(O.OBS_OUTPUT,d),f("tool.name",n),f("tool.error",String(h)),n==="Skill"&&w?f("skill.name",w):null,n==="Skill"?f("skill.invocation","slash-command"):null),status:{code:h?2:1}}),o.pendingTool=null,$t(e,o),h&&wt("TOOL_ERROR",{toolName:n}),u("PostToolUse",`sid=${e}`,`tool=${n}`,`error=${h}`,`durationMs=${Q}`,`totalSpans=${Ot.length}`),G(t);}var Vr=g(()=>{"use strict";re();se();Sn();Nt();_e();W();L();wn();Oe();});function Gr(t,e,n){let r=Object.keys(Yr).find(o=>(t??"").toLowerCase().includes(o));if(!r)return;let s=Yr[r],i=(e*s.input+n*s.output)/1e6;return Math.round(i*1e6)/1e6}var Yr,Jr=g(()=>{"use strict";Yr={"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 qr(t){let e=t.session_id||"unknown",n=t.stop_reason||"end_turn",r=Ct(e);if(!r){G(t);return}r.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(r.slashSkill)&&(u("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${r.slashSkill}"`),r.slashSkill=null);let s=it(),i=await Qn(),o=r.toolCalls,a=r.spans;if(r.slashSkill&&!o.some(_=>_.tool==="Skill")){let _=St(),lt=r.skillContent?r.skillContent:JSON.stringify({skill:r.slashSkill});o.push({tool:"Skill",brief:r.slashSkill,error:false,durationMs:0,synthetic:true}),a.push({traceId:r.traceId,spanId:_,parentSpanId:r.spanId,name:"Skill",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:r.startNs,attributes:Tt(f(O.OBS_NAME,"Skill"),f(O.OBS_TYPE,"TOOL"),f(O.OBS_LEVEL,"DEFAULT"),f(O.OBS_INPUT,lt),f(O.OBS_OUTPUT,"loaded via slash command"),f("tool.name","Skill"),f("tool.error","false"),f("skill.name",r.slashSkill),f("skill.invocation","slash-command")),status:{code:1}}),u("Stop",`slashSkill=${r.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||r.transcriptPath||"",l=fn(c);if(c&&(o.some(_=>_.tool==="Skill"&&!_.synthetic)||!!r.slashSkill)&&!l?.text){await new Promise(lt=>setTimeout(lt,500));let _=fn(c);_?.text&&(l=_);}u("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${l?`text=${l.text.length}chars`:"null"}`);let A=o.length,T=o.filter(_=>_.error).length,w=ct(l?.text?X(l.text,j.TRACE_OUTPUT):A===0?"No tools used":o.map((_,lt)=>`${lt+1}. ${_.tool}${_.brief?` \u2192 ${_.brief}`:""}${_.error?" [ERROR]":""}`).join(`
218
- `)),d=l?.inputTokens??0,h=l?.outputTokens??0,J=o.map((_,lt)=>`${lt+1}. ${_.tool}${_.brief?` \u2192 ${_.brief}`:""}${_.error?" [ERROR]":""} (${_.durationMs}ms)`),q=!!(r.slashSkill||o.some(_=>_.tool==="Skill")),Q=o.some(_=>_.tool==="Agent");if(!q&&!Q){u("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),wt("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),pn(e),G(t);return}let E=q?"skill":"agent",y=Math.round(Number(BigInt(s)-BigInt(r.startNs))/1e6),U=Gr(r.model,d,h),z=Or(r);z==="prerequisite_required"&&l?.text&&(z="complete"),z==="prerequisite_required"&&(a.push({traceId:r.traceId,spanId:St(),parentSpanId:r.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:s,attributes:Tt(f(O.OBS_NAME,"prerequisite-check"),f(O.OBS_TYPE,"EVENT"),f(O.OBS_LEVEL,"WARNING"),f(O.OBS_OUTPUT,w),f("skill.name",r.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),u("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${r.slashSkill}`));let Ot=(()=>{if(!(!q||!r.prompt)){if(r.slashSkill){let _=r.prompt.replace(new RegExp(`^\\/${r.slashSkill}\\s*`,"i"),"").trim();return _?X(ct(_),j.USER_INSTRUCTION):void 0}return X(ct(r.prompt),j.USER_INSTRUCTION)||void 0}})(),tt=JSON.stringify({trace_type:E,...z!==null&&{execution_status:z},...r.slashSkill?{skill_name:r.slashSkill}:{},...r.skillArtifacts?.length&&{skill_artifacts:r.skillArtifacts},...Ot!==void 0&&{user_instruction:Ot},latency_ms:y,...d&&{tokens_input:d},...h&&{tokens_output:h},cost_usd:U,...r.model?{model:r.model}:{},toolCount:A,errorCount:T,stopReason:n,sessionId:r.sessionId,tools:J.length?J:void 0}),C=ct(X(r.prompt,j.TRACE_INPUT)),ke=Tt(f(O.TRACE_NAME,r.traceName),f(O.TRACE_INPUT,C),f(O.TRACE_OUTPUT,w),f(O.OBS_INPUT,C),f(O.OBS_OUTPUT,w),f(O.TRACE_METADATA,tt),f(O.SESSION_ID,r.sessionId),f(O.USER_ID,i.user),f(O.OBS_TYPE,"GENERATION"),f(O.MODEL,r.model),d?f(O.INPUT_TOKENS,d):null,h?f(O.OUTPUT_TOKENS,h):null,f("claude.stop_reason",n),f("claude.tool_count",String(A)),f("claude.error_count",String(T)),f("claude.session_id",r.sessionId),f("flow.trace_type",E),{key:O.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:E}]}}}),Qr={traceId:r.traceId,spanId:r.spanId,name:r.traceName,kind:1,startTimeUnixNano:r.startNs,endTimeUnixNano:s,attributes:ke,status:{code:T>0?2:1}},ts=Tt(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Tn=[...a,Qr];u("Stop",`sid=${e}`,`totalTools=${A}`,`errorTools=${T}`,`spans=${Tn.length}`,`inputTokens=${d}`,`outputTokens=${h}`,`traceOutput="${we(w,80)}"`);let es=await Mr(vr(ts,Tn));u("Stop",`POST status=${es}`,`traceId=${r.traceId}`),wt("TRACE_SENT",{latencyMs:y,totalTools:A,errorTools:T,inputTokens:d,outputTokens:h,costUsd:U}),pn(e),G(t);}var Kr=g(()=>{"use strict";re();se();Sn();V();Jr();mn();Nt();W();_e();wn();L();Oe();});var yt,Xr=g(()=>{"use strict";V();Nt();Ar();Lr();Vr();Kr();yt=class t{static passthroughStdin(){let e=[];process.stdin.on("data",n=>e.push(n)),process.stdin.on("end",()=>process.stdout.write(Buffer.concat(e)));}static async userPromptSubmit(){let e=await ne(),n;try{n=await K();}catch{process.stdout.write(JSON.stringify(e));return}n.authError?await gn(e,!0):n.length>0?await gn(e):process.stdout.write(JSON.stringify(e));}static async preToolUse(){if(!await me()){t.passthroughStdin();return}let e=await ne();await kr(e);}static async postToolUse(){if(!await me()){t.passthroughStdin();return}let e=await ne();await Wr(e);}static async stop(){if(!await me()){t.passthroughStdin();return}let e=await ne();await qr(e);}};});var ei={};async function ti(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await yt.userPromptSubmit();break;case "PreToolUse":await yt.preToolUse();break;case "PostToolUse":await yt.postToolUse();break;case "Stop":await yt.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
219
- `),process.stdin.on("data",e=>process.stdout.write(e));}}var zr=g(()=>{"use strict";Xr();ti().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
220
- `),process.exit(0);});});var ni=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,H]=process.argv;function _t(t,e){let n=t.indexOf(e);return n!==-1?t[n+1]:void 0}function Zr(){let{bold:t,cyan:e,dim:n,green:r}=(ut(),N(ve)),{version:s}=Dt();process.stdout.write(`
212
+ `),inputTokens:r,outputTokens:s}}catch{}return null}var fn=g(()=>{"use strict";});function Tr(t){return t.replace(":","/")}function we(t,e){if(!t)return null;let n=Tr(t),r=[bt.join(ht.homedir(),".claude","skills",n,"SKILL.md"),bt.join(e??"",".claude","skills",n,"SKILL.md")];for(let s of r)if(k.existsSync(s))try{return k.readFileSync(s,"utf8")}catch{}return null}function yr(t){return t.split(`
213
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function _r(t){return !!t.slashSkill||t.toolCalls.some(r=>r.tool==="Skill")?t.toolCalls.some(r=>r.tool==="Skill"&&!r.synthetic||No.has(r.tool))?"complete":"prerequisite_required":null}function Te(t,e){if(!t)return null;let n=Tr(t),r=[bt.join(ht.homedir(),".claude","skills",n),bt.join(e??"",".claude","skills",n)],s=null;for(let a of r)if(k.existsSync(bt.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let i=[];function o(a,c){for(let l of k.readdirSync(a,{withFileTypes:true})){if(Po.has(l.name)||Uo.has(l.name)||Io.has(bt.extname(l.name)))continue;let S=c?`${c}/${l.name}`:l.name;l.isDirectory()?o(bt.join(a,l.name),S):i.push(S);}}return o(s,""),i.length>0?i:null}var Po,Io,Uo,No,ye=g(()=>{"use strict";Po=new Set([".venv","__pycache__",".git","node_modules"]),Io=new Set([".pyc",".pyo"]),Uo=new Set(["SKILL.md",".DS_Store",".gitignore"]);No=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function Fo(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function xo(t,e,n,r){return new Promise(s=>{let i=new URL(t),o=i.protocol==="https:",a=(o?cs__default.default:vs__default.default).request({hostname:i.hostname,port:i.port||(o?443:80),path:i.pathname+i.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),Authorization:`Bearer ${String(n).replace(/[\r\n]/g,"")}`,FlowTenant:String(r).replace(/[\r\n]/g,"")}},c=>{c.resume(),s(c.statusCode??0);});a.on("error",()=>s(0)),a.setTimeout(5e3,()=>{a.destroy(),s(0);}),a.write(e),a.end();})}async function wt(t,e={}){try{let n=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!n)return;let r,s=new Promise((A,T)=>{r=setTimeout(()=>T(new Error("getToken timeout")),4e3),r.unref();}),{accessToken:i}=await Promise.race([B(n),s]);clearTimeout(r);let o=Fo(i);if(!o)return;let a=o.tenant||n.tenant,c=JSON.stringify({action:t,booster:ae().BOOSTER,metadata:e,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:o.email||"",id:o.sub||"",name:o.name||o.email||""}}),l=Et(ae().API_URL),S=await xo(l,c,i,a);u("metrics.logEvent",`action=${t} status=${S}`);}catch(n){u("metrics.logEvent",`silenced error: ${n.message}`);}}var _e=g(()=>{"use strict";L();gt();Y();V();});async function mn(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Do})+`
214
+ `);return}let r=!!(await z()).authError,s=t.session_id||"unknown",i=t.prompt||"",o=t.cwd||"",a=Er(t.transcript_path)||ln(),c=yr(i),l=c?we(c,o):null,S=c?Te(c,o):null;$t(s,{traceId:ln(),spanId:St(),startNs:it(),sessionId:s,prompt:i,cwd:o,traceName:a,transcriptPath:t.transcript_path||"",model:process.env[p.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:l,skillArtifacts:S}),wt("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:r}),u("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),N(t);}var Do,Or=g(()=>{"use strict";re();se();fn();ye();Nt();V();L();Y();_e();Do=`\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 ${et()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;});async function Ar(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},s=Ct(e);s&&(s.pendingTool={name:n,inputStr:K(r,W.TOOL_INPUT),startNs:it()},$t(e,s)),u("PreToolUse",`sid=${e}`,`tool=${n}`,`stateFound=${!!s}`),N(t);}var kr=g(()=>{"use strict";re();se();Nt();V();L();});function f(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function Tt(...t){return t.filter(e=>e!==null)}function Lr(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Bo,spans:Array.isArray(e)?e:[e]}]}]}}var Bo,O,vr=g(()=>{"use strict";L();Bo={name:ie.SCOPE_NAME,version:ie.SCOPE_VERSION},O={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 br(t,e,n,r,s){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let i=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(n)},response:{status:r,body:s}});try{k.writeFileSync(Rr,i+`
215
+ `,{flag:"a",encoding:"utf8",mode:384}),u("sendTraces:dump",`request appendada em ${Rr}`);}catch(o){u("sendTraces:dump",`falha ao salvar: ${o.message}`);}}function Yo(t){let e=new URL(t),n=new URL(pt().GATEWAY_HEALTH);return n.hostname=e.hostname,n.port=e.port,n.protocol=e.protocol,n}function Pr(t,e){return new Promise((n,r)=>{let s=t._isSSL?cs__default.default:vs__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let i=s.request(t,o=>{let a=[];o.on("data",c=>a.push(c)),o.on("end",()=>n({statusCode:o.statusCode??0,body:a.join("")}));});i.setTimeout(1e4,()=>{i.destroy(new Error("Request timeout"));}),i.on("error",o=>r(new Error(`Network error: ${o.message}`))),e&&i.write(e),i.end();})}async function Ir(t,e){let n;try{n=Yo(t);}catch{return false}let r=n.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let i=await Pr({hostname:n.hostname,port:n.port||(r?443:80),path:n.pathname,method:"GET",headers:s,_isSSL:r},null);return u("checkHealth",`url=${n.href} status=${i.statusCode}`),i.statusCode>=200&&i.statusCode<300}catch{return false}}async function Oe(t,e,n){let r=JSON.stringify(t),s=new URL(e),i=s.protocol==="https:",o=String(n).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:o,"Content-Length":Buffer.byteLength(r)};u("sendTraces:request",`POST ${e}`),u("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:o.slice(0,20)+"\u2026"})}`),u("sendTraces:request",`body=${r.slice(0,500)}${r.length>500?"\u2026":""}`);try{let c=await Pr({hostname:s.hostname,port:s.port||(i?443:80),path:s.pathname,method:"POST",headers:a,_isSSL:i},r);return u("sendTraces:response",`status=${c.statusCode}`),br(e,a,r,c.statusCode,c.body),c.statusCode}catch(c){return u("sendTraces:error",c.message),br(e,a,r,0,c.message),0}}var Rr,Ur=g(()=>{"use strict";L();V();Rr=bt.join(ht.tmpdir(),"flow-obs-requests.ndjson");});function Go(){let t=parseInt(process.env[p.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(D.MIN_TTL_DAYS,Math.min(D.MAX_TTL_DAYS,t)):D.DEFAULT_TTL_DAYS)*24*60*60*1e3}function Jo(){let t=parseInt(process.env[p.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(D.MIN_MAX_FILES,Math.min(D.MAX_MAX_FILES,t)):D.DEFAULT_MAX_FILES}function Cr(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return bt__namespace.default.join(ht__namespace.default.tmpdir(),`${D.FILE_PREFIX}${t}.json`)}function hn(){let t=ht__namespace.default.tmpdir(),e;try{e=k__namespace.default.readdirSync(t);}catch{return []}return e.filter(n=>n.startsWith(D.FILE_PREFIX)&&n.endsWith(".json")).map(n=>{let r=bt__namespace.default.join(t,n),s=0;try{s=k__namespace.default.statSync(r).mtimeMs;}catch{}return {full:r,mtime:s}}).sort((n,r)=>n.mtime-r.mtime).map(n=>n.full)}function oe(t){try{let e=Jo(),n=hn();if(n.length>=e){let i=n.slice(0,n.length-e+1);for(let o of i)try{k__namespace.default.unlinkSync(o);}catch{}}let r=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:r,bufferedAt:Date.now(),payload:t};return k__namespace.default.writeFileSync(Cr(r),JSON.stringify(s),{encoding:"utf8",mode:384}),u("buffer",`saved fileId=${r}`),r}catch(e){return u("buffer",`saveToBuffer failed: ${e.message}`),null}}function $r(t){let e=hn(),n=t!=null&&t>0?t:e.length,r=[];for(let s of e){if(r.length>=n)break;try{let i=k__namespace.default.readFileSync(s,"utf8"),o=JSON.parse(i);o&&o.fileId&&o.payload&&r.push(o);}catch{u("buffer",`skipping malformed file: ${s}`);}}return r}function Fr(t){try{k__namespace.default.unlinkSync(Cr(t)),u("buffer",`deleted fileId=${t}`);}catch{}}function xr(){let t=Date.now()-Go();for(let e of hn())try{let{mtimeMs:n}=k__namespace.default.statSync(e);n<t&&(k__namespace.default.unlinkSync(e),u("buffer",`evicted stale: ${bt__namespace.default.basename(e)}`));}catch{}}var Dr=g(()=>{"use strict";L();V();});async function qo(t){xr();let e=$r(D.REPLAY_BATCH_SIZE);e.length&&(u("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async n=>{try{let r=await Oe(n.payload,t.endpoint,t.authHeader);r>=200&&r<300?(Fr(n.fileId),u("replayBufferedTraces",`replayed fileId=${n.fileId} status=${r}`)):u("replayBufferedTraces",`replay failed fileId=${n.fileId} status=${r}`);}catch(r){u("replayBufferedTraces",`replay error fileId=${n.fileId}: ${r.message}`);}})));}async function Br(t){let e=await z();if(!e.length)return e.authError&&(u("postToLangfuse","auth refresh failed \u2014 buffering trace"),oe(t)),0;let n=await Promise.all(e.map(async i=>{if(i.mode!=="gateway")return {creds:i,healthy:true};let o=await Ir(i.endpoint,i.authHeader);return {creds:i,healthy:o}})),r=n.find(i=>i.creds.mode==="gateway"&&i.healthy)?.creds??n.find(i=>i.creds.mode==="direct")?.creds;return r&&await qo(r),(await Promise.all(n.map(async({creds:i,healthy:o})=>{if(i.mode==="gateway"){if(!o)return u("postToLangfuse","gateway health check failed \u2014 buffering trace"),oe(t),0;let c=await Oe(t,i.endpoint,i.authHeader);return (c===0||c>=500)&&(u("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),oe(t)),c}let a=await Oe(t,i.endpoint,i.authHeader);return (a===0||a>=500)&&(u("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),oe(t)),a}))).find(i=>i!==0)??0}var Mr=g(()=>{"use strict";Y();V();Ur();Dr();L();});var En=g(()=>{"use strict";vr();Mr();});function ct(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Zo.reduce((n,{re:r,replace:s})=>n.replace(r,s),e)}var H,Ko,Xo,zo,Hr,Zo,Sn=g(()=>{"use strict";H="[REDACTED]",Ko="[REDACTED-EMAIL]",Xo="[REDACTED-CPF]",zo="[REDACTED-CNPJ]",Hr="[REDACTED-PHONE]",Zo=[{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,n)=>`${e}
216
+ ${H}
217
+ ${n}`},{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,n)=>`${e}${n}${H}${n}`},{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:()=>Ko},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Xo},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>zo},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Hr},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Hr}];});async function jr(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},s=t.tool_response,i=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",o=Ct(e);if(!o){N(t);return}let a=it(),c=o.pendingTool,l=c?.name===n,S=l?c.startNs:String(BigInt(a)-200000000n),A=l?c.inputStr:K(r,W.TOOL_INPUT),T=A,w=null;if(n==="Skill"){let tt=typeof r=="object"&&r!==null?r.skill||r.name||r.skillName||r.commandName||String(Object.values(r)[0]??""):String(r);w=tt?String(tt).trim():null;let $=w?we(w,o.cwd):null;$&&(T=$,o.skillContent||(o.skillContent=$),o.skillArtifacts||(o.skillArtifacts=Te(w,o.cwd))),w&&!o.slashSkill&&(o.slashSkill=w),u("PostToolUse","Skill tool detected",`skillName=${w}`,`contentFound=${!!$}`);}let d=ct(K(i,W.TOOL_OUTPUT)),h=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(d.slice(0,500)),J=h?"ERROR":"DEFAULT",q=St(),Q=Math.round(Number(BigInt(a)-BigInt(S))/1e6),y={Agent:"AGENT",Task:"AGENT"}[n]??"TOOL",U=n==="Skill"&&w?w:Se(A,60);o.toolCalls.push({tool:n,brief:U,error:h,durationMs:Q});let Ot=o.spans;Ot.push({traceId:o.traceId,spanId:q,parentSpanId:o.spanId,name:n,kind:3,startTimeUnixNano:S,endTimeUnixNano:a,attributes:Tt(f(O.OBS_NAME,n),f(O.OBS_TYPE,y),f(O.OBS_LEVEL,J),f(O.OBS_INPUT,ct(T)),f(O.OBS_OUTPUT,d),f("tool.name",n),f("tool.error",String(h)),n==="Skill"&&w?f("skill.name",w):null,n==="Skill"?f("skill.invocation","slash-command"):null),status:{code:h?2:1}}),o.pendingTool=null,$t(e,o),h&&wt("TOOL_ERROR",{toolName:n}),u("PostToolUse",`sid=${e}`,`tool=${n}`,`error=${h}`,`durationMs=${Q}`,`totalSpans=${Ot.length}`),N(t);}var Wr=g(()=>{"use strict";re();se();En();Nt();ye();V();L();Sn();_e();});function Yr(t,e,n){let r=Object.keys(Vr).find(o=>(t??"").toLowerCase().includes(o));if(!r)return;let s=Vr[r],i=(e*s.input+n*s.output)/1e6;return Math.round(i*1e6)/1e6}var Vr,Gr=g(()=>{"use strict";Vr={"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 Jr(t){let e=t.session_id||"unknown",n=t.stop_reason||"end_turn",r=Ct(e);if(!r){N(t);return}r.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(r.slashSkill)&&(u("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${r.slashSkill}"`),r.slashSkill=null);let s=it(),i=await Zn(),o=r.toolCalls,a=r.spans;if(r.slashSkill&&!o.some(_=>_.tool==="Skill")){let _=St(),lt=r.skillContent?r.skillContent:JSON.stringify({skill:r.slashSkill});o.push({tool:"Skill",brief:r.slashSkill,error:false,durationMs:0,synthetic:true}),a.push({traceId:r.traceId,spanId:_,parentSpanId:r.spanId,name:"Skill",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:r.startNs,attributes:Tt(f(O.OBS_NAME,"Skill"),f(O.OBS_TYPE,"TOOL"),f(O.OBS_LEVEL,"DEFAULT"),f(O.OBS_INPUT,lt),f(O.OBS_OUTPUT,"loaded via slash command"),f("tool.name","Skill"),f("tool.error","false"),f("skill.name",r.slashSkill),f("skill.invocation","slash-command")),status:{code:1}}),u("Stop",`slashSkill=${r.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||r.transcriptPath||"",l=pn(c);if(c&&(o.some(_=>_.tool==="Skill"&&!_.synthetic)||!!r.slashSkill)&&!l?.text){await new Promise(lt=>setTimeout(lt,500));let _=pn(c);_?.text&&(l=_);}u("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${l?`text=${l.text.length}chars`:"null"}`);let A=o.length,T=o.filter(_=>_.error).length,w=ct(l?.text?K(l.text,W.TRACE_OUTPUT):A===0?"No tools used":o.map((_,lt)=>`${lt+1}. ${_.tool}${_.brief?` \u2192 ${_.brief}`:""}${_.error?" [ERROR]":""}`).join(`
218
+ `)),d=l?.inputTokens??0,h=l?.outputTokens??0,J=o.map((_,lt)=>`${lt+1}. ${_.tool}${_.brief?` \u2192 ${_.brief}`:""}${_.error?" [ERROR]":""} (${_.durationMs}ms)`),q=!!(r.slashSkill||o.some(_=>_.tool==="Skill")),Q=o.some(_=>_.tool==="Agent");if(!q&&!Q){u("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),wt("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),dn(e),N(t);return}let E=q?"skill":"agent",y=Math.round(Number(BigInt(s)-BigInt(r.startNs))/1e6),U=Yr(r.model,d,h),X=_r(r);X==="prerequisite_required"&&l?.text&&(X="complete"),X==="prerequisite_required"&&(a.push({traceId:r.traceId,spanId:St(),parentSpanId:r.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:s,attributes:Tt(f(O.OBS_NAME,"prerequisite-check"),f(O.OBS_TYPE,"EVENT"),f(O.OBS_LEVEL,"WARNING"),f(O.OBS_OUTPUT,w),f("skill.name",r.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),u("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${r.slashSkill}`));let Ot=(()=>{if(!(!q||!r.prompt)){if(r.slashSkill){let _=r.prompt.replace(new RegExp(`^\\/${r.slashSkill}\\s*`,"i"),"").trim();return _?K(ct(_),W.USER_INSTRUCTION):void 0}return K(ct(r.prompt),W.USER_INSTRUCTION)||void 0}})(),tt=JSON.stringify({trace_type:E,...X!==null&&{execution_status:X},...r.slashSkill?{skill_name:r.slashSkill}:{},...r.skillArtifacts?.length&&{skill_artifacts:r.skillArtifacts},...Ot!==void 0&&{user_instruction:Ot},latency_ms:y,...d&&{tokens_input:d},...h&&{tokens_output:h},cost_usd:U,...r.model?{model:r.model}:{},toolCount:A,errorCount:T,stopReason:n,sessionId:r.sessionId,tools:J.length?J:void 0}),$=ct(K(r.prompt,W.TRACE_INPUT)),Ae=Tt(f(O.TRACE_NAME,r.traceName),f(O.TRACE_INPUT,$),f(O.TRACE_OUTPUT,w),f(O.OBS_INPUT,$),f(O.OBS_OUTPUT,w),f(O.TRACE_METADATA,tt),f(O.SESSION_ID,r.sessionId),f(O.USER_ID,i.user),f(O.OBS_TYPE,"GENERATION"),f(O.MODEL,r.model),d?f(O.INPUT_TOKENS,d):null,h?f(O.OUTPUT_TOKENS,h):null,f("claude.stop_reason",n),f("claude.tool_count",String(A)),f("claude.error_count",String(T)),f("claude.session_id",r.sessionId),f("flow.trace_type",E),{key:O.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:E}]}}}),Zr={traceId:r.traceId,spanId:r.spanId,name:r.traceName,kind:1,startTimeUnixNano:r.startNs,endTimeUnixNano:s,attributes:Ae,status:{code:T>0?2:1}},Qr=Tt(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),wn=[...a,Zr];u("Stop",`sid=${e}`,`totalTools=${A}`,`errorTools=${T}`,`spans=${wn.length}`,`inputTokens=${d}`,`outputTokens=${h}`,`traceOutput="${Se(w,80)}"`);let ts=await Br(Lr(Qr,wn));u("Stop",`POST status=${ts}`,`traceId=${r.traceId}`),wt("TRACE_SENT",{latencyMs:y,totalTools:A,errorTools:T,inputTokens:d,outputTokens:h,costUsd:U}),dn(e),N(t);}var qr=g(()=>{"use strict";re();se();En();Y();Gr();fn();Nt();V();ye();Sn();L();_e();});var yt,Kr=g(()=>{"use strict";Y();Nt();Or();kr();Wr();qr();yt=class{static async userPromptSubmit(){let e=await ne(),n;try{n=await z();}catch{N(e);return}n.authError?await mn(e,!0):n.length>0?await mn(e):N(e);}static async preToolUse(){let e=await ne();await Ar(e);}static async postToolUse(){let e=await ne();await jr(e);}static async stop(){let e=await ne();await Jr(e);}};});var ti={};async function Qo(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await yt.userPromptSubmit();break;case "PreToolUse":await yt.preToolUse();break;case "PostToolUse":await yt.postToolUse();break;case "Stop":await yt.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
219
+ `),process.stdin.on("data",e=>process.stdout.write(e));}}var Xr=g(()=>{"use strict";Kr();Qo().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
220
+ `),process.exit(0);});});var ei=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,j]=process.argv;function _t(t,e){let n=t.indexOf(e);return n!==-1?t[n+1]:void 0}function zr(){let{bold:t,cyan:e,dim:n,green:r}=(ut(),C(Le)),{version:s}=Dt();process.stdout.write(`
221
221
  `+t(" flow-ai-obs")+n(" v"+s)+`
222
222
 
223
223
  `),process.stdout.write(e(" init")+n(` Configure environment: Claude Code + Proxy + OTEL + Trace hooks
@@ -235,16 +235,16 @@ ${n}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${M}`},{re:/(aws_secret_ac
235
235
 
236
236
  `)),process.stdout.write(n(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
237
237
 
238
- `));}if(H==="--version"||H==="-v")(async()=>{let{version:t}=Dt();process.stdout.write(t+`
239
- `);let e=(vt(),N(Lt)),n=await e.fetchLatestVersionAsync().catch(()=>null);if(n&&e.isNewer(t,n.version)){let{dim:r,yellow:s}=(ut(),N(ve));process.stdout.write(s(`
238
+ `));}if(j==="--version"||j==="-v")(async()=>{let{version:t}=Dt();process.stdout.write(t+`
239
+ `);let e=(vt(),C(Lt)),n=await e.fetchLatestVersionAsync().catch(()=>null);if(n&&e.isNewer(t,n.version)){let{dim:r,yellow:s}=(ut(),C(Le));process.stdout.write(s(`
240
240
  Update available: ${t} \u2192 ${n.version}
241
241
  `)+r(` Run: flow-ai-obs update
242
242
 
243
- `));}process.exit(0);})().catch(()=>process.exit(0));else if(H==="--help"||H==="-h")Zr(),process.exit(0);else if(H==="init"||H==="install")(async()=>{H==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
244
- `),await(vt(),N(Lt)).checkForUpdateInteractive();let{runInit:t}=(ar(),N(ir)),e=process.argv.slice(3);process.exit(await t({url:_t(e,"--custom-url"),noInteractive:e.includes("--no-interactive"),clientId:_t(e,"--client-id"),clientSecret:_t(e,"--client-secret"),tenant:_t(e,"--tenant")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
245
- `),process.exit(1);});else if(H==="login")(async()=>{await(vt(),N(Lt)).checkForUpdateInteractive();let{runLogin:t}=(Zt(),N(zt)),e=process.argv.slice(3),n=await t({clientId:_t(e,"--client-id"),clientSecret:_t(e,"--client-secret"),tenant:_t(e,"--tenant")});process.exit(typeof n=="number"?n:n.code);})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
246
- `),process.exit(1);});else if(H==="status")(async()=>{await(vt(),N(Lt)).checkForUpdateInteractive();let{runStatus:t}=(dr(),N(ur));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
247
- `),process.exit(1);});else if(H==="update")(async()=>{let t=(vt(),N(Lt)),{version:e}=Dt(),n=await t.fetchLatestVersionAsync();n||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
243
+ `));}process.exit(0);})().catch(()=>process.exit(0));else if(j==="--help"||j==="-h")zr(),process.exit(0);else if(j==="init"||j==="install")(async()=>{j==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
244
+ `),await(vt(),C(Lt)).checkForUpdateInteractive();let{runInit:t}=(ir(),C(or)),e=process.argv.slice(3);process.exit(await t({url:_t(e,"--custom-url"),noInteractive:e.includes("--no-interactive"),clientId:_t(e,"--client-id"),clientSecret:_t(e,"--client-secret"),tenant:_t(e,"--tenant")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
245
+ `),process.exit(1);});else if(j==="login")(async()=>{await(vt(),C(Lt)).checkForUpdateInteractive();let{runLogin:t}=(Zt(),C(zt)),e=process.argv.slice(3),n=await t({clientId:_t(e,"--client-id"),clientSecret:_t(e,"--client-secret"),tenant:_t(e,"--tenant")});process.exit(typeof n=="number"?n:n.code);})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
246
+ `),process.exit(1);});else if(j==="status")(async()=>{await(vt(),C(Lt)).checkForUpdateInteractive();let{runStatus:t}=(ur(),C(lr));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
247
+ `),process.exit(1);});else if(j==="update")(async()=>{let t=(vt(),C(Lt)),{version:e}=Dt(),n=await t.fetchLatestVersionAsync();n||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
248
248
  `),process.exit(1)),t.isNewer(e,n.version)||(process.stdout.write(` \u2713 Already up to date (v${e})
249
249
  `),process.exit(0)),await t.runUpdate(n.version),process.exit(0);})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
250
- `),process.exit(1);});else if(H==="otel-headers"){let{runOtelHeaders:t}=(fr(),N(pr));t().then(e=>process.exit(e)).catch(()=>process.exit(1));}else ni.has(H)?(zr(),N(ei)):(Zr(),process.exit(0));
250
+ `),process.exit(1);});else if(j==="otel-headers"){let{runOtelHeaders:t}=(pr(),C(dr));t().then(e=>process.exit(e)).catch(()=>process.exit(1));}else ei.has(j)?(Xr(),C(ti)):(zr(),process.exit(0));
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
- 'use strict';var child_process=require('child_process'),util=require('util'),I=require('fs'),x=require('path'),me=require('os'),Je=require('https'),Ke=require('http'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var I__default=/*#__PURE__*/_interopDefault(I);var x__default=/*#__PURE__*/_interopDefault(x);var me__default=/*#__PURE__*/_interopDefault(me);var Je__default=/*#__PURE__*/_interopDefault(Je);var Ke__default=/*#__PURE__*/_interopDefault(Ke);var Pe=Object.defineProperty;var st=(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 gt=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var St=(t,e)=>{for(var r in e)Pe(t,r,{get:e[r],enumerable:true});};var xt={};St(xt,{MacOsKeyVaultProvider:()=>At});var yt,At,Mt=gt(()=>{"use strict";yt=util.promisify(child_process.execFile),At=class{static async isAvailable(){try{return I.accessSync("/usr/bin/security",I.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await yt("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await yt("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await yt("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Ht={};St(Ht,{LinuxKeyVaultProvider:()=>Ot});var Vt,Ot,Wt=gt(()=>{"use strict";Vt=util.promisify(child_process.execFile),Ot=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 I.accessSync(r,I.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await Vt("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 Vt("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Yt={};St(Yt,{WindowsKeyVaultProvider:()=>wt});var wt,Gt=gt(()=>{"use strict";wt=class{static async isAvailable(){try{return await st("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return st("keytar").getPassword(e,r)}async setSecret(e,r,n){await st("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return st("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});var Ne="https://flow.ciandt.com";function B(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Ne}function G(){let t=B();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`}}G();var ot={SERVICE:"flow-plugins-cli",ACCOUNT_TOKEN:"token-cache"},it="FLOW-nodejs",at="config.json",_t={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",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var A={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},Dt="flow-ai-obs-debug.log",w={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4};function Tt(){let t=B();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Et={credentials:"credentials","token-cache":"tokenCache"};function J(){let t=me__default.default.homedir();if(process.platform==="darwin")return x__default.default.join(t,"Library","Preferences",it,at);if(process.platform==="win32"){let r=process.env.APPDATA??x__default.default.join(t,"AppData","Roaming");return x__default.default.join(r,it,at)}let e=process.env.XDG_CONFIG_HOME??x__default.default.join(t,".config");return x__default.default.join(e,it,at)}function ht(){try{let t=I__default.default.readFileSync(J(),"utf8");return JSON.parse(t)}catch{return {}}}function Bt(t){let e=J();I__default.default.mkdirSync(x__default.default.dirname(e),{recursive:true}),I__default.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var j=class{static isAvailable(){return true}static hasExistingData(){try{if(!I__default.default.existsSync(J()))return !1;let e=JSON.parse(I__default.default.readFileSync(J(),"utf8"));return !!(e&&e.credentials)}catch{return false}}async getSecret(e,r){let n=ht(),o=Et[r]??r,s=n[o];return s?typeof s=="string"?s:JSON.stringify(s):null}async setSecret(e,r,n){let o=ht(),s=Et[r]??r;if(r==="token-cache")try{o[s]=JSON.parse(n);}catch{o[s]=n;}else o[s]=n;Bt(o);}async deleteSecret(e,r){let n=ht(),o=Et[r]??r;return o in n?(delete n[o],Bt(n),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${J()}`}};async function Jt(){return process.env[S.FLOW_OBS_USE_JSON_VAULT]==="1"?new j:await Ve()??new j}async function Ve(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Mt(),xt));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Wt(),Ht));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Gt(),Yt));return await t.isAvailable()?new t:null}default:return null}}var Kt=ot.SERVICE,jt=ot.ACCOUNT_TOKEN,kt=null;function qt(){return kt||(kt=Jt()),kt}async function Lt(t){await(await qt()).setSecret(Kt,jt,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function It(){let e=await(await qt()).getSecret(Kt,jt);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 Rt(){let t=await It();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 Ge=x.join(me.tmpdir(),Dt);function a(...t){if(process.env[S.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
2
- `;try{I.writeFileSync(Ge,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";}},je=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;function qe(t){if(!je.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var zt={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 ze(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}`:"")),zt[n.error]))return new b(zt[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{qe(t.tenant);}catch(p){return r(p)}let n=JSON.stringify({clientSecret:t.clientSecret}),o=new URL(G().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?Je__default.default:Ke__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(ze(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();if(!m.access_token)return r(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));e({accessToken:m.access_token,expiresAt:g});});});c.on("error",p=>r(new Error(`Network error: ${p.message}`))),c.write(n),c.end();})}var Xe=[/^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 Ze(t){return Xe.some(e=>e.test(t))}function Qe(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 lt(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 ct(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&&Ze(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Xt(){let t=lt(process.env[S.ANTHROPIC_AUTH_TOKEN]);return t?{user:await Rt().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function tr(){return new Date().toISOString().slice(0,10)}async function er(t){let e=tr(),r=await It();if(r?.lastAuthCheckAt!==e){a("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let s=await q(t);try{await Lt({...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 Lt({...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 rr(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function nr(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 v(){let t=[],e=process.env[S.ANTHROPIC_MODEL]??"",r=lt(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;r&&(m=await Rt().catch(()=>null)??r.clientId);let E={user:m??"",tenant:g??"",team:"",project:"",model:e};t.push({mode:"direct",...nr(ct(s),i,l),...E}),a("resolveCredentials","direct mode active",`user=${E.user}`,`tenant=${E.tenant}`);}if(!r){if(t.length===0){let m=[];return m.authError=false,m}return t}let c;try{c=await er(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:Qe(c)??r.clientId,tenant:n,team:"",project:"",model:e},T=process.env[S.FLOW_TELEMETRY_GATEWAY]??B();return t.push({mode:"gateway",...rr(ct(T),{accessToken:c}),..._}),t}async function ut(){return (await v()).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 pt(t,e=100){return String(t??"").split(`
4
- `)[0].slice(0,e).trim()}function z(){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 Pt=()=>crypto.randomBytes(16).toString("hex"),U=()=>crypto.randomBytes(8).toString("hex");function L(){return String(BigInt(Date.now())*1000000n)}var dr=/^[0-9a-f-]{1,64}$/i,fr=x.normalize(me.tmpdir())+x.sep;function mr(t,e){let r=x.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function Nt(t){if(!dr.test(t))throw new Error(`Invalid session ID: ${t}`);return mr(x.join(me.tmpdir(),`flow-obs-${t}.json`),fr)}function M(t){let e=Nt(t);if(!I.existsSync(e))return null;try{return JSON.parse(I.readFileSync(e,"utf8"))}catch{return null}}function V(t,e){I.writeFileSync(Nt(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function bt(t){try{I.unlinkSync(Nt(t));}catch{}}function re(t){if(!t||!I.existsSync(t))return null;try{let e=I.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 vt(t){if(!t||!I.existsSync(t))return null;try{let e=I.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(`
1
+ 'use strict';var child_process=require('child_process'),util=require('util'),I=require('fs'),x=require('path'),fe=require('os'),Ge=require('https'),Je=require('http'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var I__default=/*#__PURE__*/_interopDefault(I);var x__default=/*#__PURE__*/_interopDefault(x);var fe__default=/*#__PURE__*/_interopDefault(fe);var Ge__default=/*#__PURE__*/_interopDefault(Ge);var Je__default=/*#__PURE__*/_interopDefault(Je);var Re=Object.defineProperty;var st=(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 mt=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var gt=(t,e)=>{for(var r in e)Re(t,r,{get:e[r],enumerable:true});};var xt={};gt(xt,{MacOsKeyVaultProvider:()=>yt});var ht,yt,Bt=mt(()=>{"use strict";ht=util.promisify(child_process.execFile),yt=class{static async isAvailable(){try{return I.accessSync("/usr/bin/security",I.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await ht("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await ht("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await ht("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Vt={};gt(Vt,{LinuxKeyVaultProvider:()=>At});var Mt,At,Ht=mt(()=>{"use strict";Mt=util.promisify(child_process.execFile),At=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 I.accessSync(r,I.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await Mt("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 Mt("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Wt={};gt(Wt,{WindowsKeyVaultProvider:()=>Ot});var Ot,Yt=mt(()=>{"use strict";Ot=class{static async isAvailable(){try{return await st("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return st("keytar").getPassword(e,r)}async setSecret(e,r,n){await st("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return st("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});var Pe="https://flow.ciandt.com";function D(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Pe}function G(){let t=D();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`}}G();var ot={SERVICE:"flow-plugins-cli",ACCOUNT_TOKEN:"token-cache"},it="FLOW-nodejs",at="config.json",_t={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};var _={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",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};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},Ft="flow-ai-obs-debug.log",k={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4};function St(){let t=D();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Tt={credentials:"credentials","token-cache":"tokenCache"};function J(){let t=fe__default.default.homedir();if(process.platform==="darwin")return x__default.default.join(t,"Library","Preferences",it,at);if(process.platform==="win32"){let r=process.env.APPDATA??x__default.default.join(t,"AppData","Roaming");return x__default.default.join(r,it,at)}let e=process.env.XDG_CONFIG_HOME??x__default.default.join(t,".config");return x__default.default.join(e,it,at)}function Et(){try{let t=I__default.default.readFileSync(J(),"utf8");return JSON.parse(t)}catch{return {}}}function Dt(t){let e=J();I__default.default.mkdirSync(x__default.default.dirname(e),{recursive:true}),I__default.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var j=class{static isAvailable(){return true}static hasExistingData(){try{if(!I__default.default.existsSync(J()))return !1;let e=JSON.parse(I__default.default.readFileSync(J(),"utf8"));return !!(e&&e.credentials)}catch{return false}}async getSecret(e,r){let n=Et(),o=Tt[r]??r,s=n[o];return s?typeof s=="string"?s:JSON.stringify(s):null}async setSecret(e,r,n){let o=Et(),s=Tt[r]??r;if(r==="token-cache")try{o[s]=JSON.parse(n);}catch{o[s]=n;}else o[s]=n;Dt(o);}async deleteSecret(e,r){let n=Et(),o=Tt[r]??r;return o in n?(delete n[o],Dt(n),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${J()}`}};async function Gt(){return process.env[_.FLOW_OBS_USE_JSON_VAULT]==="1"?new j:await Me()??new j}async function Me(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Bt(),xt));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Ht(),Vt));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Yt(),Wt));return await t.isAvailable()?new t:null}default:return null}}var Jt=ot.SERVICE,Kt=ot.ACCOUNT_TOKEN,kt=null;function jt(){return kt||(kt=Gt()),kt}async function wt(t){await(await jt()).setSecret(Jt,Kt,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function Lt(){let e=await(await jt()).getSecret(Jt,Kt);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 It(){let t=await Lt();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 Ye=x.join(fe.tmpdir(),Ft);function a(...t){if(process.env[_.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
2
+ `;try{I.writeFileSync(Ye,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";}},Ke=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;function je(t){if(!Ke.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var qt={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 qe(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}`:"")),qt[n.error]))return new b(qt[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{je(t.tenant);}catch(p){return r(p)}let n=JSON.stringify({clientSecret:t.clientSecret}),o=new URL(G().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?Ge__default.default:Je__default.default).request(i,p=>{let S=[];p.on("data",T=>S.push(T)),p.on("end",()=>{let T=S.join("");if((p.statusCode??0)>=400)return r(qe(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();if(!m.access_token)return r(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));e({accessToken:m.access_token,expiresAt:g});});});c.on("error",p=>r(new Error(`Network error: ${p.message}`))),c.write(n),c.end();})}var ze=[/^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 Xe(t){return ze.some(e=>e.test(t))}function Ze(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 lt(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 ct(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[_.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&&Xe(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function zt(){let t=lt(process.env[_.ANTHROPIC_AUTH_TOKEN]);return t?{user:await It().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function Qe(){return new Date().toISOString().slice(0,10)}async function tr(t){let e=Qe(),r=await Lt();if(r?.lastAuthCheckAt!==e){a("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let s=await q(t);try{await wt({...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 wt({...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 er(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function rr(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 B(){let t=[],e=process.env[_.ANTHROPIC_MODEL]??"",r=lt(process.env[_.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[_.FLOW_TELEMETRY]==="true",s=process.env[_.LANGFUSE_BASE_URL],i=process.env[_.LANGFUSE_PUBLIC_KEY],l=process.env[_.LANGFUSE_SECRET_KEY];if(o&&s&&i&&l){let m="",g=n;r&&(m=await It().catch(()=>null)??r.clientId);let E={user:m??"",tenant:g??"",team:"",project:"",model:e};t.push({mode:"direct",...rr(ct(s),i,l),...E}),a("resolveCredentials","direct mode active",`user=${E.user}`,`tenant=${E.tenant}`);}if(!r){if(t.length===0){let m=[];return m.authError=false,m}return t}let c;try{c=await tr(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 S={user:Ze(c)??r.clientId,tenant:n,team:"",project:"",model:e},T=process.env[_.FLOW_TELEMETRY_GATEWAY]??D();return t.push({mode:"gateway",...er(ct(T),{accessToken:c}),...S}),t}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 ut(t,e=100){return String(t??"").split(`
4
+ `)[0].slice(0,e).trim()}function z(){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 y(t){process.stdout.write(JSON.stringify(t));}var Rt=()=>crypto.randomBytes(16).toString("hex"),U=()=>crypto.randomBytes(8).toString("hex");function L(){return String(BigInt(Date.now())*1000000n)}var pr=/^[0-9a-f-]{1,64}$/i,dr=x.normalize(fe.tmpdir())+x.sep;function fr(t,e){let r=x.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function Pt(t){if(!pr.test(t))throw new Error(`Invalid session ID: ${t}`);return fr(x.join(fe.tmpdir(),`flow-obs-${t}.json`),dr)}function M(t){let e;try{e=Pt(t);}catch{return null}if(!I.existsSync(e))return null;try{return JSON.parse(I.readFileSync(e,"utf8"))}catch{return null}}function V(t,e){I.writeFileSync(Pt(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function Nt(t){try{I.unlinkSync(Pt(t));}catch{}}function ee(t){if(!t||!I.existsSync(t))return null;try{let e=I.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 bt(t){if(!t||!I.existsSync(t))return null;try{let e=I.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(S=>S.type==="text").map(S=>S.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:o}}catch{}return null}var Tr=new Set([".venv","__pycache__",".git","node_modules"]),Er=new Set([".pyc",".pyo"]),hr=new Set(["SKILL.md",".DS_Store",".gitignore"]);function oe(t){return t.replace(":","/")}function dt(t,e){if(!t)return null;let r=oe(t),n=[x.join(me.homedir(),".claude","skills",r,"SKILL.md"),x.join(e??"",".claude","skills",r,"SKILL.md")];for(let o of n)if(I.existsSync(o))try{return I.readFileSync(o,"utf8")}catch{}return null}function ie(t){return t.split(`
9
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}var yr=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);function ae(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||yr.has(n.tool))?"complete":"prerequisite_required":null}function ft(t,e){if(!t)return null;let r=oe(t),n=[x.join(me.homedir(),".claude","skills",r),x.join(e??"",".claude","skills",r)],o=null;for(let l of n)if(I.existsSync(x.join(l,"SKILL.md"))){o=l;break}if(!o)return null;let s=[];function i(l,c){for(let p of I.readdirSync(l,{withFileTypes:true})){if(Tr.has(p.name)||hr.has(p.name)||Er.has(x.extname(p.name)))continue;let _=c?`${c}/${p.name}`:p.name;p.isDirectory()?i(x.join(l,p.name),_):s.push(_);}}return i(o,""),s.length>0?s:null}function wr(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function kr(t,e,r,n){return new Promise(o=>{let s=new URL(t),i=s.protocol==="https:",l=(i?Je__default.default:Ke__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 C(t,e={}){try{let r=lt(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=wr(s);if(!i)return;let l=i.tenant||r.tenant,c=JSON.stringify({action:t,booster:Tt().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=ct(Tt().API_URL),_=await kr(p,c,s,l);a("metrics.logEvent",`action=${t} status=${_}`);}catch(r){a("metrics.logEvent",`silenced error: ${r.message}`);}}var Lr=`\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 ${B()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;async function Ut(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Lr})+`
10
- `);return}let n=!!(await v()).authError,o=t.session_id||"unknown",s=t.prompt||"",i=t.cwd||"",l=re(t.transcript_path)||Pt(),c=ie(s),p=c?dt(c,i):null,_=c?ft(c,i):null;V(o,{traceId:Pt(),spanId:U(),startNs:L(),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:_}),C("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),a("UserPromptSubmit",`sid=${o}`,`traceName=${l}`,`slashSkill=${c}`),O(t);}async function ce(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:L()},V(e,o)),a("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!o}`),O(t);}var Ir={name:_t.SCOPE_NAME,version:_t.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 $(...t){return t.filter(e=>e!==null)}function le(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Ir,spans:Array.isArray(e)?e:[e]}]}]}}var ue=x.join(me.tmpdir(),"flow-obs-requests.ndjson");function pe(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{I.writeFileSync(ue,s+`
11
- `,{flag:"a",encoding:"utf8",mode:384}),a("sendTraces:dump",`request appendada em ${ue}`);}catch(i){a("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Ur(t){let e=new URL(t),r=new URL(G().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function de(t,e){return new Promise((r,n)=>{let o=t._isSSL?Je__default.default:Ke__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 fe(t,e){let r;try{r=Ur(t);}catch{return false}let n=r.protocol==="https:";try{let o={};e&&(o.Authorization=String(e).replace(/[\r\n]/g,""));let s=await de({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 mt(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 de({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}`),pe(e,l,n,c.statusCode,c.body),c.statusCode}catch(c){return a("sendTraces:error",c.message),pe(e,l,n,0,c.message),0}}function Cr(){let t=parseInt(process.env[S.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(A.MIN_TTL_DAYS,Math.min(A.MAX_TTL_DAYS,t)):A.DEFAULT_TTL_DAYS)*24*60*60*1e3}function $r(){let t=parseInt(process.env[S.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(A.MIN_MAX_FILES,Math.min(A.MAX_MAX_FILES,t)):A.DEFAULT_MAX_FILES}function ge(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return x__default.default.join(me__default.default.tmpdir(),`${A.FILE_PREFIX}${t}.json`)}function $t(){let t=me__default.default.tmpdir(),e;try{e=I__default.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(A.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=x__default.default.join(t,r),o=0;try{o=I__default.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:o}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function X(t){try{let e=$r(),r=$t();if(r.length>=e){let s=r.slice(0,r.length-e+1);for(let i of s)try{I__default.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,o={fileId:n,bufferedAt:Date.now(),payload:t};return I__default.default.writeFileSync(ge(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 Se(t){let e=$t(),r=t,n=[];for(let o of e){if(n.length>=r)break;try{let s=I__default.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 _e(t){try{I__default.default.unlinkSync(ge(t)),a("buffer",`deleted fileId=${t}`);}catch{}}function Te(){let t=Date.now()-Cr();for(let e of $t())try{let{mtimeMs:r}=I__default.default.statSync(e);r<t&&(I__default.default.unlinkSync(e),a("buffer",`evicted stale: ${x__default.default.basename(e)}`));}catch{}}async function Fr(t){Te();let e=Se(A.REPLAY_BATCH_SIZE);e.length&&(a("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await mt(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(_e(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 Ee(t){let e=await v();if(!e.length)return e.authError&&(a("postToLangfuse","auth refresh failed \u2014 buffering trace"),X(t)),0;let r=await Promise.all(e.map(async s=>{if(s.mode!=="gateway")return {creds:s,healthy:true};let i=await fe(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 Fr(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"),X(t),0;let c=await mt(t,s.endpoint,s.authHeader);return (c===0||c>=500)&&(a("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),X(t)),c}let l=await mt(t,s.endpoint,s.authHeader);return (l===0||l>=500)&&(a("postToLangfuse",`direct endpoint unavailable (status ${l}) \u2014 buffering trace`),X(t)),l}))).find(s=>s!==0)??0}var y="[REDACTED]",Dr="[REDACTED-EMAIL]",Br="[REDACTED-CPF]",xr="[REDACTED-CNPJ]",he="[REDACTED-PHONE]",Mr=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${y}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${y}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${y}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${y}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
12
- ${y}
13
- ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${y}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${y}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${y}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${y}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${y}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${y}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${y}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>Dr},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Br},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>xr},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>he},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>he}];function R(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Mr.reduce((r,{re:n,replace:o})=>r.replace(n,o),e)}async function ye(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=L(),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 nt=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);g=nt?String(nt).trim():null;let P=g?dt(g,i.cwd):null;P&&(m=P,i.skillContent||(i.skillContent=P),i.skillArtifacts||(i.skillArtifacts=ft(g,i.cwd))),g&&!i.slashSkill&&(i.slashSkill=g),a("PostToolUse","Skill tool detected",`skillName=${g}`,`contentFound=${!!P}`);}let E=R(k(s,w.TOOL_OUTPUT)),h=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(E.slice(0,500)),Z=h?"ERROR":"DEFAULT",W=U(),Q=Math.round(Number(BigInt(l)-BigInt(_))/1e6),et={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",rt=r==="Skill"&&g?g:pt(T,60);i.toolCalls.push({tool:r,brief:rt,error:h,durationMs:Q});let Y=i.spans;Y.push({traceId:i.traceId,spanId:W,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:_,endTimeUnixNano:l,attributes:$(u(f.OBS_NAME,r),u(f.OBS_TYPE,et),u(f.OBS_LEVEL,Z),u(f.OBS_INPUT,R(m)),u(f.OBS_OUTPUT,E),u("tool.name",r),u("tool.error",String(h)),r==="Skill"&&g?u("skill.name",g):null,r==="Skill"?u("skill.invocation","slash-command"):null),status:{code:h?2:1}}),i.pendingTool=null,V(e,i),h&&C("TOOL_ERROR",{toolName:r}),a("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${h}`,`durationMs=${Q}`,`totalSpans=${Y.length}`),O(t);}var Ae={"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 Oe(t,e,r){let n=Object.keys(Ae).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let o=Ae[n],s=(e*o.input+r*o.output)/1e6;return Math.round(s*1e6)/1e6}async function we(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=L(),s=await Xt(),i=n.toolCalls,l=n.spans;if(n.slashSkill&&!i.some(d=>d.tool==="Skill")){let d=U(),N=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:$(u(f.OBS_NAME,"Skill"),u(f.OBS_TYPE,"TOOL"),u(f.OBS_LEVEL,"DEFAULT"),u(f.OBS_INPUT,N),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=vt(c);if(c&&(i.some(d=>d.tool==="Skill"&&!d.synthetic)||!!n.slashSkill)&&!p?.text){await new Promise(N=>setTimeout(N,500));let d=vt(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,N)=>`${N+1}. ${d.tool}${d.brief?` \u2192 ${d.brief}`:""}${d.error?" [ERROR]":""}`).join(`
14
- `)),E=p?.inputTokens??0,h=p?.outputTokens??0,Z=i.map((d,N)=>`${N+1}. ${d.tool}${d.brief?` \u2192 ${d.brief}`:""}${d.error?" [ERROR]":""} (${d.durationMs}ms)`),W=!!(n.slashSkill||i.some(d=>d.tool==="Skill")),Q=i.some(d=>d.tool==="Agent");if(!W&&!Q){a("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),C("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),bt(e),O(t);return}let tt=W?"skill":"agent",et=Math.round(Number(BigInt(o)-BigInt(n.startNs))/1e6),rt=Oe(n.model,E,h),D=ae(n);D==="prerequisite_required"&&p?.text&&(D="complete"),D==="prerequisite_required"&&(l.push({traceId:n.traceId,spanId:U(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:o,attributes:$(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 Y=(()=>{if(!(!W||!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}})(),nt=JSON.stringify({trace_type:tt,...D!==null&&{execution_status:D},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Y!==void 0&&{user_instruction:Y},latency_ms:et,...E&&{tokens_input:E},...h&&{tokens_output:h},cost_usd:rt,...n.model?{model:n.model}:{},toolCount:T,errorCount:m,stopReason:r,sessionId:n.sessionId,tools:Z.length?Z:void 0}),P=R(k(n.prompt,w.TRACE_INPUT)),ke=$(u(f.TRACE_NAME,n.traceName),u(f.TRACE_INPUT,P),u(f.TRACE_OUTPUT,g),u(f.OBS_INPUT,P),u(f.OBS_OUTPUT,g),u(f.TRACE_METADATA,nt),u(f.SESSION_ID,n.sessionId),u(f.USER_ID,s.user),u(f.OBS_TYPE,"GENERATION"),u(f.MODEL,n.model),E?u(f.INPUT_TOKENS,E):null,h?u(f.OUTPUT_TOKENS,h):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",tt),{key:f.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:tt}]}}}),Le={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:o,attributes:ke,status:{code:m>0?2:1}},Ie=$(u("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),u("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Ft=[...l,Le];a("Stop",`sid=${e}`,`totalTools=${T}`,`errorTools=${m}`,`spans=${Ft.length}`,`inputTokens=${E}`,`outputTokens=${h}`,`traceOutput="${pt(g,80)}"`);let Re=await Ee(le(Ie,Ft));a("Stop",`POST status=${Re}`,`traceId=${n.traceId}`),C("TRACE_SENT",{latencyMs:et,totalTools:T,errorTools:m,inputTokens:E,outputTokens:h,costUsd:rt}),bt(e),O(t);}var F=class t{static passthroughStdin(){let e=[];process.stdin.on("data",r=>e.push(r)),process.stdin.on("end",()=>process.stdout.write(Buffer.concat(e)));}static async userPromptSubmit(){let e=await z(),r;try{r=await v();}catch{process.stdout.write(JSON.stringify(e));return}r.authError?await Ut(e,true):r.length>0?await Ut(e):process.stdout.write(JSON.stringify(e));}static async preToolUse(){if(!await ut()){t.passthroughStdin();return}let e=await z();await ce(e);}static async postToolUse(){if(!await ut()){t.passthroughStdin();return}let e=await z();await ye(e);}static async stop(){if(!await ut()){t.passthroughStdin();return}let e=await z();await we(e);}};async function Vr(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await F.userPromptSubmit();break;case "PreToolUse":await F.preToolUse();break;case "PostToolUse":await F.postToolUse();break;case "Stop":await F.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
15
- `),process.stdin.on("data",e=>process.stdout.write(e));}}Vr().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
8
+ `),inputTokens:n,outputTokens:o}}catch{}return null}var Sr=new Set([".venv","__pycache__",".git","node_modules"]),Tr=new Set([".pyc",".pyo"]),Er=new Set(["SKILL.md",".DS_Store",".gitignore"]);function se(t){return t.replace(":","/")}function pt(t,e){if(!t)return null;let r=se(t),n=[x.join(fe.homedir(),".claude","skills",r,"SKILL.md"),x.join(e??"",".claude","skills",r,"SKILL.md")];for(let o of n)if(I.existsSync(o))try{return I.readFileSync(o,"utf8")}catch{}return null}function oe(t){return t.split(`
9
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}var hr=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);function ie(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||hr.has(n.tool))?"complete":"prerequisite_required":null}function dt(t,e){if(!t)return null;let r=se(t),n=[x.join(fe.homedir(),".claude","skills",r),x.join(e??"",".claude","skills",r)],o=null;for(let l of n)if(I.existsSync(x.join(l,"SKILL.md"))){o=l;break}if(!o)return null;let s=[];function i(l,c){for(let p of I.readdirSync(l,{withFileTypes:true})){if(Sr.has(p.name)||Er.has(p.name)||Tr.has(x.extname(p.name)))continue;let S=c?`${c}/${p.name}`:p.name;p.isDirectory()?i(x.join(l,p.name),S):s.push(S);}}return i(o,""),s.length>0?s:null}function Or(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function kr(t,e,r,n){return new Promise(o=>{let s=new URL(t),i=s.protocol==="https:",l=(i?Ge__default.default:Je__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=lt(process.env[_.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=Or(s);if(!i)return;let l=i.tenant||r.tenant,c=JSON.stringify({action:t,booster:St().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=ct(St().API_URL),S=await kr(p,c,s,l);a("metrics.logEvent",`action=${t} status=${S}`);}catch(r){a("metrics.logEvent",`silenced error: ${r.message}`);}}var wr=`\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 ${D()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;async function Ut(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:wr})+`
10
+ `);return}let n=!!(await B()).authError,o=t.session_id||"unknown",s=t.prompt||"",i=t.cwd||"",l=ee(t.transcript_path)||Rt(),c=oe(s),p=c?pt(c,i):null,S=c?dt(c,i):null;V(o,{traceId:Rt(),spanId:U(),startNs:L(),sessionId:o,prompt:s,cwd:i,traceName:l,transcriptPath:t.transcript_path||"",model:process.env[_.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:p,skillArtifacts:S}),v("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),a("UserPromptSubmit",`sid=${o}`,`traceName=${l}`,`slashSkill=${c}`),y(t);}async function ae(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:w(n,k.TOOL_INPUT),startNs:L()},V(e,o)),a("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!o}`),y(t);}var Lr={name:_t.SCOPE_NAME,version:_t.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 C(...t){return t.filter(e=>e!==null)}function ce(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Lr,spans:Array.isArray(e)?e:[e]}]}]}}var le=x.join(fe.tmpdir(),"flow-obs-requests.ndjson");function ue(t,e,r,n,o){if(process.env[_.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{I.writeFileSync(le,s+`
11
+ `,{flag:"a",encoding:"utf8",mode:384}),a("sendTraces:dump",`request appendada em ${le}`);}catch(i){a("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Ur(t){let e=new URL(t),r=new URL(G().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function pe(t,e){return new Promise((r,n)=>{let o=t._isSSL?Ge__default.default:Je__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 de(t,e){let r;try{r=Ur(t);}catch{return false}let n=r.protocol==="https:";try{let o={};e&&(o.Authorization=String(e).replace(/[\r\n]/g,""));let s=await pe({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 ft(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 pe({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}`),ue(e,l,n,c.statusCode,c.body),c.statusCode}catch(c){return a("sendTraces:error",c.message),ue(e,l,n,0,c.message),0}}function vr(){let t=parseInt(process.env[_.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 Cr(){let t=parseInt(process.env[_.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 me(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return x__default.default.join(fe__default.default.tmpdir(),`${O.FILE_PREFIX}${t}.json`)}function Ct(){let t=fe__default.default.tmpdir(),e;try{e=I__default.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(O.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=x__default.default.join(t,r),o=0;try{o=I__default.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:o}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function X(t){try{let e=Cr(),r=Ct();if(r.length>=e){let s=r.slice(0,r.length-e+1);for(let i of s)try{I__default.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,o={fileId:n,bufferedAt:Date.now(),payload:t};return I__default.default.writeFileSync(me(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 ge(t){let e=Ct(),r=t,n=[];for(let o of e){if(n.length>=r)break;try{let s=I__default.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 _e(t){try{I__default.default.unlinkSync(me(t)),a("buffer",`deleted fileId=${t}`);}catch{}}function Se(){let t=Date.now()-vr();for(let e of Ct())try{let{mtimeMs:r}=I__default.default.statSync(e);r<t&&(I__default.default.unlinkSync(e),a("buffer",`evicted stale: ${x__default.default.basename(e)}`));}catch{}}async function $r(t){Se();let e=ge(O.REPLAY_BATCH_SIZE);e.length&&(a("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await ft(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(_e(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 Te(t){let e=await B();if(!e.length)return e.authError&&(a("postToLangfuse","auth refresh failed \u2014 buffering trace"),X(t)),0;let r=await Promise.all(e.map(async s=>{if(s.mode!=="gateway")return {creds:s,healthy:true};let i=await de(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 $r(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"),X(t),0;let c=await ft(t,s.endpoint,s.authHeader);return (c===0||c>=500)&&(a("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),X(t)),c}let l=await ft(t,s.endpoint,s.authHeader);return (l===0||l>=500)&&(a("postToLangfuse",`direct endpoint unavailable (status ${l}) \u2014 buffering trace`),X(t)),l}))).find(s=>s!==0)??0}var A="[REDACTED]",Fr="[REDACTED-EMAIL]",Dr="[REDACTED-CPF]",xr="[REDACTED-CNPJ]",Ee="[REDACTED-PHONE]",Br=[{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:()=>Fr},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Dr},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>xr},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Ee},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Ee}];function R(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Br.reduce((r,{re:n,replace:o})=>r.replace(n,o),e)}async function he(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){y(t);return}let l=L(),c=i.pendingTool,p=c?.name===r,S=p?c.startNs:String(BigInt(l)-200000000n),T=p?c.inputStr:w(n,k.TOOL_INPUT),m=T,g=null;if(r==="Skill"){let nt=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);g=nt?String(nt).trim():null;let P=g?pt(g,i.cwd):null;P&&(m=P,i.skillContent||(i.skillContent=P),i.skillArtifacts||(i.skillArtifacts=dt(g,i.cwd))),g&&!i.slashSkill&&(i.slashSkill=g),a("PostToolUse","Skill tool detected",`skillName=${g}`,`contentFound=${!!P}`);}let E=R(w(s,k.TOOL_OUTPUT)),h=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(E.slice(0,500)),Z=h?"ERROR":"DEFAULT",W=U(),Q=Math.round(Number(BigInt(l)-BigInt(S))/1e6),et={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",rt=r==="Skill"&&g?g:ut(T,60);i.toolCalls.push({tool:r,brief:rt,error:h,durationMs:Q});let Y=i.spans;Y.push({traceId:i.traceId,spanId:W,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:S,endTimeUnixNano:l,attributes:C(u(f.OBS_NAME,r),u(f.OBS_TYPE,et),u(f.OBS_LEVEL,Z),u(f.OBS_INPUT,R(m)),u(f.OBS_OUTPUT,E),u("tool.name",r),u("tool.error",String(h)),r==="Skill"&&g?u("skill.name",g):null,r==="Skill"?u("skill.invocation","slash-command"):null),status:{code:h?2:1}}),i.pendingTool=null,V(e,i),h&&v("TOOL_ERROR",{toolName:r}),a("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${h}`,`durationMs=${Q}`,`totalSpans=${Y.length}`),y(t);}var ye={"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 Ae(t,e,r){let n=Object.keys(ye).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let o=ye[n],s=(e*o.input+r*o.output)/1e6;return Math.round(s*1e6)/1e6}async function Oe(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=M(e);if(!n){y(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=L(),s=await zt(),i=n.toolCalls,l=n.spans;if(n.slashSkill&&!i.some(d=>d.tool==="Skill")){let d=U(),N=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:C(u(f.OBS_NAME,"Skill"),u(f.OBS_TYPE,"TOOL"),u(f.OBS_LEVEL,"DEFAULT"),u(f.OBS_INPUT,N),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=bt(c);if(c&&(i.some(d=>d.tool==="Skill"&&!d.synthetic)||!!n.slashSkill)&&!p?.text){await new Promise(N=>setTimeout(N,500));let d=bt(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?w(p.text,k.TRACE_OUTPUT):T===0?"No tools used":i.map((d,N)=>`${N+1}. ${d.tool}${d.brief?` \u2192 ${d.brief}`:""}${d.error?" [ERROR]":""}`).join(`
14
+ `)),E=p?.inputTokens??0,h=p?.outputTokens??0,Z=i.map((d,N)=>`${N+1}. ${d.tool}${d.brief?` \u2192 ${d.brief}`:""}${d.error?" [ERROR]":""} (${d.durationMs}ms)`),W=!!(n.slashSkill||i.some(d=>d.tool==="Skill")),Q=i.some(d=>d.tool==="Agent");if(!W&&!Q){a("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),v("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),Nt(e),y(t);return}let tt=W?"skill":"agent",et=Math.round(Number(BigInt(o)-BigInt(n.startNs))/1e6),rt=Ae(n.model,E,h),F=ie(n);F==="prerequisite_required"&&p?.text&&(F="complete"),F==="prerequisite_required"&&(l.push({traceId:n.traceId,spanId:U(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:o,attributes:C(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 Y=(()=>{if(!(!W||!n.prompt)){if(n.slashSkill){let d=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return d?w(R(d),k.USER_INSTRUCTION):void 0}return w(R(n.prompt),k.USER_INSTRUCTION)||void 0}})(),nt=JSON.stringify({trace_type:tt,...F!==null&&{execution_status:F},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Y!==void 0&&{user_instruction:Y},latency_ms:et,...E&&{tokens_input:E},...h&&{tokens_output:h},cost_usd:rt,...n.model?{model:n.model}:{},toolCount:T,errorCount:m,stopReason:r,sessionId:n.sessionId,tools:Z.length?Z:void 0}),P=R(w(n.prompt,k.TRACE_INPUT)),ke=C(u(f.TRACE_NAME,n.traceName),u(f.TRACE_INPUT,P),u(f.TRACE_OUTPUT,g),u(f.OBS_INPUT,P),u(f.OBS_OUTPUT,g),u(f.TRACE_METADATA,nt),u(f.SESSION_ID,n.sessionId),u(f.USER_ID,s.user),u(f.OBS_TYPE,"GENERATION"),u(f.MODEL,n.model),E?u(f.INPUT_TOKENS,E):null,h?u(f.OUTPUT_TOKENS,h):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",tt),{key:f.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:tt}]}}}),we={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:o,attributes:ke,status:{code:m>0?2:1}},Le=C(u("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),u("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),$t=[...l,we];a("Stop",`sid=${e}`,`totalTools=${T}`,`errorTools=${m}`,`spans=${$t.length}`,`inputTokens=${E}`,`outputTokens=${h}`,`traceOutput="${ut(g,80)}"`);let Ie=await Te(ce(Le,$t));a("Stop",`POST status=${Ie}`,`traceId=${n.traceId}`),v("TRACE_SENT",{latencyMs:et,totalTools:T,errorTools:m,inputTokens:E,outputTokens:h,costUsd:rt}),Nt(e),y(t);}var $=class{static async userPromptSubmit(){let e=await z(),r;try{r=await B();}catch{y(e);return}r.authError?await Ut(e,true):r.length>0?await Ut(e):y(e);}static async preToolUse(){let e=await z();await ae(e);}static async postToolUse(){let e=await z();await he(e);}static async stop(){let e=await z();await Oe(e);}};async function Mr(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await $.userPromptSubmit();break;case "PreToolUse":await $.preToolUse();break;case "PostToolUse":await $.postToolUse();break;case "Stop":await $.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
15
+ `),process.stdin.on("data",e=>process.stdout.write(e));}}Mr().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
16
16
  `),process.exit(0);});
package/dist/setup.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),f=require('path'),p=require('os'),ft=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 p__namespace=/*#__PURE__*/_interopNamespace(p);var ft__default=/*#__PURE__*/_interopDefault(ft);var I=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var Re=Object.getOwnPropertyNames;var ke=Object.prototype.hasOwnProperty;var A=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var L=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Pe=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}},R=(e,t)=>{for(var n in t)I(e,n,{get:t[n],enumerable:true});},Ie=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Re(t))!ke.call(e,s)&&s!==n&&I(e,s,{get:()=>t[s],enumerable:!(r=Le(t,s))||r.enumerable});return e};var Ne=e=>Ie(I({},"__esModule",{value:true}),e);var J={};R(J,{BUFFER:()=>De,CONFIG_DIR_NAME:()=>y,CONFIG_FILE_NAME:()=>_,DEBUG_LOG_FILENAME:()=>U,ENV:()=>u,FEATURES:()=>$e,FLOW_URLS:()=>be,HOOK_TIMEOUTS:()=>b,INSTALLER:()=>C,NATIVE_OTEL:()=>N,OTLP:()=>Ue,STATE_FILE_PREFIX:()=>Ve,TRACE_LIMITS:()=>xe,VAULT:()=>E,getFlowBaseUrl:()=>h,getFlowUrls:()=>k,getLlmProxy:()=>Fe,getMetrics:()=>He});function h(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ce}function k(){let e=h();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function Fe(){let e=h();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-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function He(){let e=h();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ce,be,E,y,_,Ue,N,u,$e,C,b,De,U,xe,Ve,l=L(()=>{"use strict";Ce="https://flow.ciandt.com";be=k(),E={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},y="FLOW-nodejs",_="config.json",Ue={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};N={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},u={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",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"},$e={KEYCHAIN_ENABLED:!1},C={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},b={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},De={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},U="flow-ai-obs-debug.log",xe={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};Ve="flow-obs-";});var X={};R(X,{MacOsKeyVaultProvider:()=>x});var D,x,q=L(()=>{"use strict";D=util.promisify(child_process.execFile),x=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(t,n){try{let{stdout:r}=await D("security",["find-generic-password","-w","-a",n,"-s",t]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await D("security",["add-generic-password","-U","-a",n,"-s",t,"-w",r]);}async deleteSecret(t,n){try{return await D("security",["delete-generic-password","-a",n,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Z={};R(Z,{LinuxKeyVaultProvider:()=>H});var z,H,Q=L(()=>{"use strict";z=util.promisify(child_process.execFile),H=class{static async isAvailable(){let t=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of t)try{return i.accessSync(n,i.constants.X_OK),!0}catch{}return !1}async getSecret(t,n){try{let{stdout:r}=await z("secret-tool",["lookup","service",t,"account",n]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await new Promise((s,o)=>{let a=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",n]);a.on("error",o),a.on("close",m=>{m===0?s():o(new Error(`secret-tool exited with code ${m}`));}),a.stdin.write(r),a.stdin.end();});}async deleteSecret(t,n){try{return await z("secret-tool",["clear","service",t,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var ee={};R(ee,{WindowsKeyVaultProvider:()=>V});var V,te=L(()=>{"use strict";V=class{static async isAvailable(){try{return await A("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,n){return A("keytar").getPassword(t,n)}async setSecret(t,n,r){await A("keytar").setPassword(t,n,r);}async deleteSecret(t,n){return A("keytar").deletePassword(t,n)}getStoragePath(){return "Windows Credential Manager"}};});var me=Pe((An,pt)=>{pt.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.11.0",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},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"}};});l();l();var F={credentials:"credentials","token-cache":"tokenCache"};function T(){let e=p__namespace.default.homedir();if(process.platform==="darwin")return f__namespace.default.join(e,"Library","Preferences",y,_);if(process.platform==="win32"){let n=process.env.APPDATA??f__namespace.default.join(e,"AppData","Roaming");return f__namespace.default.join(n,y,_)}let t=process.env.XDG_CONFIG_HOME??f__namespace.default.join(e,".config");return f__namespace.default.join(t,y,_)}function $(){try{let e=i__namespace.default.readFileSync(T(),"utf8");return JSON.parse(e)}catch{return {}}}function K(e){let t=T();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 w=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(T()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(T(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,n){let r=$(),s=F[n]??n,o=r[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,n,r){let s=$(),o=F[n]??n;if(n==="token-cache")try{s[o]=JSON.parse(r);}catch{s[o]=r;}else s[o]=r;K(s);}async deleteSecret(t,n){let r=$(),s=F[n]??n;return s in r?(delete r[s],K(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${T()}`}};async function ne(){return process.env[u.FLOW_OBS_USE_JSON_VAULT]==="1"?new w:await ze()??new w}async function ze(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(q(),X));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(Q(),Z));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(te(),ee));return await e.isAvailable()?new e:null}default:return null}}l();var Ze=E.SERVICE,Qe=E.ACCOUNT_CREDS;E.ACCOUNT_TOKEN;var M=null;function et(){return M||(M=ne()),M}async function re(){let t=await(await et()).getSecret(Ze,Qe);if(!t)return null;try{return JSON.parse(t)}catch{return null}}l();l();l();f.join(p.tmpdir(),U);!process.env.NO_COLOR&&process.stdout.isTTY;function j(){return process.platform==="win32"?false:process.getuid?.()===0}function se(){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:p__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||p__namespace.userInfo().username}}function P(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(e=n);}if(e){let t=e.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return f__namespace.join(t,".claude","settings.json")}return f__namespace.join(p__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||p__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(p__namespace.homedir(),".claude","settings.json")}var oe="flow-ai-obs",ie="config.json";function ce(){if(process.platform==="win32"){let n=process.env.APPDATA||f__namespace.join(p__namespace.homedir(),"AppData","Roaming");return f__namespace.join(n,oe,ie)}let e=se(),t=process.env.XDG_CONFIG_HOME||f__namespace.join(e.home,".config");return f__namespace.join(t,oe,ie)}var ct=C.LOCK_STALE_MS;function le(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>ct&&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 ue(e){try{i__namespace.unlinkSync(e);}catch{}}function lt(e,t){let r=(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,...r]}function pe(e,t){let n=P(),r=n+".lock",s=[];i__namespace.mkdirSync(f__namespace.dirname(n),{recursive:true}),le(r);try{if(i__namespace.existsSync(n)){i__namespace.copyFileSync(n,n+".bkp");try{i__namespace.chmodSync(n+".bkp",384);}catch{}}let o=ce();if(i__namespace.existsSync(o)){let c=o+".bkp";i__namespace.copyFileSync(o,c);try{i__namespace.chmodSync(c,384);}catch{}}let a={};try{a=JSON.parse(i__namespace.readFileSync(n,"utf8"));}catch{}let m=a.env&&typeof a.env=="object"?a.env:{};delete m.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:Se}=(l(),Ne(J)),we=Se().OTEL_ENDPOINT,ve={...N,OTEL_EXPORTER_OTLP_ENDPOINT:e??we};a.env={...m,...ve,...t??{}},a.otelHeadersHelper="flow-ai-obs otel-headers",(!a.hooks||typeof a.hooks!="object"||Array.isArray(a.hooks))&&(a.hooks={});let Oe=(c,O)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:O}]}),Ae=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],B=a.hooks;for(let c of Ae){let O=lt(B[c],Oe(c,b[c]));O.length>1&&s.push(c),B[c]=O;}i__namespace.writeFileSync(n,JSON.stringify(a,null,2)+`
2
+ 'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),f=require('path'),p=require('os'),ft=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 p__namespace=/*#__PURE__*/_interopNamespace(p);var ft__default=/*#__PURE__*/_interopDefault(ft);var I=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var Re=Object.getOwnPropertyNames;var ke=Object.prototype.hasOwnProperty;var A=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var L=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Pe=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}},R=(e,t)=>{for(var n in t)I(e,n,{get:t[n],enumerable:true});},Ie=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Re(t))!ke.call(e,s)&&s!==n&&I(e,s,{get:()=>t[s],enumerable:!(r=Le(t,s))||r.enumerable});return e};var Ne=e=>Ie(I({},"__esModule",{value:true}),e);var J={};R(J,{BUFFER:()=>De,CONFIG_DIR_NAME:()=>y,CONFIG_FILE_NAME:()=>_,DEBUG_LOG_FILENAME:()=>U,ENV:()=>u,FEATURES:()=>$e,FLOW_URLS:()=>be,HOOK_TIMEOUTS:()=>b,INSTALLER:()=>C,NATIVE_OTEL:()=>N,OTLP:()=>Ue,STATE_FILE_PREFIX:()=>Ve,TRACE_LIMITS:()=>xe,VAULT:()=>E,getFlowBaseUrl:()=>h,getFlowUrls:()=>k,getLlmProxy:()=>Fe,getMetrics:()=>He});function h(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ce}function k(){let e=h();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function Fe(){let e=h();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-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function He(){let e=h();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ce,be,E,y,_,Ue,N,u,$e,C,b,De,U,xe,Ve,l=L(()=>{"use strict";Ce="https://flow.ciandt.com";be=k(),E={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},y="FLOW-nodejs",_="config.json",Ue={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};N={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},u={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",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"},$e={KEYCHAIN_ENABLED:!1},C={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},b={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},De={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},U="flow-ai-obs-debug.log",xe={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};Ve="flow-obs-";});var X={};R(X,{MacOsKeyVaultProvider:()=>x});var D,x,q=L(()=>{"use strict";D=util.promisify(child_process.execFile),x=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(t,n){try{let{stdout:r}=await D("security",["find-generic-password","-w","-a",n,"-s",t]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await D("security",["add-generic-password","-U","-a",n,"-s",t,"-w",r]);}async deleteSecret(t,n){try{return await D("security",["delete-generic-password","-a",n,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Z={};R(Z,{LinuxKeyVaultProvider:()=>H});var z,H,Q=L(()=>{"use strict";z=util.promisify(child_process.execFile),H=class{static async isAvailable(){let t=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of t)try{return i.accessSync(n,i.constants.X_OK),!0}catch{}return !1}async getSecret(t,n){try{let{stdout:r}=await z("secret-tool",["lookup","service",t,"account",n]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await new Promise((s,o)=>{let a=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",n]);a.on("error",o),a.on("close",m=>{m===0?s():o(new Error(`secret-tool exited with code ${m}`));}),a.stdin.write(r),a.stdin.end();});}async deleteSecret(t,n){try{return await z("secret-tool",["clear","service",t,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var ee={};R(ee,{WindowsKeyVaultProvider:()=>V});var V,te=L(()=>{"use strict";V=class{static async isAvailable(){try{return await A("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,n){return A("keytar").getPassword(t,n)}async setSecret(t,n,r){await A("keytar").setPassword(t,n,r);}async deleteSecret(t,n){return A("keytar").deletePassword(t,n)}getStoragePath(){return "Windows Credential Manager"}};});var me=Pe((An,pt)=>{pt.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.12.0-beta.803",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",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},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"}};});l();l();var F={credentials:"credentials","token-cache":"tokenCache"};function T(){let e=p__namespace.default.homedir();if(process.platform==="darwin")return f__namespace.default.join(e,"Library","Preferences",y,_);if(process.platform==="win32"){let n=process.env.APPDATA??f__namespace.default.join(e,"AppData","Roaming");return f__namespace.default.join(n,y,_)}let t=process.env.XDG_CONFIG_HOME??f__namespace.default.join(e,".config");return f__namespace.default.join(t,y,_)}function $(){try{let e=i__namespace.default.readFileSync(T(),"utf8");return JSON.parse(e)}catch{return {}}}function K(e){let t=T();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 w=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(T()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(T(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,n){let r=$(),s=F[n]??n,o=r[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,n,r){let s=$(),o=F[n]??n;if(n==="token-cache")try{s[o]=JSON.parse(r);}catch{s[o]=r;}else s[o]=r;K(s);}async deleteSecret(t,n){let r=$(),s=F[n]??n;return s in r?(delete r[s],K(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${T()}`}};async function ne(){return process.env[u.FLOW_OBS_USE_JSON_VAULT]==="1"?new w:await ze()??new w}async function ze(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(q(),X));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(Q(),Z));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(te(),ee));return await e.isAvailable()?new e:null}default:return null}}l();var Ze=E.SERVICE,Qe=E.ACCOUNT_CREDS;E.ACCOUNT_TOKEN;var M=null;function et(){return M||(M=ne()),M}async function re(){let t=await(await et()).getSecret(Ze,Qe);if(!t)return null;try{return JSON.parse(t)}catch{return null}}l();l();l();f.join(p.tmpdir(),U);!process.env.NO_COLOR&&process.stdout.isTTY;function j(){return process.platform==="win32"?false:process.getuid?.()===0}function se(){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:p__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||p__namespace.userInfo().username}}function P(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(e=n);}if(e){let t=e.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return f__namespace.join(t,".claude","settings.json")}return f__namespace.join(p__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||p__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(p__namespace.homedir(),".claude","settings.json")}var oe="flow-ai-obs",ie="config.json";function ce(){if(process.platform==="win32"){let n=process.env.APPDATA||f__namespace.join(p__namespace.homedir(),"AppData","Roaming");return f__namespace.join(n,oe,ie)}let e=se(),t=process.env.XDG_CONFIG_HOME||f__namespace.join(e.home,".config");return f__namespace.join(t,oe,ie)}var ct=C.LOCK_STALE_MS;function le(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>ct&&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 ue(e){try{i__namespace.unlinkSync(e);}catch{}}function lt(e,t){let r=(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,...r]}function pe(e,t){let n=P(),r=n+".lock",s=[];i__namespace.mkdirSync(f__namespace.dirname(n),{recursive:true}),le(r);try{if(i__namespace.existsSync(n)){i__namespace.copyFileSync(n,n+".bkp");try{i__namespace.chmodSync(n+".bkp",384);}catch{}}let o=ce();if(i__namespace.existsSync(o)){let c=o+".bkp";i__namespace.copyFileSync(o,c);try{i__namespace.chmodSync(c,384);}catch{}}let a={};try{a=JSON.parse(i__namespace.readFileSync(n,"utf8"));}catch{}let m=a.env&&typeof a.env=="object"?a.env:{};delete m.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:Se}=(l(),Ne(J)),we=Se().OTEL_ENDPOINT,ve={...N,OTEL_EXPORTER_OTLP_ENDPOINT:e??we};a.env={...m,...ve,...t??{}},a.otelHeadersHelper="flow-ai-obs otel-headers",(!a.hooks||typeof a.hooks!="object"||Array.isArray(a.hooks))&&(a.hooks={});let Oe=(c,O)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:O}]}),Ae=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],B=a.hooks;for(let c of Ae){let O=lt(B[c],Oe(c,b[c]));O.length>1&&s.push(c),B[c]=O;}i__namespace.writeFileSync(n,JSON.stringify(a,null,2)+`
3
3
  `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(n,384);}catch{}}finally{ue(r);}return {settingsPath:n,preserved:s}}function fe(e){let t=P(),n=t+".lock";i__namespace.mkdirSync(f__namespace.dirname(t),{recursive:true}),le(n);try{let r={};try{r=JSON.parse(i__namespace.readFileSync(t,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,e),i__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
4
4
  `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}}finally{ue(n);}}l();function de(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let n=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:s,tenant:o}=n;return !r||!s||!o?null:{clientId:r,clientSecret:s,tenant:o}}catch{return null}}function ge(e){let t=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),n=Buffer.from(JSON.stringify({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant})).toString("base64url");return `${t}.${n}.`}l();var W;function Ee(){return W||(W=me()),W}var ye=f__namespace.default.join(p__namespace.default.tmpdir(),"flow-obs-update-cache.json"),mt=1440*60*1e3,ht=3e3;function Et(e,t){let n=o=>{let a=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[3]]:null},r=n(e),s=n(t);return !r||!s?false:s[0]!==r[0]?s[0]>r[0]:s[1]!==r[1]?s[1]>r[1]:s[2]>r[2]}function yt(){try{let e=JSON.parse(i__namespace.default.readFileSync(ye,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=mt?null:e}catch{return null}}function _t(e,t,n=Date.now()){try{i__namespace.default.writeFileSync(ye,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:n}),{mode:384});}catch{}}function Tt(e){let t=Ee().name,n=ft__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:ht},r=>{if(r.statusCode!==200)return r.resume(),e(new Error(`HTTP ${r.statusCode}`));let s="";r.setEncoding("utf8"),r.on("data",o=>{s+=o;}),r.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);}});});n.on("error",e),n.on("timeout",()=>{n.destroy(new Error("timeout"));});}function _e(){try{if(yt())return;setImmediate(()=>{Tt((e,t)=>{e||!t||Et(Ee().version,t.version)&&_t(t.version,t.updatePriority,0);});});}catch{}}var St=f__namespace.default.resolve(__dirname,".."),wt=process.env.INIT_CWD?f__namespace.default.resolve(process.env.INIT_CWD):null;wt===St&&process.exit(0);j()&&(process.stderr.write(`
5
5
  [flow-ai-obs] \u2717 Do not install with sudo.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.11.0",
3
+ "version": "0.12.0-beta.803",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {