@ciandt-flow/flow-ai-obs 0.10.0 → 0.11.0-beta.782

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