@ciandt-flow/flow-ai-obs 0.16.1 → 1.0.0-beta.149

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,284 +1,199 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var Jt=require('readline/promises'),Is=require('https'),E=require('fs'),ke=require('os'),L=require('path'),child_process=require('child_process'),js=require('http'),nn=require('crypto');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 Jt__namespace=/*#__PURE__*/_interopNamespace(Jt);var Is__namespace=/*#__PURE__*/_interopNamespace(Is);var E__namespace=/*#__PURE__*/_interopNamespace(E);var ke__namespace=/*#__PURE__*/_interopNamespace(ke);var L__namespace=/*#__PURE__*/_interopNamespace(L);var js__namespace=/*#__PURE__*/_interopNamespace(js);var nn__namespace=/*#__PURE__*/_interopNamespace(nn);var Vt=Object.defineProperty;var ys=Object.getOwnPropertyDescriptor;var Ss=Object.getOwnPropertyNames;var ws=Object.prototype.hasOwnProperty;var As=(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 T=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Os=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},Z=(e,t)=>{for(var r in t)Vt(e,r,{get:t[r],enumerable:true});},Ls=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ss(t))!ws.call(e,s)&&s!==r&&Vt(e,s,{get:()=>t[s],enumerable:!(n=ys(t,s))||n.enumerable});return e};var D=e=>Ls(Vt({},"__esModule",{value:true}),e);var Gt={};Z(Gt,{bold:()=>v,cyan:()=>M,dim:()=>m,green:()=>R,red:()=>k,yellow:()=>I});function Be(e,t){return Rs?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var Rs,R,k,I,M,v,m,de=T(()=>{"use strict";Rs=!process.env.NO_COLOR&&process.stdout.isTTY;R=Be("32","39"),k=Be("31","39"),I=Be("33","39"),M=Be("36","39"),v=Be("1","22"),m=Be("2","22");});var nt=Os((Li,ks)=>{ks.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.16.1",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,dependencies:{},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 fe(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function st(e,t){let r=Jt__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 Xt(e,t){let r=Jt__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=T(()=>{"use strict";});var He={};Z(He,{checkForUpdate:()=>Ns,checkForUpdateInteractive:()=>$s,fetchLatestVersionAsync:()=>Hr,isNewer:()=>We,primeUpdateCache:()=>Fs,runUpdate:()=>Wr});function X(){return zt||(zt=nt()),zt}function We(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 er(){try{let e=JSON.parse(E__namespace.default.readFileSync(Br,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=bs?null:e}catch{return null}}function tr(e,t,r=Date.now()){try{E__namespace.default.writeFileSync(Br,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function rr(e){let t=X().name,r=Is__namespace.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Us},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=X().name,n=` Update available: ${X().version} \u2192 ${e}`,s=` Run: npm install -g ${t}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
2
+ 'use strict';var _e=require('readline/promises'),Vn=require('https'),m=require('fs'),At=require('os'),w=require('path'),child_process=require('child_process'),hr=require('crypto'),Zs=require('http');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 _e__namespace=/*#__PURE__*/_interopNamespace(_e);var Vn__default=/*#__PURE__*/_interopDefault(Vn);var m__namespace=/*#__PURE__*/_interopNamespace(m);var At__namespace=/*#__PURE__*/_interopNamespace(At);var w__namespace=/*#__PURE__*/_interopNamespace(w);var hr__namespace=/*#__PURE__*/_interopNamespace(hr);var Zs__default=/*#__PURE__*/_interopDefault(Zs);var Ee=Object.defineProperty;var Fn=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var Mn=Object.prototype.hasOwnProperty;var Wn=(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 E=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var Kn=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},z=(t,e)=>{for(var r in e)Ee(t,r,{get:e[r],enumerable:true});},Bn=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of xn(e))!Mn.call(t,s)&&s!==r&&Ee(t,s,{get:()=>e[s],enumerable:!(n=Fn(e,s))||n.enumerable});return t};var F=t=>Bn(Ee({},"__esModule",{value:true}),t);var he={};z(he,{bold:()=>b,cyan:()=>j,dim:()=>S,green:()=>v,red:()=>N,yellow:()=>C});function St(t,e){return Yn?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var Yn,v,N,C,j,b,S,ut=E(()=>{"use strict";Yn=!process.env.NO_COLOR&&process.stdout.isTTY;v=St("32","39"),N=St("31","39"),C=St("33","39"),j=St("36","39"),b=St("1","22"),S=St("2","22");});var Nt=Kn((go,jn)=>{jn.exports={name:"@ciandt-flow/flow-ai-obs",version:"1.0.0-beta.149",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",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:{},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"}};});var er={};z(er,{isTTY:()=>tt,promptRaw:()=>Hn,promptText:()=>qt,promptYesNo:()=>yt});function tt(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function yt(t,e){let r=_e__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&e!==void 0)return r.close(),e;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(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function qt(t,e){let r=_e__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${t}: `)).trim();if(e){let s=e(n);if(s)throw new Error(s)}return n}catch(n){throw n}finally{r.close();}}function Hn(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:o=""}=e;process.stdout.write(t+o);let i=o;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=h=>{if(h===""){u(),n(new Error("SIGINT"));return}if(h==="\r"||h===`
4
+ `){u(),process.stdout.write(`
5
+ `),r(i);return}if(h==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}h.startsWith("\x1B")||(i+=h,process.stdout.write(s?"*".repeat(h.length):h));};function u(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",a),process.removeListener("unhandledRejection",a);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}var zt=E(()=>{"use strict";});var $t={};z($t,{checkForUpdate:()=>Zn,checkForUpdateInteractive:()=>Qn,fetchLatestVersionAsync:()=>ir,isNewer:()=>Tt,primeUpdateCache:()=>ts,runUpdate:()=>or});function x(){return Se||(Se=Nt()),Se}function Tt(t,e){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[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 Oe(){try{let t=JSON.parse(m__namespace.default.readFileSync(sr,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=Xn?null:t}catch{return null}}function we(t,e,r=Date.now()){try{m__namespace.default.writeFileSync(sr,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:r}),{mode:384});}catch{}}function Le(t){let e=x().name,r=Vn__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:qn},n=>{if(n.statusCode!==200)return n.resume(),t(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");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});r.on("error",t),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function ye(t){let e=x().name,n=` Update available: ${x().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
4
6
  \u256D${i}\u256E
5
7
  \u2502${n.padEnd(o)}\u2502
6
8
  \u2502${s.padEnd(o)}\u2502
7
9
  \u2570${i}\u256F
8
10
 
9
- `);}function Qt(e){let t=X().name;process.stderr.write(`
10
- [${t}] Critical update detected \u2014 auto-updating to ${e}...
11
+ `);}function Te(t){let e=x().name;process.stderr.write(`
12
+ [${e}] Critical update detected \u2014 auto-updating to ${t}...
11
13
 
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 Cs(e,t=1e4){let r=As("readline"),n=X().name,o=` Update available: ${X().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,u="\u2500".repeat(c);return process.stderr.write(`
14
+ `);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 zn(t,e=1e4){let r=Wn("readline"),n=x().name,o=` Update available: ${x().version} \u2192 ${t}`,i=` Run: npm install -g ${n}`,a=" Install now? [y/N]: ",c=Math.max(o.length,i.length,a.length-2)+2,u="\u2500".repeat(c);return process.stderr.write(`
13
15
  \u256D${u}\u256E
14
16
  \u2502${o.padEnd(c)}\u2502
15
17
  \u2502${i.padEnd(c)}\u2502
16
18
  \u2502${a.padEnd(c)}\u2502
17
19
  \u2570${u}\u256F
18
- `),new Promise(h=>{let d=r.createInterface({input:process.stdin,output:void 0,terminal:false}),y=false;function S(b){y||(y=true,clearTimeout($),d.close(),process.stderr.write(`
19
- `),h(b));}let $=setTimeout(()=>S(false),t);d.once("line",b=>S(b.trim().toLowerCase()==="y")),d.once("close",()=>S(false));})}async function Wr(e){let t=X().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.
20
+ `),new Promise(h=>{let L=r.createInterface({input:process.stdin,output:void 0,terminal:false}),I=false;function A(O){I||(I=true,clearTimeout(p),L.close(),process.stderr.write(`
21
+ `),h(O));}let p=setTimeout(()=>A(false),e);L.once("line",O=>A(O.trim().toLowerCase()==="y")),L.once("close",()=>A(false));})}async function or(t){let e=x().name;return process.stderr.write(` Installing ${e}@${t}...
22
+ `),new Promise(r=>{let n=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit",shell:process.platform==="win32"}),s=false;function o(i,a){if(!s){if(s=true,i)process.stderr.write(` \u2713 Updated to ${t}. Please restart the command.
21
23
 
22
24
  `);else {let c=a?` (${a})`:"";process.stderr.write(` \u2717 Update failed${c} \u2014 continuing with current version.
23
25
 
24
- `);}r();}}n.on("close",(i,a)=>o(i===0,a??void 0)),n.on("error",i=>o(false,i.code));})}function Hr(){return new Promise(e=>{rr((t,r)=>e(t||!r?null:r));})}function Ns(){try{let e=er();if(e){We(X().version,e.latestVersion)&&(e.updatePriority==="auto"?Qt(e.latestVersion):Zt(e.latestVersion));return}setImmediate(()=>{rr((t,r)=>{t||!r||(tr(r.version,r.updatePriority),We(X().version,r.version)&&(r.updatePriority==="auto"?Qt(r.version):Zt(r.version)));});});}catch{}}async function $s(e={}){try{let t=er();if(t){if(!We(X().version,t.latestVersion))return}else {let n=await Hr();if(!n||(tr(n.version,n.updatePriority),!We(X().version,n.version)))return;t={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(t.updatePriority==="auto"){Qt(t.latestVersion);return}if(!fe()){Zt(t.latestVersion);return}await Cs(t.latestVersion,e.timeoutMs)&&await Wr(t.latestVersion);}catch{}}function Fs(){try{if(er())return;setImmediate(()=>{rr((e,t)=>{e||!t||We(X().version,t.version)&&tr(t.version,t.updatePriority,0);});});}catch{}}var zt,Br,bs,Us,Ke=T(()=>{"use strict";qt();Br=L__namespace.default.join(ke__namespace.default.tmpdir(),"flow-obs-update-cache.json"),bs=1440*60*1e3,Us=3e3;});var Kr={};Z(Kr,{AUTH_ENGINE:()=>Ye,BUFFER:()=>q,CLAUDE_DESKTOP:()=>U,CONFIG_DIR_NAME:()=>ot,CONFIG_FILE_NAME:()=>it,COPILOT_OTEL:()=>_,DEBUG_LOG_FILENAME:()=>nr,ENV:()=>p,FLOW_URLS:()=>xs,INSTALLER:()=>ge,NATIVE_OTEL:()=>me,OTLP:()=>wt,STATE_FILE_PREFIX:()=>Ms,TOKEN_CACHE_KEY:()=>St,TRACE_LIMITS:()=>Q,VALIDATION:()=>K,getFlowBaseUrl:()=>Oe,getFlowUrls:()=>H,getMetrics:()=>At});function Oe(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ds}function H(){let e=Oe();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=Oe();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ds,xs,ot,it,St,wt,me,p,Ye,ge,q,K,nr,Q,U,_,Ms,P=T(()=>{"use strict";Ds="https://flow.ciandt.com";xs=H(),ot="FLOW-nodejs",it="config.json",St="tokenCache",wt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},me={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_SKIP_DESKTOP_DETECTION:"FLOW_OBS_SKIP_DESKTOP_DETECTION",FLOW_OBS_SKIP_COPILOT_DETECTION:"FLOW_OBS_SKIP_COPILOT_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"},Ye={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},ge={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},q={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},K={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},nr="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",OTLP_RESOURCE_ATTRIBUTES:"otlpResourceAttributes"},CUSTOM_PROVIDER_KEY:"custom.provider",CUSTOM_PROVIDER_VALUE:"claude-code-desktop"},_={ENABLED_KEY:"github.copilot.chat.otel.enabled",ENABLED_VALUE:!0,EXPORTER_TYPE_KEY:"github.copilot.chat.otel.exporterType",EXPORTER_TYPE_VALUE:"otlp-http",PROTOCOL_KEY:"github.copilot.chat.otel.protocol",PROTOCOL_VALUE:"http/json",ENDPOINT_KEY:"github.copilot.chat.otel.otlpEndpoint",HEADERS_KEY:"github.copilot.chat.otel.headers",HEADER_API_KEY:"x-flow-api-key",HEADER_USER:"x-flow-user"},Ms="flow-obs-";});function l(...e){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let t=`[${new Date().toISOString()}] ${e.join(" ")}
25
- `;try{E.writeFileSync(Ks,t,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
26
- `);}}var Ks,x=T(()=>{"use strict";P();Ks=L.join(ke.tmpdir(),nr);});function Gs(e){if(!Vs.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Js(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}`:"")),Yr[n.error]))return new Le(Yr[n.error],e)}catch{}return e===401||e===403||e===500?new Le("Invalid credentials",e):e>=400&&e<500?new Le("Authentication request was rejected",e):new Error("Authentication service unavailable, please try again later")}function Y(e){return new Promise((t,r)=>{try{Gs(e.tenant);}catch(u){return r(u)}let n=JSON.stringify({clientSecret:e.clientSecret}),s=new URL(H().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?Is__namespace.default:js__namespace.default).request(i,u=>{let h=[];u.on("data",d=>h.push(d)),u.on("end",()=>{let d=h.join("");if((u.statusCode??0)>=400)return r(Js(u.statusCode??0,d));let y;try{y=JSON.parse(d);}catch{return r(new Error("Invalid response from auth engine"))}let S=y.expires_at??new Date(Date.now()+(y.expires_in??3600)*1e3).toISOString();if(!y.access_token)return r(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));t({accessToken:y.access_token,expiresAt:S});});});c.on("error",u=>r(new Error(`Network error: ${u.message}`))),c.setTimeout(Ye.REQUEST_TIMEOUT_MS,()=>{c.destroy(new Error("Request timeout"));}),c.write(n),c.end();})}var Le,Vs,Yr,Re=T(()=>{"use strict";P();x();Le=class extends Error{statusCode;constructor(t,r=0){super(t),this.name="AuthError",this.statusCode=r;}},Vs=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;Yr={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 jr(){return process.platform==="win32"?false:process.getuid?.()===0}function Ot(){if(jr())return process.stderr.write(`
27
- `+k(` \u2717 flow-ai-obs is not supported in a sudo context.
26
+ `);}r();}}n.on("close",(i,a)=>o(i===0,a??void 0)),n.on("error",i=>o(false,i.code));})}function ir(){return new Promise(t=>{Le((e,r)=>t(e||!r?null:r));})}function Zn(){try{let t=Oe();if(t){Tt(x().version,t.latestVersion)&&(t.updatePriority==="auto"?Te(t.latestVersion):ye(t.latestVersion));return}setImmediate(()=>{Le((e,r)=>{e||!r||(we(r.version,r.updatePriority),Tt(x().version,r.version)&&(r.updatePriority==="auto"?Te(r.version):ye(r.version)));});});}catch{}}async function Qn(t={}){try{let e=Oe();if(e){if(!Tt(x().version,e.latestVersion))return}else {let n=await ir();if(!n||(we(n.version,n.updatePriority),!Tt(x().version,n.version)))return;e={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Te(e.latestVersion);return}if(!tt()){ye(e.latestVersion);return}await zn(e.latestVersion,t.timeoutMs)&&await or(e.latestVersion);}catch{}}function ts(){try{if(Oe())return;setImmediate(()=>{Le((t,e)=>{t||!e||Tt(x().version,e.version)&&we(e.version,e.updatePriority,0);});});}catch{}}var Se,sr,Xn,qn,Dt=E(()=>{"use strict";zt();sr=w__namespace.default.join(At__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Xn=1440*60*1e3,qn=3e3;});var cr={};z(cr,{BUFFER:()=>M,CLAUDE_DESKTOP:()=>R,COPILOT_OTEL:()=>g,DEBUG_LOG_FILENAME:()=>Ae,ENV:()=>d,FLOW_URLS:()=>rs,INSTALLER:()=>Qt,NATIVE_OTEL:()=>et,OTLP:()=>Zt,STATE_FILE_PREFIX:()=>ns,TRACE_LIMITS:()=>V,VALIDATION:()=>H,getFlowBaseUrl:()=>ar,getFlowUrls:()=>Z});function ar(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():es}function Z(){let t=ar();return {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`}}var es,rs,Zt,et,d,Qt,M,H,Ae,V,R,g,ns,U=E(()=>{"use strict";es="https://flow.ciandt.com";rs=Z(),Zt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},et={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},d={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_SKIP_DESKTOP_DETECTION:"FLOW_OBS_SKIP_DESKTOP_DETECTION",FLOW_OBS_SKIP_COPILOT_DETECTION:"FLOW_OBS_SKIP_COPILOT_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"},Qt={LOCK_STALE_MS:3e4,CLI:"flow-ai-obs "},M={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},H={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},Ae="flow-ai-obs-debug.log",V={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60},R={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",OTLP_RESOURCE_ATTRIBUTES:"otlpResourceAttributes"},CUSTOM_PROVIDER_KEY:"custom.provider",CUSTOM_PROVIDER_VALUE:"claude-code-desktop"},g={ENABLED_KEY:"github.copilot.chat.otel.enabled",ENABLED_VALUE:!0,EXPORTER_TYPE_KEY:"github.copilot.chat.otel.exporterType",EXPORTER_TYPE_VALUE:"otlp-http",PROTOCOL_KEY:"github.copilot.chat.otel.protocol",PROTOCOL_VALUE:"http/json",ENDPOINT_KEY:"github.copilot.chat.otel.otlpEndpoint",HEADERS_KEY:"github.copilot.chat.otel.headers",HEADER_API_KEY:"x-flow-api-key",HEADER_USER:"x-flow-user"},ns="flow-obs-";});function l(...t){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
27
+ `;try{m.writeFileSync(as,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
28
+ `);}}var as,W=E(()=>{"use strict";U();as=w.join(At.tmpdir(),Ae);});function lr(){return process.platform==="win32"?false:process.getuid?.()===0}function ur(){if(lr())return process.stderr.write(`
29
+ `+N(` \u2717 flow-ai-obs is not supported in a sudo context.
28
30
 
29
- `)+M(` npm install -g @ciandt-flow/flow-ai-obs
31
+ `)+j(` npm install -g @ciandt-flow/flow-ai-obs
30
32
  `)+`
31
- `),1}var Lt=T(()=>{"use strict";de();});function Ie(){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:ke__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||ke__namespace.userInfo().username}}function ee(){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 L__namespace.join(t,".claude","settings.json")}return L__namespace.join(ke__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||ke__namespace.homedir();return L__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 L__namespace.join(t,".claude","settings.json")}return L__namespace.join(ke__namespace.homedir(),".claude","settings.json")}var at=T(()=>{"use strict";Lt();});function Rt(){if(process.platform==="win32"){let r=process.env.APPDATA||L__namespace.join(ke__namespace.homedir(),"AppData","Roaming");return L__namespace.join(r,Vr,Gr)}let e=Ie(),t=process.env.XDG_CONFIG_HOME||L__namespace.join(e.home,".config");return L__namespace.join(t,Vr,Gr)}function or(){let{getPersistedFlowBaseUrl:e}=(le(),D(Xr));return e()??null}var Vr,Gr,ir=T(()=>{"use strict";at();Vr="flow-ai-obs",Gr="config.json";});var Xr={};Z(Xr,{addEnvToClaudeSettings:()=>Pe,getClaudeSettingsPath:()=>ee,getEffectiveEnv:()=>lt,getEnvFromClaudeSettings:()=>j,getPersistedFlowBaseUrl:()=>qr,removeEnvFromClaudeSettings:()=>eo,resolveFlowBaseUrl:()=>ut,validateConnectivity:()=>Qs,writeClaudeSettings:()=>ur});function cr(e){try{let t=E__namespace.statSync(e);Date.now()-t.mtimeMs>zs&&E__namespace.unlinkSync(e);}catch{}try{E__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 lr(e){try{E__namespace.unlinkSync(e);}catch{}}function Zs(e){let t=[];if(!e.hooks||typeof e.hooks!="object"||Array.isArray(e.hooks))return delete e.hooks,t;let r=e.hooks,n={};for(let[s,o]of Object.entries(r)){if(!Array.isArray(o))continue;let i=o.map(a=>{if(!Array.isArray(a?.hooks))return null;let c=a.hooks.filter(u=>!u.command?.startsWith?.(ge.CLI));return c.length>0?{...a,hooks:c}:null}).filter(a=>a!=null);i.length>0&&(n[s]=i,t.push(s));}return Object.keys(n).length>0?e.hooks=n:delete e.hooks,t}function ur(e,t){let r=ee(),n=r+".lock";E__namespace.mkdirSync(L__namespace.dirname(r),{recursive:true}),cr(n);try{if(E__namespace.existsSync(r)){E__namespace.copyFileSync(r,r+".bkp");try{E__namespace.chmodSync(r+".bkp",384);}catch{}}let s=Rt();if(E__namespace.existsSync(s)){let d=s+".bkp";E__namespace.copyFileSync(s,d);try{E__namespace.chmodSync(d,384);}catch{}}let o={};try{o=JSON.parse(E__namespace.readFileSync(r,"utf8"));}catch{}let i=o.env&&typeof o.env=="object"?o.env:{};delete i.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:a}=(P(),D(Kr)),c=a().OTEL_ENDPOINT,u={...me,OTEL_EXPORTER_OTLP_ENDPOINT:e??c};o.env={...i,...u,...t??{}},o.otelHeadersHelper="flow-ai-obs otel-headers";let h=Zs(o);E__namespace.writeFileSync(r,JSON.stringify(o,null,2)+`
32
- `,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(r,384);}catch{}return Ee=void 0,{settingsPath:r,preserved:h}}finally{lr(n);}}async function Qs(e){let t;try{t=(await Y(e)).accessToken;}catch{return false}return t?new Promise(r=>{ar(`Bearer ${t}`,r,1);}):false}function ar(e,t,r){let n=new URL(H().GATEWAY_TRACES),s=JSON.stringify({resourceSpans:[],validation_run:true}),o=n.protocol==="https:",i={hostname:n.hostname,port:n.port||(o?443:80),path:n.pathname,method:"POST",headers:{"Content-Type":"application/json",Authorization:e,"Content-Length":Buffer.byteLength(s)}},c=(o?Is__namespace:js__namespace).request(i,u=>{u.resume(),u.statusCode===200||u.statusCode===204?t(true):r<ge.CONNECTIVITY_MAX_RETRY?setTimeout(()=>ar(e,t,r+1),ge.CONNECTIVITY_RETRY_MS):t(false);});c.on("error",()=>{r<ge.CONNECTIVITY_MAX_RETRY?setTimeout(()=>ar(e,t,r+1),ge.CONNECTIVITY_RETRY_MS):t(false);}),c.write(s),c.end();}function j(e){if(Ee===void 0)try{let r=E__namespace.readFileSync(ee(),"utf8");Ee=JSON.parse(r).env??null;}catch{Ee=null;}if(!Ee)return null;let t=Ee[e];return typeof t=="string"?t:null}function Pe(e){let t=ee(),r=t+".lock";E__namespace.mkdirSync(L__namespace.dirname(t),{recursive:true}),cr(r);try{let n={};try{n=JSON.parse(E__namespace.readFileSync(t,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,e),E__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
33
- `,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(t,384);}catch{}Ee=void 0;}finally{lr(r);}}function eo(e){let t=ee(),r=t+".lock";E__namespace.mkdirSync(L__namespace.dirname(t),{recursive:true}),cr(r);try{let n={};try{n=JSON.parse(E__namespace.readFileSync(t,"utf8"));}catch{return}if(!n.env||typeof n.env!="object")return;for(let s of e)delete n.env[s];E__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
34
- `,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(t,384);}catch{}Ee=void 0;}finally{lr(r);}}function lt(e){let t=process.env[e];return t!==void 0?t!==""?t:void 0:j(e)??void 0}function qr(){let e=j(p.FLOW_BASE_URL);return e&&e.trim()?e.trim():void 0}function ut(){let e=process.env[p.FLOW_BASE_URL];return e&&e.trim()?e.trim():qr()}var zs,Ee,le=T(()=>{"use strict";P();Re();at();ir();zs=ge.LOCK_STALE_MS;});var Qr={};Z(Qr,{getEmailFromToken:()=>Ge,getTokenCache:()=>pt,isTokenValid:()=>no,saveTokenCache:()=>he});function zr(){let e=ke__namespace.default.homedir();if(process.platform==="darwin")return L__namespace.default.join(e,"Library","Preferences",ot,it);if(process.platform==="win32"){let r=process.env.APPDATA??L__namespace.default.join(e,"AppData","Roaming");return L__namespace.default.join(r,ot,it)}let t=process.env.XDG_CONFIG_HOME??L__namespace.default.join(e,".config");return L__namespace.default.join(t,ot,it)}function Zr(){try{let e=E__namespace.default.readFileSync(zr(),"utf8");return JSON.parse(e)}catch{return {}}}function ro(e){let t=zr();E__namespace.default.mkdirSync(L__namespace.default.dirname(t),{recursive:true}),E__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}async function he(e){let t=Zr();t[St]={accessToken:e.accessToken,expiresAt:e.expiresAt,lastAuthCheckAt:e.lastAuthCheckAt},ro(t);}async function pt(){let t=Zr()[St];return t?{accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}:null}async function no(){let e=await pt();return e?new Date(e.expiresAt)>new Date:false}async function Ge(){let e=await pt();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}}var Je=T(()=>{"use strict";P();});function en(){return !!process.env[p.FLOW_USER_EMAIL]||!!j(p.FLOW_USER_EMAIL)}function dr(e){l("maybePersistUserEmail",`${e}: starting`);let t=e==="api-key"?`\u26A0\uFE0F flow-ai-obs: FLOW_USER_EMAIL is not set. Configure it with:
35
- flow-ai-obs init --custom-email <EMAIL>
36
- `:`\u26A0\uFE0F flow-ai-obs: FLOW_USER_EMAIL is not set and could not be derived from token.
37
- Run: flow-ai-obs init
38
- `;return Ge().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&&K.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{Pe({[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.
39
- Run: flow-ai-obs init
40
- `);}}else process.stderr.write(t);}).catch(r=>{l("maybePersistUserEmail",`${e}: getEmailFromToken failed: ${r.message}`);})}var tn=T(()=>{"use strict";Je();le();x();P();});function io(e){return oo.some(t=>t.test(e))}function ao(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 te(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 ve(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&&io(t.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${t.hostname}`);return e}async function rn(){let e=te(process.env[p.ANTHROPIC_AUTH_TOKEN]);return e?{user:await Ge().catch(()=>null)??e.clientId,tenant:e.tenant}:{user:"",tenant:""}}function co(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 be(){let e=lt(p.FLOW_USER_EMAIL);if(e!==void 0){let r=e.replace(/[\r\n]/g,"").trim();if(r)if(r.length>K.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${K.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!K.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=co("x-flow-user");if(t){let r=t.replace(/[\r\n]/g,"").trim();if(r.length>K.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${K.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!K.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=ke__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 ie(e){if(!e)return null;let t=e.replace(/[\r\n]/g,"").trim();return t?t.length>K.API_KEY_MAX_LENGTH?(l("validateApiKey",`API key exceeds ${K.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):K.API_KEY_PATTERN.test(t)?t:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function V(){let e=process.env[p.FLOW_API_KEY];return ie(e)}function lo(){return new Date().toISOString().slice(0,10)}async function uo(e){let t=lo(),r=await pt();if(r?.lastAuthCheckAt!==t){l("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);let o=Ye.MAX_RETRY_ATTEMPTS;for(let i=1;i<=o;i++)try{let a=await Y(e);try{await he({...a,lastAuthCheckAt:t});}catch(u){l("getOrRefreshToken",`saveTokenCache failed (non-fatal): ${u.message}`);}return l("getOrRefreshToken",`daily check passed (attempt ${i}), expires=${a.expiresAt}`),V()?en()||await dr("api-key"):await dr("oauth"),a.accessToken}catch(a){if(a instanceof Le){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,Ye.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 Y(e);try{await he({...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 po(e,t){let r=t&&t.accessToken?t.accessToken:"";return {endpoint:e.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function fo(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 ue(){let e=[],t=te(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 d="",y=r;t&&(d=await Ge().catch(()=>null)??t.clientId);let S={user:d??"",tenant:y??"",team:"",project:""};e.push({mode:"direct",...fo(ve(s),o,i),...S}),l("resolveCredentials","direct mode active",`user=${S.user}`,`tenant=${S.tenant}`);}if(!t){if(e.length===0){let d=[];return d.authError=false,d}return e}let a;try{a=await uo(t);}catch(d){if(l("resolveCredentials",`token refresh failed: ${d.message}`,`(tenant=${t.tenant} clientId=${t.clientId})`),e.length>0)return e.authError=true,e;let y=[];return y.authError=true,y}let u={user:ao(a)??t.clientId,tenant:r,team:"",project:""},h=process.env[p.FLOW_TELEMETRY_GATEWAY]??Oe();return e.push({mode:"gateway",...po(ve(h),{accessToken:a}),...u}),e}var oo,B=T(()=>{"use strict";Je();Re();P();x();tn();le();oo=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];});function sn(){return !!(process.env.WSL_DISTRO_NAME&&process.platform==="linux")}function Pt(){return process.platform==="win32"||sn()}function go(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 on(){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=L__namespace.join(s,U.DIR_3P);return It(o)}}if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||L__namespace.join(ke__namespace.homedir(),"AppData","Local"),s=L__namespace.join(n,U.DIR_3P);return It(s)}if(process.platform==="darwin"){let n=L__namespace.join(ke__namespace.homedir(),"Library","Application Support",U.DIR_3P);return It(n)}let e=Ie(),t=process.env.XDG_CONFIG_HOME||L__namespace.join(e.home,".config"),r=L__namespace.join(t,U.DIR_3P);return It(r)}function It(e){return {configDir:e,configLibraryDir:L__namespace.join(e,U.CONFIG_LIBRARY_DIR),desktopConfigPath:L__namespace.join(e,U.DESKTOP_CONFIG_FILE),metaPath:L__namespace.join(e,U.CONFIG_LIBRARY_DIR,U.META_FILE)}}function vt(){let e=ee(),t=L__namespace.dirname(e),r=Pt()?U.WRAPPER_SCRIPT_WIN:U.WRAPPER_SCRIPT_UNIX;return L__namespace.join(t,r)}function bt(){if(process.env[p.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=on();if(E__namespace.existsSync(e.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",L__namespace.join(ke__namespace.homedir(),"Applications","Claude.app")].some(r=>E__namespace.existsSync(r));if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||L__namespace.join(ke__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files";return [L__namespace.join(t,"AnthropicClaude","Claude.exe"),L__namespace.join(r,"Claude","Claude.exe")].some(s=>E__namespace.existsSync(s))}if(process.platform==="linux"){let t=Ie(),r=process.env.XDG_CONFIG_HOME||L__namespace.join(t.home,".config"),n=L__namespace.join(r,"Claude");return E__namespace.existsSync(n)}return false}function Eo(e){let t=e??vt();try{if(!E__namespace.existsSync(t))return null;let r=E__namespace.readFileSync(t,"utf8"),n=r.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(n&&n[1])return ie(n[1]);let s=r.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(s&&s[1])return ie(s[1])}catch{}return null}function an(e,t,r=448){let n=L__namespace.dirname(e);E__namespace.mkdirSync(n,{recursive:true});let s=Pt(),o=s?420:r,i=true;try{E__namespace.readFileSync(e,"utf8")===t&&(i=!1);}catch{}if(!i){if(!s)try{E__namespace.chmodSync(e,r);}catch{}return {written:false}}if(E__namespace.existsSync(e)&&(E__namespace.copyFileSync(e,e+".bkp"),!s))try{E__namespace.chmodSync(e+".bkp",448);}catch{}if(E__namespace.writeFileSync(e,t,{encoding:"utf8",mode:o}),!s)try{E__namespace.chmodSync(e,r);}catch{}return {written:true}}function ho(e){let t=vt(),r=e?ie(e):null,n=Pt()?ln(r):cn(r);return an(t,n,!!r?448:493),t}function cn(e){let t=e?ie(e):null,r=["#!/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"];return t&&r.push(`export FLOW_API_KEY="${t}"`),r.push("exec flow-ai-obs otel-headers",""),r.join(`
41
- `)}function ln(e){let t=e?ie(e):null,r=["@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."];return t&&r.push(`set FLOW_API_KEY=${t}`),r.push("flow-ai-obs otel-headers",""),r.join(`\r
42
- `)}function un(e){if(!bt())return {status:"skipped",reason:"Claude Desktop is not installed"};let t=ie(e);if(!t)return {status:"skipped",reason:"Invalid API key provided"};try{let r=vt(),n=Pt()?ln(t):cn(t),{written:s}=an(r,n,448);return {status:s?"configured":"already_configured",wrapperScriptPath:r}}catch(r){return {status:"skipped",reason:r.message}}}function To(e){try{let t=E__namespace.readFileSync(e,"utf8");try{let r=JSON.parse(t);if(r.appliedId&&typeof r.appliedId=="string"&&_o.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 nn__namespace.randomUUID()}function yo(e,t){let r=L__namespace.dirname(e);E__namespace.mkdirSync(r,{recursive:true});let n;try{let o=E__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)+`
43
- `;try{if(E__namespace.readFileSync(e,"utf8")===s)return}catch{}if(E__namespace.existsSync(e)){E__namespace.copyFileSync(e,e+".bkp");try{E__namespace.chmodSync(e+".bkp",384);}catch{}}E__namespace.writeFileSync(e,s,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(e,384);}catch{}}function So(e,t,r,n){E__namespace.mkdirSync(e,{recursive:true});let s=L__namespace.resolve(e),o=L__namespace.resolve(e,`${t}.json`);if(!o.startsWith(s+L__namespace.sep))throw new Error(`Security error: invalid config path ${o}`);let i={};try{let c=E__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]=sn()?go(n):n,i[U.KEYS.OTLP_RESOURCE_ATTRIBUTES]={[U.CUSTOM_PROVIDER_KEY]:U.CUSTOM_PROVIDER_VALUE};let a=JSON.stringify(i,null,2)+`
44
- `;try{if(E__namespace.readFileSync(o,"utf8")===a)return o}catch{}if(E__namespace.existsSync(o)){E__namespace.copyFileSync(o,o+".bkp");try{E__namespace.chmodSync(o+".bkp",384);}catch{}}E__namespace.writeFileSync(o,a,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(o,384);}catch{}return o}function wo(e){let t=L__namespace.dirname(e);E__namespace.mkdirSync(t,{recursive:true});let r={};try{let n=E__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){if(E__namespace.existsSync(e)){E__namespace.copyFileSync(e,e+".bkp");try{E__namespace.chmodSync(e+".bkp",384);}catch{}}r.deploymentMode=U.DEPLOYMENT_MODE,E__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
45
- `,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(e,384);}catch{}}}function pn(e,t){if(!bt())return {configured:false};let r=on(),n=e??H().OTEL_ENDPOINT,s=t!==void 0?t:V()??Eo(vt()),o=ho(s),i=To(r.metaPath),a=So(r.configLibraryDir,i,n,o);return yo(r.metaPath,i),wo(r.desktopConfigPath),{configured:true,configDir:r.configDir,configLibraryPath:a,uuid:i,wrapperScriptPath:o}}var _o,fr=T(()=>{"use strict";P();at();B();x();_o=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;});function mr(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let r=process.env.APPDATA;if(!r)try{let o=child_process.spawnSync("cmd.exe",["/c","echo","%APPDATA%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();o&&/^[A-Za-z]:\\/.test(o)&&(r=o);}catch(s){l("getVsCodeSettingsPath",`cmd.exe APPDATA lookup failed: ${s.message}`);}if(!r)return null;let n=r.replace(/^([A-Za-z]):/,(s,o)=>`/mnt/${o.toLowerCase()}`).replace(/\\/g,"/");return L__namespace.join(n,"Code","User","settings.json")}if(process.platform==="win32"){let r=process.env.APPDATA||L__namespace.join(ke__namespace.homedir(),"AppData","Roaming");return L__namespace.join(r,"Code","User","settings.json")}if(process.platform==="darwin")return L__namespace.join(ke__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let e=process.platform==="linux"&&process.getuid?.()===0?Ie().home:process.env.HOME||ke__namespace.homedir(),t=process.env.XDG_CONFIG_HOME||L__namespace.join(e,".config");return L__namespace.join(t,"Code","User","settings.json")}function dn(e){let t=false,r=false,n="";for(let s=0;s<e.length;s++){let o=e[s];if(t){n+=o,r?r=false:o==="\\"?r=true:o==='"'&&(t=false);continue}if(o==='"'){t=true,n+=o;continue}if(o===","){let i=s+1;for(;i<e.length&&/\s/.test(e[i]);)i++;if(i<e.length&&(e[i]==="}"||e[i]==="]"))continue}n+=o;}return n}function Ut(e){if(process.env[p.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(e&&E__namespace.existsSync(e));if(e&&(E__namespace.existsSync(e)||E__namespace.existsSync(L__namespace.dirname(e))||E__namespace.existsSync(L__namespace.dirname(L__namespace.dirname(e)))))return true;let t=mr();if(t&&(E__namespace.existsSync(t)||E__namespace.existsSync(L__namespace.dirname(t))||E__namespace.existsSync(L__namespace.dirname(L__namespace.dirname(t))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",L__namespace.join(ke__namespace.homedir(),"Applications","Visual Studio Code.app")].some(n=>E__namespace.existsSync(n)))return true;if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||L__namespace.join(ke__namespace.homedir(),"AppData","Local"),n=process.env.PROGRAMFILES||"C:\\Program Files",s=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([L__namespace.join(r,"Programs","Microsoft VS Code","Code.exe"),L__namespace.join(n,"Microsoft VS Code","Code.exe"),L__namespace.join(s,"Microsoft VS Code","Code.exe")].some(i=>E__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(n=>E__namespace.existsSync(n)))}function fn(e,t={}){let r;try{r=t.customSettingsPath||mr();}catch(n){return {status:"skipped",reason:`VS Code path resolution failed: ${n.message}`}}if(!r)return {status:"skipped",reason:"VS Code path not found"};if(!Ut(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(E__namespace.existsSync(r))try{let $=dn(E__namespace.readFileSync(r,"utf8"));n=JSON.parse($);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=e||H().OTEL_ENDPOINT,o=t.apiKey!==void 0?t.apiKey:V(),i=t.userEmail!==void 0?t.userEmail:be(),a=typeof n[_.HEADERS_KEY]=="object"&&n[_.HEADERS_KEY]!==null&&!Array.isArray(n[_.HEADERS_KEY])?n[_.HEADERS_KEY]:{},c={...a};o&&(c[_.HEADER_API_KEY]=o),i&&(c[_.HEADER_USER]=i);let u=Object.keys(c),h=Object.keys(a),d=u.length===0&&(n[_.HEADERS_KEY]===void 0||h.length===0)||u.length===h.length&&u.every($=>a[$]===c[$]);if(n[_.ENABLED_KEY]===_.ENABLED_VALUE&&n[_.EXPORTER_TYPE_KEY]===_.EXPORTER_TYPE_VALUE&&n[_.PROTOCOL_KEY]===_.PROTOCOL_VALUE&&n[_.ENDPOINT_KEY]===s&&d)return {status:"already_configured",settingsPath:r};E__namespace.mkdirSync(L__namespace.dirname(r),{recursive:!0});let S={...n,[_.ENABLED_KEY]:_.ENABLED_VALUE,[_.EXPORTER_TYPE_KEY]:_.EXPORTER_TYPE_VALUE,[_.PROTOCOL_KEY]:_.PROTOCOL_VALUE,[_.ENDPOINT_KEY]:s};return u.length>0&&(S[_.HEADERS_KEY]=c),E__namespace.writeFileSync(r,JSON.stringify(S,null,2)+`
46
- `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}function mn(e,t={}){let r;try{r=t.customSettingsPath||mr();}catch(n){return {status:"skipped",reason:`VS Code path resolution failed: ${n.message}`}}if(!r)return {status:"skipped",reason:"VS Code path not found"};if(!Ut(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(E__namespace.existsSync(r))try{let a=dn(E__namespace.readFileSync(r,"utf8"));n=JSON.parse(a);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=typeof n[_.HEADERS_KEY]=="object"&&n[_.HEADERS_KEY]!==null&&!Array.isArray(n[_.HEADERS_KEY])?n[_.HEADERS_KEY]:{};if(s[_.HEADER_API_KEY]===e)return {status:"already_configured",settingsPath:r};let o={...s,[_.HEADER_API_KEY]:e};E__namespace.mkdirSync(L__namespace.dirname(r),{recursive:!0});let i={...n,[_.ENABLED_KEY]:n[_.ENABLED_KEY]??_.ENABLED_VALUE,[_.EXPORTER_TYPE_KEY]:n[_.EXPORTER_TYPE_KEY]??_.EXPORTER_TYPE_VALUE,[_.PROTOCOL_KEY]:n[_.PROTOCOL_KEY]??_.PROTOCOL_VALUE,[_.ENDPOINT_KEY]:n[_.ENDPOINT_KEY]??H().OTEL_ENDPOINT,[_.HEADERS_KEY]:o};return E__namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
47
- `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}var gr=T(()=>{"use strict";P();B();at();x();});var En={};Z(En,{clearLoggedOutMarker:()=>hr,isLoggedOut:()=>Ro,markLoggedOut:()=>Lo});function Er(){return L__namespace.default.join(ke__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function Lo(){try{let e=Er();E__namespace.default.mkdirSync(L__namespace.default.dirname(e),{recursive:!0}),E__namespace.default.writeFileSync(e,"",{mode:384});}catch{}}function hr(){try{E__namespace.default.unlinkSync(Er());}catch{}}function Ro(){try{return E__namespace.default.existsSync(Er())}catch{return false}}var _r=T(()=>{"use strict";});function Tr(){return ut()??null}function ko(){return j(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=ko(),r=te(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 Y({clientId:r.clientId,clientSecret:r.clientSecret,tenant:r.tenant});await he({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=T(()=>{"use strict";Je();B();le();P();Re();});var ft={};Z(ft,{promptRaw:()=>Sr,runLogin:()=>vo});function re(e){return typeof e=="string"?e.replace(Io,""):e}function Sr(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=h=>{if(h===""){u(),n(new Error("SIGINT"));return}if(h==="\r"||h===`
48
- `){u(),process.stdout.write(`
49
- `),r(i);return}if(h==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}h.startsWith("\x1B")||(i+=h,process.stdout.write(s?"*".repeat(h.length):h));};function u(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",a),process.removeListener("unhandledRejection",a);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}async function $t(e,t,r=false){let n=Tr(),s=process.env.FLOW_BASE_URL;n&&(process.env.FLOW_BASE_URL=n);try{let{accessToken:o,expiresAt:i}=await Y(e);if(r)return {jwt:t,accessToken:o,expiresAt:i};Pe({[p.ANTHROPIC_AUTH_TOKEN]:t}),hr(),await he({accessToken:o,expiresAt:i});}finally{s===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=s;}}async function Po(e=false){try{let t=(await Sr(M(" ? ")+"Flow API Token (JWT): ",{masked:!0})).trim();if(!t)return process.stderr.write(k(` \u2717 Token is required
50
- `)),1;let r=te(t);if(!r)return process.stderr.write(k(` \u2717 Invalid Flow API Token
51
- `)),1;if(process.stdout.write(m(` Authenticating...
52
- `)),e){let n=await $t(r,t,!0);return process.stdout.write(`
53
- ${R("\u2713")} ${v("Authenticated")}
54
- `+m(` Tenant: ${re(r.tenant)}
55
- `)+m(` Storage: pending (will be written at end of init)
56
-
57
- `)),{code:0,result:n}}return await $t(r,t),process.stdout.write(`
58
- ${R("\u2713")} ${v("Authenticated")}
59
- `+m(` Tenant: ${re(r.tenant)}
60
- `)+m(` Storage: ANTHROPIC_AUTH_TOKEN (settings.json)
61
-
62
- `)),0}catch(t){if(t.message==="SIGINT"||t.message==="NOT_A_TTY")throw t;return process.stderr.write(`
63
- ${k("\u2717")} ${v("Authentication failed:")}
64
- ${re(t.message)}
65
-
66
- `),1}}async function vo(e={}){let t=Ot();if(t)return t;let{deferPersist:r=false,skipAuthCheck:n=false}=e;if(e.token){let o=e.token.trim(),i=te(o);if(!i)return process.stderr.write(k(` \u2717 Invalid Flow API Token
67
- `)),1;try{if(r){let a=await $t(i,o,!0);return process.stdout.write(R(` \u2713 Authenticated. Tenant: ${re(i.tenant)}
68
-
69
- `)),{code:0,result:a}}return await $t(i,o),process.stdout.write(R(` \u2713 Authenticated. Tenant: ${re(i.tenant)}
70
-
71
- `)),0}catch(a){return process.stderr.write(k(` \u2717 Authentication failed: ${re(a.message)}
72
- `)),1}}if(e.clientId||e.clientSecret||e.tenant)return process.stderr.write(k(` \u2717 Passing individual credential flags (--client-id, --client-secret, --tenant) is no longer supported.
73
- `)+` LiteLLM requires a signed Flow API Token. Pass --token <JWT> instead.
74
-
75
- `),1;let s=await Nt();if(!n){if(process.stdout.write(`
76
- `),process.stdout.write(v(` Auth
77
- `)),s.notConfigured)return process.stdout.write(` ${I("\u26A0")} Not configured
78
- `),process.stdout.write(m(" Run `flow-ai-obs init` to set up the environment first.\n")),process.stdout.write(`
79
- `),1;if(s.ok){process.stdout.write(` ${R("\u2713")} Authenticated
80
- `),process.stdout.write(m(" URL: ")+re(s.baseUrl)+`
81
- `),process.stdout.write(m(" Tenant: ")+re(s.tenant)+`
82
- `),process.stdout.write(m(" User: ")+re(s.user)+`
83
- `),process.stdout.write(`
84
- `);let o;try{o=await Sr(M(" ? ")+"Re-authenticate? (y/N): ");}catch(i){if(i.message==="SIGINT")return process.stdout.write(`
85
- `),130;if(i.message==="NOT_A_TTY")return process.stdout.write(R(` \u2713 Using existing credentials.
86
-
87
- `)),0;throw i}if(o.trim().toLowerCase()!=="y")return process.stdout.write(R(` \u2713 Using existing credentials.
88
-
89
- `)),0}else s.error==="No credentials found"?(process.stdout.write(` ${I("\u26A0")} Not authenticated
90
- `),process.stdout.write(m(` URL: ${s.baseUrl}
91
- `)),process.stdout.write(`
92
- `)):(process.stdout.write(` ${I("\u26A0")} Session not valid for current endpoint
93
- `),process.stdout.write(m(" URL: ")+re(s.baseUrl)+`
94
- `),process.stdout.write(m(" Tenant: ")+re(s.tenant)+`
95
- `),process.stdout.write(m(" User: ")+m("(not authenticated)")+`
96
- `),process.stdout.write(`
97
- `));}try{return await Po(r)}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
98
- `),130;if(o.message==="NOT_A_TTY")return process.stderr.write(k(` \u2717 No TTY available for interactive login.
99
- `)+` Pass --token <JWT> for non-interactive use.
100
-
101
- `),1;throw o}}var Io,mt=T(()=>{"use strict";Je();_r();Re();B();le();P();de();Lt();yr();Io=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var yn={};Z(yn,{normalizeCustomUrl:()=>Tn,runInit:()=>Co,validateCustomUrl:()=>Or,validateEmail:()=>Ar});function Ft(e,t,r){process.stdout.write(v(M(`
102
- [${e}/${t}] ${r}
103
- `)));}function _e(e){process.stdout.write(` ${R("\u2713")} ${e}
104
- `);}function Ce(e){process.stdout.write(` ${I("\u26A0")} ${e}
105
- `);}function Ue(e){process.stdout.write(` ${m(e)}
106
- `);}function hn(){return !!j(p.ANTHROPIC_AUTH_TOKEN)}function bo(){let e=or();if(!e)return null;Pe({FLOW_BASE_URL:e});try{let t=Rt(),r={};try{r=JSON.parse(E__namespace.readFileSync(t,"utf8"));}catch{return e}delete r.baseUrl,Object.keys(r).length===0?E__namespace.unlinkSync(t):E__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
107
- `,{encoding:"utf8",mode:384});}catch{}return e}function Tn(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 Or(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.
108
- Received: ${e}
33
+ `),1}var Re=E(()=>{"use strict";ut();});function rt(t={}){let e=t.env??process.env,r=t.platform??process.platform;return !!(e.WSL_DISTRO_NAME&&r==="linux")}function xt(t,e={}){let r=e.env??process.env,n=e.spawnSync??child_process.spawnSync;if(!rt({env:r,platform:e.platform}))return;let s=r[t];if(!s)try{let i=n("cmd.exe",["/c","echo",`%${t}%`],{encoding:"utf8",timeout:5e3}).stdout?.trim();i&&/^[A-Za-z]:\\/.test(i)&&(s=i);}catch(o){l("resolveWslWindowsPath",`cmd.exe ${t} lookup failed: ${o.message}`);}if(s)return s.replace(/^([A-Za-z]):/,(o,i)=>`/mnt/${i.toLowerCase()}`).replace(/\\/g,"/")}function nt(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER)try{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}}catch(t){l("getActualUser",`getent passwd lookup failed: ${t.message}`);}return {home:At__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||At__namespace.userInfo().username}}function G(){if(rt()){let t=xt("USERPROFILE");return t?w__namespace.join(t,".claude","settings.json"):w__namespace.join(At__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||At__namespace.homedir();return w__namespace.join(t,".claude","settings.json")}return w__namespace.join(nt().home,".claude","settings.json")}var Mt=E(()=>{"use strict";W();Re();});function te(){if(process.platform==="win32"){let r=process.env.APPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Roaming");return w__namespace.join(r,dr,fr)}let t=nt(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t.home,".config");return w__namespace.join(e,dr,fr)}function Pe(){let{getPersistedFlowBaseUrl:t}=(wt(),F(gr));return t()??null}var dr,fr,ke=E(()=>{"use strict";Mt();dr="flow-ai-obs",fr="config.json";});var gr={};z(gr,{addEnvToClaudeSettings:()=>Ue,getClaudeSettingsPath:()=>G,getEffectiveEnv:()=>Ce,getEnvFromClaudeSettings:()=>pt,getPersistedFlowBaseUrl:()=>Er,removeEnvFromClaudeSettings:()=>us,resolveFlowBaseUrl:()=>Ne,writeClaudeSettings:()=>be});function Ie(t){try{let e=m__namespace.statSync(t);Date.now()-e.mtimeMs>cs&&m__namespace.unlinkSync(t);}catch{}try{m__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 ve(t){try{m__namespace.unlinkSync(t);}catch{}}function ls(t){let e=[];if(!t.hooks||typeof t.hooks!="object"||Array.isArray(t.hooks))return delete t.hooks,e;let r=t.hooks,n={};for(let[s,o]of Object.entries(r)){if(!Array.isArray(o))continue;let i=o.map(a=>{if(!Array.isArray(a?.hooks))return null;let c=a.hooks.filter(u=>!u.command?.startsWith?.(Qt.CLI));return c.length>0?{...a,hooks:c}:null}).filter(a=>a!=null);i.length>0&&(n[s]=i,e.push(s));}return Object.keys(n).length>0?t.hooks=n:delete t.hooks,e}function be(t,e){let r=G(),n=r+".lock";m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:true}),Ie(n);try{if(m__namespace.existsSync(r)){m__namespace.copyFileSync(r,r+".bkp");try{m__namespace.chmodSync(r+".bkp",384);}catch{}}let s=te();if(m__namespace.existsSync(s)){let L=s+".bkp";m__namespace.copyFileSync(s,L);try{m__namespace.chmodSync(L,384);}catch{}}let o={};try{o=JSON.parse(m__namespace.readFileSync(r,"utf8"));}catch{}let i=o.env&&typeof o.env=="object"?o.env:{};delete i.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:a}=(U(),F(cr)),c=a().OTEL_ENDPOINT,u={...et,OTEL_EXPORTER_OTLP_ENDPOINT:t??c};o.env={...i,...u,...e??{}},o.otelHeadersHelper="flow-ai-obs otel-headers";let h=ls(o);m__namespace.writeFileSync(r,JSON.stringify(o,null,2)+`
34
+ `,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(r,384);}catch{}return st=void 0,{settingsPath:r,preserved:h}}finally{ve(n);}}function pt(t){if(st===void 0)try{let r=m__namespace.readFileSync(G(),"utf8");st=JSON.parse(r).env??null;}catch{st=null;}if(!st)return null;let e=st[t];return typeof e=="string"?e:null}function Ue(t){let e=G(),r=e+".lock";m__namespace.mkdirSync(w__namespace.dirname(e),{recursive:true}),Ie(r);try{let n={};try{n=JSON.parse(m__namespace.readFileSync(e,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,t),m__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
35
+ `,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(e,384);}catch{}st=void 0;}finally{ve(r);}}function us(t){let e=G(),r=e+".lock";m__namespace.mkdirSync(w__namespace.dirname(e),{recursive:true}),Ie(r);try{let n={};try{n=JSON.parse(m__namespace.readFileSync(e,"utf8"));}catch{return}if(!n.env||typeof n.env!="object")return;for(let s of t)delete n.env[s];m__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
36
+ `,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(e,384);}catch{}st=void 0;}finally{ve(r);}}function Ce(t){let e=process.env[t];return e!==void 0?e!==""?e:void 0:pt(t)??void 0}function Er(){let t=pt(d.FLOW_BASE_URL);return t&&t.trim()?t.trim():void 0}function Ne(){let t=process.env[d.FLOW_BASE_URL];return t&&t.trim()?t.trim():Er()}var cs,st,wt=E(()=>{"use strict";U();Mt();ke();cs=Qt.LOCK_STALE_MS;});function fs(t){return ds.some(e=>e.test(t))}function re(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[d.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&fs(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}function ms(t){let e=process.env[d.OTEL_EXPORTER_OTLP_HEADERS];if(!e)return null;let r=t.toLowerCase();for(let n of e.split(",")){let s=n.indexOf("=");if(!(s<=0)&&n.slice(0,s).trim().toLowerCase()===r){let o=n.slice(s+1),i=o.search(/[\r\n]/);return (i===-1?o:o.slice(0,i)).trim()||null}}return null}function K(){let t=Ce(d.FLOW_USER_EMAIL);if(t!==void 0){let r=t.replace(/[\r\n]/g,"").trim();if(r)if(r.length>H.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${H.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!H.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=ms("x-flow-user");if(e){let r=e.replace(/[\r\n]/g,"").trim();if(r.length>H.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${H.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!H.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=At__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 X(t){if(!t)return null;let e=t.replace(/[\r\n]/g,"").trim();return e?e.length>H.API_KEY_MAX_LENGTH?(l("validateApiKey",`API key exceeds ${H.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):H.API_KEY_PATTERN.test(e)?e:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function $(){let t=process.env[d.FLOW_API_KEY];return X(t)}function gs(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 Lt(){let t=[],e=process.env[d.FLOW_TELEMETRY]==="true",r=process.env[d.LANGFUSE_BASE_URL],n=process.env[d.LANGFUSE_PUBLIC_KEY],s=process.env[d.LANGFUSE_SECRET_KEY];if(e&&r&&n&&s){let o={user:K()??"",tenant:"",team:"",project:""};t.push({mode:"direct",...gs(re(r),n,s),...o}),l("resolveCredentials","direct mode active",`user=${o.user}`);}return t}var ds,J=E(()=>{"use strict";U();W();wt();ds=[/^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 se(){return process.platform==="win32"||rt()}function Es(t){let e=t.match(/^\/mnt\/([a-z])\/(.*)$/);if(!e)return t;let r=e[1].toUpperCase(),n=e[2].replace(/\//g,"\\");return `${r}:\\${n}`}function _r(){if(rt()){let n=xt("LOCALAPPDATA");if(n){let s=w__namespace.join(n,R.DIR_3P);return ne(s)}}if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),s=w__namespace.join(n,R.DIR_3P);return ne(s)}if(process.platform==="darwin"){let n=w__namespace.join(At__namespace.homedir(),"Library","Application Support",R.DIR_3P);return ne(n)}let t=nt(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t.home,".config"),r=w__namespace.join(e,R.DIR_3P);return ne(r)}function ne(t){return {configDir:t,configLibraryDir:w__namespace.join(t,R.CONFIG_LIBRARY_DIR),desktopConfigPath:w__namespace.join(t,R.DESKTOP_CONFIG_FILE),metaPath:w__namespace.join(t,R.CONFIG_LIBRARY_DIR,R.META_FILE)}}function oe(){let t=G(),e=w__namespace.dirname(t),r=se()?R.WRAPPER_SCRIPT_WIN:R.WRAPPER_SCRIPT_UNIX;return w__namespace.join(e,r)}function ie(){if(process.env[d.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let t=_r();if(m__namespace.existsSync(t.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",w__namespace.join(At__namespace.homedir(),"Applications","Claude.app")].some(r=>m__namespace.existsSync(r));if(process.platform==="win32"){let e=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files";return [w__namespace.join(e,"AnthropicClaude","Claude.exe"),w__namespace.join(r,"Claude","Claude.exe")].some(s=>m__namespace.existsSync(s))}if(process.platform==="linux"){let e=nt(),r=process.env.XDG_CONFIG_HOME||w__namespace.join(e.home,".config"),n=w__namespace.join(r,"Claude");return m__namespace.existsSync(n)}return false}function hs(t){let e=t??oe();try{if(!m__namespace.existsSync(e))return null;let r=m__namespace.readFileSync(e,"utf8"),n=r.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(n&&n[1])return X(n[1]);let s=r.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(s&&s[1])return X(s[1])}catch{}return null}function Sr(t,e,r=448){let n=w__namespace.dirname(t);m__namespace.mkdirSync(n,{recursive:true});let s=se(),o=s?420:r,i=true;try{m__namespace.readFileSync(t,"utf8")===e&&(i=!1);}catch{}if(!i){if(!s)try{m__namespace.chmodSync(t,r);}catch{}return {written:false}}if(m__namespace.existsSync(t)&&(m__namespace.copyFileSync(t,t+".bkp"),!s))try{m__namespace.chmodSync(t+".bkp",448);}catch{}if(m__namespace.writeFileSync(t,e,{encoding:"utf8",mode:o}),!s)try{m__namespace.chmodSync(t,r);}catch{}return {written:true}}function _s(t){let e=oe(),r=t?X(t):null,n=se()?Tr(r):yr(r);return Sr(e,n,!!r?448:493),e}function yr(t){let e=t?X(t):null,r=["#!/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"];return e&&r.push(`export FLOW_API_KEY="${e}"`),r.push("exec flow-ai-obs otel-headers",""),r.join(`
37
+ `)}function Tr(t){let e=t?X(t):null,r=["@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."];return e&&r.push(`set FLOW_API_KEY=${e}`),r.push("flow-ai-obs otel-headers",""),r.join(`\r
38
+ `)}function Or(t){if(!ie())return {status:"skipped",reason:"Claude Desktop is not installed"};let e=X(t);if(!e)return {status:"skipped",reason:"Invalid API key provided"};try{let r=oe(),n=se()?Tr(e):yr(e),{written:s}=Sr(r,n,448);return {status:s?"configured":"already_configured",wrapperScriptPath:r}}catch(r){return {status:"skipped",reason:r.message}}}function ys(t){try{let e=m__namespace.readFileSync(t,"utf8");try{let r=JSON.parse(e);if(r.appliedId&&typeof r.appliedId=="string"&&Ss.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 ${t} \u2014 generating new UUID`);}}catch(e){e.code!=="ENOENT"&&l("getOrCreateConfigUuid",`read error: ${e.message}`);}return hr__namespace.randomUUID()}function Ts(t,e){let r=w__namespace.dirname(t);m__namespace.mkdirSync(r,{recursive:true});let n;try{let o=m__namespace.readFileSync(t,"utf8");try{n=JSON.parse(o),(!n.appliedId||typeof n.appliedId!="string")&&(n.appliedId=e),Array.isArray(n.entries)||(n.entries=[]);}catch{l("writeMetaJson",`corrupted JSON in ${t} \u2014 starting fresh`),n={appliedId:e,entries:[]};}}catch(o){o.code!=="ENOENT"&&l("writeMetaJson",`read error: ${o.message}`),n={appliedId:e,entries:[]};}n.entries.some(o=>o.id===e)||n.entries.push({id:e,name:R.CONFIG_NAME});let s=JSON.stringify(n,null,2)+`
39
+ `;try{if(m__namespace.readFileSync(t,"utf8")===s)return}catch{}if(m__namespace.existsSync(t)){m__namespace.copyFileSync(t,t+".bkp");try{m__namespace.chmodSync(t+".bkp",384);}catch{}}m__namespace.writeFileSync(t,s,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(t,384);}catch{}}function Os(t,e,r,n){m__namespace.mkdirSync(t,{recursive:true});let s=w__namespace.resolve(t),o=w__namespace.resolve(t,`${e}.json`);if(!o.startsWith(s+w__namespace.sep))throw new Error(`Security error: invalid config path ${o}`);let i={};try{let c=m__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[R.KEYS.OTLP_ENDPOINT]=r,i[R.KEYS.OTLP_PROTOCOL]=R.OTLP_PROTOCOL,i[R.KEYS.OTLP_HEADERS_HELPER]=rt()?Es(n):n,i[R.KEYS.OTLP_RESOURCE_ATTRIBUTES]={[R.CUSTOM_PROVIDER_KEY]:R.CUSTOM_PROVIDER_VALUE};let a=JSON.stringify(i,null,2)+`
40
+ `;try{if(m__namespace.readFileSync(o,"utf8")===a)return o}catch{}if(m__namespace.existsSync(o)){m__namespace.copyFileSync(o,o+".bkp");try{m__namespace.chmodSync(o+".bkp",384);}catch{}}m__namespace.writeFileSync(o,a,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(o,384);}catch{}return o}function ws(t){let e=w__namespace.dirname(t);m__namespace.mkdirSync(e,{recursive:true});let r={};try{let n=m__namespace.readFileSync(t,"utf8");try{r=JSON.parse(n);}catch{l("mergeClaudeDesktopConfig",`corrupted JSON in ${t} \u2014 starting fresh (original backed up to .bkp)`);}}catch(n){n.code!=="ENOENT"&&l("mergeClaudeDesktopConfig",`read error: ${n.message}`);}if(r.deploymentMode!==R.DEPLOYMENT_MODE){if(m__namespace.existsSync(t)){m__namespace.copyFileSync(t,t+".bkp");try{m__namespace.chmodSync(t+".bkp",384);}catch{}}r.deploymentMode=R.DEPLOYMENT_MODE,m__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
41
+ `,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(t,384);}catch{}}}function wr(t,e){if(!ie())return {configured:false};let r=_r(),n=t??Z().OTEL_ENDPOINT,s=e!==void 0?e:$()??hs(oe()),o=_s(s),i=ys(r.metaPath),a=Os(r.configLibraryDir,i,n,o);return Ts(r.metaPath,i),ws(r.desktopConfigPath),{configured:true,configDir:r.configDir,configLibraryPath:a,uuid:i,wrapperScriptPath:o}}var Ss,$e=E(()=>{"use strict";U();Mt();J();W();Ss=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;});function De(){if(rt()){let r=xt("APPDATA");return r?w__namespace.join(r,"Code","User","settings.json"):null}if(process.platform==="win32"){let r=process.env.APPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Roaming");return w__namespace.join(r,"Code","User","settings.json")}if(process.platform==="darwin")return w__namespace.join(At__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let t=process.platform==="linux"&&process.getuid?.()===0?nt().home:process.env.HOME||At__namespace.homedir(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t,".config");return w__namespace.join(e,"Code","User","settings.json")}function Lr(t){let e=false,r=false,n="";for(let s=0;s<t.length;s++){let o=t[s];if(e){n+=o,r?r=false:o==="\\"?r=true:o==='"'&&(e=false);continue}if(o==='"'){e=true,n+=o;continue}if(o===","){let i=s+1;for(;i<t.length&&/\s/.test(t[i]);)i++;if(i<t.length&&(t[i]==="}"||t[i]==="]"))continue}n+=o;}return n}function ae(t){if(process.env[d.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(t&&m__namespace.existsSync(t));if(t&&(m__namespace.existsSync(t)||m__namespace.existsSync(w__namespace.dirname(t))||m__namespace.existsSync(w__namespace.dirname(w__namespace.dirname(t)))))return true;let e=De();if(e&&(m__namespace.existsSync(e)||m__namespace.existsSync(w__namespace.dirname(e))||m__namespace.existsSync(w__namespace.dirname(w__namespace.dirname(e))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",w__namespace.join(At__namespace.homedir(),"Applications","Visual Studio Code.app")].some(n=>m__namespace.existsSync(n)))return true;if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),n=process.env.PROGRAMFILES||"C:\\Program Files",s=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([w__namespace.join(r,"Programs","Microsoft VS Code","Code.exe"),w__namespace.join(n,"Microsoft VS Code","Code.exe"),w__namespace.join(s,"Microsoft VS Code","Code.exe")].some(i=>m__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(n=>m__namespace.existsSync(n)))}function Ar(t,e={}){let r;try{r=e.customSettingsPath||De();}catch(n){return {status:"skipped",reason:`VS Code path resolution failed: ${n.message}`}}if(!r)return {status:"skipped",reason:"VS Code path not found"};if(!ae(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(m__namespace.existsSync(r))try{let p=Lr(m__namespace.readFileSync(r,"utf8"));n=JSON.parse(p);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=t||Z().OTEL_ENDPOINT,o=e.apiKey!==void 0?e.apiKey:$(),i=e.userEmail!==void 0?e.userEmail:K(),a=typeof n[g.HEADERS_KEY]=="object"&&n[g.HEADERS_KEY]!==null&&!Array.isArray(n[g.HEADERS_KEY])?n[g.HEADERS_KEY]:{},c={...a};o&&(c[g.HEADER_API_KEY]=o),i&&(c[g.HEADER_USER]=i);let u=Object.keys(c),h=Object.keys(a),L=u.length===0&&(n[g.HEADERS_KEY]===void 0||h.length===0)||u.length===h.length&&u.every(p=>a[p]===c[p]);if(n[g.ENABLED_KEY]===g.ENABLED_VALUE&&n[g.EXPORTER_TYPE_KEY]===g.EXPORTER_TYPE_VALUE&&n[g.PROTOCOL_KEY]===g.PROTOCOL_VALUE&&n[g.ENDPOINT_KEY]===s&&L)return {status:"already_configured",settingsPath:r};m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:!0});let A={...n,[g.ENABLED_KEY]:g.ENABLED_VALUE,[g.EXPORTER_TYPE_KEY]:g.EXPORTER_TYPE_VALUE,[g.PROTOCOL_KEY]:g.PROTOCOL_VALUE,[g.ENDPOINT_KEY]:s};return u.length>0&&(A[g.HEADERS_KEY]=c),m__namespace.writeFileSync(r,JSON.stringify(A,null,2)+`
42
+ `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}function Rr(t,e={}){let r;try{r=e.customSettingsPath||De();}catch(n){return {status:"skipped",reason:`VS Code path resolution failed: ${n.message}`}}if(!r)return {status:"skipped",reason:"VS Code path not found"};if(!ae(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(m__namespace.existsSync(r))try{let a=Lr(m__namespace.readFileSync(r,"utf8"));n=JSON.parse(a);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=typeof n[g.HEADERS_KEY]=="object"&&n[g.HEADERS_KEY]!==null&&!Array.isArray(n[g.HEADERS_KEY])?n[g.HEADERS_KEY]:{};if(s[g.HEADER_API_KEY]===t)return {status:"already_configured",settingsPath:r};let o={...s,[g.HEADER_API_KEY]:t};m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:!0});let i={...n,[g.ENABLED_KEY]:n[g.ENABLED_KEY]??g.ENABLED_VALUE,[g.EXPORTER_TYPE_KEY]:n[g.EXPORTER_TYPE_KEY]??g.EXPORTER_TYPE_VALUE,[g.PROTOCOL_KEY]:n[g.PROTOCOL_KEY]??g.PROTOCOL_VALUE,[g.ENDPOINT_KEY]:n[g.ENDPOINT_KEY]??Z().OTEL_ENDPOINT,[g.HEADERS_KEY]:o};return m__namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
43
+ `,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}var Fe=E(()=>{"use strict";U();J();Mt();});var Ir={};z(Ir,{normalizeCustomUrl:()=>kr,runInit:()=>Rs,validateCustomUrl:()=>Ke,validateEmail:()=>We});function xe(t,e,r){process.stdout.write(b(j(`
44
+ [${t}/${e}] ${r}
45
+ `)));}function dt(t){process.stdout.write(` ${v("\u2713")} ${t}
46
+ `);}function ft(t){process.stdout.write(` ${C("\u26A0")} ${t}
47
+ `);}function Rt(t){process.stdout.write(` ${S(t)}
48
+ `);}function Ls(){let t=Pe();if(!t)return null;Ue({FLOW_BASE_URL:t});try{let e=te(),r={};try{r=JSON.parse(m__namespace.readFileSync(e,"utf8"));}catch{return t}delete r.baseUrl,Object.keys(r).length===0?m__namespace.unlinkSync(e):m__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
49
+ `,{encoding:"utf8",mode:384});}catch{}return t}function kr(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 Ke(t,e=false){if(e){let o=/^https?:\/\//i.test(t.trim())?t.trim().replace(/\\/g,"/"):`https://${t.trim().replace(/\\/g,"/")}`,i;try{i=new URL(o);}catch{throw new Error(`Invalid URL: ${t}`)}if(i.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(i.pathname!=="/"&&i.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
50
+ Received: ${t}
109
51
  Expected: https://tenant.example.com`);if(i.search)throw new Error(`Custom URL must not contain query parameters.
110
- Received: ${e}
52
+ Received: ${t}
111
53
  Expected: https://tenant.example.com`);if(i.hash)throw new Error(`Custom URL must not contain a fragment.
112
- Received: ${e}
54
+ Received: ${t}
113
55
  Expected: https://tenant.example.com`);if(i.username||i.password)throw new Error(`Custom URL must not contain embedded credentials.
114
- Received: ${e}
115
- 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],ve(a);}finally{c!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=c);}return a}let r=Tn(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],ve(r);}finally{s!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function wr(){for(let e=1;e<=3;e++)try{let t=await Xt(" Enter your Flow domain (e.g., tenant.ciandt.com)");return Or(t)}catch(t){if(process.stderr.write(I(` \u2717 ${t.message}
56
+ Received: ${t}
57
+ 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[d.FLOW_OBS_ALLOW_HTTP];try{delete process.env[d.FLOW_OBS_ALLOW_HTTP],re(a);}finally{c!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=c);}return a}let r=kr(t),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${t}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!n.hostname.includes("."))throw new Error(`Invalid domain: ${n.hostname}. Expected format: tenant.example.com`);let s=process.env[d.FLOW_OBS_ALLOW_HTTP];try{delete process.env[d.FLOW_OBS_ALLOW_HTTP],re(r);}finally{s!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function Me(){for(let t=1;t<=3;t++)try{let e=await qt(" Enter your Flow domain (e.g., tenant.ciandt.com)");return Ke(e)}catch(e){if(process.stderr.write(C(` \u2717 ${e.message}
116
58
 
117
- `)),e===3)throw process.stderr.write(k(` Too many invalid attempts.
59
+ `)),t===3)throw process.stderr.write(N(` Too many invalid attempts.
118
60
 
119
- `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function _n(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 Uo(e,t,r){let n=j(p.FLOW_USER_EMAIL),s=be(),o=s??"(could not be derived)";if(!e||!fe()){if(r){let c=_n(r);if(!c)throw new Error("--custom-email: value is empty after normalization");let u=Ar(c);if(u)throw new Error(`--custom-email: ${u}`);return _e(`Email: ${v(c)}`),c}return n??s?_e(`Email: ${v(n??s)}`):Ce(`Email not configured \u2014 telemetry will not include user identity.
120
- To set it: flow-ai-obs init --custom-email <you@company.com>`),null}r&&Ce("--custom-email is ignored in interactive mode. Use --no-interactive to apply it.");async function i(){for(let c=1;c<=3;c++){let u;try{u=await Xt(" Enter your corporate email (e.g., user@company.com)");}catch(y){throw process.stderr.write(k(` \u2717 Input error: ${y.message}
61
+ `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function Pr(t){return t.replace(/[\r\n]/g,"").trim()}function We(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 As(t,e,r){let n=pt(d.FLOW_USER_EMAIL),s=K(),o=s??"(could not be derived)";if(!t||!tt()){if(r){let c=Pr(r);if(!c)throw new Error("--custom-email: value is empty after normalization");let u=We(c);if(u)throw new Error(`--custom-email: ${u}`);return dt(`Email: ${b(c)}`),c}return n??s?dt(`Email: ${b(n??s)}`):ft(`Email not configured \u2014 telemetry will not include user identity.
62
+ To set it: flow-ai-obs init --custom-email <you@company.com>`),null}r&&ft("--custom-email is ignored in interactive mode. Use --no-interactive to apply it.");async function i(){for(let c=1;c<=3;c++){let u;try{u=await qt(" Enter your corporate email (e.g., user@company.com)");}catch(I){throw process.stderr.write(N(` \u2717 Input error: ${I.message}
121
63
 
122
- `)),y}let h=_n(u),d=Ar(h);if(!d)return h;process.stderr.write(I(` \u2717 ${d}
64
+ `)),I}let h=Pr(u),L=We(h);if(!L)return h;process.stderr.write(C(` \u2717 ${L}
123
65
 
124
- `));}throw process.stderr.write(k(` Too many invalid attempts.
66
+ `));}throw process.stderr.write(N(` Too many invalid attempts.
125
67
 
126
- `)),new Error("Too many invalid email attempts")}async function a(){let c=await i();return process.stdout.write(R(` \u2713 Email: ${c}
68
+ `)),new Error("Too many invalid email attempts")}async function a(){let c=await i();return process.stdout.write(v(` \u2713 Email: ${c}
127
69
 
128
- `)),c}return n?await st(` Registered email: ${v(n)} \u2014 still correct?`,true)?(process.stdout.write(R(` \u2713 Email: ${v(n)}
70
+ `)),c}return n?await yt(` Registered email: ${b(n)} \u2014 still correct?`,true)?(process.stdout.write(v(` \u2713 Email: ${b(n)}
129
71
 
130
- `)),null):a():s?t?await st(" Is your corporate email domain @ciandt.com?",true)?(process.stdout.write(R(` \u2713 Email: ${v(o)}
72
+ `)),null):a():s?e?await yt(" Is your corporate email domain @ciandt.com?",true)?(process.stdout.write(v(` \u2713 Email: ${b(o)}
131
73
 
132
- `)),s):a():(process.stdout.write(R(` \u2713 Email: ${v(o)}
74
+ `)),s):a():(process.stdout.write(v(` \u2713 Email: ${b(o)}
133
75
 
134
- `)),s):(process.stdout.write(I(`
76
+ `)),s):(process.stdout.write(C(`
135
77
  \u26A0 Could not derive email from OS username.
136
- `)),a())}function gt(){let e=j(p.FLOW_BASE_URL);return e&&e.trim()?e.trim():null}async function Co(e={}){let t=Ot();if(t)return t;let r=e.url,n=!!V();!n&&process.env[p.FLOW_API_KEY]&&Ce(`FLOW_API_KEY appears to be misconfigured \u2014 authentication with Flow is required.
137
- To fix: unset FLOW_API_KEY && flow-ai-obs init`);let s=n?3:4;process.stdout.write(v(M(`
78
+ `)),a())}function ce(){let t=pt(d.FLOW_BASE_URL);return t&&t.trim()?t.trim():null}async function Rs(t={}){let e=ur();if(e)return e;let r=t.url,n=!!$();n||ft(process.env[d.FLOW_API_KEY]?`FLOW_API_KEY is set but invalid \u2014 telemetry will not authenticate.
79
+ To fix: set a valid FLOW_API_KEY and re-run flow-ai-obs init`:`FLOW_API_KEY is not set \u2014 telemetry will not authenticate until it is configured.
80
+ Set FLOW_API_KEY in your environment, then re-run flow-ai-obs init`);let s=3;process.stdout.write(b(j(`
138
81
  flow-ai-obs init
139
- `))),process.stdout.write(m(` Configuring your development environment:
140
-
141
- `)),process.stdout.write(m(` [1/${s}] Flow Environment Setup Configure Flow URLs and LLM routing
142
- `)),process.stdout.write(m(` [2/${s}] User Identity Capture user email for telemetry
143
- `)),n?process.stdout.write(m(` [3/${s}] Observability OpenTelemetry metrics, logs and traces
144
- `)):(process.stdout.write(m(` [3/${s}] Authentication Authenticate with Flow
145
- `)),process.stdout.write(m(` [4/${s}] Observability OpenTelemetry metrics, logs and traces
146
- `))),Ft(1,s,"Flow Environment Setup");let o=false;{let f=j(p.FLOW_BASE_URL);if(f&&(Ce(`Base URL already configured (FLOW_BASE_URL=${f})`),!e.noInteractive&&fe()))try{let{promptRaw:F}=await Promise.resolve().then(()=>(mt(),ft));o=(await F(M(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",o||Ue("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(I(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
147
- `)+I(" on Windows too: ")+M(`npm install -g @ciandt-flow/flow-ai-obs
148
- `)+I(` Without the Windows install, observability will not work for the Windows-side code assistant.
149
-
150
- `)),bo(),!r&&!e.noInteractive&&fe()){let f=gt();o?r=await wr():f?(process.stdout.write(`
151
- Current base URL: ${v(f)}
152
- `),await st(" Keep this URL?",true)||(r=await wr())):(process.stdout.write(`
153
- `),await st(" Does your organization use a custom Flow URL?",false)?r=await wr():_e("Using default Flow Base URL: https://flow.ciandt.com")),process.stdout.write(`
154
- `);}if(!r&&!e.noInteractive&&!fe()){let f=gt();if(f)process.stdout.write(I(` \u26A0 Non-interactive environment detected.
155
- `)+m(` Using URL: ${f}
82
+ `))),process.stdout.write(S(` Configuring your development environment:
83
+
84
+ `)),process.stdout.write(S(` [1/${s}] Flow Environment Setup Configure Flow URLs and LLM routing
85
+ `)),process.stdout.write(S(` [2/${s}] User Identity Capture user email for telemetry
86
+ `)),process.stdout.write(S(` [3/${s}] Observability OpenTelemetry metrics, logs and traces
87
+ `)),xe(1,s,"Flow Environment Setup");let o=false;{let p=pt(d.FLOW_BASE_URL);if(p&&(ft(`Base URL already configured (FLOW_BASE_URL=${p})`),!t.noInteractive&&tt()))try{let{promptRaw:O}=await Promise.resolve().then(()=>(zt(),er));o=(await O(j(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",o||Rt("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(C(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
88
+ `)+C(" on Windows too: ")+j(`npm install -g @ciandt-flow/flow-ai-obs
89
+ `)+C(` Without the Windows install, observability will not work for the Windows-side code assistant.
90
+
91
+ `)),Ls(),!r&&!t.noInteractive&&tt()){let p=ce();o?r=await Me():p?(process.stdout.write(`
92
+ Current base URL: ${b(p)}
93
+ `),await yt(" Keep this URL?",true)||(r=await Me())):(process.stdout.write(`
94
+ `),await yt(" Does your organization use a custom Flow URL?",false)?r=await Me():dt("Using default Flow Base URL: https://flow.ciandt.com")),process.stdout.write(`
95
+ `);}if(!r&&!t.noInteractive&&!tt()){let p=ce();if(p)process.stdout.write(C(` \u26A0 Non-interactive environment detected.
96
+ `)+S(` Using URL: ${p}
156
97
 
157
98
  `));else return process.stderr.write(` \u2717 No URL configured and no TTY available.
158
99
  Run: flow-ai-obs init --custom-url <URL>
159
100
 
160
- `),1}let i,a=false;if(r){let f;try{f=Or(r,!0);}catch(se){return process.stderr.write(`
161
- \u2717 Invalid --custom-url: ${se.message}
101
+ `),1}let i;if(r){let p;try{p=Ke(r,!0);}catch(ct){return process.stderr.write(`
102
+ \u2717 Invalid --custom-url: ${ct.message}
162
103
 
163
- `),1}let F=gt();i=f,a=!!F&&F!==f,a?process.stdout.write(I(` \u26A0 Base URL changed \u2014 re-authentication required.
164
- `)+m(` Previous: ${F}
165
- `)+m(` New: ${f}
104
+ `),1}let O=ce();i=p,O&&O!==p?process.stdout.write(C(` \u26A0 Base URL changed.
105
+ `)+S(` Previous: ${O}
106
+ `)+S(` New: ${p}
166
107
 
167
- `)):process.stdout.write(R(` \u2713 Base URL configured: ${f}
108
+ `)):process.stdout.write(v(` \u2713 Base URL configured: ${p}
168
109
 
169
- `));}else i=gt()??"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(R(`
110
+ `));}else i=ce()??"https://flow.ciandt.com";let a={FLOW_BASE_URL:i,OTEL_EXPORTER_OTLP_ENDPOINT:`${i}/otel`};process.env.FLOW_BASE_URL=i,process.stdout.write(v(`
170
111
  \u2713 Flow environment ready.
171
- `));let u=36;for(let[f,F]of Object.entries(c))process.stdout.write(m(` ${f.padEnd(u)}`)+F+`
172
- `);Ft(2,s,"User Identity");let h=await Uo(!e.noInteractive,!!(r??or()),e.email),d=null;if(n)l("init","FLOW_API_KEY detected \u2014 skipping OAuth authentication step");else {Ft(3,s,"Authentication");let f=gt(),F=!!f&&f!==i;if(!hn()||a||F)if(e.noInteractive||!fe()){let{token:ce,clientId:J,clientSecret:rt,tenant:oe}=e,we=!!ce,pe=!!(J||rt||oe);if(we){let{runLogin:yt}=await Promise.resolve().then(()=>(mt(),ft)),Me;try{Me=await yt({deferPersist:!0,token:ce});}catch(jt){return process.stderr.write(`
173
- ${k("\u2717")} Authentication failed unexpectedly.
174
- ${jt.message}
175
-
176
- `),1}if(typeof Me=="number")return Me;d=Me.result;}else return pe?(process.stderr.write(`
177
- ${k("\u2717")} Passing individual credential flags (--client-id, --client-secret, --tenant) is no longer supported.
178
- LiteLLM requires a signed Flow API Token. Pass --token <JWT> instead.
179
-
180
- `),1):(process.stderr.write(`
181
- ${k("\u2717")} Authentication required.
182
- Run: flow-ai-obs login
183
-
184
- `),1)}else {(e.token||e.clientId||e.clientSecret||e.tenant)&&process.stderr.write(`
185
- ${I("\u26A0")} Credential flags (--token, --client-id, --client-secret, --tenant) are only used with --no-interactive.
186
- Continuing with interactive authentication.
187
-
188
- `),process.stdout.write(`
189
- ${I("\u26A0")} Authentication required for the new endpoint.
190
-
191
- `);let{runLogin:ce}=await Promise.resolve().then(()=>(mt(),ft)),J=await ce({deferPersist:true,skipAuthCheck:a});if(typeof J=="number")return J;d=J.result;}else _e("Already authenticated \u2014 skipping."),Ue("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");}let y=hn()?j(p.ANTHROPIC_AUTH_TOKEN):null,S={...c,...h?{[p.FLOW_USER_EMAIL]:h}:{},...d?{[p.ANTHROPIC_AUTH_TOKEN]:d.jwt}:{},...y&&!d?{[p.ANTHROPIC_AUTH_TOKEN]:y}:{}},$,b;Ft(n?3:4,s,"Observability (OpenTelemetry)"),process.stdout.write(`
192
- ${v("Metrics and Logs")}
193
- `);let xe={...me,OTEL_EXPORTER_OTLP_ENDPOINT:c.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[f,F]of Object.entries(xe))process.stdout.write(m(` ${f.padEnd(36)}`)+F+`
112
+ `));let c=36;for(let[p,O]of Object.entries(a))process.stdout.write(S(` ${p.padEnd(c)}`)+O+`
113
+ `);xe(2,s,"User Identity");let u=await As(!t.noInteractive,!!(r??Pe()),t.email);l("init",n?"FLOW_API_KEY detected":"FLOW_API_KEY not configured");let h={...a,...u?{[d.FLOW_USER_EMAIL]:u}:{}},L,I;xe(3,s,"Observability (OpenTelemetry)"),process.stdout.write(`
114
+ ${b("Metrics and Logs")}
115
+ `);let A={...et,OTEL_EXPORTER_OTLP_ENDPOINT:a.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[p,O]of Object.entries(A))process.stdout.write(S(` ${p.padEnd(36)}`)+O+`
194
116
  `);process.stdout.write(`
195
- `);try{({settingsPath:$,preserved:b}=ur(c.OTEL_EXPORTER_OTLP_ENDPOINT,S));}catch(f){return process.stderr.write(` \u2717 Failed to write settings: ${f.message}
196
- `),1}if(d){let{saveTokenCache:f}=await Promise.resolve().then(()=>(Je(),Qr));try{await f({accessToken:d.accessToken,expiresAt:d.expiresAt});}catch(se){process.stderr.write(` ${I("\u26A0")} Token cache could not be saved: ${se.message}
197
- Credentials will be re-resolved on first use.
198
- `);}let{clearLoggedOutMarker:F}=await Promise.resolve().then(()=>(_r(),En));F();}if(_e(`Settings written: ${$}`),b.length>0&&(process.stdout.write(`
199
- `),process.stdout.write(I(` \u26A0 Third-party hooks preserved on: ${b.join(", ")}
200
- `)),process.stdout.write(m(` flow-ai-obs no longer manages lifecycle hooks \u2014 those third-party entries were left untouched.
117
+ `);try{({settingsPath:L,preserved:I}=be(a.OTEL_EXPORTER_OTLP_ENDPOINT,h));}catch(p){return process.stderr.write(` \u2717 Failed to write settings: ${p.message}
118
+ `),1}if(dt(`Settings written: ${L}`),I.length>0&&(process.stdout.write(`
119
+ `),process.stdout.write(C(` \u26A0 Third-party hooks preserved on: ${I.join(", ")}
120
+ `)),process.stdout.write(S(` flow-ai-obs no longer manages lifecycle hooks \u2014 those third-party entries were left untouched.
201
121
  `))),process.stdout.write(`
202
- `),bt()){process.stdout.write(` ${v("Claude Desktop")}
203
- `);try{let f=pn(c.OTEL_EXPORTER_OTLP_ENDPOINT,V()??void 0);f.configured&&(_e(`Desktop config written: ${f.configLibraryPath}`),Ue(`Wrapper script: ${f.wrapperScriptPath}`),Ue(`Config UUID: ${f.uuid}`),process.stdout.write(m(` Relaunch Claude Desktop to activate OTLP telemetry.
204
- `)));}catch(f){Ce(`Claude Desktop config failed: ${f.message}`),Ue("CLI observability is configured \u2014 Desktop config can be retried.");}process.stdout.write(`
205
- `);}if(Ut()){process.stdout.write(` ${v("GitHub Copilot (VS Code)")}
206
- `);try{let f=fn(c.OTEL_EXPORTER_OTLP_ENDPOINT,{apiKey:V(),userEmail:h??be()});f.status==="configured"?_e(`Copilot OTEL configured: ${f.settingsPath}`):f.status==="already_configured"?_e("Copilot OTEL: Already configured \u2014 skipping."):(Ce(`Copilot OTEL skipped: ${f.reason??"unknown"}`),f.reason?.includes("could not be parsed")&&Ue("Remove comments from VS Code settings.json and re-run init, or add the keys manually."));}catch(f){Ce(`GitHub Copilot OTEL config failed: ${f.message}`),Ue("CLI observability is configured \u2014 Copilot config can be retried.");}process.stdout.write(`
207
- `);}return e.skipHint||(process.stdout.write(`
208
- `),process.stdout.write(R(` \u2713 Setup complete.
209
-
210
- `)),process.stdout.write(m(` Verify your configuration:
211
- `)+M(` flow-ai-obs status
212
-
213
- `)+m(` Start your code assistant and begin working.
214
-
215
- `))),0}var Sn=T(()=>{"use strict";le();P();de();Lt();ir();B();qt();x();fr();gr();});var kn={};Z(kn,{runStatus:()=>$o});function wn(e){return !e||e.length<=8?"****":e.slice(0,4)+"****...****"+e.slice(-4)}function No(e){process.stdout.write(` ${R("\u2713")} ${e}
216
- `);}function Lr(e){process.stdout.write(` ${I("\u26A0")} ${e}
217
- `);}function Dt(e){process.stdout.write(` ${R("\u2713")} ${e}
218
- `);}function Rr(e){process.stdout.write(` ${I("\u26A0")} ${e}
219
- `);}function xt(e){process.stdout.write(` ${k("\u2717")} ${e}
220
- `);}function ze(e){process.stdout.write(` ${m(e)}
221
- `);}function An(e){process.stdout.write(v(M(`
222
- ${e}
223
- `)));}function On(e,t=false){let r=t?`${I("\u26A0")} ${v(I(e))}`:v(e);process.stdout.write(`
122
+ `),ie()){process.stdout.write(` ${b("Claude Desktop")}
123
+ `);try{let p=wr(a.OTEL_EXPORTER_OTLP_ENDPOINT,$()??void 0);p.configured&&(dt(`Desktop config written: ${p.configLibraryPath}`),Rt(`Wrapper script: ${p.wrapperScriptPath}`),Rt(`Config UUID: ${p.uuid}`),process.stdout.write(S(` Relaunch Claude Desktop to activate OTLP telemetry.
124
+ `)));}catch(p){ft(`Claude Desktop config failed: ${p.message}`),Rt("CLI observability is configured \u2014 Desktop config can be retried.");}process.stdout.write(`
125
+ `);}if(ae()){process.stdout.write(` ${b("GitHub Copilot (VS Code)")}
126
+ `);try{let p=Ar(a.OTEL_EXPORTER_OTLP_ENDPOINT,{apiKey:$(),userEmail:u??K()});p.status==="configured"?dt(`Copilot OTEL configured: ${p.settingsPath}`):p.status==="already_configured"?dt("Copilot OTEL: Already configured \u2014 skipping."):(ft(`Copilot OTEL skipped: ${p.reason??"unknown"}`),p.reason?.includes("could not be parsed")&&Rt("Remove comments from VS Code settings.json and re-run init, or add the keys manually."));}catch(p){ft(`GitHub Copilot OTEL config failed: ${p.message}`),Rt("CLI observability is configured \u2014 Copilot config can be retried.");}process.stdout.write(`
127
+ `);}return t.skipHint||(process.stdout.write(`
128
+ `),process.stdout.write(v(` \u2713 Setup complete.
129
+
130
+ `)),process.stdout.write(S(` Verify your configuration:
131
+ `)+j(` flow-ai-obs status
132
+
133
+ `)+S(` Start your code assistant and begin working.
134
+
135
+ `))),0}var vr=E(()=>{"use strict";wt();U();ut();Re();ke();J();zt();W();$e();Fe();});function Ps(){return Ne()??null}async function br(){let t=Ps();if(!t)return {ok:false,baseUrl:"",user:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let n=new URL(t);if(n.protocol!=="https:"&&n.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:t,user:"",notConfigured:true,error:"NOT_CONFIGURED"}}if(!$()){let n=!!process.env[d.FLOW_API_KEY];return {ok:false,baseUrl:t,user:"",error:n?"FLOW_API_KEY is set but invalid":"No credentials found"}}let r=K();return r?{ok:true,baseUrl:t,user:r}:{ok:false,baseUrl:t,user:"",error:"FLOW_API_KEY is set but x-flow-user could not be resolved"}}var Ur=E(()=>{"use strict";J();wt();U();});var Wr={};z(Wr,{runStatus:()=>Is});function Cr(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function ks(t){process.stdout.write(` ${v("\u2713")} ${t}
136
+ `);}function Nr(t){process.stdout.write(` ${C("\u26A0")} ${t}
137
+ `);}function Be(t){process.stdout.write(` ${v("\u2713")} ${t}
138
+ `);}function $r(t){process.stdout.write(` ${C("\u26A0")} ${t}
139
+ `);}function le(t){process.stdout.write(` ${N("\u2717")} ${t}
140
+ `);}function Bt(t){process.stdout.write(` ${S(t)}
141
+ `);}function Dr(t){process.stdout.write(b(j(`
142
+ ${t}
143
+ `)));}function Fr(t,e=false){let r=e?`${C("\u26A0")} ${b(C(t))}`:b(t);process.stdout.write(`
224
144
  ${r}
225
- `);}function Ln(){process.stdout.write(`
226
- `);}async function $o(){An("Auth");let e=await Nt();e.notConfigured?(Lr("Not configured."),process.stdout.write(`
227
- `),process.stdout.write(` ${m("Run `flow-ai-obs init` to set up.")}
228
- `)):!e.ok&&e.error==="No credentials found"?Lr("Not authenticated. Run `flow-ai-obs login` to set up."):e.ok?(No("Authenticated"),process.stdout.write(` ${m("URL: ")}${e.baseUrl}
229
- `),process.stdout.write(` ${m("Tenant: ")}${e.tenant}
230
- `),process.stdout.write(` ${m("User: ")}${e.user}
231
- `),process.stdout.write(` ${m("Storage: ANTHROPIC_AUTH_TOKEN (settings.json)")}
232
- `)):Lr(`Session rejected by ${e.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`);let t={},r={};try{let c=E__namespace.readFileSync(ee(),"utf8");r=JSON.parse(c),t=r.env||{};}catch{}An("Observability configuration (OpenTelemetry)");let n=Object.keys(me).filter(c=>!t[c]);On("Metrics and Logs",n.length>0),n.length===0?(Dt("All OTEL env vars present in settings.json"),ze(`Endpoint: ${t.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
233
- `),process.stdout.write(` ${m("Run: flow-ai-obs init (restores missing vars automatically)")}
145
+ `);}function xr(){process.stdout.write(`
146
+ `);}async function Is(){Dr("Auth");let t=await br();if(t.notConfigured)Nr("Not configured."),process.stdout.write(`
147
+ `),process.stdout.write(` ${S("Run `flow-ai-obs init` to set up.")}
148
+ `);else if(t.ok)ks("Authenticated"),process.stdout.write(` ${S("URL: ")}${t.baseUrl}
149
+ `),process.stdout.write(` ${S("User: ")}${t.user}
150
+ `),process.stdout.write(` ${S("Storage: FLOW_API_KEY (environment)")}
151
+ `);else {let c=t.error==="FLOW_API_KEY is set but x-flow-user could not be resolved"?"Run `flow-ai-obs init --custom-email <EMAIL>`.":"Set FLOW_API_KEY and run `flow-ai-obs init`.";Nr(`${t.error}. ${c}`),process.stdout.write(` ${S("URL: ")}${t.baseUrl}
152
+ `);}let e={},r={};try{let c=m__namespace.readFileSync(G(),"utf8");r=JSON.parse(c),e=r.env||{};}catch{}Dr("Observability configuration (OpenTelemetry)");let n=Object.keys(et).filter(c=>!e[c]);Fr("Metrics and Logs",n.length>0),n.length===0?(Be("All OTEL env vars present in settings.json"),Bt(`Endpoint: ${e.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
153
+ `),process.stdout.write(` ${S("Run: flow-ai-obs init (restores missing vars automatically)")}
234
154
  `),process.stdout.write(`
235
- `),Rr(`${n.length} OTEL var(s) missing from settings.json`),n.forEach(c=>xt(`Missing: ${c}`))),Ln();for(let c of Object.keys(me)){let u=t[c]??k("(missing)");process.stdout.write(m(` ${c.padEnd(36)}`)+u+`
236
- `);}On("Trace Destination");let s=process.env[p.FLOW_TELEMETRY]==="true",o=process.env[p.LANGFUSE_BASE_URL],i=process.env[p.LANGFUSE_PUBLIC_KEY],a=process.env[p.LANGFUSE_SECRET_KEY];if(s)if(o&&i&&a){let c=await ue();for(let u of c)u.mode==="direct"&&(Dt("FLOW_TELEMETRY=true (direct mode enabled)"),Dt("Mode: direct"),ze(`Endpoint: ${u.endpoint}`),ze(`PK: ${wn(i)}`),ze(`SK: ${wn(a)}`));}else Rr("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),o||xt("LANGFUSE_BASE_URL not set"),i||xt("LANGFUSE_PUBLIC_KEY not set"),a||xt("LANGFUSE_SECRET_KEY not set");else {let c=await ue();if(c.length>0)for(let u of c)u.mode==="gateway"&&(Dt("Mode: gateway"),ze(`Endpoint: ${u.endpoint}`));else c.authError?Rr("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):ze("No active tracing destination configured.");}return Ln(),0}var In=T(()=>{"use strict";B();le();P();de();yr();});var Pn={};Z(Pn,{runUpdateApiKey:()=>Fo});async function Fo(e={}){let t=e.key!==void 0?ie(e.key):V();if(!t)return e.key!==void 0?process.stderr.write(k(` \u2717 Provided API key is invalid.
237
- `)+m(` Ensure the key contains valid characters and does not exceed 1024 characters.
238
-
239
- `)):process.stderr.write(k(` \u2717 FLOW_API_KEY environment variable is not set or is invalid.
240
- `)+m(` Set FLOW_API_KEY=<key> in your environment and re-run.
241
-
242
- `)),1;let r=false,n=mn(t);n.status==="configured"?process.stdout.write(R(` \u2713 GitHub Copilot API key updated successfully in ${n.settingsPath}
243
- `)):n.status==="already_configured"?process.stdout.write(R(` \u2713 GitHub Copilot API key is already up to date in ${n.settingsPath}
244
- `)):n.reason?.includes("not installed")?process.stdout.write(m(` \u2139 VS Code is not installed \u2014 skipping Copilot API key update.
245
- `)):(process.stderr.write(k(` \u2717 GitHub Copilot API key update failed: ${n.reason}
246
- `)),r=true);let s=un(t);return s.status==="configured"?process.stdout.write(R(` \u2713 Claude Desktop API key updated successfully in ${s.wrapperScriptPath}
247
- `)):s.status==="already_configured"?process.stdout.write(R(` \u2713 Claude Desktop API key is already up to date in ${s.wrapperScriptPath}
248
- `)):s.reason?.includes("not installed")?process.stdout.write(m(` \u2139 Claude Desktop is not installed \u2014 skipping Desktop API key update.
249
- `)):(process.stderr.write(k(` \u2717 Claude Desktop API key update failed: ${s.reason}
250
- `)),r=true),r?1:0}var vn=T(()=>{"use strict";B();gr();fr();de();});var bn={};Z(bn,{runOtelHeaders:()=>Do});async function Do(){let e=V(),t=be(),r=te(lt(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.
155
+ `),$r(`${n.length} OTEL var(s) missing from settings.json`),n.forEach(c=>le(`Missing: ${c}`))),xr();for(let c of Object.keys(et)){let u=e[c]??N("(missing)");process.stdout.write(S(` ${c.padEnd(36)}`)+u+`
156
+ `);}Fr("Trace Destination");let s=process.env[d.FLOW_TELEMETRY]==="true",o=process.env[d.LANGFUSE_BASE_URL],i=process.env[d.LANGFUSE_PUBLIC_KEY],a=process.env[d.LANGFUSE_SECRET_KEY];if(s)if(o&&i&&a){let c=await Lt();for(let u of c)u.mode==="direct"&&(Be("FLOW_TELEMETRY=true (direct mode enabled)"),Be("Mode: direct"),Bt(`Endpoint: ${u.endpoint}`),Bt(`PK: ${Cr(i)}`),Bt(`SK: ${Cr(a)}`));}else $r("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),o||le("LANGFUSE_BASE_URL not set"),i||le("LANGFUSE_PUBLIC_KEY not set"),a||le("LANGFUSE_SECRET_KEY not set");else Bt("No active tracing destination configured.");return xr(),0}var Kr=E(()=>{"use strict";J();wt();U();ut();Ur();});var Br={};z(Br,{runUpdateApiKey:()=>vs});async function vs(t={}){let e=t.key!==void 0?X(t.key):$();if(!e)return t.key!==void 0?process.stderr.write(N(` \u2717 Provided API key is invalid.
157
+ `)+S(` Ensure the key contains valid characters and does not exceed 1024 characters.
158
+
159
+ `)):process.stderr.write(N(` \u2717 FLOW_API_KEY environment variable is not set or is invalid.
160
+ `)+S(` Set FLOW_API_KEY=<key> in your environment and re-run.
161
+
162
+ `)),1;let r=false,n=Rr(e);n.status==="configured"?process.stdout.write(v(` \u2713 GitHub Copilot API key updated successfully in ${n.settingsPath}
163
+ `)):n.status==="already_configured"?process.stdout.write(v(` \u2713 GitHub Copilot API key is already up to date in ${n.settingsPath}
164
+ `)):n.reason?.includes("not installed")?process.stdout.write(S(` \u2139 VS Code is not installed \u2014 skipping Copilot API key update.
165
+ `)):(process.stderr.write(N(` \u2717 GitHub Copilot API key update failed: ${n.reason}
166
+ `)),r=true);let s=Or(e);return s.status==="configured"?process.stdout.write(v(` \u2713 Claude Desktop API key updated successfully in ${s.wrapperScriptPath}
167
+ `)):s.status==="already_configured"?process.stdout.write(v(` \u2713 Claude Desktop API key is already up to date in ${s.wrapperScriptPath}
168
+ `)):s.reason?.includes("not installed")?process.stdout.write(S(` \u2139 Claude Desktop is not installed \u2014 skipping Desktop API key update.
169
+ `)):(process.stderr.write(N(` \u2717 Claude Desktop API key update failed: ${s.reason}
170
+ `)),r=true),r?1:0}var Yr=E(()=>{"use strict";J();Fe();$e();ut();});var jr={};z(jr,{runOtelHeaders:()=>bs});async function bs(){let t=$();if(!t)return process.stderr.write(process.env[d.FLOW_API_KEY]?`[flow-ai-obs otel-headers] FLOW_API_KEY is set but its value was rejected (invalid characters or length).
171
+ Set a valid FLOW_API_KEY in the environment used by your code assistant, then restart it.
172
+ `:`[flow-ai-obs otel-headers] FLOW_API_KEY is not set.
173
+ Set FLOW_API_KEY in the environment used by your code assistant, then restart it.
174
+ `),1;let e=K();if(!e)return process.stderr.write(`[flow-ai-obs otel-headers] FLOW_API_KEY is set but x-flow-user could not be resolved.
251
175
  Run: flow-ai-obs init --custom-email <EMAIL>
252
- `),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.
253
- `),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)+`
254
- `),0}if(!r)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs login
255
- `),1;let n=ut(),s=process.env[p.FLOW_BASE_URL];n&&(process.env[p.FLOW_BASE_URL]=n);let o;try{o=(await Y(r)).accessToken;}catch(i){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${i.message}
256
- `),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,"")}`})+`
257
- `),0):(process.stderr.write(`[flow-ai-obs otel-headers] Empty token received
258
- `),1)}var Un=T(()=>{"use strict";Re();B();le();P();});function ae(e,t){let r=typeof e=="object"?JSON.stringify(e):String(e??"");return r.length>t?r.slice(0,t)+" \u2026[truncated]":r}function Mt(e,t=100){return String(e??"").split(`
259
- `)[0].slice(0,t).trim()}function Et(){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 W(e){process.stdout.write(JSON.stringify(e));}var Ze=T(()=>{"use strict";});function Te(){return String(BigInt(Date.now())*1000000n)}var kr,Ne,ht=T(()=>{"use strict";kr=()=>nn.randomBytes(16).toString("hex"),Ne=()=>nn.randomBytes(8).toString("hex");});function Jo(e,t){let r=L.resolve(e);if(!r.startsWith(t))throw new Error(`Path traversal detected: ${e}`);return r}function Ir(e){if(!Vo.test(e))throw new Error(`Invalid session ID: ${e}`);return Jo(L.join(ke.tmpdir(),`flow-obs-${e}.json`),Go)}function Qe(e){let t;try{t=Ir(e);}catch{return null}if(!E.existsSync(t))return null;try{return JSON.parse(E.readFileSync(t,"utf8"))}catch{return null}}function et(e,t){E.writeFileSync(Ir(e),JSON.stringify(t),{encoding:"utf8",mode:384});}function Pr(e){try{E.unlinkSync(Ir(e));}catch{}}var Vo,Go,_t=T(()=>{"use strict";Vo=/^[0-9a-f-]{1,64}$/i,Go=L.normalize(ke.tmpdir())+L.sep;});function Dn(e){if(!e||!E.existsSync(e))return null;try{let t=E.readFileSync(e,"utf8").trimEnd().split(`
260
- `);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 vr(e){if(!e||!E.existsSync(e))return null;try{let t=E.readFileSync(e,"utf8").trimEnd().split(`
261
- `),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 u=(a.message?.content??[]).filter(d=>d.type==="text").map(d=>d.text??"").join("");u&&r.unshift(u);let h=a.message?.usage??{};n+=(h.input_tokens??0)+(h.cache_read_input_tokens??0)+(h.cache_creation_input_tokens??0),s+=h.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
262
-
263
- `),inputTokens:n,outputTokens:s,model:o}}catch{}return null}var br=T(()=>{"use strict";});function Bn(e){return e.replace(":","/")}function Bt(e,t){if(!e)return null;let r=Bn(e),n=[L.join(ke.homedir(),".claude","skills",r,"SKILL.md"),L.join(t??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(E.existsSync(s))try{return E.readFileSync(s,"utf8")}catch{}return null}function Wn(e){return e.split(`
264
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function Hn(e){return !!e.slashSkill||e.toolCalls.some(n=>n.tool==="Skill")?e.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||ti.has(n.tool))?"complete":"prerequisite_required":null}function Wt(e,t){if(!e)return null;let r=Bn(e),n=[L.join(ke.homedir(),".claude","skills",r),L.join(t??"",".claude","skills",r)],s=null;for(let a of n)if(E.existsSync(L.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let u of E.readdirSync(a,{withFileTypes:true})){if(Zo.has(u.name)||ei.has(u.name)||Qo.has(L.extname(u.name)))continue;let h=c?`${c}/${u.name}`:u.name;u.isDirectory()?i(L.join(a,u.name),h):o.push(h);}}return i(s,""),o.length>0?o:null}var Zo,Qo,ei,ti,Ht=T(()=>{"use strict";Zo=new Set([".venv","__pycache__",".git","node_modules"]),Qo=new Set([".pyc",".pyo"]),ei=new Set(["SKILL.md",".DS_Store",".gitignore"]);ti=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function si(e){try{let t=e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(t,"base64").toString())}catch{return null}}function oi(e,t,r,n){return new Promise(s=>{let o=new URL(e),i=o.protocol==="https:",a=(i?Is__namespace.default:js__namespace.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 $e(e,t={}){try{let r=te(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,s=new Promise((d,y)=>{n=setTimeout(()=>y(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:o}=await Promise.race([Y(r),s]);clearTimeout(n);let i=si(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||""}}),u=ve(At().API_URL),h=await oi(u,c,o,a);l("metrics.logEvent",`action=${e} status=${h}`);}catch(r){l("metrics.logEvent",`silenced error: ${r.message}`);}}var Kt=T(()=>{"use strict";P();Re();B();x();});async function Ur(e,t=false){if(t){process.stdout.write(JSON.stringify({decision:"block",reason:ii})+`
265
- `);return}let n=!!(await ue()).authError,s=e.session_id||"unknown",o=e.prompt||"",i=e.cwd||"",a=Dn(e.transcript_path)||kr(),c=Wn(o),u=c?Bt(c,i):null,h=c?Wt(c,i):null;et(s,{traceId:kr(),spanId:Ne(),startNs:Te(),sessionId:s,prompt:o,cwd:i,traceName:a,transcriptPath:e.transcript_path||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:u,skillArtifacts:h}),$e("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),l("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),W(e);}var ii,Kn=T(()=>{"use strict";ht();_t();br();Ht();Ze();x();P();B();Kt();ii=`\u26D4 Could not verify your Flow API key. This may be a temporary instability in the Flow services, or your API key may have expired. Please try again in a few minutes. If the issue persists, check your credentials at ${Oe()}/settings/api-keys and run: flow-ai-obs login. If it still persists, contact Flow support through the official channels.`;});async function Yn(e){let t=e.session_id||"unknown",r=e.tool_name||"unknown",n=e.tool_input||{},s=Qe(t);s&&(s.pendingTool={name:r,inputStr:ae(n,Q.TOOL_INPUT),startNs:Te()},et(t,s)),l("PreToolUse",`sid=${t}`,`tool=${r}`,`stateFound=${!!s}`),W(e);}var jn=T(()=>{"use strict";ht();_t();Ze();x();P();});function g(e,t){return t==null||t===""?null:{key:e,value:{stringValue:String(t)}}}function Fe(...e){return e.filter(t=>t!==null)}function Vn(e,t){return {resourceSpans:[{resource:{attributes:e},scopeSpans:[{scope:ai,spans:Array.isArray(t)?t:[t]}]}]}}var ai,O,Gn=T(()=>{"use strict";P();ai={name:wt.SCOPE_NAME,version:wt.SCOPE_VERSION},O={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};});function Xn(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{E.writeFileSync(Jn,o+`
266
- `,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${Jn}`);}catch(i){l("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function fi(e){let t=new URL(e),r=new URL(H().GATEWAY_HEALTH);return r.hostname=t.hostname,r.port=t.port,r.protocol=t.protocol,r}function qn(e,t){return new Promise((r,n)=>{let s=e._isSSL?Is__namespace.default:js__namespace.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 zn(e,t){let r;try{r=fi(e);}catch{return false}let n=r.protocol==="https:";try{let s={};t&&(s.Authorization=String(t).replace(/[\r\n]/g,""));let o=await qn({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 Yt(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 qn({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}`),Xn(t,a,n,c.statusCode,c.body),c.statusCode}catch(c){return l("sendTraces:error",c.message),Xn(t,a,n,0,c.message),0}}var Jn,Zn=T(()=>{"use strict";P();x();Jn=L.join(ke.tmpdir(),"flow-obs-requests.ndjson");});function mi(){let e=parseInt(process.env[p.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(e)?Math.max(q.MIN_TTL_DAYS,Math.min(q.MAX_TTL_DAYS,e)):q.DEFAULT_TTL_DAYS)*24*60*60*1e3}function gi(){let e=parseInt(process.env[p.BUFFER_MAX_FILES]??"",10);return Number.isFinite(e)?Math.max(q.MIN_MAX_FILES,Math.min(q.MAX_MAX_FILES,e)):q.DEFAULT_MAX_FILES}function es(e){if(/[/\\]/.test(e))throw new Error(`Invalid buffer fileId: ${e}`);return L__namespace.default.join(ke__namespace.default.tmpdir(),`${q.FILE_PREFIX}${e}.json`)}function Nr(){let e=ke__namespace.default.tmpdir(),t;try{t=E__namespace.default.readdirSync(e);}catch{return []}return t.filter(r=>r.startsWith(q.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=L__namespace.default.join(e,r),s=0;try{s=E__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function Tt(e){try{let t=gi(),r=Nr();if(r.length>=t){let o=r.slice(0,r.length-t+1);for(let i of o)try{E__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 E__namespace.default.writeFileSync(es(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 ts(e){let t=Nr(),r=e!=null&&e>0?e:t.length,n=[];for(let s of t){if(n.length>=r)break;try{let o=E__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 rs(e){try{E__namespace.default.unlinkSync(es(e)),l("buffer",`deleted fileId=${e}`);}catch{}}function ns(){let e=Date.now()-mi();for(let t of Nr())try{let{mtimeMs:r}=E__namespace.default.statSync(t);r<e&&(E__namespace.default.unlinkSync(t),l("buffer",`evicted stale: ${L__namespace.default.basename(t)}`));}catch{}}var ss=T(()=>{"use strict";P();x();});async function Ei(e){ns();let t=ts(q.REPLAY_BATCH_SIZE);t.length&&(l("replayBufferedTraces",`replaying ${t.length} buffered trace(s)`),await Promise.allSettled(t.map(async r=>{try{let n=await Yt(r.payload,e.endpoint,e.authHeader);n>=200&&n<300?(rs(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 os(e){let t=await ue();if(!t.length)return t.authError&&(l("postToLangfuse","auth refresh failed \u2014 buffering trace"),Tt(e)),0;let r=await Promise.all(t.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await zn(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 Ei(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"),Tt(e),0;let c=await Yt(e,o.endpoint,o.authHeader);return (c===0||c>=500)&&(l("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),Tt(e)),c}let a=await Yt(e,o.endpoint,o.authHeader);return (a===0||a>=500)&&(l("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),Tt(e)),a}))).find(o=>o!==0)??0}var is=T(()=>{"use strict";B();x();Zn();ss();P();});var $r=T(()=>{"use strict";Gn();is();});function Se(e){if(e==null)return "";let t=typeof e=="string"?e:JSON.stringify(e);return yi.reduce((r,{re:n,replace:s})=>r.replace(n,s),t)}var z,hi,_i,Ti,as,yi,Fr=T(()=>{"use strict";z="[REDACTED]",hi="[REDACTED-EMAIL]",_i="[REDACTED-CPF]",Ti="[REDACTED-CNPJ]",as="[REDACTED-PHONE]",yi=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${z}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${z}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(e,t)=>`${t}${z}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(e,t)=>`${t}${z}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(e,t,r)=>`${t}
267
- ${z}
268
- ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${z}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(e,t)=>`${t}${z}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${z}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${z}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${z}`},{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}${z}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(e,t)=>`${t}:${z}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>hi},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>_i},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Ti},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>as},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>as}];});async function cs(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=Qe(t);if(!i){W(e);return}let a=Te(),c=i.pendingTool,u=c?.name===r,h=u?c.startNs:String(BigInt(a)-200000000n),d=u?c.inputStr:ae(n,Q.TOOL_INPUT),y=d,S=null;if(r==="Skill"){let we=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);S=we?String(we).trim():null;let pe=S?Bt(S,i.cwd):null;pe&&(y=pe,i.skillContent||(i.skillContent=pe),i.skillArtifacts||(i.skillArtifacts=Wt(S,i.cwd))),S&&!i.slashSkill&&(i.slashSkill=S),l("PostToolUse","Skill tool detected",`skillName=${S}`,`contentFound=${!!pe}`);}let $=Se(ae(o,Q.TOOL_OUTPUT)),b=/\b(error|exception|failed|failure|traceback|errno)\b/i.test($.slice(0,500)),xe=b?"ERROR":"DEFAULT",f=Ne(),F=Math.round(Number(BigInt(a)-BigInt(h))/1e6),ce={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",J=r==="Skill"&&S?S:Mt(d,60);i.toolCalls.push({tool:r,brief:J,error:b,durationMs:F});let oe=i.spans;oe.push({traceId:i.traceId,spanId:f,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:h,endTimeUnixNano:a,attributes:Fe(g(O.OBS_NAME,r),g(O.OBS_TYPE,ce),g(O.OBS_LEVEL,xe),g(O.OBS_INPUT,Se(y)),g(O.OBS_OUTPUT,$),g("tool.name",r),g("tool.error",String(b)),r==="Skill"&&S?g("skill.name",S):null,r==="Skill"?g("skill.invocation","slash-command"):null),status:{code:b?2:1}}),i.pendingTool=null,et(t,i),b&&$e("TOOL_ERROR",{toolName:r}),l("PostToolUse",`sid=${t}`,`tool=${r}`,`error=${b}`,`durationMs=${F}`,`totalSpans=${oe.length}`),W(e);}var ls=T(()=>{"use strict";ht();_t();$r();Ze();Ht();x();P();Fr();Kt();});function ps(e,t,r){let n=Object.keys(us).find(i=>(e??"").toLowerCase().includes(i));if(!n)return;let s=us[n],o=(t*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var us,ds=T(()=>{"use strict";us={"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 fs(e){let t=e.session_id||"unknown",r=e.stop_reason||"end_turn",n=Qe(t);if(!n){W(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=Te(),o=await rn(),i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(A=>A.tool==="Skill")){let A=Ne(),Ae=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:A,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:Fe(g(O.OBS_NAME,"Skill"),g(O.OBS_TYPE,"TOOL"),g(O.OBS_LEVEL,"DEFAULT"),g(O.OBS_INPUT,Ae),g(O.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||"",u=vr(c);if(c&&(i.some(A=>A.tool==="Skill"&&!A.synthetic)||!!n.slashSkill)&&!u?.text){await new Promise(Ae=>setTimeout(Ae,500));let A=vr(c);A?.text&&(u=A);}l("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${u?`text=${u.text.length}chars`:"null"}`);let d=i.length,y=i.filter(A=>A.error).length,S=Se(u?.text?ae(u.text,Q.TRACE_OUTPUT):d===0?"No tools used":i.map((A,Ae)=>`${Ae+1}. ${A.tool}${A.brief?` \u2192 ${A.brief}`:""}${A.error?" [ERROR]":""}`).join(`
269
- `)),$=u?.inputTokens??0,b=u?.outputTokens??0,xe=i.map((A,Ae)=>`${Ae+1}. ${A.tool}${A.brief?` \u2192 ${A.brief}`:""}${A.error?" [ERROR]":""} (${A.durationMs}ms)`),f=!!(n.slashSkill||i.some(A=>A.tool==="Skill")),F=i.some(A=>A.tool==="Agent");if(!f&&!F){l("Stop",`sid=${t}`,"skipping trace \u2014 no Skill or Agent calls found"),$e("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),Pr(t),W(e);return}let se=f?"skill":"agent",ce=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),J=u?.model||"",rt=ps(J,$,b),oe=Hn(n);oe==="prerequisite_required"&&u?.text&&(oe="complete"),oe==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:Ne(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Fe(g(O.OBS_NAME,"prerequisite-check"),g(O.OBS_TYPE,"EVENT"),g(O.OBS_LEVEL,"WARNING"),g(O.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 we=(()=>{if(!(!f||!n.prompt)){if(n.slashSkill){let A=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return A?ae(Se(A),Q.USER_INSTRUCTION):void 0}return ae(Se(n.prompt),Q.USER_INSTRUCTION)||void 0}})(),pe=JSON.stringify({trace_type:se,...oe!==null&&{execution_status:oe},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...we!==void 0&&{user_instruction:we},latency_ms:ce,...$&&{tokens_input:$},...b&&{tokens_output:b},cost_usd:rt,...J?{model:J}:{},toolCount:d,errorCount:y,stopReason:r,sessionId:n.sessionId,tools:xe.length?xe:void 0}),yt=Se(ae(n.prompt,Q.TRACE_INPUT)),Me=Fe(g(O.TRACE_NAME,n.traceName),g(O.TRACE_INPUT,yt),g(O.TRACE_OUTPUT,S),g(O.OBS_INPUT,yt),g(O.OBS_OUTPUT,S),g(O.TRACE_METADATA,pe),g(O.SESSION_ID,n.sessionId),g(O.USER_ID,o.user),g(O.OBS_TYPE,"GENERATION"),g(O.MODEL,J),$?g(O.INPUT_TOKENS,$):null,b?g(O.OUTPUT_TOKENS,b):null,g("claude.stop_reason",r),g("claude.tool_count",String(d)),g("claude.error_count",String(y)),g("claude.session_id",n.sessionId),g("flow.trace_type",se),{key:O.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:se}]}}}),jt={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Me,status:{code:y>0?2:1}},_s=Fe(g("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),g("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Dr=[...a,jt];l("Stop",`sid=${t}`,`totalTools=${d}`,`errorTools=${y}`,`spans=${Dr.length}`,`inputTokens=${$}`,`outputTokens=${b}`,`traceOutput="${Mt(S,80)}"`);let Ts=await os(Vn(_s,Dr));l("Stop",`POST status=${Ts}`,`traceId=${n.traceId}`),$e("TRACE_SENT",{latencyMs:ce,totalTools:d,errorTools:y,inputTokens:$,outputTokens:b,costUsd:rt}),Pr(t),W(e);}var ms=T(()=>{"use strict";ht();_t();$r();B();ds();br();Ze();x();Ht();Fr();P();Kt();});var De,gs=T(()=>{"use strict";B();Ze();Kn();jn();ls();ms();De=class{static async userPromptSubmit(){let t=await Et(),r;try{r=await ue();}catch{W(t);return}r.authError?await Ur(t,!0):r.length>0?await Ur(t):W(t);}static async preToolUse(){let t=await Et();await Yn(t);}static async postToolUse(){let t=await Et();await cs(t);}static async stop(){let t=await Et();await fs(t);}};});var wi={};async function Si(){let e=process.argv[2];switch(e){case "UserPromptSubmit":await De.userPromptSubmit();break;case "PreToolUse":await De.preToolUse();break;case "PostToolUse":await De.postToolUse();break;case "Stop":await De.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${e}
270
- `),process.stdin.on("data",t=>process.stdout.write(t));}}var Es=T(()=>{"use strict";gs();Si().catch(e=>{process.stderr.write(`[flow-obs] fatal: ${e.message}
271
- `),process.exit(0);});});var Ai=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,G]=process.argv;function ne(e,t){let r=e.indexOf(t);return r!==-1?e[r+1]:void 0}function hs(){let{bold:e,cyan:t,dim:r,green:n}=(de(),D(Gt)),{version:s}=nt();process.stdout.write(`
272
- `+e(" flow-ai-obs")+r(" v"+s)+`
273
-
274
- `),process.stdout.write(t(" init")+r(` Configure environment: Claude Code + Proxy + OTEL + Trace hooks
176
+ `),1;let r=s=>s.replace(/[\r\n]/g,""),n={"x-flow-api-key":r(t),"x-flow-user":r(e)};return process.stdout.write(JSON.stringify(n)+`
177
+ `),0}var Hr=E(()=>{"use strict";J();U();});function q(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function ue(t,e=100){return String(t??"").split(`
178
+ `)[0].slice(0,e).trim()}function Yt(){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 D(t){process.stdout.write(JSON.stringify(t));}var kt=E(()=>{"use strict";});function ot(){return String(BigInt(Date.now())*1000000n)}var Ye,mt,jt=E(()=>{"use strict";Ye=()=>hr.randomBytes(16).toString("hex"),mt=()=>hr.randomBytes(8).toString("hex");});function Bs(t,e){let r=w.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function je(t){if(!Ws.test(t))throw new Error(`Invalid session ID: ${t}`);return Bs(w.join(At.tmpdir(),`flow-obs-${t}.json`),Ks)}function It(t){let e;try{e=je(t);}catch{return null}if(!m.existsSync(e))return null;try{return JSON.parse(m.readFileSync(e,"utf8"))}catch{return null}}function vt(t,e){m.writeFileSync(je(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function He(t){try{m.unlinkSync(je(t));}catch{}}var Ws,Ks,Ht=E(()=>{"use strict";Ws=/^[0-9a-f-]{1,64}$/i,Ks=w.normalize(At.tmpdir())+w.sep;});function qr(t){if(!t||!m.existsSync(t))return null;try{let e=m.readFileSync(t,"utf8").trimEnd().split(`
179
+ `);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 Ve(t){if(!t||!m.existsSync(t))return null;try{let e=m.readFileSync(t,"utf8").trimEnd().split(`
180
+ `),r=[],n=0,s=0,o;for(let i=e.length-1;i>=0;i--)try{let a=JSON.parse(e[i]);if(a.type==="user")break;if(a.type==="assistant"){!o&&a.message?.model&&(o=a.message.model);let u=(a.message?.content??[]).filter(L=>L.type==="text").map(L=>L.text??"").join("");u&&r.unshift(u);let h=a.message?.usage??{};n+=(h.input_tokens??0)+(h.cache_read_input_tokens??0)+(h.cache_creation_input_tokens??0),s+=h.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
181
+
182
+ `),inputTokens:n,outputTokens:s,model:o}}catch{}return null}var Ge=E(()=>{"use strict";});function Qr(t){return t.replace(":","/")}function pe(t,e){if(!t)return null;let r=Qr(t),n=[w.join(At.homedir(),".claude","skills",r,"SKILL.md"),w.join(e??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(m.existsSync(s))try{return m.readFileSync(s,"utf8")}catch{}return null}function tn(t){return t.split(`
183
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function en(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Xs.has(n.tool))?"complete":"prerequisite_required":null}function de(t,e){if(!t)return null;let r=Qr(t),n=[w.join(At.homedir(),".claude","skills",r),w.join(e??"",".claude","skills",r)],s=null;for(let a of n)if(m.existsSync(w.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let u of m.readdirSync(a,{withFileTypes:true})){if(Vs.has(u.name)||Js.has(u.name)||Gs.has(w.extname(u.name)))continue;let h=c?`${c}/${u.name}`:u.name;u.isDirectory()?i(w.join(a,u.name),h):o.push(h);}}return i(s,""),o.length>0?o:null}var Vs,Gs,Js,Xs,fe=E(()=>{"use strict";Vs=new Set([".venv","__pycache__",".git","node_modules"]),Gs=new Set([".pyc",".pyo"]),Js=new Set(["SKILL.md",".DS_Store",".gitignore"]);Xs=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});async function rn(t){let e=t.session_id||"unknown",r=t.prompt||"",n=t.cwd||"",s=qr(t.transcript_path)||Ye(),o=tn(r),i=o?pe(o,n):null,a=o?de(o,n):null;vt(e,{traceId:Ye(),spanId:mt(),startNs:ot(),sessionId:e,prompt:r,cwd:n,traceName:s,transcriptPath:t.transcript_path||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:o,skillContent:i,skillArtifacts:a}),l("UserPromptSubmit",`sid=${e}`,`traceName=${s}`,`slashSkill=${o}`),D(t);}var nn=E(()=>{"use strict";jt();Ht();Ge();fe();kt();W();});async function sn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=It(e);s&&(s.pendingTool={name:r,inputStr:q(n,V.TOOL_INPUT),startNs:ot()},vt(e,s)),l("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!s}`),D(t);}var on=E(()=>{"use strict";jt();Ht();kt();W();U();});function f(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function gt(...t){return t.filter(e=>e!==null)}function an(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:qs,spans:Array.isArray(e)?e:[e]}]}]}}var qs,T,cn=E(()=>{"use strict";U();qs={name:Zt.SCOPE_NAME,version:Zt.SCOPE_VERSION},T={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 un(t,e,r,n,s){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:s}});try{m.writeFileSync(ln,o+`
184
+ `,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${ln}`);}catch(i){l("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function ro(t){let e=new URL(t),r=new URL(Z().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function pn(t,e){return new Promise((r,n)=>{let s=t._isSSL?Vn__default.default:Zs__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=s.request(t,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}`))),e&&o.write(e),o.end();})}async function dn(t,e){let r;try{r=ro(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let o=await pn({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 me(t,e,r){let n=JSON.stringify(t),s=new URL(e),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 ${e}`),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 pn({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}`),un(e,a,n,c.statusCode,c.body),c.statusCode}catch(c){return l("sendTraces:error",c.message),un(e,a,n,0,c.message),0}}var ln,fn=E(()=>{"use strict";U();W();ln=w.join(At.tmpdir(),"flow-obs-requests.ndjson");});function no(){let t=parseInt(process.env[d.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(M.MIN_TTL_DAYS,Math.min(M.MAX_TTL_DAYS,t)):M.DEFAULT_TTL_DAYS)*24*60*60*1e3}function so(){let t=parseInt(process.env[d.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(M.MIN_MAX_FILES,Math.min(M.MAX_MAX_FILES,t)):M.DEFAULT_MAX_FILES}function gn(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return w__namespace.default.join(At__namespace.default.tmpdir(),`${M.FILE_PREFIX}${t}.json`)}function Xe(){let t=At__namespace.default.tmpdir(),e;try{e=m__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(M.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=w__namespace.default.join(t,r),s=0;try{s=m__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function Vt(t){try{let e=so(),r=Xe();if(r.length>=e){let o=r.slice(0,r.length-e+1);for(let i of o)try{m__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:t};return m__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 En(t){let e=Xe(),r=t!=null&&t>0?t:e.length,n=[];for(let s of e){if(n.length>=r)break;try{let o=m__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 hn(t){try{m__namespace.default.unlinkSync(gn(t)),l("buffer",`deleted fileId=${t}`);}catch{}}function _n(){let t=Date.now()-no();for(let e of Xe())try{let{mtimeMs:r}=m__namespace.default.statSync(e);r<t&&(m__namespace.default.unlinkSync(e),l("buffer",`evicted stale: ${w__namespace.default.basename(e)}`));}catch{}}var Sn=E(()=>{"use strict";U();W();});async function oo(t){_n();let e=En(M.REPLAY_BATCH_SIZE);e.length&&(l("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await me(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(hn(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 yn(t){let e=await Lt();if(!e.length)return e.authError&&(l("postToLangfuse","auth refresh failed \u2014 buffering trace"),Vt(t)),0;let r=await Promise.all(e.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await dn(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 oo(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"),Vt(t),0;let c=await me(t,o.endpoint,o.authHeader);return (c===0||c>=500)&&(l("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),Vt(t)),c}let a=await me(t,o.endpoint,o.authHeader);return (a===0||a>=500)&&(l("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),Vt(t)),a}))).find(o=>o!==0)??0}var Tn=E(()=>{"use strict";J();W();fn();Sn();U();});var qe=E(()=>{"use strict";cn();Tn();});function at(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return lo.reduce((r,{re:n,replace:s})=>r.replace(n,s),e)}var B,io,ao,co,On,lo,ze=E(()=>{"use strict";B="[REDACTED]",io="[REDACTED-EMAIL]",ao="[REDACTED-CPF]",co="[REDACTED-CNPJ]",On="[REDACTED-PHONE]",lo=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${B}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${B}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${B}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${B}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
185
+ ${B}
186
+ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${B}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${B}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${B}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${B}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${B}`},{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}${B}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${B}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>io},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>ao},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>co},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>On},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>On}];});async function wn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=t.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=It(e);if(!i){D(t);return}let a=ot(),c=i.pendingTool,u=c?.name===r,h=u?c.startNs:String(BigInt(a)-200000000n),L=u?c.inputStr:q(n,V.TOOL_INPUT),I=L,A=null;if(r==="Skill"){let Ct=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);A=Ct?String(Ct).trim():null;let _t=A?pe(A,i.cwd):null;_t&&(I=_t,i.skillContent||(i.skillContent=_t),i.skillArtifacts||(i.skillArtifacts=de(A,i.cwd))),A&&!i.slashSkill&&(i.slashSkill=A),l("PostToolUse","Skill tool detected",`skillName=${A}`,`contentFound=${!!_t}`);}let p=at(q(o,V.TOOL_OUTPUT)),O=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(p.slice(0,500)),ct=O?"ERROR":"DEFAULT",Ut=mt(),Gt=Math.round(Number(BigInt(a)-BigInt(h))/1e6),Xt={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",ht=r==="Skill"&&A?A:ue(L,60);i.toolCalls.push({tool:r,brief:ht,error:O,durationMs:Gt});let Q=i.spans;Q.push({traceId:i.traceId,spanId:Ut,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:h,endTimeUnixNano:a,attributes:gt(f(T.OBS_NAME,r),f(T.OBS_TYPE,Xt),f(T.OBS_LEVEL,ct),f(T.OBS_INPUT,at(I)),f(T.OBS_OUTPUT,p),f("tool.name",r),f("tool.error",String(O)),r==="Skill"&&A?f("skill.name",A):null,r==="Skill"?f("skill.invocation","slash-command"):null),status:{code:O?2:1}}),i.pendingTool=null,vt(e,i),l("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${O}`,`durationMs=${Gt}`,`totalSpans=${Q.length}`),D(t);}var Ln=E(()=>{"use strict";jt();Ht();qe();kt();fe();W();U();ze();});function Rn(t,e,r){let n=Object.keys(An).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let s=An[n],o=(e*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var An,Pn=E(()=>{"use strict";An={"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 kn(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=It(e);if(!n){D(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(),o=K()??"",i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(y=>y.tool==="Skill")){let y=mt(),lt=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:y,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:gt(f(T.OBS_NAME,"Skill"),f(T.OBS_TYPE,"TOOL"),f(T.OBS_LEVEL,"DEFAULT"),f(T.OBS_INPUT,lt),f(T.OBS_OUTPUT,"loaded via slash command"),f("tool.name","Skill"),f("tool.error","false"),f("skill.name",n.slashSkill),f("skill.invocation","slash-command")),status:{code:1}}),l("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||n.transcriptPath||"",u=Ve(c);if(c&&(i.some(y=>y.tool==="Skill"&&!y.synthetic)||!!n.slashSkill)&&!u?.text){await new Promise(lt=>setTimeout(lt,500));let y=Ve(c);y?.text&&(u=y);}l("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${u?`text=${u.text.length}chars`:"null"}`);let L=i.length,I=i.filter(y=>y.error).length,A=at(u?.text?q(u.text,V.TRACE_OUTPUT):L===0?"No tools used":i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""}`).join(`
187
+ `)),p=u?.inputTokens??0,O=u?.outputTokens??0,ct=i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""} (${y.durationMs}ms)`),Ut=!!(n.slashSkill||i.some(y=>y.tool==="Skill")),Gt=i.some(y=>y.tool==="Agent");if(!Ut&&!Gt){l("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),He(e),D(t);return}let Jt=Ut?"skill":"agent",Xt=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),ht=u?.model||"",ge=Rn(ht,p,O),Q=en(n);Q==="prerequisite_required"&&u?.text&&(Q="complete"),Q==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:mt(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:gt(f(T.OBS_NAME,"prerequisite-check"),f(T.OBS_TYPE,"EVENT"),f(T.OBS_LEVEL,"WARNING"),f(T.OBS_OUTPUT,A),f("skill.name",n.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),l("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let Ct=(()=>{if(!(!Ut||!n.prompt)){if(n.slashSkill){let y=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return y?q(at(y),V.USER_INSTRUCTION):void 0}return q(at(n.prompt),V.USER_INSTRUCTION)||void 0}})(),_t=JSON.stringify({trace_type:Jt,...Q!==null&&{execution_status:Q},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Ct!==void 0&&{user_instruction:Ct},latency_ms:Xt,...p&&{tokens_input:p},...O&&{tokens_output:O},cost_usd:ge,...ht?{model:ht}:{},toolCount:L,errorCount:I,stopReason:r,sessionId:n.sessionId,tools:ct.length?ct:void 0}),Qe=at(q(n.prompt,V.TRACE_INPUT)),Cn=gt(f(T.TRACE_NAME,n.traceName),f(T.TRACE_INPUT,Qe),f(T.TRACE_OUTPUT,A),f(T.OBS_INPUT,Qe),f(T.OBS_OUTPUT,A),f(T.TRACE_METADATA,_t),f(T.SESSION_ID,n.sessionId),f(T.USER_ID,o),f(T.OBS_TYPE,"GENERATION"),f(T.MODEL,ht),p?f(T.INPUT_TOKENS,p):null,O?f(T.OUTPUT_TOKENS,O):null,f("claude.stop_reason",r),f("claude.tool_count",String(L)),f("claude.error_count",String(I)),f("claude.session_id",n.sessionId),f("flow.trace_type",Jt),{key:T.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Jt}]}}}),Nn={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Cn,status:{code:I>0?2:1}},$n=gt(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),tr=[...a,Nn];l("Stop",`sid=${e}`,`totalTools=${L}`,`errorTools=${I}`,`spans=${tr.length}`,`inputTokens=${p}`,`outputTokens=${O}`,`traceOutput="${ue(A,80)}"`);let Dn=await yn(an($n,tr));l("Stop",`POST status=${Dn}`,`traceId=${n.traceId}`,`latencyMs=${Xt}`,`costUsd=${ge}`),He(e),D(t);}var In=E(()=>{"use strict";jt();Ht();qe();J();Pn();Ge();kt();W();fe();ze();U();});var Et,vn=E(()=>{"use strict";J();kt();nn();on();Ln();In();Et=class{static async userPromptSubmit(){let e=await Yt(),r;try{r=(await Lt()).length>0;}catch{D(e);return}r?await rn(e):D(e);}static async preToolUse(){let e=await Yt();await sn(e);}static async postToolUse(){let e=await Yt();await wn(e);}static async stop(){let e=await Yt();await kn(e);}};});var po={};async function uo(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await Et.userPromptSubmit();break;case "PreToolUse":await Et.preToolUse();break;case "PostToolUse":await Et.postToolUse();break;case "Stop":await Et.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
188
+ `),process.stdin.on("data",e=>process.stdout.write(e));}}var bn=E(()=>{"use strict";vn();uo().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
189
+ `),process.exit(0);});});var fo=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,Y]=process.argv;function Ze(t,e){let r=t.indexOf(e);return r!==-1?t[r+1]:void 0}function Un(){let{bold:t,cyan:e,dim:r,green:n}=(ut(),F(he)),{version:s}=Nt();process.stdout.write(`
190
+ `+t(" flow-ai-obs")+r(" v"+s)+`
191
+
192
+ `),process.stdout.write(e(" init")+r(` Configure environment: Claude Code + Proxy + OTEL + Trace hooks
275
193
  `)),process.stdout.write(r(` --custom-url <URL> Set a custom Flow base URL
276
194
  `)),process.stdout.write(r(` --no-interactive Suppress interactive prompts (CI/CD)
277
195
  `)),process.stdout.write(r(` --custom-email <EMAIL> Set user email (used with --no-interactive)
278
- `)),process.stdout.write(r(` --token <JWT> Flow API Token (non-interactive auth)
279
- `)),process.stdout.write(t(" login")+r(` Refresh authentication token (re-authenticate)
280
- `)),process.stdout.write(r(` --token <JWT> Flow API Token (non-interactive auth)
281
- `)),process.stdout.write(t(" status")+r(` Show current observability configuration
196
+ `)),process.stdout.write(e(" status")+r(` Show current observability configuration
282
197
  `)),process.stdout.write(n(" update")+r(` Update to the latest version
283
198
 
284
199
  `)),process.stdout.write(r(` Flags: --version -v Show version
@@ -286,18 +201,17 @@ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${z}`},{re:/(aws_secret_ac
286
201
 
287
202
  `)),process.stdout.write(r(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
288
203
 
289
- `));}if(G==="--version"||G==="-v")(async()=>{let{version:e}=nt();process.stdout.write(e+`
290
- `);let t=(Ke(),D(He)),r=await t.fetchLatestVersionAsync().catch(()=>null);if(r&&t.isNewer(e,r.version)){let{dim:n,yellow:s}=(de(),D(Gt));process.stdout.write(s(`
291
- Update available: ${e} \u2192 ${r.version}
204
+ `));}if(Y==="--version"||Y==="-v")(async()=>{let{version:t}=Nt();process.stdout.write(t+`
205
+ `);let e=(Dt(),F($t)),r=await e.fetchLatestVersionAsync().catch(()=>null);if(r&&e.isNewer(t,r.version)){let{dim:n,yellow:s}=(ut(),F(he));process.stdout.write(s(`
206
+ Update available: ${t} \u2192 ${r.version}
292
207
  `)+n(` Run: flow-ai-obs update
293
208
 
294
- `));}process.exit(0);})().catch(()=>process.exit(0));else if(G==="--help"||G==="-h")hs(),process.exit(0);else if(G==="init"||G==="install")(async()=>{G==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
295
- `),await(Ke(),D(He)).checkForUpdateInteractive();let{runInit:e}=(Sn(),D(yn)),t=process.argv.slice(3);process.exit(await e({url:ne(t,"--custom-url"),noInteractive:t.includes("--no-interactive"),email:ne(t,"--custom-email"),token:ne(t,"--token"),clientId:ne(t,"--client-id"),clientSecret:ne(t,"--client-secret"),tenant:ne(t,"--tenant")}));})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
296
- `),process.exit(1);});else if(G==="login")(async()=>{await(Ke(),D(He)).checkForUpdateInteractive();let{runLogin:e}=(mt(),D(ft)),t=process.argv.slice(3),r=await e({token:ne(t,"--token"),clientId:ne(t,"--client-id"),clientSecret:ne(t,"--client-secret"),tenant:ne(t,"--tenant")});process.exit(typeof r=="number"?r:r.code);})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
297
- `),process.exit(1);});else if(G==="status")(async()=>{await(Ke(),D(He)).checkForUpdateInteractive();let{runStatus:e}=(In(),D(kn));process.exit(await e());})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
298
- `),process.exit(1);});else if(G==="update-api-key")(async()=>{let{runUpdateApiKey:e}=(vn(),D(Pn)),t=process.argv.slice(3);process.exit(await e({key:ne(t,"--key")}));})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
299
- `),process.exit(1);});else if(G==="update")(async()=>{let e=(Ke(),D(He)),{version:t}=nt(),r=await e.fetchLatestVersionAsync();r||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
300
- `),process.exit(1)),e.isNewer(t,r.version)||(process.stdout.write(` \u2713 Already up to date (v${t})
301
- `),process.exit(0)),await e.runUpdate(r.version),process.exit(0);})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
302
- `),process.exit(1);});else if(G==="otel-headers"){let{runOtelHeaders:e}=(Un(),D(bn));e().then(t=>process.exit(t)).catch(t=>{process.stderr.write(`[flow-ai-obs otel-headers] Unexpected error: ${t.message}
303
- `),process.exit(1);});}else Ai.has(G)?(Es(),D(wi)):(hs(),process.exit(0));
209
+ `));}process.exit(0);})().catch(()=>process.exit(0));else if(Y==="--help"||Y==="-h")Un(),process.exit(0);else if(Y==="init"||Y==="install")(async()=>{Y==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
210
+ `),await(Dt(),F($t)).checkForUpdateInteractive();let{runInit:t}=(vr(),F(Ir)),e=process.argv.slice(3);process.exit(await t({url:Ze(e,"--custom-url"),noInteractive:e.includes("--no-interactive"),email:Ze(e,"--custom-email")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
211
+ `),process.exit(1);});else if(Y==="status")(async()=>{await(Dt(),F($t)).checkForUpdateInteractive();let{runStatus:t}=(Kr(),F(Wr));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
212
+ `),process.exit(1);});else if(Y==="update-api-key")(async()=>{let{runUpdateApiKey:t}=(Yr(),F(Br)),e=process.argv.slice(3);process.exit(await t({key:Ze(e,"--key")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
213
+ `),process.exit(1);});else if(Y==="update")(async()=>{let t=(Dt(),F($t)),{version:e}=Nt(),r=await t.fetchLatestVersionAsync();r||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
214
+ `),process.exit(1)),t.isNewer(e,r.version)||(process.stdout.write(` \u2713 Already up to date (v${e})
215
+ `),process.exit(0)),await t.runUpdate(r.version),process.exit(0);})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
216
+ `),process.exit(1);});else if(Y==="otel-headers"){let{runOtelHeaders:t}=(Hr(),F(jr));t().then(e=>process.exit(e)).catch(e=>{process.stderr.write(`[flow-ai-obs otel-headers] Unexpected error: ${e.message}
217
+ `),process.exit(1);});}else fo.has(Y)?(bn(),F(po)):(Un(),process.exit(0));