@ciandt-flow/flow-ai-obs 0.13.0 → 0.14.0-beta.59

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