@ciandt-flow/flow-ai-obs 0.12.0 → 0.13.0-beta.15

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