@ciandt-flow/flow-ai-obs 0.10.0-beta.693 → 0.10.0

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