@ciandt-flow/flow-ai-obs 0.11.0 → 0.12.0-beta.6

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,224 +1,224 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var Re=require('readline/promises'),ls=require('https'),k=require('fs'),ht=require('os'),bt=require('path'),child_process=require('child_process'),Rs=require('http'),util=require('util'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Re__namespace=/*#__PURE__*/_interopNamespace(Re);var ls__default=/*#__PURE__*/_interopDefault(ls);var k__namespace=/*#__PURE__*/_interopNamespace(k);var ht__namespace=/*#__PURE__*/_interopNamespace(ht);var bt__namespace=/*#__PURE__*/_interopNamespace(bt);var Rs__default=/*#__PURE__*/_interopDefault(Rs);var Le=Object.defineProperty;var ns=Object.getOwnPropertyDescriptor;var rs=Object.getOwnPropertyNames;var ss=Object.prototype.hasOwnProperty;var xt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var g=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var os=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}},$=(t,e)=>{for(var n in e)Le(t,n,{get:e[n],enumerable:true});},is=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of rs(e))!ss.call(t,s)&&s!==n&&Le(t,s,{get:()=>e[s],enumerable:!(r=ns(e,s))||r.enumerable});return t};var N=t=>is(Le({},"__esModule",{value:true}),t);var ve={};$(ve,{bold:()=>I,cyan:()=>P,dim:()=>m,green:()=>R,red:()=>b,yellow:()=>v});function At(t,e){return as?n=>`\x1B[${t}m${n}\x1B[${e}m`:n=>n}var as,R,b,v,P,I,m,ut=g(()=>{"use strict";as=!process.env.NO_COLOR&&process.stdout.isTTY;R=At("32","39"),b=At("31","39"),v=At("33","39"),P=At("36","39"),I=At("1","22"),m=At("2","22");});var Dt=os((si,cs)=>{cs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.11.0",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function dt(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function be(t,e){let n=Re__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let i=1;i<=3;i++)try{let o=(await n.question(s)).trim().toLowerCase();if(o===""&&e!==void 0)return n.close(),e;if(o==="y"||o==="yes")return n.close(),!0;if(o==="n"||o==="no")return n.close(),!1;i<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
- `);}catch(o){throw n.close(),o}if(n.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function yn(t,e){let n=Re__namespace.createInterface({input:process.stdin,output:process.stdout});try{let r=(await n.question(`${t}: `)).trim();if(e);return r}catch(r){throw r}finally{n.close();}}var Pe=g(()=>{"use strict";});var Lt={};$(Lt,{checkForUpdate:()=>gs,checkForUpdateInteractive:()=>hs,fetchLatestVersionAsync:()=>Ln,isNewer:()=>kt,primeUpdateCache:()=>Es,runUpdate:()=>kn});function F(){return Ie||(Ie=Dt()),Ie}function kt(t,e){let n=i=>{let o=String(i).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return o?[+o[1],+o[2],+o[3]]:null},r=n(t),s=n(e);return !r||!s?false:s[0]!==r[0]?s[0]>r[0]:s[1]!==r[1]?s[1]>r[1]:s[2]>r[2]}function Ce(){try{let t=JSON.parse(k__namespace.default.readFileSync(An,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=ps?null:t}catch{return null}}function $e(t,e,n=Date.now()){try{k__namespace.default.writeFileSync(An,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:n}),{mode:384});}catch{}}function Fe(t){let e=F().name,n=ls__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:fs},r=>{if(r.statusCode!==200)return r.resume(),t(new Error(`HTTP ${r.statusCode}`));let s="";r.setEncoding("utf8"),r.on("data",i=>{s+=i;}),r.on("end",()=>{try{let i=JSON.parse(s);if(typeof i.version!="string")throw new Error("no version field");t(null,{version:i.version,updatePriority:typeof i.updatePriority=="string"?i.updatePriority:null});}catch(i){t(i);}});});n.on("error",t),n.on("timeout",()=>{n.destroy(new Error("timeout"));});}function Ue(t){let e=F().name,r=` Update available: ${F().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,i=Math.max(r.length,s.length)+2,o="\u2500".repeat(i);process.stderr.write(`
4
- \u256D${o}\u256E
2
+ 'use strict';var ve=require('readline/promises'),ls=require('https'),k=require('fs'),ht=require('os'),Pt=require('path'),child_process=require('child_process'),vs=require('http'),util=require('util'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var ve__namespace=/*#__PURE__*/_interopNamespace(ve);var ls__default=/*#__PURE__*/_interopDefault(ls);var k__namespace=/*#__PURE__*/_interopNamespace(k);var ht__namespace=/*#__PURE__*/_interopNamespace(ht);var Pt__namespace=/*#__PURE__*/_interopNamespace(Pt);var vs__default=/*#__PURE__*/_interopDefault(vs);var Le=Object.defineProperty;var ns=Object.getOwnPropertyDescriptor;var rs=Object.getOwnPropertyNames;var ss=Object.prototype.hasOwnProperty;var Dt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var g=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var os=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}},F=(t,e)=>{for(var n in e)Le(t,n,{get:e[n],enumerable:true});},is=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of rs(e))!ss.call(t,o)&&o!==n&&Le(t,o,{get:()=>e[o],enumerable:!(r=ns(e,o))||r.enumerable});return t};var C=t=>is(Le({},"__esModule",{value:true}),t);var Re={};F(Re,{bold:()=>I,cyan:()=>P,dim:()=>m,green:()=>v,red:()=>b,yellow:()=>R});function At(t,e){return as?n=>`\x1B[${t}m${n}\x1B[${e}m`:n=>n}var as,v,b,R,P,I,m,ut=g(()=>{"use strict";as=!process.env.NO_COLOR&&process.stdout.isTTY;v=At("32","39"),b=At("31","39"),R=At("33","39"),P=At("36","39"),I=At("1","22"),m=At("2","22");});var Mt=os((si,cs)=>{cs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.12.0-beta.6",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function dt(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function be(t,e){let n=ve__namespace.createInterface({input:process.stdin,output:process.stdout}),o=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let i=1;i<=3;i++)try{let s=(await n.question(o)).trim().toLowerCase();if(s===""&&e!==void 0)return n.close(),e;if(s==="y"||s==="yes")return n.close(),!0;if(s==="n"||s==="no")return n.close(),!1;i<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
+ `);}catch(s){throw n.close(),s}if(n.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function _n(t,e){let n=ve__namespace.createInterface({input:process.stdin,output:process.stdout});try{let r=(await n.question(`${t}: `)).trim();if(e);return r}catch(r){throw r}finally{n.close();}}var Pe=g(()=>{"use strict";});var Lt={};F(Lt,{checkForUpdate:()=>gs,checkForUpdateInteractive:()=>hs,fetchLatestVersionAsync:()=>Ln,isNewer:()=>kt,primeUpdateCache:()=>Es,runUpdate:()=>kn});function x(){return Ie||(Ie=Mt()),Ie}function kt(t,e){let n=i=>{let s=String(i).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return s?[+s[1],+s[2],+s[3]]:null},r=n(t),o=n(e);return !r||!o?false:o[0]!==r[0]?o[0]>r[0]:o[1]!==r[1]?o[1]>r[1]:o[2]>r[2]}function Ce(){try{let t=JSON.parse(k__namespace.default.readFileSync(An,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=ps?null:t}catch{return null}}function $e(t,e,n=Date.now()){try{k__namespace.default.writeFileSync(An,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:n}),{mode:384});}catch{}}function Fe(t){let e=x().name,n=ls__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:fs},r=>{if(r.statusCode!==200)return r.resume(),t(new Error(`HTTP ${r.statusCode}`));let o="";r.setEncoding("utf8"),r.on("data",i=>{o+=i;}),r.on("end",()=>{try{let i=JSON.parse(o);if(typeof i.version!="string")throw new Error("no version field");t(null,{version:i.version,updatePriority:typeof i.updatePriority=="string"?i.updatePriority:null});}catch(i){t(i);}});});n.on("error",t),n.on("timeout",()=>{n.destroy(new Error("timeout"));});}function Ue(t){let e=x().name,r=` Update available: ${x().version} \u2192 ${t}`,o=` Run: npm install -g ${e}`,i=Math.max(r.length,o.length)+2,s="\u2500".repeat(i);process.stderr.write(`
4
+ \u256D${s}\u256E
5
5
  \u2502${r.padEnd(i)}\u2502
6
- \u2502${s.padEnd(i)}\u2502
7
- \u2570${o}\u256F
6
+ \u2502${o.padEnd(i)}\u2502
7
+ \u2570${s}\u256F
8
8
 
9
- `);}function Ne(t){let e=F().name;process.stderr.write(`
9
+ `);}function Ne(t){let e=x().name;process.stderr.write(`
10
10
  [${e}] Critical update detected \u2014 auto-updating to ${t}...
11
11
 
12
- `);let n=child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});n.on("error",()=>{}),n.unref();}async function ms(t,e=1e4){let n=xt("readline"),r=F().name,i=` Update available: ${F().version} \u2192 ${t}`,o=` Run: npm install -g ${r}`,a=" Install now? [y/N]: ",c=Math.max(i.length,o.length,a.length-2)+2,l="\u2500".repeat(c);return process.stderr.write(`
13
- \u256D${l}\u256E
12
+ `);let n=child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});n.on("error",()=>{}),n.unref();}async function ms(t,e=1e4){let n=Dt("readline"),r=x().name,i=` Update available: ${x().version} \u2192 ${t}`,s=` Run: npm install -g ${r}`,a=" Install now? [y/N]: ",c=Math.max(i.length,s.length,a.length-2)+2,u="\u2500".repeat(c);return process.stderr.write(`
13
+ \u256D${u}\u256E
14
14
  \u2502${i.padEnd(c)}\u2502
15
- \u2502${o.padEnd(c)}\u2502
15
+ \u2502${s.padEnd(c)}\u2502
16
16
  \u2502${a.padEnd(c)}\u2502
17
- \u2570${l}\u256F
18
- `),new Promise(S=>{let A=n.createInterface({input:process.stdin,output:void 0,terminal:false}),T=false;function w(h){T||(T=true,clearTimeout(d),A.close(),process.stderr.write(`
19
- `),S(h));}let d=setTimeout(()=>w(false),e);A.once("line",h=>w(h.trim().toLowerCase()==="y")),A.once("close",()=>w(false));})}async function kn(t){let e=F().name;return process.stderr.write(` Installing ${e}@${t}...
20
- `),new Promise(n=>{let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit",shell:process.platform==="win32"}),s=false;function i(o,a){if(!s){if(s=true,o)process.stderr.write(` \u2713 Updated to ${t}. Please restart the command.
17
+ \u2570${u}\u256F
18
+ `),new Promise(T=>{let A=n.createInterface({input:process.stdin,output:void 0,terminal:false}),w=false;function S(h){w||(w=true,clearTimeout(d),A.close(),process.stderr.write(`
19
+ `),T(h));}let d=setTimeout(()=>S(false),e);A.once("line",h=>S(h.trim().toLowerCase()==="y")),A.once("close",()=>S(false));})}async function kn(t){let e=x().name;return process.stderr.write(` Installing ${e}@${t}...
20
+ `),new Promise(n=>{let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit",shell:process.platform==="win32"}),o=false;function i(s,a){if(!o){if(o=true,s)process.stderr.write(` \u2713 Updated to ${t}. Please restart the command.
21
21
 
22
22
  `);else {let c=a?` (${a})`:"";process.stderr.write(` \u2717 Update failed${c} \u2014 continuing with current version.
23
23
 
24
- `);}n();}}r.on("close",(o,a)=>i(o===0,a??void 0)),r.on("error",o=>i(false,o.code));})}function Ln(){return new Promise(t=>{Fe((e,n)=>t(e||!n?null:n));})}function gs(){try{let t=Ce();if(t){kt(F().version,t.latestVersion)&&(t.updatePriority==="auto"?Ne(t.latestVersion):Ue(t.latestVersion));return}setImmediate(()=>{Fe((e,n)=>{e||!n||($e(n.version,n.updatePriority),kt(F().version,n.version)&&(n.updatePriority==="auto"?Ne(n.version):Ue(n.version)));});});}catch{}}async function hs(t={}){try{let e=Ce();if(e){if(!kt(F().version,e.latestVersion))return}else {let r=await Ln();if(!r||($e(r.version,r.updatePriority),!kt(F().version,r.version)))return;e={latestVersion:r.version,updatePriority:r.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Ne(e.latestVersion);return}if(!dt()){Ue(e.latestVersion);return}await ms(e.latestVersion,t.timeoutMs)&&await kn(e.latestVersion);}catch{}}function Es(){try{if(Ce())return;setImmediate(()=>{Fe((t,e)=>{t||!e||kt(F().version,e.version)&&$e(e.version,e.updatePriority,0);});});}catch{}}var Ie,An,ps,fs,vt=g(()=>{"use strict";Pe();An=bt__namespace.default.join(ht__namespace.default.tmpdir(),"flow-obs-update-cache.json"),ps=1440*60*1e3,fs=3e3;});var vn={};$(vn,{BUFFER:()=>x,CONFIG_DIR_NAME:()=>Mt,CONFIG_FILE_NAME:()=>Ht,DEBUG_LOG_FILENAME:()=>xe,ENV:()=>p,FEATURES:()=>ys,FLOW_URLS:()=>ws,HOOK_TIMEOUTS:()=>ft,INSTALLER:()=>jt,NATIVE_OTEL:()=>nt,OTLP:()=>ie,STATE_FILE_PREFIX:()=>_s,TRACE_LIMITS:()=>j,VAULT:()=>Bt,getFlowBaseUrl:()=>et,getFlowUrls:()=>pt,getLlmProxy:()=>Ts,getMetrics:()=>ae});function et(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Ss}function pt(){let t=et();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}function Ts(){let t=et();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function ae(){let t=et();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ss,ws,Bt,Mt,Ht,ie,nt,p,ys,jt,ft,x,xe,j,_s,L=g(()=>{"use strict";Ss="https://flow.ciandt.com";ws=pt(),Bt={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},Mt="FLOW-nodejs",Ht="config.json",ie={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};nt={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},p={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"},ys={KEYCHAIN_ENABLED:!1},jt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},ft={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},x={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},xe="flow-ai-obs-debug.log",j={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};_s="flow-obs-";});function u(...t){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
24
+ `);}n();}}r.on("close",(s,a)=>i(s===0,a??void 0)),r.on("error",s=>i(false,s.code));})}function Ln(){return new Promise(t=>{Fe((e,n)=>t(e||!n?null:n));})}function gs(){try{let t=Ce();if(t){kt(x().version,t.latestVersion)&&(t.updatePriority==="auto"?Ne(t.latestVersion):Ue(t.latestVersion));return}setImmediate(()=>{Fe((e,n)=>{e||!n||($e(n.version,n.updatePriority),kt(x().version,n.version)&&(n.updatePriority==="auto"?Ne(n.version):Ue(n.version)));});});}catch{}}async function hs(t={}){try{let e=Ce();if(e){if(!kt(x().version,e.latestVersion))return}else {let r=await Ln();if(!r||($e(r.version,r.updatePriority),!kt(x().version,r.version)))return;e={latestVersion:r.version,updatePriority:r.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Ne(e.latestVersion);return}if(!dt()){Ue(e.latestVersion);return}await ms(e.latestVersion,t.timeoutMs)&&await kn(e.latestVersion);}catch{}}function Es(){try{if(Ce())return;setImmediate(()=>{Fe((t,e)=>{t||!e||kt(x().version,e.version)&&$e(e.version,e.updatePriority,0);});});}catch{}}var Ie,An,ps,fs,Rt=g(()=>{"use strict";Pe();An=Pt__namespace.default.join(ht__namespace.default.tmpdir(),"flow-obs-update-cache.json"),ps=1440*60*1e3,fs=3e3;});var Rn={};F(Rn,{AUTH_ENGINE:()=>vt,BUFFER:()=>D,CONFIG_DIR_NAME:()=>Ht,CONFIG_FILE_NAME:()=>jt,DEBUG_LOG_FILENAME:()=>xe,ENV:()=>p,FEATURES:()=>_s,FLOW_URLS:()=>Ss,HOOK_TIMEOUTS:()=>ft,INSTALLER:()=>Wt,NATIVE_OTEL:()=>nt,OTLP:()=>ae,STATE_FILE_PREFIX:()=>ys,TRACE_LIMITS:()=>W,VAULT:()=>Bt,getFlowBaseUrl:()=>et,getFlowUrls:()=>pt,getLlmProxy:()=>ws,getMetrics:()=>ce});function et(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Ts}function pt(){let t=et();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}function ws(){let t=et();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function ce(){let t=et();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ts,Ss,Bt,Ht,jt,ae,nt,p,_s,vt,Wt,ft,D,xe,W,ys,L=g(()=>{"use strict";Ts="https://flow.ciandt.com";Ss=pt(),Bt={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},Ht="FLOW-nodejs",jt="config.json",ae={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};nt={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},p={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"},_s={KEYCHAIN_ENABLED:!1},vt={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},Wt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},ft={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},D={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},xe="flow-ai-obs-debug.log",W={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};ys="flow-obs-";});function l(...t){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
25
25
  `;try{k.writeFileSync(Ls,e,{flag:"a"});}catch(n){process.stderr.write(`[flow-obs debug ERROR] ${n.message}
26
- `);}}var Ls,W=g(()=>{"use strict";L();Ls=bt.join(ht.tmpdir(),xe);});function Ps(t){if(!bs.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Is(t,e){let n=e.length>400?e.slice(0,400)+"\u2026":e;u("toAuthError",`status=${t} body=${n}`);try{let r=JSON.parse(e);if(typeof r.error=="string"&&(u("toAuthError",`api_error_code=${r.error}`+(r.message?` api_message=${r.message}`:"")),Rn[r.error]))return new mt(Rn[r.error])}catch{}return t===401||t===403||t===500?new mt("Invalid credentials"):t>=400&&t<500?new mt("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function D(t){return new Promise((e,n)=>{try{Ps(t.tenant);}catch(l){return n(l)}let r=JSON.stringify({clientSecret:t.clientSecret}),s=new URL(pt().AUTH_ENGINE),i=s.protocol==="https:",o={hostname:s.hostname,port:s.port||(i?443:80),path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(r),FlowTenant:t.tenant}};u("getToken",`requesting token tenant=${t.tenant} host=${o.hostname} path=${o.path}`);let c=(i?ls__default.default:Rs__default.default).request(o,l=>{let S=[];l.on("data",A=>S.push(A)),l.on("end",()=>{let A=S.join("");if((l.statusCode??0)>=400)return n(Is(l.statusCode??0,A));let T;try{T=JSON.parse(A);}catch{return n(new Error("Invalid response from auth engine"))}let w=T.expires_at??new Date(Date.now()+(T.expires_in??3600)*1e3).toISOString();if(!T.access_token)return n(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));e({accessToken:T.access_token,expiresAt:w});});});c.on("error",l=>n(new Error(`Network error: ${l.message}`))),c.write(r),c.end();})}var mt,bs,Rn,gt=g(()=>{"use strict";L();W();mt=class extends Error{constructor(e){super(e),this.name="AuthError";}},bs=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;Rn={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};});function bn(){return process.platform==="win32"?false:process.getuid?.()===0}function ce(){if(bn())return process.stderr.write(`
26
+ `);}}var Ls,V=g(()=>{"use strict";L();Ls=Pt.join(ht.tmpdir(),xe);});function Ps(t){if(!bs.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Is(t,e){let n=e.length>400?e.slice(0,400)+"\u2026":e;l("toAuthError",`status=${t} body=${n}`);try{let r=JSON.parse(e);if(typeof r.error=="string"&&(l("toAuthError",`api_error_code=${r.error}`+(r.message?` api_message=${r.message}`:"")),vn[r.error]))return new mt(vn[r.error],t)}catch{}return t===401||t===403||t===500?new mt("Invalid credentials",t):t>=400&&t<500?new mt("Authentication request was rejected",t):new Error("Authentication service unavailable, please try again later")}function M(t){return new Promise((e,n)=>{try{Ps(t.tenant);}catch(u){return n(u)}let r=JSON.stringify({clientSecret:t.clientSecret}),o=new URL(pt().AUTH_ENGINE),i=o.protocol==="https:",s={hostname:o.hostname,port:o.port||(i?443:80),path:o.pathname+o.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(r),FlowTenant:t.tenant}};l("getToken",`requesting token tenant=${t.tenant} host=${s.hostname} path=${s.path}`);let c=(i?ls__default.default:vs__default.default).request(s,u=>{let T=[];u.on("data",A=>T.push(A)),u.on("end",()=>{let A=T.join("");if((u.statusCode??0)>=400)return n(Is(u.statusCode??0,A));let w;try{w=JSON.parse(A);}catch{return n(new Error("Invalid response from auth engine"))}let S=w.expires_at??new Date(Date.now()+(w.expires_in??3600)*1e3).toISOString();if(!w.access_token)return n(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));e({accessToken:w.access_token,expiresAt:S});});});c.on("error",u=>n(new Error(`Network error: ${u.message}`))),c.setTimeout(vt.REQUEST_TIMEOUT_MS,()=>{c.destroy(new Error("Request timeout"));}),c.write(r),c.end();})}var mt,bs,vn,gt=g(()=>{"use strict";L();V();mt=class extends Error{statusCode;constructor(e,n=0){super(e),this.name="AuthError",this.statusCode=n;}},bs=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;vn={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};});function bn(){return process.platform==="win32"?false:process.getuid?.()===0}function le(){if(bn())return process.stderr.write(`
27
27
  `+b(` \u2717 flow-ai-obs is not supported in a sudo context.
28
28
 
29
29
  `)+P(` npm install -g @ciandt-flow/flow-ai-obs
30
30
  `)+`
31
- `),1}var le=g(()=>{"use strict";ut();});function Pn(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:ht__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||ht__namespace.userInfo().username}}function B(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(t=n);}if(t){let e=t.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return bt__namespace.join(e,".claude","settings.json")}return bt__namespace.join(ht__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||ht__namespace.homedir();return bt__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return bt__namespace.join(e,".claude","settings.json")}return bt__namespace.join(ht__namespace.homedir(),".claude","settings.json")}var ue=g(()=>{"use strict";le();});function de(){if(process.platform==="win32"){let n=process.env.APPDATA||bt__namespace.join(ht__namespace.homedir(),"AppData","Roaming");return bt__namespace.join(n,In,Un)}let t=Pn(),e=process.env.XDG_CONFIG_HOME||bt__namespace.join(t.home,".config");return bt__namespace.join(e,In,Un)}function $n(){try{let t=k__namespace.readFileSync(B(),"utf8"),n=JSON.parse(t).env?.FLOW_BASE_URL;return typeof n=="string"&&n.trim()?n.trim():null}catch{return null}}var In,Un,Be=g(()=>{"use strict";ue();In="flow-ai-obs",Un="config.json";});function Fn(t){try{let e=k__namespace.statSync(t);Date.now()-e.mtimeMs>Us&&k__namespace.unlinkSync(t);}catch{}try{k__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function xn(t){try{k__namespace.unlinkSync(t);}catch{}}function Ns(t,e){let r=(Array.isArray(t)?t:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let i=s.hooks.filter(o=>!o.command?.startsWith?.("flow-ai-obs "));return i.length>0?{...s,hooks:i}:null}).filter(s=>s!=null);return [e,...r]}function Dn(t,e){let n=B(),r=n+".lock",s=[];k__namespace.mkdirSync(bt__namespace.dirname(n),{recursive:true}),Fn(r);try{if(k__namespace.existsSync(n)){k__namespace.copyFileSync(n,n+".bkp");try{k__namespace.chmodSync(n+".bkp",384);}catch{}}let i=de();if(k__namespace.existsSync(i)){let d=i+".bkp";k__namespace.copyFileSync(i,d);try{k__namespace.chmodSync(d,384);}catch{}}let o={};try{o=JSON.parse(k__namespace.readFileSync(n,"utf8"));}catch{}let a=o.env&&typeof o.env=="object"?o.env:{};delete a.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:c}=(L(),N(vn)),l=c().OTEL_ENDPOINT,S={...nt,OTEL_EXPORTER_OTLP_ENDPOINT:t??l};o.env={...a,...S,...e??{}},o.otelHeadersHelper="flow-ai-obs otel-headers",(!o.hooks||typeof o.hooks!="object"||Array.isArray(o.hooks))&&(o.hooks={});let A=(d,h)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${d}`,timeout:h}]}),T=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],w=o.hooks;for(let d of T){let h=Ns(w[d],A(d,ft[d]));h.length>1&&s.push(d),w[d]=h;}k__namespace.writeFileSync(n,JSON.stringify(o,null,2)+`
32
- `,{encoding:"utf8",mode:384});try{k__namespace.chmodSync(n,384);}catch{}}finally{xn(r);}return {settingsPath:n,preserved:s}}function He(t){try{let e=k__namespace.readFileSync(B(),"utf8"),r=JSON.parse(e).env?.[t];return typeof r=="string"?r:null}catch{return null}}function pe(t){let e=B(),n=e+".lock";k__namespace.mkdirSync(bt__namespace.dirname(e),{recursive:true}),Fn(n);try{let r={};try{r=JSON.parse(k__namespace.readFileSync(e,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,t),k__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
33
- `,{encoding:"utf8",mode:384});try{k__namespace.chmodSync(e,384);}catch{}}finally{xn(n);}}var Us,Vt=g(()=>{"use strict";L();gt();ue();Be();Us=jt.LOCK_STALE_MS;});function Yt(){let t=ht__namespace.default.homedir();if(process.platform==="darwin")return bt__namespace.default.join(t,"Library","Preferences",Mt,Ht);if(process.platform==="win32"){let n=process.env.APPDATA??bt__namespace.default.join(t,"AppData","Roaming");return bt__namespace.default.join(n,Mt,Ht)}let e=process.env.XDG_CONFIG_HOME??bt__namespace.default.join(t,".config");return bt__namespace.default.join(e,Mt,Ht)}function We(){try{let t=k__namespace.default.readFileSync(Yt(),"utf8");return JSON.parse(t)}catch{return {}}}function Bn(t){let e=Yt();k__namespace.default.mkdirSync(bt__namespace.default.dirname(e),{recursive:true}),k__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var je,Jt,Mn=g(()=>{"use strict";L();je={credentials:"credentials","token-cache":"tokenCache"};Jt=class{static isAvailable(){return !0}static hasExistingData(){try{if(!k__namespace.default.existsSync(Yt()))return !1;let e=JSON.parse(k__namespace.default.readFileSync(Yt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,n){let r=We(),s=je[n]??n,i=r[s];return i?typeof i=="string"?i:JSON.stringify(i):null}async setSecret(e,n,r){let s=We(),i=je[n]??n;if(n==="token-cache")try{s[i]=JSON.parse(r);}catch{s[i]=r;}else s[i]=r;Bn(s);}async deleteSecret(e,n){let r=We(),s=je[n]??n;return s in r?(delete r[s],Bn(r),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Yt()}`}};});var Hn={};$(Hn,{MacOsKeyVaultProvider:()=>Ye});var Ve,Ye,jn=g(()=>{"use strict";Ve=util.promisify(child_process.execFile),Ye=class{static async isAvailable(){try{return k.accessSync("/usr/bin/security",k.constants.X_OK),!0}catch{return !1}}async getSecret(e,n){try{let{stdout:r}=await Ve("security",["find-generic-password","-w","-a",n,"-s",e]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await Ve("security",["add-generic-password","-U","-a",n,"-s",e,"-w",r]);}async deleteSecret(e,n){try{return await Ve("security",["delete-generic-password","-a",n,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Vn={};$(Vn,{LinuxKeyVaultProvider:()=>Ge});var Wn,Ge,Yn=g(()=>{"use strict";Wn=util.promisify(child_process.execFile),Ge=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of e)try{return k.accessSync(n,k.constants.X_OK),!0}catch{}return !1}async getSecret(e,n){try{let{stdout:r}=await Wn("secret-tool",["lookup","service",e,"account",n]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await new Promise((s,i)=>{let o=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",n]);o.on("error",i),o.on("close",a=>{a===0?s():i(new Error(`secret-tool exited with code ${a}`));}),o.stdin.write(r),o.stdin.end();});}async deleteSecret(e,n){try{return await Wn("secret-tool",["clear","service",e,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Gn={};$(Gn,{WindowsKeyVaultProvider:()=>Je});var Je,Jn=g(()=>{"use strict";Je=class{static async isAvailable(){try{return await xt("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,n){return xt("keytar").getPassword(e,n)}async setSecret(e,n,r){await xt("keytar").setPassword(e,n,r);}async deleteSecret(e,n){return xt("keytar").deletePassword(e,n)}getStoragePath(){return "Windows Credential Manager"}};});async function qn(){return process.env[p.FLOW_OBS_USE_JSON_VAULT]==="1"?new Jt:await Vs()??new Jt}async function Vs(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(jn(),Hn));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Yn(),Vn));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Jn(),Gn));return await t.isAvailable()?new t:null}default:return null}}var Kn=g(()=>{"use strict";L();Mn();});var zn={};$(zn,{clearFlowCredentials:()=>Gs,getConfigPath:()=>qs,getEmailFromToken:()=>fe,getFlowCredentials:()=>Xn,getTokenCache:()=>qt,hasCredentials:()=>Ks,isTokenValid:()=>Js,saveFlowCredentials:()=>Ys,saveTokenCache:()=>rt});function It(){return qe||(qe=qn()),qe}async function Xn(){let e=await(await It()).getSecret(Pt,Ke);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Ys(t){if(!t.clientId||!t.clientSecret||!t.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await It()).setSecret(Pt,Ke,JSON.stringify(t));}async function Gs(){let t=await It();await t.deleteSecret(Pt,Ke),await t.deleteSecret(Pt,Xe);}async function rt(t){await(await It()).setSecret(Pt,Xe,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function qt(){let e=await(await It()).getSecret(Pt,Xe);if(!e)return null;try{let n=JSON.parse(e);return {accessToken:n.accessToken,expiresAt:n.expiresAt,lastAuthCheckAt:n.lastAuthCheckAt}}catch{return null}}async function Js(){let t=await qt();return t?new Date(t.expiresAt)>new Date:false}async function fe(){let t=await qt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email??n.preferred_username??n.upn??n.sub??null}catch{return null}}async function qs(){let t=await It();if(typeof t.getStoragePath=="function")return t.getStoragePath();let e=process.platform;return e==="darwin"?"macOS Keychain":e==="win32"?"Windows Credential Manager":"Linux Secret Service (libsecret)"}async function Ks(){let t=await Xn();return !!(t&&t.clientId&&t.clientSecret&&t.tenant)}var Pt,Ke,Xe,qe,Kt=g(()=>{"use strict";Kn();L();Pt=Bt.SERVICE,Ke=Bt.ACCOUNT_CREDS,Xe=Bt.ACCOUNT_TOKEN,qe=null;});function zs(t){return Xs.some(e=>e.test(t))}function Zs(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email||n.preferred_username||n.upn||n.sub||null}catch{return null}}function st(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:s,tenant:i}=n;return !r||!s||!i?null:{clientId:r,clientSecret:s,tenant:i}}catch{return null}}function Zn(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),n=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${n}.`}function Et(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let n=process.env[p.FLOW_OBS_ALLOW_HTTP]==="true";if(!n&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!n&&zs(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Qn(){let t=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);return t?{user:await fe().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function Qs(){return new Date().toISOString().slice(0,10)}async function to(t){let e=Qs(),n=await qt();if(n?.lastAuthCheckAt!==e){u("getOrRefreshToken",`daily auth check (last: ${n?.lastAuthCheckAt??"never"})`);try{let i=await D(t);try{await rt({...i,lastAuthCheckAt:e});}catch{}return u("getOrRefreshToken",`daily check passed, expires=${i.expiresAt}`),i.accessToken}catch(i){if(i instanceof mt)throw i;u("getOrRefreshToken",`daily check network error \u2014 using cache: ${i.message}`);}}let r=n!=null&&new Date(n.expiresAt)>new Date;if(u("getOrRefreshToken",`cacheValid=${r}`),r)return u("getOrRefreshToken",`using cached token, expires=${n.expiresAt}`),n.accessToken;u("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let s=await D(t);try{await rt({...s,lastAuthCheckAt:e});}catch(i){u("getOrRefreshToken",`token cache save failed (non-fatal): ${i.message}`);}return u("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function eo(t,e){let n=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${n}`}}function no(t,e,n){let r=Buffer.from(`${e}:${n}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${r}`}}async function K(){let t=[],e=process.env[p.ANTHROPIC_MODEL]??"",n=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);u("resolveCredentials",n?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),n&&u("resolveCredentials",`clientId=${n.clientId}`,`tenant=${n.tenant}`);let r=n?n.tenant:"",s=process.env[p.FLOW_TELEMETRY]==="true",i=process.env[p.LANGFUSE_BASE_URL],o=process.env[p.LANGFUSE_PUBLIC_KEY],a=process.env[p.LANGFUSE_SECRET_KEY];if(s&&i&&o&&a){let T="",w=r;n&&(T=await fe().catch(()=>null)??n.clientId);let d={user:T??"",tenant:w??"",team:"",project:"",model:e};t.push({mode:"direct",...no(Et(i),o,a),...d}),u("resolveCredentials","direct mode active",`user=${d.user}`,`tenant=${d.tenant}`);}if(!n){if(t.length===0){let T=[];return T.authError=false,T}return t}let c;try{c=await to(n);}catch(T){if(u("resolveCredentials",`token refresh failed: ${T.message}`,`(tenant=${n.tenant} clientId=${n.clientId})`),t.length>0)return t.authError=true,t;let w=[];return w.authError=true,w}let S={user:Zs(c)??n.clientId,tenant:r,team:"",project:"",model:e},A=process.env[p.FLOW_TELEMETRY_GATEWAY]??et();return t.push({mode:"gateway",...eo(Et(A),{accessToken:c}),...S}),t}async function me(){return (await K()).length>0}var Xs,V=g(()=>{"use strict";Kt();gt();L();W();Xs=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];});var er={};$(er,{clearLoggedOutMarker:()=>Ze,isLoggedOut:()=>oo,markLoggedOut:()=>so});function ze(){return bt__namespace.default.join(ht__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function so(){try{let t=ze();k__namespace.default.mkdirSync(bt__namespace.default.dirname(t),{recursive:!0}),k__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function Ze(){try{k__namespace.default.unlinkSync(ze());}catch{}}function oo(){try{return k__namespace.default.existsSync(ze())}catch{return false}}var Qe=g(()=>{"use strict";});function tn(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():He("FLOW_BASE_URL")}function io(){return He(p.ANTHROPIC_AUTH_TOKEN)??void 0}async function he(){let t=tn();if(!t)return {ok:false,baseUrl:"",user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let s=new URL(t);if(s.protocol!=="https:"&&s.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:t,user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"}}let e=io(),n=st(e);if(!n)return {ok:false,baseUrl:t,user:"",tenant:"",error:"No credentials found"};let r=process.env.FLOW_BASE_URL;process.env.FLOW_BASE_URL=t;try{let s=await D({clientId:n.clientId,clientSecret:n.clientSecret,tenant:n.tenant});await rt({accessToken:s.accessToken,expiresAt:s.expiresAt});let i=n.clientId;try{let o=s.accessToken.split(".");if(o.length>=2){let a=JSON.parse(Buffer.from(o[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));i=a.email??a.preferred_username??a.upn??a.sub??i;}}catch{}return {ok:!0,baseUrl:t,user:i,tenant:n.tenant}}catch(s){return {ok:false,baseUrl:t,user:n.clientId,tenant:n.tenant,error:s.message}}finally{r===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=r;}}var en=g(()=>{"use strict";Kt();V();Vt();L();gt();});var zt={};$(zt,{promptRaw:()=>Xt,runLogin:()=>lo});function Y(t){return typeof t=="string"?t.replace(ao,""):t}function Xt(t,e={}){return new Promise((n,r)=>{if(typeof process.stdin.setRawMode!="function"){r(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:i=""}=e;process.stdout.write(t+i);let o=i;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=S=>{if(S===""){l(),r(new Error("SIGINT"));return}if(S==="\r"||S===`
34
- `){l(),process.stdout.write(`
35
- `),n(o);return}if(S==="\x7F"){o.length>0&&(o=o.slice(0,-1),process.stdout.write("\b \b"));return}S.startsWith("\x1B")||(o+=S,process.stdout.write(s?"*".repeat(S.length):S));};function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",a),process.removeListener("unhandledRejection",a);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}async function Ee(t,e=false){let n=tn(),r=process.env.FLOW_BASE_URL;n&&(process.env.FLOW_BASE_URL=n);try{let{accessToken:s,expiresAt:i}=await D(t),o=Zn(t);if(e)return {jwt:o,accessToken:s,expiresAt:i};pe({[p.ANTHROPIC_AUTH_TOKEN]:o}),Ze(),await rt({accessToken:s,expiresAt:i});}finally{r===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=r;}}async function co(t=false){try{let e=(await Xt(P(" ? ")+"Client ID: ")).trim(),n=(await Xt(P(" ? ")+"Client Secret: ",{masked:!0})).trim(),r=(await Xt(P(" ? ")+"Tenant: ")).trim();if(!e||!n||!r)return process.stderr.write(b(` \u2717 All fields are required
31
+ `),1}var ue=g(()=>{"use strict";ut();});function Pn(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:ht__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||ht__namespace.userInfo().username}}function B(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(t=n);}if(t){let e=t.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return Pt__namespace.join(e,".claude","settings.json")}return Pt__namespace.join(ht__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||ht__namespace.homedir();return Pt__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return Pt__namespace.join(e,".claude","settings.json")}return Pt__namespace.join(ht__namespace.homedir(),".claude","settings.json")}var de=g(()=>{"use strict";ue();});function pe(){if(process.platform==="win32"){let n=process.env.APPDATA||Pt__namespace.join(ht__namespace.homedir(),"AppData","Roaming");return Pt__namespace.join(n,In,Un)}let t=Pn(),e=process.env.XDG_CONFIG_HOME||Pt__namespace.join(t.home,".config");return Pt__namespace.join(e,In,Un)}function $n(){try{let t=k__namespace.readFileSync(B(),"utf8"),n=JSON.parse(t).env?.FLOW_BASE_URL;return typeof n=="string"&&n.trim()?n.trim():null}catch{return null}}var In,Un,Me=g(()=>{"use strict";de();In="flow-ai-obs",Un="config.json";});function Fn(t){try{let e=k__namespace.statSync(t);Date.now()-e.mtimeMs>Us&&k__namespace.unlinkSync(t);}catch{}try{k__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function xn(t){try{k__namespace.unlinkSync(t);}catch{}}function Ns(t,e){let r=(Array.isArray(t)?t:[]).map(o=>{if(!Array.isArray(o?.hooks))return null;let i=o.hooks.filter(s=>!s.command?.startsWith?.("flow-ai-obs "));return i.length>0?{...o,hooks:i}:null}).filter(o=>o!=null);return [e,...r]}function Dn(t,e){let n=B(),r=n+".lock",o=[];k__namespace.mkdirSync(Pt__namespace.dirname(n),{recursive:true}),Fn(r);try{if(k__namespace.existsSync(n)){k__namespace.copyFileSync(n,n+".bkp");try{k__namespace.chmodSync(n+".bkp",384);}catch{}}let i=pe();if(k__namespace.existsSync(i)){let d=i+".bkp";k__namespace.copyFileSync(i,d);try{k__namespace.chmodSync(d,384);}catch{}}let s={};try{s=JSON.parse(k__namespace.readFileSync(n,"utf8"));}catch{}let a=s.env&&typeof s.env=="object"?s.env:{};delete a.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:c}=(L(),C(Rn)),u=c().OTEL_ENDPOINT,T={...nt,OTEL_EXPORTER_OTLP_ENDPOINT:t??u};s.env={...a,...T,...e??{}},s.otelHeadersHelper="flow-ai-obs otel-headers",(!s.hooks||typeof s.hooks!="object"||Array.isArray(s.hooks))&&(s.hooks={});let A=(d,h)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${d}`,timeout:h}]}),w=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],S=s.hooks;for(let d of w){let h=Ns(S[d],A(d,ft[d]));h.length>1&&o.push(d),S[d]=h;}k__namespace.writeFileSync(n,JSON.stringify(s,null,2)+`
32
+ `,{encoding:"utf8",mode:384});try{k__namespace.chmodSync(n,384);}catch{}}finally{xn(r);}return {settingsPath:n,preserved:o}}function He(t){try{let e=k__namespace.readFileSync(B(),"utf8"),r=JSON.parse(e).env?.[t];return typeof r=="string"?r:null}catch{return null}}function fe(t){let e=B(),n=e+".lock";k__namespace.mkdirSync(Pt__namespace.dirname(e),{recursive:true}),Fn(n);try{let r={};try{r=JSON.parse(k__namespace.readFileSync(e,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,t),k__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
33
+ `,{encoding:"utf8",mode:384});try{k__namespace.chmodSync(e,384);}catch{}}finally{xn(n);}}var Us,Yt=g(()=>{"use strict";L();gt();de();Me();Us=Wt.LOCK_STALE_MS;});function Gt(){let t=ht__namespace.default.homedir();if(process.platform==="darwin")return Pt__namespace.default.join(t,"Library","Preferences",Ht,jt);if(process.platform==="win32"){let n=process.env.APPDATA??Pt__namespace.default.join(t,"AppData","Roaming");return Pt__namespace.default.join(n,Ht,jt)}let e=process.env.XDG_CONFIG_HOME??Pt__namespace.default.join(t,".config");return Pt__namespace.default.join(e,Ht,jt)}function We(){try{let t=k__namespace.default.readFileSync(Gt(),"utf8");return JSON.parse(t)}catch{return {}}}function Mn(t){let e=Gt();k__namespace.default.mkdirSync(Pt__namespace.default.dirname(e),{recursive:true}),k__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var je,qt,Bn=g(()=>{"use strict";L();je={credentials:"credentials","token-cache":"tokenCache"};qt=class{static isAvailable(){return !0}static hasExistingData(){try{if(!k__namespace.default.existsSync(Gt()))return !1;let e=JSON.parse(k__namespace.default.readFileSync(Gt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,n){let r=We(),o=je[n]??n,i=r[o];return i?typeof i=="string"?i:JSON.stringify(i):null}async setSecret(e,n,r){let o=We(),i=je[n]??n;if(n==="token-cache")try{o[i]=JSON.parse(r);}catch{o[i]=r;}else o[i]=r;Mn(o);}async deleteSecret(e,n){let r=We(),o=je[n]??n;return o in r?(delete r[o],Mn(r),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Gt()}`}};});var Hn={};F(Hn,{MacOsKeyVaultProvider:()=>Ye});var Ve,Ye,jn=g(()=>{"use strict";Ve=util.promisify(child_process.execFile),Ye=class{static async isAvailable(){try{return k.accessSync("/usr/bin/security",k.constants.X_OK),!0}catch{return !1}}async getSecret(e,n){try{let{stdout:r}=await Ve("security",["find-generic-password","-w","-a",n,"-s",e]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await Ve("security",["add-generic-password","-U","-a",n,"-s",e,"-w",r]);}async deleteSecret(e,n){try{return await Ve("security",["delete-generic-password","-a",n,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Vn={};F(Vn,{LinuxKeyVaultProvider:()=>Ge});var Wn,Ge,Yn=g(()=>{"use strict";Wn=util.promisify(child_process.execFile),Ge=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of e)try{return k.accessSync(n,k.constants.X_OK),!0}catch{}return !1}async getSecret(e,n){try{let{stdout:r}=await Wn("secret-tool",["lookup","service",e,"account",n]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await new Promise((o,i)=>{let s=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",n]);s.on("error",i),s.on("close",a=>{a===0?o():i(new Error(`secret-tool exited with code ${a}`));}),s.stdin.write(r),s.stdin.end();});}async deleteSecret(e,n){try{return await Wn("secret-tool",["clear","service",e,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Gn={};F(Gn,{WindowsKeyVaultProvider:()=>Je});var Je,Jn=g(()=>{"use strict";Je=class{static async isAvailable(){try{return await Dt("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,n){return Dt("keytar").getPassword(e,n)}async setSecret(e,n,r){await Dt("keytar").setPassword(e,n,r);}async deleteSecret(e,n){return Dt("keytar").deletePassword(e,n)}getStoragePath(){return "Windows Credential Manager"}};});async function qn(){return process.env[p.FLOW_OBS_USE_JSON_VAULT]==="1"?new qt:await Vs()??new qt}async function Vs(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(jn(),Hn));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Yn(),Vn));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Jn(),Gn));return await t.isAvailable()?new t:null}default:return null}}var Kn=g(()=>{"use strict";L();Bn();});var zn={};F(zn,{clearFlowCredentials:()=>Gs,getConfigPath:()=>qs,getEmailFromToken:()=>me,getFlowCredentials:()=>Xn,getTokenCache:()=>Kt,hasCredentials:()=>Ks,isTokenValid:()=>Js,saveFlowCredentials:()=>Ys,saveTokenCache:()=>rt});function Ut(){return qe||(qe=qn()),qe}async function Xn(){let e=await(await Ut()).getSecret(It,Ke);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Ys(t){if(!t.clientId||!t.clientSecret||!t.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await Ut()).setSecret(It,Ke,JSON.stringify(t));}async function Gs(){let t=await Ut();await t.deleteSecret(It,Ke),await t.deleteSecret(It,Xe);}async function rt(t){await(await Ut()).setSecret(It,Xe,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function Kt(){let e=await(await Ut()).getSecret(It,Xe);if(!e)return null;try{let n=JSON.parse(e);return {accessToken:n.accessToken,expiresAt:n.expiresAt,lastAuthCheckAt:n.lastAuthCheckAt}}catch{return null}}async function Js(){let t=await Kt();return t?new Date(t.expiresAt)>new Date:false}async function me(){let t=await Kt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email??n.preferred_username??n.upn??n.sub??null}catch{return null}}async function qs(){let t=await Ut();if(typeof t.getStoragePath=="function")return t.getStoragePath();let e=process.platform;return e==="darwin"?"macOS Keychain":e==="win32"?"Windows Credential Manager":"Linux Secret Service (libsecret)"}async function Ks(){let t=await Xn();return !!(t&&t.clientId&&t.clientSecret&&t.tenant)}var It,Ke,Xe,qe,Xt=g(()=>{"use strict";Kn();L();It=Bt.SERVICE,Ke=Bt.ACCOUNT_CREDS,Xe=Bt.ACCOUNT_TOKEN,qe=null;});function zs(t){return Xs.some(e=>e.test(t))}function Zs(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email||n.preferred_username||n.upn||n.sub||null}catch{return null}}function st(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:o,tenant:i}=n;return !r||!o||!i?null:{clientId:r,clientSecret:o,tenant:i}}catch{return null}}function Zn(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),n=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${n}.`}function Et(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let n=process.env[p.FLOW_OBS_ALLOW_HTTP]==="true";if(!n&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!n&&zs(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Qn(){let t=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);return t?{user:await me().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function Qs(){return new Date().toISOString().slice(0,10)}async function to(t){let e=Qs(),n=await Kt();if(n?.lastAuthCheckAt!==e){l("getOrRefreshToken",`daily auth check (last: ${n?.lastAuthCheckAt??"never"})`);let i=vt.MAX_RETRY_ATTEMPTS;for(let s=1;s<=i;s++)try{let a=await M(t);try{await rt({...a,lastAuthCheckAt:e});}catch(c){l("getOrRefreshToken",`saveTokenCache failed (non-fatal): ${c.message}`);}return l("getOrRefreshToken",`daily check passed (attempt ${s}), expires=${a.expiresAt}`),a.accessToken}catch(a){if(a instanceof mt){if(a.statusCode!==500)throw l("getOrRefreshToken",`daily check auth error (${a.statusCode}) \u2014 propagating immediately`),a;if(s<i){l("getOrRefreshToken",`daily check 500 error (attempt ${s}/${i}) \u2014 retrying in 1s`),await new Promise(c=>setTimeout(c,vt.RETRY_DELAY_MS));continue}throw l("getOrRefreshToken",`daily check failed after ${i} attempts \u2014 propagating`),a}l("getOrRefreshToken",`daily check network error \u2014 using cache: ${a.message}`);break}}let r=n!=null&&new Date(n.expiresAt)>new Date;if(l("getOrRefreshToken",`cacheValid=${r}`),r)return l("getOrRefreshToken",`using cached token, expires=${n.expiresAt}`),n.accessToken;l("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let o=await M(t);try{await rt({...o,lastAuthCheckAt:e});}catch(i){l("getOrRefreshToken",`token cache save failed (non-fatal): ${i.message}`);}return l("getOrRefreshToken",`token refreshed, expires=${o.expiresAt}`),o.accessToken}function eo(t,e){let n=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${n}`}}function no(t,e,n){let r=Buffer.from(`${e}:${n}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${r}`}}async function z(){let t=[],e=process.env[p.ANTHROPIC_MODEL]??"",n=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);l("resolveCredentials",n?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),n&&l("resolveCredentials",`clientId=${n.clientId}`,`tenant=${n.tenant}`);let r=n?n.tenant:"",o=process.env[p.FLOW_TELEMETRY]==="true",i=process.env[p.LANGFUSE_BASE_URL],s=process.env[p.LANGFUSE_PUBLIC_KEY],a=process.env[p.LANGFUSE_SECRET_KEY];if(o&&i&&s&&a){let w="",S=r;n&&(w=await me().catch(()=>null)??n.clientId);let d={user:w??"",tenant:S??"",team:"",project:"",model:e};t.push({mode:"direct",...no(Et(i),s,a),...d}),l("resolveCredentials","direct mode active",`user=${d.user}`,`tenant=${d.tenant}`);}if(!n){if(t.length===0){let w=[];return w.authError=false,w}return t}let c;try{c=await to(n);}catch(w){if(l("resolveCredentials",`token refresh failed: ${w.message}`,`(tenant=${n.tenant} clientId=${n.clientId})`),t.length>0)return t.authError=true,t;let S=[];return S.authError=true,S}let T={user:Zs(c)??n.clientId,tenant:r,team:"",project:"",model:e},A=process.env[p.FLOW_TELEMETRY_GATEWAY]??et();return t.push({mode:"gateway",...eo(Et(A),{accessToken:c}),...T}),t}var Xs,Y=g(()=>{"use strict";Xt();gt();L();V();Xs=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];});var er={};F(er,{clearLoggedOutMarker:()=>Ze,isLoggedOut:()=>oo,markLoggedOut:()=>so});function ze(){return Pt__namespace.default.join(ht__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function so(){try{let t=ze();k__namespace.default.mkdirSync(Pt__namespace.default.dirname(t),{recursive:!0}),k__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function Ze(){try{k__namespace.default.unlinkSync(ze());}catch{}}function oo(){try{return k__namespace.default.existsSync(ze())}catch{return false}}var Qe=g(()=>{"use strict";});function tn(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():He("FLOW_BASE_URL")}function io(){return He(p.ANTHROPIC_AUTH_TOKEN)??void 0}async function he(){let t=tn();if(!t)return {ok:false,baseUrl:"",user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let o=new URL(t);if(o.protocol!=="https:"&&o.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:t,user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"}}let e=io(),n=st(e);if(!n)return {ok:false,baseUrl:t,user:"",tenant:"",error:"No credentials found"};let r=process.env.FLOW_BASE_URL;process.env.FLOW_BASE_URL=t;try{let o=await M({clientId:n.clientId,clientSecret:n.clientSecret,tenant:n.tenant});await rt({accessToken:o.accessToken,expiresAt:o.expiresAt});let i=n.clientId;try{let s=o.accessToken.split(".");if(s.length>=2){let a=JSON.parse(Buffer.from(s[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));i=a.email??a.preferred_username??a.upn??a.sub??i;}}catch{}return {ok:!0,baseUrl:t,user:i,tenant:n.tenant}}catch(o){return {ok:false,baseUrl:t,user:n.clientId,tenant:n.tenant,error:o.message}}finally{r===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=r;}}var en=g(()=>{"use strict";Xt();Y();Yt();L();gt();});var Zt={};F(Zt,{promptRaw:()=>zt,runLogin:()=>lo});function G(t){return typeof t=="string"?t.replace(ao,""):t}function zt(t,e={}){return new Promise((n,r)=>{if(typeof process.stdin.setRawMode!="function"){r(new Error("NOT_A_TTY"));return}let{masked:o=false,defaultValue:i=""}=e;process.stdout.write(t+i);let s=i;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=T=>{if(T===""){u(),r(new Error("SIGINT"));return}if(T==="\r"||T===`
34
+ `){u(),process.stdout.write(`
35
+ `),n(s);return}if(T==="\x7F"){s.length>0&&(s=s.slice(0,-1),process.stdout.write("\b \b"));return}T.startsWith("\x1B")||(s+=T,process.stdout.write(o?"*".repeat(T.length):T));};function u(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",a),process.removeListener("unhandledRejection",a);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}async function Ee(t,e=false){let n=tn(),r=process.env.FLOW_BASE_URL;n&&(process.env.FLOW_BASE_URL=n);try{let{accessToken:o,expiresAt:i}=await M(t),s=Zn(t);if(e)return {jwt:s,accessToken:o,expiresAt:i};fe({[p.ANTHROPIC_AUTH_TOKEN]:s}),Ze(),await rt({accessToken:o,expiresAt:i});}finally{r===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=r;}}async function co(t=false){try{let e=(await zt(P(" ? ")+"Client ID: ")).trim(),n=(await zt(P(" ? ")+"Client Secret: ",{masked:!0})).trim(),r=(await zt(P(" ? ")+"Tenant: ")).trim();if(!e||!n||!r)return process.stderr.write(b(` \u2717 All fields are required
36
36
  `)),1;if(process.stdout.write(m(` Authenticating...
37
- `)),t){let s=await Ee({clientId:e,clientSecret:n,tenant:r},!0);return process.stdout.write(`
38
- ${R("\u2713")} ${I("Authenticated")}
39
- `+m(` Tenant: ${Y(r)}
37
+ `)),t){let o=await Ee({clientId:e,clientSecret:n,tenant:r},!0);return process.stdout.write(`
38
+ ${v("\u2713")} ${I("Authenticated")}
39
+ `+m(` Tenant: ${G(r)}
40
40
  `)+m(` Storage: pending (will be written at end of init)
41
41
 
42
- `)),{code:0,result:s}}return await Ee({clientId:e,clientSecret:n,tenant:r}),process.stdout.write(`
43
- ${R("\u2713")} ${I("Authenticated")}
44
- `+m(` Tenant: ${Y(r)}
42
+ `)),{code:0,result:o}}return await Ee({clientId:e,clientSecret:n,tenant:r}),process.stdout.write(`
43
+ ${v("\u2713")} ${I("Authenticated")}
44
+ `+m(` Tenant: ${G(r)}
45
45
  `)+m(` Storage: ANTHROPIC_AUTH_TOKEN (settings.json)
46
46
 
47
47
  `)),0}catch(e){if(e.message==="SIGINT"||e.message==="NOT_A_TTY")throw e;return process.stderr.write(`
48
48
  ${b("\u2717")} ${I("Authentication failed:")}
49
- ${Y(e.message)}
49
+ ${G(e.message)}
50
50
 
51
- `),1}}async function lo(t={}){let e=ce();if(e)return e;let{deferPersist:n=false,skipAuthCheck:r=false}=t;if(t.clientId&&t.clientSecret&&t.tenant)try{if(n){let i=await Ee({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant},!0);return process.stdout.write(R(` \u2713 Authenticated. Tenant: ${Y(t.tenant)}
51
+ `),1}}async function lo(t={}){let e=le();if(e)return e;let{deferPersist:n=false,skipAuthCheck:r=false}=t;if(t.clientId&&t.clientSecret&&t.tenant)try{if(n){let i=await Ee({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant},!0);return process.stdout.write(v(` \u2713 Authenticated. Tenant: ${G(t.tenant)}
52
52
 
53
- `)),{code:0,result:i}}return await Ee({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant}),process.stdout.write(R(` \u2713 Authenticated. Tenant: ${Y(t.tenant)}
53
+ `)),{code:0,result:i}}return await Ee({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant}),process.stdout.write(v(` \u2713 Authenticated. Tenant: ${G(t.tenant)}
54
54
 
55
- `)),0}catch(i){return process.stderr.write(b(` \u2717 Authentication failed: ${Y(i.message)}
56
- `)),1}let s=await he();if(!r){if(process.stdout.write(`
55
+ `)),0}catch(i){return process.stderr.write(b(` \u2717 Authentication failed: ${G(i.message)}
56
+ `)),1}let o=await he();if(!r){if(process.stdout.write(`
57
57
  `),process.stdout.write(I(` Auth
58
- `)),s.notConfigured)return process.stdout.write(` ${v("\u26A0")} Not configured
58
+ `)),o.notConfigured)return process.stdout.write(` ${R("\u26A0")} Not configured
59
59
  `),process.stdout.write(m(" Run `flow-ai-obs init` to set up the environment first.\n")),process.stdout.write(`
60
- `),1;if(s.ok){process.stdout.write(` ${R("\u2713")} Authenticated
61
- `),process.stdout.write(m(" URL: ")+Y(s.baseUrl)+`
62
- `),process.stdout.write(m(" Tenant: ")+Y(s.tenant)+`
63
- `),process.stdout.write(m(" User: ")+Y(s.user)+`
60
+ `),1;if(o.ok){process.stdout.write(` ${v("\u2713")} Authenticated
61
+ `),process.stdout.write(m(" URL: ")+G(o.baseUrl)+`
62
+ `),process.stdout.write(m(" Tenant: ")+G(o.tenant)+`
63
+ `),process.stdout.write(m(" User: ")+G(o.user)+`
64
64
  `),process.stdout.write(`
65
- `);let i;try{i=await Xt(P(" ? ")+"Re-authenticate? (y/N): ");}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
66
- `),130;if(o.message==="NOT_A_TTY")return process.stdout.write(R(` \u2713 Using existing credentials.
65
+ `);let i;try{i=await zt(P(" ? ")+"Re-authenticate? (y/N): ");}catch(s){if(s.message==="SIGINT")return process.stdout.write(`
66
+ `),130;if(s.message==="NOT_A_TTY")return process.stdout.write(v(` \u2713 Using existing credentials.
67
67
 
68
- `)),0;throw o}if(i.trim().toLowerCase()!=="y")return process.stdout.write(R(` \u2713 Using existing credentials.
68
+ `)),0;throw s}if(i.trim().toLowerCase()!=="y")return process.stdout.write(v(` \u2713 Using existing credentials.
69
69
 
70
- `)),0}else s.error==="No credentials found"?(process.stdout.write(` ${v("\u26A0")} Not authenticated
71
- `),process.stdout.write(m(` URL: ${s.baseUrl}
70
+ `)),0}else o.error==="No credentials found"?(process.stdout.write(` ${R("\u26A0")} Not authenticated
71
+ `),process.stdout.write(m(` URL: ${o.baseUrl}
72
72
  `)),process.stdout.write(`
73
- `)):(process.stdout.write(` ${v("\u26A0")} Session not valid for current endpoint
74
- `),process.stdout.write(m(" URL: ")+Y(s.baseUrl)+`
75
- `),process.stdout.write(m(" Tenant: ")+Y(s.tenant)+`
73
+ `)):(process.stdout.write(` ${R("\u26A0")} Session not valid for current endpoint
74
+ `),process.stdout.write(m(" URL: ")+G(o.baseUrl)+`
75
+ `),process.stdout.write(m(" Tenant: ")+G(o.tenant)+`
76
76
  `),process.stdout.write(m(" User: ")+m("(not authenticated)")+`
77
77
  `),process.stdout.write(`
78
78
  `));}try{return await co(n)}catch(i){if(i.message==="SIGINT")return process.stdout.write(`
79
79
  `),130;if(i.message==="NOT_A_TTY")return process.stderr.write(b(` \u2717 No TTY available for interactive login.
80
80
  `)+` Pass --client-id, --client-secret and --tenant for non-interactive use.
81
81
 
82
- `),1;throw i}}var ao,Zt=g(()=>{"use strict";Kt();Qe();gt();V();Vt();L();ut();le();en();ao=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var ir={};$(ir,{normalizeCustomUrl:()=>or,runInit:()=>fo,validateCustomUrl:()=>on});function nn(t,e,n){process.stdout.write(I(P(`
82
+ `),1;throw i}}var ao,Qt=g(()=>{"use strict";Xt();Qe();gt();Y();Yt();L();ut();ue();en();ao=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var ir={};F(ir,{normalizeCustomUrl:()=>or,runInit:()=>fo,validateCustomUrl:()=>on});function nn(t,e,n){process.stdout.write(I(P(`
83
83
  [${t}/${e}] ${n}
84
- `)));}function rn(t){process.stdout.write(` ${R("\u2713")} ${t}
85
- `);}function uo(t){process.stdout.write(` ${v("\u26A0")} ${t}
84
+ `)));}function rn(t){process.stdout.write(` ${v("\u2713")} ${t}
85
+ `);}function uo(t){process.stdout.write(` ${R("\u26A0")} ${t}
86
86
  `);}function nr(t){process.stdout.write(` ${m(t)}
87
- `);}function rr(){try{let t=k__namespace.readFileSync(B(),"utf8");return JSON.parse(t).env||{}}catch{return {}}}function sr(){try{let t=k__namespace.readFileSync(B(),"utf8"),e=JSON.parse(t);return !!(e.env&&e.env[p.ANTHROPIC_AUTH_TOKEN])}catch{return false}}function po(){let t=$n();if(!t)return null;pe({FLOW_BASE_URL:t});try{let e=de(),n={};try{n=JSON.parse(k__namespace.readFileSync(e,"utf8"));}catch{return t}delete n.baseUrl,Object.keys(n).length===0?k__namespace.unlinkSync(e):k__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
88
- `,{encoding:"utf8",mode:384});}catch{}return t}function or(t){let e=t.trim().replace(/\\/g,"/");/^https?:\/\//i.test(e)||(e=`https://${e}`);try{let n=new URL(e);return `${n.protocol}//${n.host}`}catch{return e}}function on(t,e=false){if(e){let i=/^https?:\/\//i.test(t.trim())?t.trim().replace(/\\/g,"/"):`https://${t.trim().replace(/\\/g,"/")}`,o;try{o=new URL(i);}catch{throw new Error(`Invalid URL: ${t}`)}if(o.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(o.pathname!=="/"&&o.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
87
+ `);}function rr(){try{let t=k__namespace.readFileSync(B(),"utf8");return JSON.parse(t).env||{}}catch{return {}}}function sr(){try{let t=k__namespace.readFileSync(B(),"utf8"),e=JSON.parse(t);return !!(e.env&&e.env[p.ANTHROPIC_AUTH_TOKEN])}catch{return false}}function po(){let t=$n();if(!t)return null;fe({FLOW_BASE_URL:t});try{let e=pe(),n={};try{n=JSON.parse(k__namespace.readFileSync(e,"utf8"));}catch{return t}delete n.baseUrl,Object.keys(n).length===0?k__namespace.unlinkSync(e):k__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
88
+ `,{encoding:"utf8",mode:384});}catch{}return t}function or(t){let e=t.trim().replace(/\\/g,"/");/^https?:\/\//i.test(e)||(e=`https://${e}`);try{let n=new URL(e);return `${n.protocol}//${n.host}`}catch{return e}}function on(t,e=false){if(e){let i=/^https?:\/\//i.test(t.trim())?t.trim().replace(/\\/g,"/"):`https://${t.trim().replace(/\\/g,"/")}`,s;try{s=new URL(i);}catch{throw new Error(`Invalid URL: ${t}`)}if(s.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(s.pathname!=="/"&&s.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
89
89
  Received: ${t}
90
- Expected: https://tenant.example.com`);if(o.search)throw new Error(`Custom URL must not contain query parameters.
90
+ Expected: https://tenant.example.com`);if(s.search)throw new Error(`Custom URL must not contain query parameters.
91
91
  Received: ${t}
92
- Expected: https://tenant.example.com`);if(o.hash)throw new Error(`Custom URL must not contain a fragment.
92
+ Expected: https://tenant.example.com`);if(s.hash)throw new Error(`Custom URL must not contain a fragment.
93
93
  Received: ${t}
94
- Expected: https://tenant.example.com`);if(o.username||o.password)throw new Error(`Custom URL must not contain embedded credentials.
94
+ Expected: https://tenant.example.com`);if(s.username||s.password)throw new Error(`Custom URL must not contain embedded credentials.
95
95
  Received: ${t}
96
- Expected: https://tenant.example.com`);if(!o.hostname.includes("."))throw new Error(`Invalid domain: ${o.hostname}. Expected format: tenant.example.com`);let a=`${o.protocol}//${o.host}`,c=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],Et(a);}finally{c!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=c);}return a}let n=or(t),r;try{r=new URL(n);}catch{throw new Error(`Invalid URL: ${t}`)}if(r.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!r.hostname.includes("."))throw new Error(`Invalid domain: ${r.hostname}. Expected format: tenant.example.com`);let s=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],Et(n);}finally{s!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=s);}return n.replace(/\/$/,"")}async function sn(){for(let t=1;t<=3;t++)try{let e=await yn(" Enter your Flow domain (e.g., tenant.ciandt.com)");return on(e)}catch(e){if(process.stderr.write(v(` \u2717 ${e.message}
96
+ Expected: https://tenant.example.com`);if(!s.hostname.includes("."))throw new Error(`Invalid domain: ${s.hostname}. Expected format: tenant.example.com`);let a=`${s.protocol}//${s.host}`,c=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],Et(a);}finally{c!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=c);}return a}let n=or(t),r;try{r=new URL(n);}catch{throw new Error(`Invalid URL: ${t}`)}if(r.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!r.hostname.includes("."))throw new Error(`Invalid domain: ${r.hostname}. Expected format: tenant.example.com`);let o=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],Et(n);}finally{o!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=o);}return n.replace(/\/$/,"")}async function sn(){for(let t=1;t<=3;t++)try{let e=await _n(" Enter your Flow domain (e.g., tenant.ciandt.com)");return on(e)}catch(e){if(process.stderr.write(R(` \u2717 ${e.message}
97
97
 
98
98
  `)),t===3)throw process.stderr.write(b(` Too many invalid attempts.
99
99
 
100
- `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function Qt(){try{let t=k__namespace.readFileSync(B(),"utf8"),n=JSON.parse(t).env?.FLOW_BASE_URL;return typeof n=="string"&&n.trim()?n.trim():null}catch{return null}}async function fo(t={}){let e=ce();if(e)return e;let n=t.url,r=3;process.stdout.write(I(P(`
100
+ `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function te(){try{let t=k__namespace.readFileSync(B(),"utf8"),n=JSON.parse(t).env?.FLOW_BASE_URL;return typeof n=="string"&&n.trim()?n.trim():null}catch{return null}}async function fo(t={}){let e=le();if(e)return e;let n=t.url,r=3;process.stdout.write(I(P(`
101
101
  flow-ai-obs init
102
102
  `))),process.stdout.write(m(` Configuring your development environment:
103
103
 
104
104
  `)),process.stdout.write(m(` [1/3] Flow Environment Setup Configure Flow URLs and LLM routing
105
105
  `)),process.stdout.write(m(` [2/3] Authentication Authenticate with Flow
106
106
  `)),process.stdout.write(m(` [3/3] Observability OpenTelemetry metrics, logs and trace hooks
107
- `)),nn(1,r,"Flow Environment Setup");let s=false;{let E=rr().FLOW_BASE_URL;if(E&&(uo(`Base URL already configured (FLOW_BASE_URL=${E})`),!t.noInteractive&&dt()))try{let{promptRaw:y}=await Promise.resolve().then(()=>(Zt(),zt));s=(await y(P(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",s||nr("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(v(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
108
- `)+v(" on Windows too: ")+P(`npm install -g @ciandt-flow/flow-ai-obs
109
- `)+v(` Running a Windows code assistant + flow-ai-obs (WSL) is not a supported configuration.
107
+ `)),nn(1,r,"Flow Environment Setup");let o=false;{let E=rr().FLOW_BASE_URL;if(E&&(uo(`Base URL already configured (FLOW_BASE_URL=${E})`),!t.noInteractive&&dt()))try{let{promptRaw:_}=await Promise.resolve().then(()=>(Qt(),Zt));o=(await _(P(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",o||nr("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(R(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
108
+ `)+R(" on Windows too: ")+P(`npm install -g @ciandt-flow/flow-ai-obs
109
+ `)+R(` Running a Windows code assistant + flow-ai-obs (WSL) is not a supported configuration.
110
110
 
111
- `)),po(),!n&&!t.noInteractive&&dt()){let E=Qt();try{s?n=await sn():E?(process.stdout.write(`
111
+ `)),po(),!n&&!t.noInteractive&&dt()){let E=te();try{o?n=await sn():E?(process.stdout.write(`
112
112
  Current base URL: ${I(E)}
113
113
  `),await be(" Keep this URL?",!0)||(n=await sn())):(process.stdout.write(`
114
114
  `),await be(" Does your organization use a custom Flow URL?",!1)?n=await sn():rn("Using default Flow Base URL: https://flow.ciandt.com"));}catch{return 1}process.stdout.write(`
115
- `);}if(!n&&!t.noInteractive&&!dt()){let E=Qt();if(E)process.stdout.write(v(` \u26A0 Non-interactive environment detected.
115
+ `);}if(!n&&!t.noInteractive&&!dt()){let E=te();if(E)process.stdout.write(R(` \u26A0 Non-interactive environment detected.
116
116
  `)+m(` Using URL: ${E}
117
117
 
118
118
  `));else return process.stderr.write(` \u2717 No URL configured and no TTY available.
119
119
  Run: flow-ai-obs init --custom-url <URL>
120
120
 
121
- `),1}let i,o=false;if(n){let E;try{E=on(n,!0);}catch(U){return process.stderr.write(`
121
+ `),1}let i,s=false;if(n){let E;try{E=on(n,!0);}catch(U){return process.stderr.write(`
122
122
  \u2717 Invalid --custom-url: ${U.message}
123
123
 
124
- `),1}let y=Qt();i=E,o=!!y&&y!==E,o?process.stdout.write(v(` \u26A0 Base URL changed \u2014 re-authentication required.
125
- `)+m(` Previous: ${y}
124
+ `),1}let _=te();i=E,s=!!_&&_!==E,s?process.stdout.write(R(` \u26A0 Base URL changed \u2014 re-authentication required.
125
+ `)+m(` Previous: ${_}
126
126
  `)+m(` New: ${E}
127
127
 
128
- `)):process.stdout.write(R(` \u2713 Base URL configured: ${E}
128
+ `)):process.stdout.write(v(` \u2713 Base URL configured: ${E}
129
129
 
130
- `));}else i=Qt()??"https://flow.ciandt.com";let a={FLOW_BASE_URL:i,OTEL_EXPORTER_OTLP_ENDPOINT:`${i}/otel`,ANTHROPIC_BASE_URL:`${i}/flow-llm-proxy/`,ANTHROPIC_MODEL:"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"};process.env.FLOW_BASE_URL=i,process.stdout.write(R(`
130
+ `));}else i=te()??"https://flow.ciandt.com";let a={FLOW_BASE_URL:i,OTEL_EXPORTER_OTLP_ENDPOINT:`${i}/otel`,ANTHROPIC_BASE_URL:`${i}/flow-llm-proxy/`,ANTHROPIC_MODEL:"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"};process.env.FLOW_BASE_URL=i,process.stdout.write(v(`
131
131
  \u2713 Flow environment ready.
132
- `));let c=36;for(let[E,y]of Object.entries(a))process.stdout.write(m(` ${E.padEnd(c)}`)+y+`
133
- `);nn(2,r,"Authentication");let l=null,S=Qt(),A=!!S&&S!==i;if(!sr()||o||A)if(t.noInteractive||!dt()){let{clientId:E,clientSecret:y,tenant:U}=t,z=E&&y&&U;if(!z&&(E||y||U)){let tt=[!E&&"--client-id",!y&&"--client-secret",!U&&"--tenant"].filter(Boolean).join(", ");return process.stderr.write(`
132
+ `));let c=36;for(let[E,_]of Object.entries(a))process.stdout.write(m(` ${E.padEnd(c)}`)+_+`
133
+ `);nn(2,r,"Authentication");let u=null,T=te(),A=!!T&&T!==i;if(!sr()||s||A)if(t.noInteractive||!dt()){let{clientId:E,clientSecret:_,tenant:U}=t,X=E&&_&&U;if(!X&&(E||_||U)){let tt=[!E&&"--client-id",!_&&"--client-secret",!U&&"--tenant"].filter(Boolean).join(", ");return process.stderr.write(`
134
134
  ${b("\u2717")} Non-interactive mode requires all credential flags.
135
135
  Missing: ${tt}
136
136
 
137
- `),1}if(z){let{runLogin:tt}=await Promise.resolve().then(()=>(Zt(),zt)),C;try{C=await tt({deferPersist:!0,clientId:E,clientSecret:y,tenant:U});}catch(ke){return process.stderr.write(`
137
+ `),1}if(X){let{runLogin:tt}=await Promise.resolve().then(()=>(Qt(),Zt)),$;try{$=await tt({deferPersist:!0,clientId:E,clientSecret:_,tenant:U});}catch(ke){return process.stderr.write(`
138
138
  ${b("\u2717")} Authentication failed unexpectedly.
139
139
  ${ke.message}
140
140
 
141
- `),1}if(typeof C=="number")return C;l=C.result;}else return process.stderr.write(`
141
+ `),1}if(typeof $=="number")return $;u=$.result;}else return process.stderr.write(`
142
142
  ${b("\u2717")} Authentication required.
143
143
  Run: flow-ai-obs login
144
144
 
145
145
  `),1}else {(t.clientId||t.clientSecret||t.tenant)&&process.stderr.write(`
146
- ${v("\u26A0")} Credential flags (--client-id, --client-secret, --tenant) are only used with --no-interactive.
146
+ ${R("\u26A0")} Credential flags (--client-id, --client-secret, --tenant) are only used with --no-interactive.
147
147
  Continuing with interactive authentication.
148
148
 
149
149
  `),process.stdout.write(`
150
- ${v("\u26A0")} Authentication required for the new endpoint.
150
+ ${R("\u26A0")} Authentication required for the new endpoint.
151
151
 
152
- `);let{runLogin:E}=await Promise.resolve().then(()=>(Zt(),zt)),y=await E({deferPersist:true,skipAuthCheck:o});if(typeof y=="number")return y;l=y.result;}else rn("Already authenticated \u2014 skipping."),nr("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");let w=sr()?rr()[p.ANTHROPIC_AUTH_TOKEN]:null,d={...a,...l?{[p.ANTHROPIC_AUTH_TOKEN]:l.jwt}:{},...w&&!l?{[p.ANTHROPIC_AUTH_TOKEN]:w}:{}},h,J;nn(3,r,"Observability (OpenTelemetry)"),process.stdout.write(`
152
+ `);let{runLogin:E}=await Promise.resolve().then(()=>(Qt(),Zt)),_=await E({deferPersist:true,skipAuthCheck:s});if(typeof _=="number")return _;u=_.result;}else rn("Already authenticated \u2014 skipping."),nr("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");let S=sr()?rr()[p.ANTHROPIC_AUTH_TOKEN]:null,d={...a,...u?{[p.ANTHROPIC_AUTH_TOKEN]:u.jwt}:{},...S&&!u?{[p.ANTHROPIC_AUTH_TOKEN]:S}:{}},h,J;nn(3,r,"Observability (OpenTelemetry)"),process.stdout.write(`
153
153
  ${I("Metrics and Logs")}
154
- `);let q={...nt,OTEL_EXPORTER_OTLP_ENDPOINT:a.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[E,y]of Object.entries(q))process.stdout.write(m(` ${E.padEnd(36)}`)+y+`
154
+ `);let q={...nt,OTEL_EXPORTER_OTLP_ENDPOINT:a.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[E,_]of Object.entries(q))process.stdout.write(m(` ${E.padEnd(36)}`)+_+`
155
155
  `);process.stdout.write(`
156
156
  `),process.stdout.write(` ${I("Trace (Hook)")}
157
- `);let Q=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"];for(let E of Q){let y=ft[E];process.stdout.write(m(` ${E.padEnd(18)}`)+`\u2192 flow-ai-obs ${E} (timeout: ${y}s)
157
+ `);let Q=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"];for(let E of Q){let _=ft[E];process.stdout.write(m(` ${E.padEnd(18)}`)+`\u2192 flow-ai-obs ${E} (timeout: ${_}s)
158
158
  `);}process.stdout.write(`
159
159
  `);try{({settingsPath:h,preserved:J}=Dn(a.OTEL_EXPORTER_OTLP_ENDPOINT,d));}catch(E){return process.stderr.write(` \u2717 Failed to write settings: ${E.message}
160
- `),1}if(l){let{saveTokenCache:E}=await Promise.resolve().then(()=>(Kt(),zn));try{await E({accessToken:l.accessToken,expiresAt:l.expiresAt});}catch(U){process.stderr.write(` ${v("\u26A0")} Token cache could not be saved: ${U.message}
160
+ `),1}if(u){let{saveTokenCache:E}=await Promise.resolve().then(()=>(Xt(),zn));try{await E({accessToken:u.accessToken,expiresAt:u.expiresAt});}catch(U){process.stderr.write(` ${R("\u26A0")} Token cache could not be saved: ${U.message}
161
161
  Hooks will authenticate on first use.
162
- `);}let{clearLoggedOutMarker:y}=await Promise.resolve().then(()=>(Qe(),er));y();}return rn(`Settings written: ${h}`),J.length>0&&(process.stdout.write(`
163
- `),process.stdout.write(v(` \u26A0 Third-party hooks preserved on: ${J.join(", ")}
162
+ `);}let{clearLoggedOutMarker:_}=await Promise.resolve().then(()=>(Qe(),er));_();}return rn(`Settings written: ${h}`),J.length>0&&(process.stdout.write(`
163
+ `),process.stdout.write(R(` \u26A0 Third-party hooks preserved on: ${J.join(", ")}
164
164
  `)),process.stdout.write(m(` flow-ai-obs was prepended \u2014 it executes first.
165
165
  `))),process.stdout.write(`
166
166
  `),t.skipHint||(process.stdout.write(`
167
- `),process.stdout.write(R(` \u2713 Setup complete.
167
+ `),process.stdout.write(v(` \u2713 Setup complete.
168
168
 
169
169
  `)),process.stdout.write(m(` Verify your configuration:
170
170
  `)+P(` flow-ai-obs status
171
171
 
172
172
  `)+m(` Start your code assistant and begin working.
173
173
 
174
- `))),0}var ar=g(()=>{"use strict";Vt();L();ut();ue();le();Be();V();Pe();});var ur={};$(ur,{runStatus:()=>go});function cr(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function mo(t){process.stdout.write(` ${R("\u2713")} ${t}
175
- `);}function an(t){process.stdout.write(` ${v("\u26A0")} ${t}
176
- `);}function Ut(t){process.stdout.write(` ${R("\u2713")} ${t}
177
- `);}function te(t){process.stdout.write(` ${v("\u26A0")} ${t}
178
- `);}function ee(t){process.stdout.write(` ${b("\u2717")} ${t}
174
+ `))),0}var ar=g(()=>{"use strict";Yt();L();ut();de();ue();Me();Y();Pe();});var ur={};F(ur,{runStatus:()=>go});function cr(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function mo(t){process.stdout.write(` ${v("\u2713")} ${t}
175
+ `);}function an(t){process.stdout.write(` ${R("\u26A0")} ${t}
176
+ `);}function Nt(t){process.stdout.write(` ${v("\u2713")} ${t}
177
+ `);}function ee(t){process.stdout.write(` ${R("\u26A0")} ${t}
178
+ `);}function ne(t){process.stdout.write(` ${b("\u2717")} ${t}
179
179
  `);}function ot(t){process.stdout.write(` ${m(t)}
180
180
  `);}function cn(t){process.stdout.write(I(P(`
181
181
  ${t}
182
- `)));}function ln(t,e=false){let n=e?`${v("\u26A0")} ${I(v(t))}`:I(t);process.stdout.write(`
182
+ `)));}function ln(t,e=false){let n=e?`${R("\u26A0")} ${I(R(t))}`:I(t);process.stdout.write(`
183
183
  ${n}
184
- `);}function Se(){process.stdout.write(`
184
+ `);}function Te(){process.stdout.write(`
185
185
  `);}async function go(){cn("Auth");let t=await he();t.notConfigured?(an("Not configured."),process.stdout.write(`
186
186
  `),process.stdout.write(` ${m("Run `flow-ai-obs init` to set up.")}
187
187
  `)):!t.ok&&t.error==="No credentials found"?an("Not authenticated. Run `flow-ai-obs login` to set up."):t.ok?(mo("Authenticated"),process.stdout.write(` ${m("URL: ")}${t.baseUrl}
188
188
  `),process.stdout.write(` ${m("Tenant: ")}${t.tenant}
189
189
  `),process.stdout.write(` ${m("User: ")}${t.user}
190
190
  `),process.stdout.write(` ${m("Storage: ANTHROPIC_AUTH_TOKEN (settings.json)")}
191
- `)):an(`Session rejected by ${t.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`),cn("Flow Provider Configuration");let e=["ANTHROPIC_BASE_URL","ANTHROPIC_MODEL","ANTHROPIC_SMALL_FAST_MODEL","CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS"],n={},r={};try{let d=k__namespace.readFileSync(B(),"utf8");r=JSON.parse(d),n=r.env||{};}catch{}let s=e.filter(d=>!n[d]),i=s.length===0;ln("LLM Proxy",!i),i?(Ut("Flow LLM Proxy configured"),ot(`Endpoint: ${n.ANTHROPIC_BASE_URL}`),ot(`Model: ${n.ANTHROPIC_MODEL}`)):(process.stdout.write(`
191
+ `)):an(`Session rejected by ${t.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`),cn("Flow Provider Configuration");let e=["ANTHROPIC_BASE_URL","ANTHROPIC_MODEL","ANTHROPIC_SMALL_FAST_MODEL","CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS"],n={},r={};try{let d=k__namespace.readFileSync(B(),"utf8");r=JSON.parse(d),n=r.env||{};}catch{}let o=e.filter(d=>!n[d]),i=o.length===0;ln("LLM Proxy",!i),i?(Nt("Flow LLM Proxy configured"),ot(`Endpoint: ${n.ANTHROPIC_BASE_URL}`),ot(`Model: ${n.ANTHROPIC_MODEL}`)):(process.stdout.write(`
192
192
  `),process.stdout.write(` ${m("Run: flow-ai-obs init (configures the Flow LLM proxy)")}
193
193
  `),process.stdout.write(`
194
- `),te(`${s.length} proxy var(s) missing from settings.json`),s.forEach(d=>ee(`Missing: ${d}`))),Se();for(let d of e){let h=n[d]??b("(missing)");process.stdout.write(m(` ${d.padEnd(36)}`)+h+`
195
- `);}cn("Observability configuration (OpenTelemetry)");let o=Object.keys(nt).filter(d=>!n[d]);ln("Metrics and Logs",o.length>0),o.length===0?(Ut("All OTEL env vars present in settings.json"),ot(`Endpoint: ${n.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
194
+ `),ee(`${o.length} proxy var(s) missing from settings.json`),o.forEach(d=>ne(`Missing: ${d}`))),Te();for(let d of e){let h=n[d]??b("(missing)");process.stdout.write(m(` ${d.padEnd(36)}`)+h+`
195
+ `);}cn("Observability configuration (OpenTelemetry)");let s=Object.keys(nt).filter(d=>!n[d]);ln("Metrics and Logs",s.length>0),s.length===0?(Nt("All OTEL env vars present in settings.json"),ot(`Endpoint: ${n.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
196
196
  `),process.stdout.write(` ${m("Run: flow-ai-obs init (restores missing vars automatically)")}
197
197
  `),process.stdout.write(`
198
- `),te(`${o.length} OTEL var(s) missing from settings.json`),o.forEach(d=>ee(`Missing: ${d}`))),Se();for(let d of Object.keys(nt)){let h=n[d]??b("(missing)");process.stdout.write(m(` ${d.padEnd(36)}`)+h+`
199
- `);}let a=r.hooks??{},c=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],l=c.every(d=>{let h=a[d];return Array.isArray(h)?h.some(J=>{let q=J;return Array.isArray(q?.hooks)&&q.hooks.some(Q=>Q?.command?.startsWith(jt.CLI))}):false});ln("Tracing",!l),l?Ut("Hooks registered (trace capture)"):(process.stdout.write(`
198
+ `),ee(`${s.length} OTEL var(s) missing from settings.json`),s.forEach(d=>ne(`Missing: ${d}`))),Te();for(let d of Object.keys(nt)){let h=n[d]??b("(missing)");process.stdout.write(m(` ${d.padEnd(36)}`)+h+`
199
+ `);}let a=r.hooks??{},c=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],u=c.every(d=>{let h=a[d];return Array.isArray(h)?h.some(J=>{let q=J;return Array.isArray(q?.hooks)&&q.hooks.some(Q=>Q?.command?.startsWith(Wt.CLI))}):false});ln("Tracing",!u),u?Nt("Hooks registered (trace capture)"):(process.stdout.write(`
200
200
  `),process.stdout.write(` ${m("Run `flow-ai-obs init` to configure.")}
201
201
  `),process.stdout.write(`
202
- `),te("Hooks NOT registered."));for(let d of c){let h=ft[d];process.stdout.write(m(` ${d.padEnd(18)}`)+`\u2192 flow-ai-obs ${d} (timeout: ${h}s)
203
- `);}Se();let S=process.env[p.FLOW_TELEMETRY]==="true",A=process.env[p.LANGFUSE_BASE_URL],T=process.env[p.LANGFUSE_PUBLIC_KEY],w=process.env[p.LANGFUSE_SECRET_KEY];if(S)if(A&&T&&w){let d=await K();for(let h of d)h.mode==="direct"&&(Ut("FLOW_TELEMETRY=true (direct mode enabled)"),Ut("Mode: direct"),ot(`Endpoint: ${h.endpoint}`),ot(`PK: ${cr(T)}`),ot(`SK: ${cr(w)}`));}else te("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),A||ee("LANGFUSE_BASE_URL not set"),T||ee("LANGFUSE_PUBLIC_KEY not set"),w||ee("LANGFUSE_SECRET_KEY not set");else {let d=await K();if(d.length>0)for(let h of d)h.mode==="gateway"&&(Ut("Mode: gateway"),ot(`Endpoint: ${h.endpoint}`));else d.authError?te("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):ot("No active tracing destination configured.");}return Se(),0}var dr=g(()=>{"use strict";V();Vt();L();ut();en();});var pr={};$(pr,{runOtelHeaders:()=>ho});async function ho(){let t=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!t)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs auth login
204
- `),1;let e;try{e=(await D(t)).accessToken;}catch(n){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${n.message}
202
+ `),ee("Hooks NOT registered."));for(let d of c){let h=ft[d];process.stdout.write(m(` ${d.padEnd(18)}`)+`\u2192 flow-ai-obs ${d} (timeout: ${h}s)
203
+ `);}Te();let T=process.env[p.FLOW_TELEMETRY]==="true",A=process.env[p.LANGFUSE_BASE_URL],w=process.env[p.LANGFUSE_PUBLIC_KEY],S=process.env[p.LANGFUSE_SECRET_KEY];if(T)if(A&&w&&S){let d=await z();for(let h of d)h.mode==="direct"&&(Nt("FLOW_TELEMETRY=true (direct mode enabled)"),Nt("Mode: direct"),ot(`Endpoint: ${h.endpoint}`),ot(`PK: ${cr(w)}`),ot(`SK: ${cr(S)}`));}else ee("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),A||ne("LANGFUSE_BASE_URL not set"),w||ne("LANGFUSE_PUBLIC_KEY not set"),S||ne("LANGFUSE_SECRET_KEY not set");else {let d=await z();if(d.length>0)for(let h of d)h.mode==="gateway"&&(Nt("Mode: gateway"),ot(`Endpoint: ${h.endpoint}`));else d.authError?ee("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):ot("No active tracing destination configured.");}return Te(),0}var dr=g(()=>{"use strict";Y();Yt();L();ut();en();});var pr={};F(pr,{runOtelHeaders:()=>ho});async function ho(){let t=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!t)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs auth login
204
+ `),1;let e;try{e=(await M(t)).accessToken;}catch(n){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${n.message}
205
205
  `),1}return e?(process.stdout.write(`{"Authorization": "Bearer ${e}"}
206
206
  `),0):(process.stderr.write(`[flow-ai-obs otel-headers] Empty token received
207
- `),1)}var fr=g(()=>{"use strict";gt();V();L();});function X(t,e){let n=typeof t=="object"?JSON.stringify(t):String(t??"");return n.length>e?n.slice(0,e)+" \u2026[truncated]":n}function we(t,e=100){return String(t??"").split(`
208
- `)[0].slice(0,e).trim()}function ne(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function G(t){process.stdout.write(JSON.stringify(t));}var Nt=g(()=>{"use strict";});function it(){return String(BigInt(Date.now())*1000000n)}var un,St,re=g(()=>{"use strict";un=()=>crypto.randomBytes(16).toString("hex"),St=()=>crypto.randomBytes(8).toString("hex");});function vo(t,e){let n=bt.resolve(t);if(!n.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return n}function dn(t){if(!ko.test(t))throw new Error(`Invalid session ID: ${t}`);return vo(bt.join(ht.tmpdir(),`flow-obs-${t}.json`),Lo)}function Ct(t){let e=dn(t);if(!k.existsSync(e))return null;try{return JSON.parse(k.readFileSync(e,"utf8"))}catch{return null}}function $t(t,e){k.writeFileSync(dn(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function pn(t){try{k.unlinkSync(dn(t));}catch{}}var ko,Lo,se=g(()=>{"use strict";ko=/^[0-9a-f-]{1,64}$/i,Lo=bt.normalize(ht.tmpdir())+bt.sep;});function Sr(t){if(!t||!k.existsSync(t))return null;try{let e=k.readFileSync(t,"utf8").trimEnd().split(`
207
+ `),1)}var fr=g(()=>{"use strict";gt();Y();L();});function K(t,e){let n=typeof t=="object"?JSON.stringify(t):String(t??"");return n.length>e?n.slice(0,e)+" \u2026[truncated]":n}function Se(t,e=100){return String(t??"").split(`
208
+ `)[0].slice(0,e).trim()}function re(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function N(t){process.stdout.write(JSON.stringify(t));}var Ct=g(()=>{"use strict";});function it(){return String(BigInt(Date.now())*1000000n)}var un,Tt,se=g(()=>{"use strict";un=()=>crypto.randomBytes(16).toString("hex"),Tt=()=>crypto.randomBytes(8).toString("hex");});function Ro(t,e){let n=Pt.resolve(t);if(!n.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return n}function dn(t){if(!ko.test(t))throw new Error(`Invalid session ID: ${t}`);return Ro(Pt.join(ht.tmpdir(),`flow-obs-${t}.json`),Lo)}function $t(t){let e;try{e=dn(t);}catch{return null}if(!k.existsSync(e))return null;try{return JSON.parse(k.readFileSync(e,"utf8"))}catch{return null}}function Ft(t,e){k.writeFileSync(dn(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function pn(t){try{k.unlinkSync(dn(t));}catch{}}var ko,Lo,oe=g(()=>{"use strict";ko=/^[0-9a-f-]{1,64}$/i,Lo=Pt.normalize(ht.tmpdir())+Pt.sep;});function Tr(t){if(!t||!k.existsSync(t))return null;try{let e=k.readFileSync(t,"utf8").trimEnd().split(`
209
209
  `);for(let n=e.length-1;n>=0;n--)try{let r=JSON.parse(e[n]);if(r.type==="user"&&r.uuid)return r.uuid}catch{}}catch{}return null}function fn(t){if(!t||!k.existsSync(t))return null;try{let e=k.readFileSync(t,"utf8").trimEnd().split(`
210
- `),n=[],r=0,s=0;for(let i=e.length-1;i>=0;i--)try{let o=JSON.parse(e[i]);if(o.type==="user")break;if(o.type==="assistant"){let c=(o.message?.content??[]).filter(S=>S.type==="text").map(S=>S.text??"").join("");c&&n.unshift(c);let l=o.message?.usage??{};r+=(l.input_tokens??0)+(l.cache_read_input_tokens??0)+(l.cache_creation_input_tokens??0),s+=l.output_tokens??0;}}catch{}return !n.length&&r===0?null:{text:n.join(`
211
-
212
- `),inputTokens:r,outputTokens:s}}catch{}return null}var mn=g(()=>{"use strict";});function yr(t){return t.replace(":","/")}function Te(t,e){if(!t)return null;let n=yr(t),r=[bt.join(ht.homedir(),".claude","skills",n,"SKILL.md"),bt.join(e??"",".claude","skills",n,"SKILL.md")];for(let s of r)if(k.existsSync(s))try{return k.readFileSync(s,"utf8")}catch{}return null}function _r(t){return t.split(`
213
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function Or(t){return !!t.slashSkill||t.toolCalls.some(r=>r.tool==="Skill")?t.toolCalls.some(r=>r.tool==="Skill"&&!r.synthetic||Co.has(r.tool))?"complete":"prerequisite_required":null}function ye(t,e){if(!t)return null;let n=yr(t),r=[bt.join(ht.homedir(),".claude","skills",n),bt.join(e??"",".claude","skills",n)],s=null;for(let a of r)if(k.existsSync(bt.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let i=[];function o(a,c){for(let l of k.readdirSync(a,{withFileTypes:true})){if(Io.has(l.name)||No.has(l.name)||Uo.has(bt.extname(l.name)))continue;let S=c?`${c}/${l.name}`:l.name;l.isDirectory()?o(bt.join(a,l.name),S):i.push(S);}}return o(s,""),i.length>0?i:null}var Io,Uo,No,Co,_e=g(()=>{"use strict";Io=new Set([".venv","__pycache__",".git","node_modules"]),Uo=new Set([".pyc",".pyo"]),No=new Set(["SKILL.md",".DS_Store",".gitignore"]);Co=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function xo(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Do(t,e,n,r){return new Promise(s=>{let i=new URL(t),o=i.protocol==="https:",a=(o?ls__default.default:Rs__default.default).request({hostname:i.hostname,port:i.port||(o?443:80),path:i.pathname+i.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),Authorization:`Bearer ${String(n).replace(/[\r\n]/g,"")}`,FlowTenant:String(r).replace(/[\r\n]/g,"")}},c=>{c.resume(),s(c.statusCode??0);});a.on("error",()=>s(0)),a.setTimeout(5e3,()=>{a.destroy(),s(0);}),a.write(e),a.end();})}async function wt(t,e={}){try{let n=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!n)return;let r,s=new Promise((A,T)=>{r=setTimeout(()=>T(new Error("getToken timeout")),4e3),r.unref();}),{accessToken:i}=await Promise.race([D(n),s]);clearTimeout(r);let o=xo(i);if(!o)return;let a=o.tenant||n.tenant,c=JSON.stringify({action:t,booster:ae().BOOSTER,metadata:e,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:o.email||"",id:o.sub||"",name:o.name||o.email||""}}),l=Et(ae().API_URL),S=await Do(l,c,i,a);u("metrics.logEvent",`action=${t} status=${S}`);}catch(n){u("metrics.logEvent",`silenced error: ${n.message}`);}}var Oe=g(()=>{"use strict";L();gt();V();W();});async function gn(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Bo})+`
214
- `);return}let r=!!(await K()).authError,s=t.session_id||"unknown",i=t.prompt||"",o=t.cwd||"",a=Sr(t.transcript_path)||un(),c=_r(i),l=c?Te(c,o):null,S=c?ye(c,o):null;$t(s,{traceId:un(),spanId:St(),startNs:it(),sessionId:s,prompt:i,cwd:o,traceName:a,transcriptPath:t.transcript_path||"",model:process.env[p.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:l,skillArtifacts:S}),wt("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:r}),u("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),G(t);}var Bo,Ar=g(()=>{"use strict";re();se();mn();_e();Nt();W();L();V();Oe();Bo=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${et()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;});async function kr(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},s=Ct(e);s&&(s.pendingTool={name:n,inputStr:X(r,j.TOOL_INPUT),startNs:it()},$t(e,s)),u("PreToolUse",`sid=${e}`,`tool=${n}`,`stateFound=${!!s}`),G(t);}var Lr=g(()=>{"use strict";re();se();Nt();W();L();});function f(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function Tt(...t){return t.filter(e=>e!==null)}function vr(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Mo,spans:Array.isArray(e)?e:[e]}]}]}}var Mo,O,Rr=g(()=>{"use strict";L();Mo={name:ie.SCOPE_NAME,version:ie.SCOPE_VERSION},O={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};});function Pr(t,e,n,r,s){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let i=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(n)},response:{status:r,body:s}});try{k.writeFileSync(br,i+`
215
- `,{flag:"a",encoding:"utf8",mode:384}),u("sendTraces:dump",`request appendada em ${br}`);}catch(o){u("sendTraces:dump",`falha ao salvar: ${o.message}`);}}function Go(t){let e=new URL(t),n=new URL(pt().GATEWAY_HEALTH);return n.hostname=e.hostname,n.port=e.port,n.protocol=e.protocol,n}function Ir(t,e){return new Promise((n,r)=>{let s=t._isSSL?ls__default.default:Rs__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let i=s.request(t,o=>{let a=[];o.on("data",c=>a.push(c)),o.on("end",()=>n({statusCode:o.statusCode??0,body:a.join("")}));});i.setTimeout(1e4,()=>{i.destroy(new Error("Request timeout"));}),i.on("error",o=>r(new Error(`Network error: ${o.message}`))),e&&i.write(e),i.end();})}async function Ur(t,e){let n;try{n=Go(t);}catch{return false}let r=n.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let i=await Ir({hostname:n.hostname,port:n.port||(r?443:80),path:n.pathname,method:"GET",headers:s,_isSSL:r},null);return u("checkHealth",`url=${n.href} status=${i.statusCode}`),i.statusCode>=200&&i.statusCode<300}catch{return false}}async function Ae(t,e,n){let r=JSON.stringify(t),s=new URL(e),i=s.protocol==="https:",o=String(n).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:o,"Content-Length":Buffer.byteLength(r)};u("sendTraces:request",`POST ${e}`),u("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:o.slice(0,20)+"\u2026"})}`),u("sendTraces:request",`body=${r.slice(0,500)}${r.length>500?"\u2026":""}`);try{let c=await Ir({hostname:s.hostname,port:s.port||(i?443:80),path:s.pathname,method:"POST",headers:a,_isSSL:i},r);return u("sendTraces:response",`status=${c.statusCode}`),Pr(e,a,r,c.statusCode,c.body),c.statusCode}catch(c){return u("sendTraces:error",c.message),Pr(e,a,r,0,c.message),0}}var br,Nr=g(()=>{"use strict";L();W();br=bt.join(ht.tmpdir(),"flow-obs-requests.ndjson");});function Jo(){let t=parseInt(process.env[p.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(x.MIN_TTL_DAYS,Math.min(x.MAX_TTL_DAYS,t)):x.DEFAULT_TTL_DAYS)*24*60*60*1e3}function qo(){let t=parseInt(process.env[p.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(x.MIN_MAX_FILES,Math.min(x.MAX_MAX_FILES,t)):x.DEFAULT_MAX_FILES}function $r(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return bt__namespace.default.join(ht__namespace.default.tmpdir(),`${x.FILE_PREFIX}${t}.json`)}function En(){let t=ht__namespace.default.tmpdir(),e;try{e=k__namespace.default.readdirSync(t);}catch{return []}return e.filter(n=>n.startsWith(x.FILE_PREFIX)&&n.endsWith(".json")).map(n=>{let r=bt__namespace.default.join(t,n),s=0;try{s=k__namespace.default.statSync(r).mtimeMs;}catch{}return {full:r,mtime:s}}).sort((n,r)=>n.mtime-r.mtime).map(n=>n.full)}function oe(t){try{let e=qo(),n=En();if(n.length>=e){let i=n.slice(0,n.length-e+1);for(let o of i)try{k__namespace.default.unlinkSync(o);}catch{}}let r=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:r,bufferedAt:Date.now(),payload:t};return k__namespace.default.writeFileSync($r(r),JSON.stringify(s),{encoding:"utf8",mode:384}),u("buffer",`saved fileId=${r}`),r}catch(e){return u("buffer",`saveToBuffer failed: ${e.message}`),null}}function Fr(t){let e=En(),n=t!=null&&t>0?t:e.length,r=[];for(let s of e){if(r.length>=n)break;try{let i=k__namespace.default.readFileSync(s,"utf8"),o=JSON.parse(i);o&&o.fileId&&o.payload&&r.push(o);}catch{u("buffer",`skipping malformed file: ${s}`);}}return r}function xr(t){try{k__namespace.default.unlinkSync($r(t)),u("buffer",`deleted fileId=${t}`);}catch{}}function Dr(){let t=Date.now()-Jo();for(let e of En())try{let{mtimeMs:n}=k__namespace.default.statSync(e);n<t&&(k__namespace.default.unlinkSync(e),u("buffer",`evicted stale: ${bt__namespace.default.basename(e)}`));}catch{}}var Br=g(()=>{"use strict";L();W();});async function Ko(t){Dr();let e=Fr(x.REPLAY_BATCH_SIZE);e.length&&(u("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async n=>{try{let r=await Ae(n.payload,t.endpoint,t.authHeader);r>=200&&r<300?(xr(n.fileId),u("replayBufferedTraces",`replayed fileId=${n.fileId} status=${r}`)):u("replayBufferedTraces",`replay failed fileId=${n.fileId} status=${r}`);}catch(r){u("replayBufferedTraces",`replay error fileId=${n.fileId}: ${r.message}`);}})));}async function Mr(t){let e=await K();if(!e.length)return e.authError&&(u("postToLangfuse","auth refresh failed \u2014 buffering trace"),oe(t)),0;let n=await Promise.all(e.map(async i=>{if(i.mode!=="gateway")return {creds:i,healthy:true};let o=await Ur(i.endpoint,i.authHeader);return {creds:i,healthy:o}})),r=n.find(i=>i.creds.mode==="gateway"&&i.healthy)?.creds??n.find(i=>i.creds.mode==="direct")?.creds;return r&&await Ko(r),(await Promise.all(n.map(async({creds:i,healthy:o})=>{if(i.mode==="gateway"){if(!o)return u("postToLangfuse","gateway health check failed \u2014 buffering trace"),oe(t),0;let c=await Ae(t,i.endpoint,i.authHeader);return (c===0||c>=500)&&(u("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),oe(t)),c}let a=await Ae(t,i.endpoint,i.authHeader);return (a===0||a>=500)&&(u("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),oe(t)),a}))).find(i=>i!==0)??0}var Hr=g(()=>{"use strict";V();W();Nr();Br();L();});var Sn=g(()=>{"use strict";Rr();Hr();});function ct(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Qo.reduce((n,{re:r,replace:s})=>n.replace(r,s),e)}var M,Xo,zo,Zo,jr,Qo,wn=g(()=>{"use strict";M="[REDACTED]",Xo="[REDACTED-EMAIL]",zo="[REDACTED-CPF]",Zo="[REDACTED-CNPJ]",jr="[REDACTED-PHONE]",Qo=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${M}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${M}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${M}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${M}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,n)=>`${e}
216
- ${M}
217
- ${n}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${M}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${M}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${M}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${M}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${M}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,n)=>`${e}${n}${M}${n}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${M}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>Xo},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>zo},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Zo},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>jr},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>jr}];});async function Wr(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},s=t.tool_response,i=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",o=Ct(e);if(!o){G(t);return}let a=it(),c=o.pendingTool,l=c?.name===n,S=l?c.startNs:String(BigInt(a)-200000000n),A=l?c.inputStr:X(r,j.TOOL_INPUT),T=A,w=null;if(n==="Skill"){let tt=typeof r=="object"&&r!==null?r.skill||r.name||r.skillName||r.commandName||String(Object.values(r)[0]??""):String(r);w=tt?String(tt).trim():null;let C=w?Te(w,o.cwd):null;C&&(T=C,o.skillContent||(o.skillContent=C),o.skillArtifacts||(o.skillArtifacts=ye(w,o.cwd))),w&&!o.slashSkill&&(o.slashSkill=w),u("PostToolUse","Skill tool detected",`skillName=${w}`,`contentFound=${!!C}`);}let d=ct(X(i,j.TOOL_OUTPUT)),h=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(d.slice(0,500)),J=h?"ERROR":"DEFAULT",q=St(),Q=Math.round(Number(BigInt(a)-BigInt(S))/1e6),y={Agent:"AGENT",Task:"AGENT"}[n]??"TOOL",U=n==="Skill"&&w?w:we(A,60);o.toolCalls.push({tool:n,brief:U,error:h,durationMs:Q});let Ot=o.spans;Ot.push({traceId:o.traceId,spanId:q,parentSpanId:o.spanId,name:n,kind:3,startTimeUnixNano:S,endTimeUnixNano:a,attributes:Tt(f(O.OBS_NAME,n),f(O.OBS_TYPE,y),f(O.OBS_LEVEL,J),f(O.OBS_INPUT,ct(T)),f(O.OBS_OUTPUT,d),f("tool.name",n),f("tool.error",String(h)),n==="Skill"&&w?f("skill.name",w):null,n==="Skill"?f("skill.invocation","slash-command"):null),status:{code:h?2:1}}),o.pendingTool=null,$t(e,o),h&&wt("TOOL_ERROR",{toolName:n}),u("PostToolUse",`sid=${e}`,`tool=${n}`,`error=${h}`,`durationMs=${Q}`,`totalSpans=${Ot.length}`),G(t);}var Vr=g(()=>{"use strict";re();se();Sn();Nt();_e();W();L();wn();Oe();});function Gr(t,e,n){let r=Object.keys(Yr).find(o=>(t??"").toLowerCase().includes(o));if(!r)return;let s=Yr[r],i=(e*s.input+n*s.output)/1e6;return Math.round(i*1e6)/1e6}var Yr,Jr=g(()=>{"use strict";Yr={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};});async function qr(t){let e=t.session_id||"unknown",n=t.stop_reason||"end_turn",r=Ct(e);if(!r){G(t);return}r.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(r.slashSkill)&&(u("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${r.slashSkill}"`),r.slashSkill=null);let s=it(),i=await Qn(),o=r.toolCalls,a=r.spans;if(r.slashSkill&&!o.some(_=>_.tool==="Skill")){let _=St(),lt=r.skillContent?r.skillContent:JSON.stringify({skill:r.slashSkill});o.push({tool:"Skill",brief:r.slashSkill,error:false,durationMs:0,synthetic:true}),a.push({traceId:r.traceId,spanId:_,parentSpanId:r.spanId,name:"Skill",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:r.startNs,attributes:Tt(f(O.OBS_NAME,"Skill"),f(O.OBS_TYPE,"TOOL"),f(O.OBS_LEVEL,"DEFAULT"),f(O.OBS_INPUT,lt),f(O.OBS_OUTPUT,"loaded via slash command"),f("tool.name","Skill"),f("tool.error","false"),f("skill.name",r.slashSkill),f("skill.invocation","slash-command")),status:{code:1}}),u("Stop",`slashSkill=${r.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||r.transcriptPath||"",l=fn(c);if(c&&(o.some(_=>_.tool==="Skill"&&!_.synthetic)||!!r.slashSkill)&&!l?.text){await new Promise(lt=>setTimeout(lt,500));let _=fn(c);_?.text&&(l=_);}u("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${l?`text=${l.text.length}chars`:"null"}`);let A=o.length,T=o.filter(_=>_.error).length,w=ct(l?.text?X(l.text,j.TRACE_OUTPUT):A===0?"No tools used":o.map((_,lt)=>`${lt+1}. ${_.tool}${_.brief?` \u2192 ${_.brief}`:""}${_.error?" [ERROR]":""}`).join(`
218
- `)),d=l?.inputTokens??0,h=l?.outputTokens??0,J=o.map((_,lt)=>`${lt+1}. ${_.tool}${_.brief?` \u2192 ${_.brief}`:""}${_.error?" [ERROR]":""} (${_.durationMs}ms)`),q=!!(r.slashSkill||o.some(_=>_.tool==="Skill")),Q=o.some(_=>_.tool==="Agent");if(!q&&!Q){u("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),wt("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),pn(e),G(t);return}let E=q?"skill":"agent",y=Math.round(Number(BigInt(s)-BigInt(r.startNs))/1e6),U=Gr(r.model,d,h),z=Or(r);z==="prerequisite_required"&&l?.text&&(z="complete"),z==="prerequisite_required"&&(a.push({traceId:r.traceId,spanId:St(),parentSpanId:r.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:s,attributes:Tt(f(O.OBS_NAME,"prerequisite-check"),f(O.OBS_TYPE,"EVENT"),f(O.OBS_LEVEL,"WARNING"),f(O.OBS_OUTPUT,w),f("skill.name",r.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),u("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${r.slashSkill}`));let Ot=(()=>{if(!(!q||!r.prompt)){if(r.slashSkill){let _=r.prompt.replace(new RegExp(`^\\/${r.slashSkill}\\s*`,"i"),"").trim();return _?X(ct(_),j.USER_INSTRUCTION):void 0}return X(ct(r.prompt),j.USER_INSTRUCTION)||void 0}})(),tt=JSON.stringify({trace_type:E,...z!==null&&{execution_status:z},...r.slashSkill?{skill_name:r.slashSkill}:{},...r.skillArtifacts?.length&&{skill_artifacts:r.skillArtifacts},...Ot!==void 0&&{user_instruction:Ot},latency_ms:y,...d&&{tokens_input:d},...h&&{tokens_output:h},cost_usd:U,...r.model?{model:r.model}:{},toolCount:A,errorCount:T,stopReason:n,sessionId:r.sessionId,tools:J.length?J:void 0}),C=ct(X(r.prompt,j.TRACE_INPUT)),ke=Tt(f(O.TRACE_NAME,r.traceName),f(O.TRACE_INPUT,C),f(O.TRACE_OUTPUT,w),f(O.OBS_INPUT,C),f(O.OBS_OUTPUT,w),f(O.TRACE_METADATA,tt),f(O.SESSION_ID,r.sessionId),f(O.USER_ID,i.user),f(O.OBS_TYPE,"GENERATION"),f(O.MODEL,r.model),d?f(O.INPUT_TOKENS,d):null,h?f(O.OUTPUT_TOKENS,h):null,f("claude.stop_reason",n),f("claude.tool_count",String(A)),f("claude.error_count",String(T)),f("claude.session_id",r.sessionId),f("flow.trace_type",E),{key:O.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:E}]}}}),Qr={traceId:r.traceId,spanId:r.spanId,name:r.traceName,kind:1,startTimeUnixNano:r.startNs,endTimeUnixNano:s,attributes:ke,status:{code:T>0?2:1}},ts=Tt(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Tn=[...a,Qr];u("Stop",`sid=${e}`,`totalTools=${A}`,`errorTools=${T}`,`spans=${Tn.length}`,`inputTokens=${d}`,`outputTokens=${h}`,`traceOutput="${we(w,80)}"`);let es=await Mr(vr(ts,Tn));u("Stop",`POST status=${es}`,`traceId=${r.traceId}`),wt("TRACE_SENT",{latencyMs:y,totalTools:A,errorTools:T,inputTokens:d,outputTokens:h,costUsd:U}),pn(e),G(t);}var Kr=g(()=>{"use strict";re();se();Sn();V();Jr();mn();Nt();W();_e();wn();L();Oe();});var yt,Xr=g(()=>{"use strict";V();Nt();Ar();Lr();Vr();Kr();yt=class t{static passthroughStdin(){let e=[];process.stdin.on("data",n=>e.push(n)),process.stdin.on("end",()=>process.stdout.write(Buffer.concat(e)));}static async userPromptSubmit(){let e=await ne(),n;try{n=await K();}catch{process.stdout.write(JSON.stringify(e));return}n.authError?await gn(e,!0):n.length>0?await gn(e):process.stdout.write(JSON.stringify(e));}static async preToolUse(){if(!await me()){t.passthroughStdin();return}let e=await ne();await kr(e);}static async postToolUse(){if(!await me()){t.passthroughStdin();return}let e=await ne();await Wr(e);}static async stop(){if(!await me()){t.passthroughStdin();return}let e=await ne();await qr(e);}};});var ei={};async function ti(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await yt.userPromptSubmit();break;case "PreToolUse":await yt.preToolUse();break;case "PostToolUse":await yt.postToolUse();break;case "Stop":await yt.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
210
+ `),n=[],r=0,o=0;for(let i=e.length-1;i>=0;i--)try{let s=JSON.parse(e[i]);if(s.type==="user")break;if(s.type==="assistant"){let c=(s.message?.content??[]).filter(T=>T.type==="text").map(T=>T.text??"").join("");c&&n.unshift(c);let u=s.message?.usage??{};r+=(u.input_tokens??0)+(u.cache_read_input_tokens??0)+(u.cache_creation_input_tokens??0),o+=u.output_tokens??0;}}catch{}return !n.length&&r===0?null:{text:n.join(`
211
+
212
+ `),inputTokens:r,outputTokens:o}}catch{}return null}var mn=g(()=>{"use strict";});function _r(t){return t.replace(":","/")}function we(t,e){if(!t)return null;let n=_r(t),r=[Pt.join(ht.homedir(),".claude","skills",n,"SKILL.md"),Pt.join(e??"",".claude","skills",n,"SKILL.md")];for(let o of r)if(k.existsSync(o))try{return k.readFileSync(o,"utf8")}catch{}return null}function yr(t){return t.split(`
213
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function Or(t){return !!t.slashSkill||t.toolCalls.some(r=>r.tool==="Skill")?t.toolCalls.some(r=>r.tool==="Skill"&&!r.synthetic||Co.has(r.tool))?"complete":"prerequisite_required":null}function _e(t,e){if(!t)return null;let n=_r(t),r=[Pt.join(ht.homedir(),".claude","skills",n),Pt.join(e??"",".claude","skills",n)],o=null;for(let a of r)if(k.existsSync(Pt.join(a,"SKILL.md"))){o=a;break}if(!o)return null;let i=[];function s(a,c){for(let u of k.readdirSync(a,{withFileTypes:true})){if(Io.has(u.name)||No.has(u.name)||Uo.has(Pt.extname(u.name)))continue;let T=c?`${c}/${u.name}`:u.name;u.isDirectory()?s(Pt.join(a,u.name),T):i.push(T);}}return s(o,""),i.length>0?i:null}var Io,Uo,No,Co,ye=g(()=>{"use strict";Io=new Set([".venv","__pycache__",".git","node_modules"]),Uo=new Set([".pyc",".pyo"]),No=new Set(["SKILL.md",".DS_Store",".gitignore"]);Co=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function xo(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Do(t,e,n,r){return new Promise(o=>{let i=new URL(t),s=i.protocol==="https:",a=(s?ls__default.default:vs__default.default).request({hostname:i.hostname,port:i.port||(s?443:80),path:i.pathname+i.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),Authorization:`Bearer ${String(n).replace(/[\r\n]/g,"")}`,FlowTenant:String(r).replace(/[\r\n]/g,"")}},c=>{c.resume(),o(c.statusCode??0);});a.on("error",()=>o(0)),a.setTimeout(5e3,()=>{a.destroy(),o(0);}),a.write(e),a.end();})}async function St(t,e={}){try{let n=st(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!n)return;let r,o=new Promise((A,w)=>{r=setTimeout(()=>w(new Error("getToken timeout")),4e3),r.unref();}),{accessToken:i}=await Promise.race([M(n),o]);clearTimeout(r);let s=xo(i);if(!s)return;let a=s.tenant||n.tenant,c=JSON.stringify({action:t,booster:ce().BOOSTER,metadata:e,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:s.email||"",id:s.sub||"",name:s.name||s.email||""}}),u=Et(ce().API_URL),T=await Do(u,c,i,a);l("metrics.logEvent",`action=${t} status=${T}`);}catch(n){l("metrics.logEvent",`silenced error: ${n.message}`);}}var Oe=g(()=>{"use strict";L();gt();Y();V();});async function gn(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Mo})+`
214
+ `);return}let r=!!(await z()).authError,o=t.session_id||"unknown",i=t.prompt||"",s=t.cwd||"",a=Tr(t.transcript_path)||un(),c=yr(i),u=c?we(c,s):null,T=c?_e(c,s):null;Ft(o,{traceId:un(),spanId:Tt(),startNs:it(),sessionId:o,prompt:i,cwd:s,traceName:a,transcriptPath:t.transcript_path||"",model:process.env[p.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:u,skillArtifacts:T}),St("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:r}),l("UserPromptSubmit",`sid=${o}`,`traceName=${a}`,`slashSkill=${c}`),N(t);}var Mo,Ar=g(()=>{"use strict";se();oe();mn();ye();Ct();V();L();Y();Oe();Mo=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${et()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;});async function kr(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},o=$t(e);o&&(o.pendingTool={name:n,inputStr:K(r,W.TOOL_INPUT),startNs:it()},Ft(e,o)),l("PreToolUse",`sid=${e}`,`tool=${n}`,`stateFound=${!!o}`),N(t);}var Lr=g(()=>{"use strict";se();oe();Ct();V();L();});function f(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function wt(...t){return t.filter(e=>e!==null)}function Rr(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Bo,spans:Array.isArray(e)?e:[e]}]}]}}var Bo,O,vr=g(()=>{"use strict";L();Bo={name:ae.SCOPE_NAME,version:ae.SCOPE_VERSION},O={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};});function Pr(t,e,n,r,o){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let i=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(n)},response:{status:r,body:o}});try{k.writeFileSync(br,i+`
215
+ `,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${br}`);}catch(s){l("sendTraces:dump",`falha ao salvar: ${s.message}`);}}function Go(t){let e=new URL(t),n=new URL(pt().GATEWAY_HEALTH);return n.hostname=e.hostname,n.port=e.port,n.protocol=e.protocol,n}function Ir(t,e){return new Promise((n,r)=>{let o=t._isSSL?ls__default.default:vs__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let i=o.request(t,s=>{let a=[];s.on("data",c=>a.push(c)),s.on("end",()=>n({statusCode:s.statusCode??0,body:a.join("")}));});i.setTimeout(1e4,()=>{i.destroy(new Error("Request timeout"));}),i.on("error",s=>r(new Error(`Network error: ${s.message}`))),e&&i.write(e),i.end();})}async function Ur(t,e){let n;try{n=Go(t);}catch{return false}let r=n.protocol==="https:";try{let o={};e&&(o.Authorization=String(e).replace(/[\r\n]/g,""));let i=await Ir({hostname:n.hostname,port:n.port||(r?443:80),path:n.pathname,method:"GET",headers:o,_isSSL:r},null);return l("checkHealth",`url=${n.href} status=${i.statusCode}`),i.statusCode>=200&&i.statusCode<300}catch{return false}}async function Ae(t,e,n){let r=JSON.stringify(t),o=new URL(e),i=o.protocol==="https:",s=String(n).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:s,"Content-Length":Buffer.byteLength(r)};l("sendTraces:request",`POST ${e}`),l("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:s.slice(0,20)+"\u2026"})}`),l("sendTraces:request",`body=${r.slice(0,500)}${r.length>500?"\u2026":""}`);try{let c=await Ir({hostname:o.hostname,port:o.port||(i?443:80),path:o.pathname,method:"POST",headers:a,_isSSL:i},r);return l("sendTraces:response",`status=${c.statusCode}`),Pr(e,a,r,c.statusCode,c.body),c.statusCode}catch(c){return l("sendTraces:error",c.message),Pr(e,a,r,0,c.message),0}}var br,Nr=g(()=>{"use strict";L();V();br=Pt.join(ht.tmpdir(),"flow-obs-requests.ndjson");});function Jo(){let t=parseInt(process.env[p.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(D.MIN_TTL_DAYS,Math.min(D.MAX_TTL_DAYS,t)):D.DEFAULT_TTL_DAYS)*24*60*60*1e3}function qo(){let t=parseInt(process.env[p.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(D.MIN_MAX_FILES,Math.min(D.MAX_MAX_FILES,t)):D.DEFAULT_MAX_FILES}function $r(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return Pt__namespace.default.join(ht__namespace.default.tmpdir(),`${D.FILE_PREFIX}${t}.json`)}function En(){let t=ht__namespace.default.tmpdir(),e;try{e=k__namespace.default.readdirSync(t);}catch{return []}return e.filter(n=>n.startsWith(D.FILE_PREFIX)&&n.endsWith(".json")).map(n=>{let r=Pt__namespace.default.join(t,n),o=0;try{o=k__namespace.default.statSync(r).mtimeMs;}catch{}return {full:r,mtime:o}}).sort((n,r)=>n.mtime-r.mtime).map(n=>n.full)}function ie(t){try{let e=qo(),n=En();if(n.length>=e){let i=n.slice(0,n.length-e+1);for(let s of i)try{k__namespace.default.unlinkSync(s);}catch{}}let r=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,o={fileId:r,bufferedAt:Date.now(),payload:t};return k__namespace.default.writeFileSync($r(r),JSON.stringify(o),{encoding:"utf8",mode:384}),l("buffer",`saved fileId=${r}`),r}catch(e){return l("buffer",`saveToBuffer failed: ${e.message}`),null}}function Fr(t){let e=En(),n=t!=null&&t>0?t:e.length,r=[];for(let o of e){if(r.length>=n)break;try{let i=k__namespace.default.readFileSync(o,"utf8"),s=JSON.parse(i);s&&s.fileId&&s.payload&&r.push(s);}catch{l("buffer",`skipping malformed file: ${o}`);}}return r}function xr(t){try{k__namespace.default.unlinkSync($r(t)),l("buffer",`deleted fileId=${t}`);}catch{}}function Dr(){let t=Date.now()-Jo();for(let e of En())try{let{mtimeMs:n}=k__namespace.default.statSync(e);n<t&&(k__namespace.default.unlinkSync(e),l("buffer",`evicted stale: ${Pt__namespace.default.basename(e)}`));}catch{}}var Mr=g(()=>{"use strict";L();V();});async function Ko(t){Dr();let e=Fr(D.REPLAY_BATCH_SIZE);e.length&&(l("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async n=>{try{let r=await Ae(n.payload,t.endpoint,t.authHeader);r>=200&&r<300?(xr(n.fileId),l("replayBufferedTraces",`replayed fileId=${n.fileId} status=${r}`)):l("replayBufferedTraces",`replay failed fileId=${n.fileId} status=${r}`);}catch(r){l("replayBufferedTraces",`replay error fileId=${n.fileId}: ${r.message}`);}})));}async function Br(t){let e=await z();if(!e.length)return e.authError&&(l("postToLangfuse","auth refresh failed \u2014 buffering trace"),ie(t)),0;let n=await Promise.all(e.map(async i=>{if(i.mode!=="gateway")return {creds:i,healthy:true};let s=await Ur(i.endpoint,i.authHeader);return {creds:i,healthy:s}})),r=n.find(i=>i.creds.mode==="gateway"&&i.healthy)?.creds??n.find(i=>i.creds.mode==="direct")?.creds;return r&&await Ko(r),(await Promise.all(n.map(async({creds:i,healthy:s})=>{if(i.mode==="gateway"){if(!s)return l("postToLangfuse","gateway health check failed \u2014 buffering trace"),ie(t),0;let c=await Ae(t,i.endpoint,i.authHeader);return (c===0||c>=500)&&(l("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),ie(t)),c}let a=await Ae(t,i.endpoint,i.authHeader);return (a===0||a>=500)&&(l("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),ie(t)),a}))).find(i=>i!==0)??0}var Hr=g(()=>{"use strict";Y();V();Nr();Mr();L();});var Tn=g(()=>{"use strict";vr();Hr();});function ct(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Qo.reduce((n,{re:r,replace:o})=>n.replace(r,o),e)}var H,Xo,zo,Zo,jr,Qo,Sn=g(()=>{"use strict";H="[REDACTED]",Xo="[REDACTED-EMAIL]",zo="[REDACTED-CPF]",Zo="[REDACTED-CNPJ]",jr="[REDACTED-PHONE]",Qo=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${H}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${H}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${H}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${H}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,n)=>`${e}
216
+ ${H}
217
+ ${n}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${H}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${H}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${H}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${H}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${H}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,n)=>`${e}${n}${H}${n}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${H}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>Xo},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>zo},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Zo},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>jr},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>jr}];});async function Wr(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},o=t.tool_response,i=o!==null&&typeof o=="object"?o.output??JSON.stringify(o):o??"",s=$t(e);if(!s){N(t);return}let a=it(),c=s.pendingTool,u=c?.name===n,T=u?c.startNs:String(BigInt(a)-200000000n),A=u?c.inputStr:K(r,W.TOOL_INPUT),w=A,S=null;if(n==="Skill"){let tt=typeof r=="object"&&r!==null?r.skill||r.name||r.skillName||r.commandName||String(Object.values(r)[0]??""):String(r);S=tt?String(tt).trim():null;let $=S?we(S,s.cwd):null;$&&(w=$,s.skillContent||(s.skillContent=$),s.skillArtifacts||(s.skillArtifacts=_e(S,s.cwd))),S&&!s.slashSkill&&(s.slashSkill=S),l("PostToolUse","Skill tool detected",`skillName=${S}`,`contentFound=${!!$}`);}let d=ct(K(i,W.TOOL_OUTPUT)),h=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(d.slice(0,500)),J=h?"ERROR":"DEFAULT",q=Tt(),Q=Math.round(Number(BigInt(a)-BigInt(T))/1e6),_={Agent:"AGENT",Task:"AGENT"}[n]??"TOOL",U=n==="Skill"&&S?S:Se(A,60);s.toolCalls.push({tool:n,brief:U,error:h,durationMs:Q});let Ot=s.spans;Ot.push({traceId:s.traceId,spanId:q,parentSpanId:s.spanId,name:n,kind:3,startTimeUnixNano:T,endTimeUnixNano:a,attributes:wt(f(O.OBS_NAME,n),f(O.OBS_TYPE,_),f(O.OBS_LEVEL,J),f(O.OBS_INPUT,ct(w)),f(O.OBS_OUTPUT,d),f("tool.name",n),f("tool.error",String(h)),n==="Skill"&&S?f("skill.name",S):null,n==="Skill"?f("skill.invocation","slash-command"):null),status:{code:h?2:1}}),s.pendingTool=null,Ft(e,s),h&&St("TOOL_ERROR",{toolName:n}),l("PostToolUse",`sid=${e}`,`tool=${n}`,`error=${h}`,`durationMs=${Q}`,`totalSpans=${Ot.length}`),N(t);}var Vr=g(()=>{"use strict";se();oe();Tn();Ct();ye();V();L();Sn();Oe();});function Gr(t,e,n){let r=Object.keys(Yr).find(s=>(t??"").toLowerCase().includes(s));if(!r)return;let o=Yr[r],i=(e*o.input+n*o.output)/1e6;return Math.round(i*1e6)/1e6}var Yr,Jr=g(()=>{"use strict";Yr={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};});async function qr(t){let e=t.session_id||"unknown",n=t.stop_reason||"end_turn",r=$t(e);if(!r){N(t);return}r.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(r.slashSkill)&&(l("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${r.slashSkill}"`),r.slashSkill=null);let o=it(),i=await Qn(),s=r.toolCalls,a=r.spans;if(r.slashSkill&&!s.some(y=>y.tool==="Skill")){let y=Tt(),lt=r.skillContent?r.skillContent:JSON.stringify({skill:r.slashSkill});s.push({tool:"Skill",brief:r.slashSkill,error:false,durationMs:0,synthetic:true}),a.push({traceId:r.traceId,spanId:y,parentSpanId:r.spanId,name:"Skill",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:r.startNs,attributes:wt(f(O.OBS_NAME,"Skill"),f(O.OBS_TYPE,"TOOL"),f(O.OBS_LEVEL,"DEFAULT"),f(O.OBS_INPUT,lt),f(O.OBS_OUTPUT,"loaded via slash command"),f("tool.name","Skill"),f("tool.error","false"),f("skill.name",r.slashSkill),f("skill.invocation","slash-command")),status:{code:1}}),l("Stop",`slashSkill=${r.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||r.transcriptPath||"",u=fn(c);if(c&&(s.some(y=>y.tool==="Skill"&&!y.synthetic)||!!r.slashSkill)&&!u?.text){await new Promise(lt=>setTimeout(lt,500));let y=fn(c);y?.text&&(u=y);}l("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${u?`text=${u.text.length}chars`:"null"}`);let A=s.length,w=s.filter(y=>y.error).length,S=ct(u?.text?K(u.text,W.TRACE_OUTPUT):A===0?"No tools used":s.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""}`).join(`
218
+ `)),d=u?.inputTokens??0,h=u?.outputTokens??0,J=s.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""} (${y.durationMs}ms)`),q=!!(r.slashSkill||s.some(y=>y.tool==="Skill")),Q=s.some(y=>y.tool==="Agent");if(!q&&!Q){l("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),St("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),pn(e),N(t);return}let E=q?"skill":"agent",_=Math.round(Number(BigInt(o)-BigInt(r.startNs))/1e6),U=Gr(r.model,d,h),X=Or(r);X==="prerequisite_required"&&u?.text&&(X="complete"),X==="prerequisite_required"&&(a.push({traceId:r.traceId,spanId:Tt(),parentSpanId:r.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:o,attributes:wt(f(O.OBS_NAME,"prerequisite-check"),f(O.OBS_TYPE,"EVENT"),f(O.OBS_LEVEL,"WARNING"),f(O.OBS_OUTPUT,S),f("skill.name",r.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),l("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${r.slashSkill}`));let Ot=(()=>{if(!(!q||!r.prompt)){if(r.slashSkill){let y=r.prompt.replace(new RegExp(`^\\/${r.slashSkill}\\s*`,"i"),"").trim();return y?K(ct(y),W.USER_INSTRUCTION):void 0}return K(ct(r.prompt),W.USER_INSTRUCTION)||void 0}})(),tt=JSON.stringify({trace_type:E,...X!==null&&{execution_status:X},...r.slashSkill?{skill_name:r.slashSkill}:{},...r.skillArtifacts?.length&&{skill_artifacts:r.skillArtifacts},...Ot!==void 0&&{user_instruction:Ot},latency_ms:_,...d&&{tokens_input:d},...h&&{tokens_output:h},cost_usd:U,...r.model?{model:r.model}:{},toolCount:A,errorCount:w,stopReason:n,sessionId:r.sessionId,tools:J.length?J:void 0}),$=ct(K(r.prompt,W.TRACE_INPUT)),ke=wt(f(O.TRACE_NAME,r.traceName),f(O.TRACE_INPUT,$),f(O.TRACE_OUTPUT,S),f(O.OBS_INPUT,$),f(O.OBS_OUTPUT,S),f(O.TRACE_METADATA,tt),f(O.SESSION_ID,r.sessionId),f(O.USER_ID,i.user),f(O.OBS_TYPE,"GENERATION"),f(O.MODEL,r.model),d?f(O.INPUT_TOKENS,d):null,h?f(O.OUTPUT_TOKENS,h):null,f("claude.stop_reason",n),f("claude.tool_count",String(A)),f("claude.error_count",String(w)),f("claude.session_id",r.sessionId),f("flow.trace_type",E),{key:O.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:E}]}}}),Qr={traceId:r.traceId,spanId:r.spanId,name:r.traceName,kind:1,startTimeUnixNano:r.startNs,endTimeUnixNano:o,attributes:ke,status:{code:w>0?2:1}},ts=wt(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),wn=[...a,Qr];l("Stop",`sid=${e}`,`totalTools=${A}`,`errorTools=${w}`,`spans=${wn.length}`,`inputTokens=${d}`,`outputTokens=${h}`,`traceOutput="${Se(S,80)}"`);let es=await Br(Rr(ts,wn));l("Stop",`POST status=${es}`,`traceId=${r.traceId}`),St("TRACE_SENT",{latencyMs:_,totalTools:A,errorTools:w,inputTokens:d,outputTokens:h,costUsd:U}),pn(e),N(t);}var Kr=g(()=>{"use strict";se();oe();Tn();Y();Jr();mn();Ct();V();ye();Sn();L();Oe();});var _t,Xr=g(()=>{"use strict";Y();Ct();Ar();Lr();Vr();Kr();_t=class{static async userPromptSubmit(){let e=await re(),n;try{n=await z();}catch{N(e);return}n.authError?await gn(e,!0):n.length>0?await gn(e):N(e);}static async preToolUse(){let e=await re();await kr(e);}static async postToolUse(){let e=await re();await Wr(e);}static async stop(){let e=await re();await qr(e);}};});var ei={};async function ti(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await _t.userPromptSubmit();break;case "PreToolUse":await _t.preToolUse();break;case "PostToolUse":await _t.postToolUse();break;case "Stop":await _t.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
219
219
  `),process.stdin.on("data",e=>process.stdout.write(e));}}var zr=g(()=>{"use strict";Xr();ti().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
220
- `),process.exit(0);});});var ni=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,H]=process.argv;function _t(t,e){let n=t.indexOf(e);return n!==-1?t[n+1]:void 0}function Zr(){let{bold:t,cyan:e,dim:n,green:r}=(ut(),N(ve)),{version:s}=Dt();process.stdout.write(`
221
- `+t(" flow-ai-obs")+n(" v"+s)+`
220
+ `),process.exit(0);});});var ni=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,j]=process.argv;function yt(t,e){let n=t.indexOf(e);return n!==-1?t[n+1]:void 0}function Zr(){let{bold:t,cyan:e,dim:n,green:r}=(ut(),C(Re)),{version:o}=Mt();process.stdout.write(`
221
+ `+t(" flow-ai-obs")+n(" v"+o)+`
222
222
 
223
223
  `),process.stdout.write(e(" init")+n(` Configure environment: Claude Code + Proxy + OTEL + Trace hooks
224
224
  `)),process.stdout.write(n(` --custom-url <URL> Set a custom Flow base URL
@@ -235,16 +235,16 @@ ${n}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${M}`},{re:/(aws_secret_ac
235
235
 
236
236
  `)),process.stdout.write(n(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
237
237
 
238
- `));}if(H==="--version"||H==="-v")(async()=>{let{version:t}=Dt();process.stdout.write(t+`
239
- `);let e=(vt(),N(Lt)),n=await e.fetchLatestVersionAsync().catch(()=>null);if(n&&e.isNewer(t,n.version)){let{dim:r,yellow:s}=(ut(),N(ve));process.stdout.write(s(`
238
+ `));}if(j==="--version"||j==="-v")(async()=>{let{version:t}=Mt();process.stdout.write(t+`
239
+ `);let e=(Rt(),C(Lt)),n=await e.fetchLatestVersionAsync().catch(()=>null);if(n&&e.isNewer(t,n.version)){let{dim:r,yellow:o}=(ut(),C(Re));process.stdout.write(o(`
240
240
  Update available: ${t} \u2192 ${n.version}
241
241
  `)+r(` Run: flow-ai-obs update
242
242
 
243
- `));}process.exit(0);})().catch(()=>process.exit(0));else if(H==="--help"||H==="-h")Zr(),process.exit(0);else if(H==="init"||H==="install")(async()=>{H==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
244
- `),await(vt(),N(Lt)).checkForUpdateInteractive();let{runInit:t}=(ar(),N(ir)),e=process.argv.slice(3);process.exit(await t({url:_t(e,"--custom-url"),noInteractive:e.includes("--no-interactive"),clientId:_t(e,"--client-id"),clientSecret:_t(e,"--client-secret"),tenant:_t(e,"--tenant")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
245
- `),process.exit(1);});else if(H==="login")(async()=>{await(vt(),N(Lt)).checkForUpdateInteractive();let{runLogin:t}=(Zt(),N(zt)),e=process.argv.slice(3),n=await t({clientId:_t(e,"--client-id"),clientSecret:_t(e,"--client-secret"),tenant:_t(e,"--tenant")});process.exit(typeof n=="number"?n:n.code);})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
246
- `),process.exit(1);});else if(H==="status")(async()=>{await(vt(),N(Lt)).checkForUpdateInteractive();let{runStatus:t}=(dr(),N(ur));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
247
- `),process.exit(1);});else if(H==="update")(async()=>{let t=(vt(),N(Lt)),{version:e}=Dt(),n=await t.fetchLatestVersionAsync();n||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
243
+ `));}process.exit(0);})().catch(()=>process.exit(0));else if(j==="--help"||j==="-h")Zr(),process.exit(0);else if(j==="init"||j==="install")(async()=>{j==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
244
+ `),await(Rt(),C(Lt)).checkForUpdateInteractive();let{runInit:t}=(ar(),C(ir)),e=process.argv.slice(3);process.exit(await t({url:yt(e,"--custom-url"),noInteractive:e.includes("--no-interactive"),clientId:yt(e,"--client-id"),clientSecret:yt(e,"--client-secret"),tenant:yt(e,"--tenant")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
245
+ `),process.exit(1);});else if(j==="login")(async()=>{await(Rt(),C(Lt)).checkForUpdateInteractive();let{runLogin:t}=(Qt(),C(Zt)),e=process.argv.slice(3),n=await t({clientId:yt(e,"--client-id"),clientSecret:yt(e,"--client-secret"),tenant:yt(e,"--tenant")});process.exit(typeof n=="number"?n:n.code);})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
246
+ `),process.exit(1);});else if(j==="status")(async()=>{await(Rt(),C(Lt)).checkForUpdateInteractive();let{runStatus:t}=(dr(),C(ur));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
247
+ `),process.exit(1);});else if(j==="update")(async()=>{let t=(Rt(),C(Lt)),{version:e}=Mt(),n=await t.fetchLatestVersionAsync();n||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
248
248
  `),process.exit(1)),t.isNewer(e,n.version)||(process.stdout.write(` \u2713 Already up to date (v${e})
249
249
  `),process.exit(0)),await t.runUpdate(n.version),process.exit(0);})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
250
- `),process.exit(1);});else if(H==="otel-headers"){let{runOtelHeaders:t}=(fr(),N(pr));t().then(e=>process.exit(e)).catch(()=>process.exit(1));}else ni.has(H)?(zr(),N(ei)):(Zr(),process.exit(0));
250
+ `),process.exit(1);});else if(j==="otel-headers"){let{runOtelHeaders:t}=(fr(),C(pr));t().then(e=>process.exit(e)).catch(()=>process.exit(1));}else ni.has(j)?(zr(),C(ei)):(Zr(),process.exit(0));
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
- 'use strict';var child_process=require('child_process'),util=require('util'),I=require('fs'),x=require('path'),me=require('os'),Je=require('https'),Ke=require('http'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var I__default=/*#__PURE__*/_interopDefault(I);var x__default=/*#__PURE__*/_interopDefault(x);var me__default=/*#__PURE__*/_interopDefault(me);var Je__default=/*#__PURE__*/_interopDefault(Je);var Ke__default=/*#__PURE__*/_interopDefault(Ke);var Pe=Object.defineProperty;var st=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var gt=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var St=(t,e)=>{for(var r in e)Pe(t,r,{get:e[r],enumerable:true});};var xt={};St(xt,{MacOsKeyVaultProvider:()=>At});var yt,At,Mt=gt(()=>{"use strict";yt=util.promisify(child_process.execFile),At=class{static async isAvailable(){try{return I.accessSync("/usr/bin/security",I.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await yt("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await yt("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await yt("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Ht={};St(Ht,{LinuxKeyVaultProvider:()=>Ot});var Vt,Ot,Wt=gt(()=>{"use strict";Vt=util.promisify(child_process.execFile),Ot=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of e)try{return I.accessSync(r,I.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await Vt("secret-tool",["lookup","service",e,"account",r]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await new Promise((o,s)=>{let i=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",r]);i.on("error",s),i.on("close",l=>{l===0?o():s(new Error(`secret-tool exited with code ${l}`));}),i.stdin.write(n),i.stdin.end();});}async deleteSecret(e,r){try{return await Vt("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Yt={};St(Yt,{WindowsKeyVaultProvider:()=>wt});var wt,Gt=gt(()=>{"use strict";wt=class{static async isAvailable(){try{return await st("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return st("keytar").getPassword(e,r)}async setSecret(e,r,n){await st("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return st("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});var Ne="https://flow.ciandt.com";function B(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Ne}function G(){let t=B();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}G();var ot={SERVICE:"flow-plugins-cli",ACCOUNT_TOKEN:"token-cache"},it="FLOW-nodejs",at="config.json",_t={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};var S={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var A={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},Dt="flow-ai-obs-debug.log",w={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4};function Tt(){let t=B();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Et={credentials:"credentials","token-cache":"tokenCache"};function J(){let t=me__default.default.homedir();if(process.platform==="darwin")return x__default.default.join(t,"Library","Preferences",it,at);if(process.platform==="win32"){let r=process.env.APPDATA??x__default.default.join(t,"AppData","Roaming");return x__default.default.join(r,it,at)}let e=process.env.XDG_CONFIG_HOME??x__default.default.join(t,".config");return x__default.default.join(e,it,at)}function ht(){try{let t=I__default.default.readFileSync(J(),"utf8");return JSON.parse(t)}catch{return {}}}function Bt(t){let e=J();I__default.default.mkdirSync(x__default.default.dirname(e),{recursive:true}),I__default.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var j=class{static isAvailable(){return true}static hasExistingData(){try{if(!I__default.default.existsSync(J()))return !1;let e=JSON.parse(I__default.default.readFileSync(J(),"utf8"));return !!(e&&e.credentials)}catch{return false}}async getSecret(e,r){let n=ht(),o=Et[r]??r,s=n[o];return s?typeof s=="string"?s:JSON.stringify(s):null}async setSecret(e,r,n){let o=ht(),s=Et[r]??r;if(r==="token-cache")try{o[s]=JSON.parse(n);}catch{o[s]=n;}else o[s]=n;Bt(o);}async deleteSecret(e,r){let n=ht(),o=Et[r]??r;return o in n?(delete n[o],Bt(n),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${J()}`}};async function Jt(){return process.env[S.FLOW_OBS_USE_JSON_VAULT]==="1"?new j:await Ve()??new j}async function Ve(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Mt(),xt));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Wt(),Ht));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Gt(),Yt));return await t.isAvailable()?new t:null}default:return null}}var Kt=ot.SERVICE,jt=ot.ACCOUNT_TOKEN,kt=null;function qt(){return kt||(kt=Jt()),kt}async function Lt(t){await(await qt()).setSecret(Kt,jt,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function It(){let e=await(await qt()).getSecret(Kt,jt);if(!e)return null;try{let r=JSON.parse(e);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function Rt(){let t=await It();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}var Ge=x.join(me.tmpdir(),Dt);function a(...t){if(process.env[S.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
2
- `;try{I.writeFileSync(Ge,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
3
- `);}}var b=class extends Error{constructor(e){super(e),this.name="AuthError";}},je=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;function qe(t){if(!je.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var zt={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};function ze(t,e){let r=e.length>400?e.slice(0,400)+"\u2026":e;a("toAuthError",`status=${t} body=${r}`);try{let n=JSON.parse(e);if(typeof n.error=="string"&&(a("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),zt[n.error]))return new b(zt[n.error])}catch{}return t===401||t===403||t===500?new b("Invalid credentials"):t>=400&&t<500?new b("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function q(t){return new Promise((e,r)=>{try{qe(t.tenant);}catch(p){return r(p)}let n=JSON.stringify({clientSecret:t.clientSecret}),o=new URL(G().AUTH_ENGINE),s=o.protocol==="https:",i={hostname:o.hostname,port:o.port||(s?443:80),path:o.pathname+o.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),FlowTenant:t.tenant}};a("getToken",`requesting token tenant=${t.tenant} host=${i.hostname} path=${i.path}`);let c=(s?Je__default.default:Ke__default.default).request(i,p=>{let _=[];p.on("data",T=>_.push(T)),p.on("end",()=>{let T=_.join("");if((p.statusCode??0)>=400)return r(ze(p.statusCode??0,T));let m;try{m=JSON.parse(T);}catch{return r(new Error("Invalid response from auth engine"))}let g=m.expires_at??new Date(Date.now()+(m.expires_in??3600)*1e3).toISOString();if(!m.access_token)return r(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));e({accessToken:m.access_token,expiresAt:g});});});c.on("error",p=>r(new Error(`Network error: ${p.message}`))),c.write(n),c.end();})}var Xe=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];function Ze(t){return Xe.some(e=>e.test(t))}function Qe(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function lt(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:o,tenant:s}=r;return !n||!o||!s?null:{clientId:n,clientSecret:o,tenant:s}}catch{return null}}function ct(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[S.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&Ze(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Xt(){let t=lt(process.env[S.ANTHROPIC_AUTH_TOKEN]);return t?{user:await Rt().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function tr(){return new Date().toISOString().slice(0,10)}async function er(t){let e=tr(),r=await It();if(r?.lastAuthCheckAt!==e){a("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let s=await q(t);try{await Lt({...s,lastAuthCheckAt:e});}catch{}return a("getOrRefreshToken",`daily check passed, expires=${s.expiresAt}`),s.accessToken}catch(s){if(s instanceof b)throw s;a("getOrRefreshToken",`daily check network error \u2014 using cache: ${s.message}`);}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(a("getOrRefreshToken",`cacheValid=${n}`),n)return a("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;a("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let o=await q(t);try{await Lt({...o,lastAuthCheckAt:e});}catch(s){a("getOrRefreshToken",`token cache save failed (non-fatal): ${s.message}`);}return a("getOrRefreshToken",`token refreshed, expires=${o.expiresAt}`),o.accessToken}function rr(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function nr(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function v(){let t=[],e=process.env[S.ANTHROPIC_MODEL]??"",r=lt(process.env[S.ANTHROPIC_AUTH_TOKEN]);a("resolveCredentials",r?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),r&&a("resolveCredentials",`clientId=${r.clientId}`,`tenant=${r.tenant}`);let n=r?r.tenant:"",o=process.env[S.FLOW_TELEMETRY]==="true",s=process.env[S.LANGFUSE_BASE_URL],i=process.env[S.LANGFUSE_PUBLIC_KEY],l=process.env[S.LANGFUSE_SECRET_KEY];if(o&&s&&i&&l){let m="",g=n;r&&(m=await Rt().catch(()=>null)??r.clientId);let E={user:m??"",tenant:g??"",team:"",project:"",model:e};t.push({mode:"direct",...nr(ct(s),i,l),...E}),a("resolveCredentials","direct mode active",`user=${E.user}`,`tenant=${E.tenant}`);}if(!r){if(t.length===0){let m=[];return m.authError=false,m}return t}let c;try{c=await er(r);}catch(m){if(a("resolveCredentials",`token refresh failed: ${m.message}`,`(tenant=${r.tenant} clientId=${r.clientId})`),t.length>0)return t.authError=true,t;let g=[];return g.authError=true,g}let _={user:Qe(c)??r.clientId,tenant:n,team:"",project:"",model:e},T=process.env[S.FLOW_TELEMETRY_GATEWAY]??B();return t.push({mode:"gateway",...rr(ct(T),{accessToken:c}),..._}),t}async function ut(){return (await v()).length>0}function k(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function pt(t,e=100){return String(t??"").split(`
4
- `)[0].slice(0,e).trim()}function z(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function O(t){process.stdout.write(JSON.stringify(t));}var Pt=()=>crypto.randomBytes(16).toString("hex"),U=()=>crypto.randomBytes(8).toString("hex");function L(){return String(BigInt(Date.now())*1000000n)}var dr=/^[0-9a-f-]{1,64}$/i,fr=x.normalize(me.tmpdir())+x.sep;function mr(t,e){let r=x.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function Nt(t){if(!dr.test(t))throw new Error(`Invalid session ID: ${t}`);return mr(x.join(me.tmpdir(),`flow-obs-${t}.json`),fr)}function M(t){let e=Nt(t);if(!I.existsSync(e))return null;try{return JSON.parse(I.readFileSync(e,"utf8"))}catch{return null}}function V(t,e){I.writeFileSync(Nt(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function bt(t){try{I.unlinkSync(Nt(t));}catch{}}function re(t){if(!t||!I.existsSync(t))return null;try{let e=I.readFileSync(t,"utf8").trimEnd().split(`
5
- `);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function vt(t){if(!t||!I.existsSync(t))return null;try{let e=I.readFileSync(t,"utf8").trimEnd().split(`
6
- `),r=[],n=0,o=0;for(let s=e.length-1;s>=0;s--)try{let i=JSON.parse(e[s]);if(i.type==="user")break;if(i.type==="assistant"){let c=(i.message?.content??[]).filter(_=>_.type==="text").map(_=>_.text??"").join("");c&&r.unshift(c);let p=i.message?.usage??{};n+=(p.input_tokens??0)+(p.cache_read_input_tokens??0)+(p.cache_creation_input_tokens??0),o+=p.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
1
+ 'use strict';var child_process=require('child_process'),util=require('util'),R=require('fs'),M=require('path'),me=require('os'),Je=require('https'),Ke=require('http'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var R__default=/*#__PURE__*/_interopDefault(R);var M__default=/*#__PURE__*/_interopDefault(M);var me__default=/*#__PURE__*/_interopDefault(me);var Je__default=/*#__PURE__*/_interopDefault(Je);var Ke__default=/*#__PURE__*/_interopDefault(Ke);var Pe=Object.defineProperty;var ot=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var gt=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var _t=(t,e)=>{for(var r in e)Pe(t,r,{get:e[r],enumerable:true});};var xt={};_t(xt,{MacOsKeyVaultProvider:()=>yt});var At,yt,Bt=gt(()=>{"use strict";At=util.promisify(child_process.execFile),yt=class{static async isAvailable(){try{return R.accessSync("/usr/bin/security",R.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await At("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await At("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await At("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Ht={};_t(Ht,{LinuxKeyVaultProvider:()=>Ot});var Yt,Ot,Vt=gt(()=>{"use strict";Yt=util.promisify(child_process.execFile),Ot=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of e)try{return R.accessSync(r,R.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await Yt("secret-tool",["lookup","service",e,"account",r]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await new Promise((i,s)=>{let o=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",r]);o.on("error",s),o.on("close",c=>{c===0?i():s(new Error(`secret-tool exited with code ${c}`));}),o.stdin.write(n),o.stdin.end();});}async deleteSecret(e,r){try{return await Yt("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Gt={};_t(Gt,{WindowsKeyVaultProvider:()=>kt});var kt,Wt=gt(()=>{"use strict";kt=class{static async isAvailable(){try{return await ot("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return ot("keytar").getPassword(e,r)}async setSecret(e,r,n){await ot("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return ot("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});var Ne="https://flow.ciandt.com";function D(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Ne}function W(){let t=D();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}W();var it={SERVICE:"flow-plugins-cli",ACCOUNT_TOKEN:"token-cache"},at="FLOW-nodejs",ct="config.json",Tt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};var _={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var J={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3};var O={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},Dt="flow-ai-obs-debug.log",k={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4};function St(){let t=D();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Et={credentials:"credentials","token-cache":"tokenCache"};function K(){let t=me__default.default.homedir();if(process.platform==="darwin")return M__default.default.join(t,"Library","Preferences",at,ct);if(process.platform==="win32"){let r=process.env.APPDATA??M__default.default.join(t,"AppData","Roaming");return M__default.default.join(r,at,ct)}let e=process.env.XDG_CONFIG_HOME??M__default.default.join(t,".config");return M__default.default.join(e,at,ct)}function ht(){try{let t=R__default.default.readFileSync(K(),"utf8");return JSON.parse(t)}catch{return {}}}function Mt(t){let e=K();R__default.default.mkdirSync(M__default.default.dirname(e),{recursive:true}),R__default.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var q=class{static isAvailable(){return true}static hasExistingData(){try{if(!R__default.default.existsSync(K()))return !1;let e=JSON.parse(R__default.default.readFileSync(K(),"utf8"));return !!(e&&e.credentials)}catch{return false}}async getSecret(e,r){let n=ht(),i=Et[r]??r,s=n[i];return s?typeof s=="string"?s:JSON.stringify(s):null}async setSecret(e,r,n){let i=ht(),s=Et[r]??r;if(r==="token-cache")try{i[s]=JSON.parse(n);}catch{i[s]=n;}else i[s]=n;Mt(i);}async deleteSecret(e,r){let n=ht(),i=Et[r]??r;return i in n?(delete n[i],Mt(n),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${K()}`}};async function Jt(){return process.env[_.FLOW_OBS_USE_JSON_VAULT]==="1"?new q:await Ye()??new q}async function Ye(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Bt(),xt));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Vt(),Ht));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Wt(),Gt));return await t.isAvailable()?new t:null}default:return null}}var Kt=it.SERVICE,jt=it.ACCOUNT_TOKEN,wt=null;function qt(){return wt||(wt=Jt()),wt}async function Lt(t){await(await qt()).setSecret(Kt,jt,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function Rt(){let e=await(await qt()).getSecret(Kt,jt);if(!e)return null;try{let r=JSON.parse(e);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function It(){let t=await Rt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}var We=M.join(me.tmpdir(),Dt);function a(...t){if(process.env[_.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
2
+ `;try{R.writeFileSync(We,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
3
+ `);}}var b=class extends Error{statusCode;constructor(e,r=0){super(e),this.name="AuthError",this.statusCode=r;}},je=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;function qe(t){if(!je.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var Xt={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 Xe(t,e){let r=e.length>400?e.slice(0,400)+"\u2026":e;a("toAuthError",`status=${t} body=${r}`);try{let n=JSON.parse(e);if(typeof n.error=="string"&&(a("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),Xt[n.error]))return new b(Xt[n.error],t)}catch{}return t===401||t===403||t===500?new b("Invalid credentials",t):t>=400&&t<500?new b("Authentication request was rejected",t):new Error("Authentication service unavailable, please try again later")}function X(t){return new Promise((e,r)=>{try{qe(t.tenant);}catch(p){return r(p)}let n=JSON.stringify({clientSecret:t.clientSecret}),i=new URL(W().AUTH_ENGINE),s=i.protocol==="https:",o={hostname:i.hostname,port:i.port||(s?443:80),path:i.pathname+i.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),FlowTenant:t.tenant}};a("getToken",`requesting token tenant=${t.tenant} host=${o.hostname} path=${o.path}`);let l=(s?Je__default.default:Ke__default.default).request(o,p=>{let T=[];p.on("data",S=>T.push(S)),p.on("end",()=>{let S=T.join("");if((p.statusCode??0)>=400)return r(Xe(p.statusCode??0,S));let m;try{m=JSON.parse(S);}catch{return r(new Error("Invalid response from auth engine"))}let g=m.expires_at??new Date(Date.now()+(m.expires_in??3600)*1e3).toISOString();if(!m.access_token)return r(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));e({accessToken:m.access_token,expiresAt:g});});});l.on("error",p=>r(new Error(`Network error: ${p.message}`))),l.setTimeout(J.REQUEST_TIMEOUT_MS,()=>{l.destroy(new Error("Request timeout"));}),l.write(n),l.end();})}var ze=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];function Ze(t){return ze.some(e=>e.test(t))}function Qe(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function ut(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:i,tenant:s}=r;return !n||!i||!s?null:{clientId:n,clientSecret:i,tenant:s}}catch{return null}}function lt(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[_.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&Ze(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function zt(){let t=ut(process.env[_.ANTHROPIC_AUTH_TOKEN]);return t?{user:await It().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function tr(){return new Date().toISOString().slice(0,10)}async function er(t){let e=tr(),r=await Rt();if(r?.lastAuthCheckAt!==e){a("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);let s=J.MAX_RETRY_ATTEMPTS;for(let o=1;o<=s;o++)try{let c=await X(t);try{await Lt({...c,lastAuthCheckAt:e});}catch(l){a("getOrRefreshToken",`saveTokenCache failed (non-fatal): ${l.message}`);}return a("getOrRefreshToken",`daily check passed (attempt ${o}), expires=${c.expiresAt}`),c.accessToken}catch(c){if(c instanceof b){if(c.statusCode!==500)throw a("getOrRefreshToken",`daily check auth error (${c.statusCode}) \u2014 propagating immediately`),c;if(o<s){a("getOrRefreshToken",`daily check 500 error (attempt ${o}/${s}) \u2014 retrying in 1s`),await new Promise(l=>setTimeout(l,J.RETRY_DELAY_MS));continue}throw a("getOrRefreshToken",`daily check failed after ${s} attempts \u2014 propagating`),c}a("getOrRefreshToken",`daily check network error \u2014 using cache: ${c.message}`);break}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(a("getOrRefreshToken",`cacheValid=${n}`),n)return a("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;a("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let i=await X(t);try{await Lt({...i,lastAuthCheckAt:e});}catch(s){a("getOrRefreshToken",`token cache save failed (non-fatal): ${s.message}`);}return a("getOrRefreshToken",`token refreshed, expires=${i.expiresAt}`),i.accessToken}function rr(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function nr(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function x(){let t=[],e=process.env[_.ANTHROPIC_MODEL]??"",r=ut(process.env[_.ANTHROPIC_AUTH_TOKEN]);a("resolveCredentials",r?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),r&&a("resolveCredentials",`clientId=${r.clientId}`,`tenant=${r.tenant}`);let n=r?r.tenant:"",i=process.env[_.FLOW_TELEMETRY]==="true",s=process.env[_.LANGFUSE_BASE_URL],o=process.env[_.LANGFUSE_PUBLIC_KEY],c=process.env[_.LANGFUSE_SECRET_KEY];if(i&&s&&o&&c){let m="",g=n;r&&(m=await It().catch(()=>null)??r.clientId);let E={user:m??"",tenant:g??"",team:"",project:"",model:e};t.push({mode:"direct",...nr(lt(s),o,c),...E}),a("resolveCredentials","direct mode active",`user=${E.user}`,`tenant=${E.tenant}`);}if(!r){if(t.length===0){let m=[];return m.authError=false,m}return t}let l;try{l=await er(r);}catch(m){if(a("resolveCredentials",`token refresh failed: ${m.message}`,`(tenant=${r.tenant} clientId=${r.clientId})`),t.length>0)return t.authError=true,t;let g=[];return g.authError=true,g}let T={user:Qe(l)??r.clientId,tenant:n,team:"",project:"",model:e},S=process.env[_.FLOW_TELEMETRY_GATEWAY]??D();return t.push({mode:"gateway",...rr(lt(S),{accessToken:l}),...T}),t}function w(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function pt(t,e=100){return String(t??"").split(`
4
+ `)[0].slice(0,e).trim()}function z(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function A(t){process.stdout.write(JSON.stringify(t));}var Pt=()=>crypto.randomBytes(16).toString("hex"),U=()=>crypto.randomBytes(8).toString("hex");function L(){return String(BigInt(Date.now())*1000000n)}var dr=/^[0-9a-f-]{1,64}$/i,fr=M.normalize(me.tmpdir())+M.sep;function mr(t,e){let r=M.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function Nt(t){if(!dr.test(t))throw new Error(`Invalid session ID: ${t}`);return mr(M.join(me.tmpdir(),`flow-obs-${t}.json`),fr)}function B(t){let e;try{e=Nt(t);}catch{return null}if(!R.existsSync(e))return null;try{return JSON.parse(R.readFileSync(e,"utf8"))}catch{return null}}function Y(t,e){R.writeFileSync(Nt(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function bt(t){try{R.unlinkSync(Nt(t));}catch{}}function re(t){if(!t||!R.existsSync(t))return null;try{let e=R.readFileSync(t,"utf8").trimEnd().split(`
5
+ `);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function Ut(t){if(!t||!R.existsSync(t))return null;try{let e=R.readFileSync(t,"utf8").trimEnd().split(`
6
+ `),r=[],n=0,i=0;for(let s=e.length-1;s>=0;s--)try{let o=JSON.parse(e[s]);if(o.type==="user")break;if(o.type==="assistant"){let l=(o.message?.content??[]).filter(T=>T.type==="text").map(T=>T.text??"").join("");l&&r.unshift(l);let p=o.message?.usage??{};n+=(p.input_tokens??0)+(p.cache_read_input_tokens??0)+(p.cache_creation_input_tokens??0),i+=p.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
7
7
 
8
- `),inputTokens:n,outputTokens:o}}catch{}return null}var Tr=new Set([".venv","__pycache__",".git","node_modules"]),Er=new Set([".pyc",".pyo"]),hr=new Set(["SKILL.md",".DS_Store",".gitignore"]);function oe(t){return t.replace(":","/")}function dt(t,e){if(!t)return null;let r=oe(t),n=[x.join(me.homedir(),".claude","skills",r,"SKILL.md"),x.join(e??"",".claude","skills",r,"SKILL.md")];for(let o of n)if(I.existsSync(o))try{return I.readFileSync(o,"utf8")}catch{}return null}function ie(t){return t.split(`
9
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}var yr=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);function ae(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||yr.has(n.tool))?"complete":"prerequisite_required":null}function ft(t,e){if(!t)return null;let r=oe(t),n=[x.join(me.homedir(),".claude","skills",r),x.join(e??"",".claude","skills",r)],o=null;for(let l of n)if(I.existsSync(x.join(l,"SKILL.md"))){o=l;break}if(!o)return null;let s=[];function i(l,c){for(let p of I.readdirSync(l,{withFileTypes:true})){if(Tr.has(p.name)||hr.has(p.name)||Er.has(x.extname(p.name)))continue;let _=c?`${c}/${p.name}`:p.name;p.isDirectory()?i(x.join(l,p.name),_):s.push(_);}}return i(o,""),s.length>0?s:null}function wr(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function kr(t,e,r,n){return new Promise(o=>{let s=new URL(t),i=s.protocol==="https:",l=(i?Je__default.default:Ke__default.default).request({hostname:s.hostname,port:s.port||(i?443:80),path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),Authorization:`Bearer ${String(r).replace(/[\r\n]/g,"")}`,FlowTenant:String(n).replace(/[\r\n]/g,"")}},c=>{c.resume(),o(c.statusCode??0);});l.on("error",()=>o(0)),l.setTimeout(5e3,()=>{l.destroy(),o(0);}),l.write(e),l.end();})}async function C(t,e={}){try{let r=lt(process.env[S.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,o=new Promise((T,m)=>{n=setTimeout(()=>m(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:s}=await Promise.race([q(r),o]);clearTimeout(n);let i=wr(s);if(!i)return;let l=i.tenant||r.tenant,c=JSON.stringify({action:t,booster:Tt().BOOSTER,metadata:e,success:!0,tenant:l,timestamp:new Date().toISOString(),os:process.platform,user:{email:i.email||"",id:i.sub||"",name:i.name||i.email||""}}),p=ct(Tt().API_URL),_=await kr(p,c,s,l);a("metrics.logEvent",`action=${t} status=${_}`);}catch(r){a("metrics.logEvent",`silenced error: ${r.message}`);}}var Lr=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${B()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;async function Ut(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Lr})+`
10
- `);return}let n=!!(await v()).authError,o=t.session_id||"unknown",s=t.prompt||"",i=t.cwd||"",l=re(t.transcript_path)||Pt(),c=ie(s),p=c?dt(c,i):null,_=c?ft(c,i):null;V(o,{traceId:Pt(),spanId:U(),startNs:L(),sessionId:o,prompt:s,cwd:i,traceName:l,transcriptPath:t.transcript_path||"",model:process.env[S.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:p,skillArtifacts:_}),C("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),a("UserPromptSubmit",`sid=${o}`,`traceName=${l}`,`slashSkill=${c}`),O(t);}async function ce(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},o=M(e);o&&(o.pendingTool={name:r,inputStr:k(n,w.TOOL_INPUT),startNs:L()},V(e,o)),a("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!o}`),O(t);}var Ir={name:_t.SCOPE_NAME,version:_t.SCOPE_VERSION},f={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};function u(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function $(...t){return t.filter(e=>e!==null)}function le(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Ir,spans:Array.isArray(e)?e:[e]}]}]}}var ue=x.join(me.tmpdir(),"flow-obs-requests.ndjson");function pe(t,e,r,n,o){if(process.env[S.FLOW_OBS_DEBUG]!=="1")return;let s=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:o}});try{I.writeFileSync(ue,s+`
11
- `,{flag:"a",encoding:"utf8",mode:384}),a("sendTraces:dump",`request appendada em ${ue}`);}catch(i){a("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Ur(t){let e=new URL(t),r=new URL(G().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function de(t,e){return new Promise((r,n)=>{let o=t._isSSL?Je__default.default:Ke__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let s=o.request(t,i=>{let l=[];i.on("data",c=>l.push(c)),i.on("end",()=>r({statusCode:i.statusCode??0,body:l.join("")}));});s.setTimeout(1e4,()=>{s.destroy(new Error("Request timeout"));}),s.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&s.write(e),s.end();})}async function fe(t,e){let r;try{r=Ur(t);}catch{return false}let n=r.protocol==="https:";try{let o={};e&&(o.Authorization=String(e).replace(/[\r\n]/g,""));let s=await de({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:o,_isSSL:n},null);return a("checkHealth",`url=${r.href} status=${s.statusCode}`),s.statusCode>=200&&s.statusCode<300}catch{return false}}async function mt(t,e,r){let n=JSON.stringify(t),o=new URL(e),s=o.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),l={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};a("sendTraces:request",`POST ${e}`),a("sendTraces:request",`headers=${JSON.stringify({...l,Authorization:i.slice(0,20)+"\u2026"})}`),a("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let c=await de({hostname:o.hostname,port:o.port||(s?443:80),path:o.pathname,method:"POST",headers:l,_isSSL:s},n);return a("sendTraces:response",`status=${c.statusCode}`),pe(e,l,n,c.statusCode,c.body),c.statusCode}catch(c){return a("sendTraces:error",c.message),pe(e,l,n,0,c.message),0}}function Cr(){let t=parseInt(process.env[S.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(A.MIN_TTL_DAYS,Math.min(A.MAX_TTL_DAYS,t)):A.DEFAULT_TTL_DAYS)*24*60*60*1e3}function $r(){let t=parseInt(process.env[S.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(A.MIN_MAX_FILES,Math.min(A.MAX_MAX_FILES,t)):A.DEFAULT_MAX_FILES}function ge(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return x__default.default.join(me__default.default.tmpdir(),`${A.FILE_PREFIX}${t}.json`)}function $t(){let t=me__default.default.tmpdir(),e;try{e=I__default.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(A.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=x__default.default.join(t,r),o=0;try{o=I__default.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:o}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function X(t){try{let e=$r(),r=$t();if(r.length>=e){let s=r.slice(0,r.length-e+1);for(let i of s)try{I__default.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,o={fileId:n,bufferedAt:Date.now(),payload:t};return I__default.default.writeFileSync(ge(n),JSON.stringify(o),{encoding:"utf8",mode:384}),a("buffer",`saved fileId=${n}`),n}catch(e){return a("buffer",`saveToBuffer failed: ${e.message}`),null}}function Se(t){let e=$t(),r=t,n=[];for(let o of e){if(n.length>=r)break;try{let s=I__default.default.readFileSync(o,"utf8"),i=JSON.parse(s);i&&i.fileId&&i.payload&&n.push(i);}catch{a("buffer",`skipping malformed file: ${o}`);}}return n}function _e(t){try{I__default.default.unlinkSync(ge(t)),a("buffer",`deleted fileId=${t}`);}catch{}}function Te(){let t=Date.now()-Cr();for(let e of $t())try{let{mtimeMs:r}=I__default.default.statSync(e);r<t&&(I__default.default.unlinkSync(e),a("buffer",`evicted stale: ${x__default.default.basename(e)}`));}catch{}}async function Fr(t){Te();let e=Se(A.REPLAY_BATCH_SIZE);e.length&&(a("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await mt(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(_e(r.fileId),a("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):a("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){a("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function Ee(t){let e=await v();if(!e.length)return e.authError&&(a("postToLangfuse","auth refresh failed \u2014 buffering trace"),X(t)),0;let r=await Promise.all(e.map(async s=>{if(s.mode!=="gateway")return {creds:s,healthy:true};let i=await fe(s.endpoint,s.authHeader);return {creds:s,healthy:i}})),n=r.find(s=>s.creds.mode==="gateway"&&s.healthy)?.creds??r.find(s=>s.creds.mode==="direct")?.creds;return n&&await Fr(n),(await Promise.all(r.map(async({creds:s,healthy:i})=>{if(s.mode==="gateway"){if(!i)return a("postToLangfuse","gateway health check failed \u2014 buffering trace"),X(t),0;let c=await mt(t,s.endpoint,s.authHeader);return (c===0||c>=500)&&(a("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),X(t)),c}let l=await mt(t,s.endpoint,s.authHeader);return (l===0||l>=500)&&(a("postToLangfuse",`direct endpoint unavailable (status ${l}) \u2014 buffering trace`),X(t)),l}))).find(s=>s!==0)??0}var y="[REDACTED]",Dr="[REDACTED-EMAIL]",Br="[REDACTED-CPF]",xr="[REDACTED-CNPJ]",he="[REDACTED-PHONE]",Mr=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${y}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${y}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${y}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${y}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
8
+ `),inputTokens:n,outputTokens:i}}catch{}return null}var Sr=new Set([".venv","__pycache__",".git","node_modules"]),Er=new Set([".pyc",".pyo"]),hr=new Set(["SKILL.md",".DS_Store",".gitignore"]);function oe(t){return t.replace(":","/")}function dt(t,e){if(!t)return null;let r=oe(t),n=[M.join(me.homedir(),".claude","skills",r,"SKILL.md"),M.join(e??"",".claude","skills",r,"SKILL.md")];for(let i of n)if(R.existsSync(i))try{return R.readFileSync(i,"utf8")}catch{}return null}function ie(t){return t.split(`
9
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}var Ar=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);function ae(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Ar.has(n.tool))?"complete":"prerequisite_required":null}function ft(t,e){if(!t)return null;let r=oe(t),n=[M.join(me.homedir(),".claude","skills",r),M.join(e??"",".claude","skills",r)],i=null;for(let c of n)if(R.existsSync(M.join(c,"SKILL.md"))){i=c;break}if(!i)return null;let s=[];function o(c,l){for(let p of R.readdirSync(c,{withFileTypes:true})){if(Sr.has(p.name)||hr.has(p.name)||Er.has(M.extname(p.name)))continue;let T=l?`${l}/${p.name}`:p.name;p.isDirectory()?o(M.join(c,p.name),T):s.push(T);}}return o(i,""),s.length>0?s:null}function kr(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function wr(t,e,r,n){return new Promise(i=>{let s=new URL(t),o=s.protocol==="https:",c=(o?Je__default.default:Ke__default.default).request({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(e),Authorization:`Bearer ${String(r).replace(/[\r\n]/g,"")}`,FlowTenant:String(n).replace(/[\r\n]/g,"")}},l=>{l.resume(),i(l.statusCode??0);});c.on("error",()=>i(0)),c.setTimeout(5e3,()=>{c.destroy(),i(0);}),c.write(e),c.end();})}async function v(t,e={}){try{let r=ut(process.env[_.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,i=new Promise((S,m)=>{n=setTimeout(()=>m(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:s}=await Promise.race([X(r),i]);clearTimeout(n);let o=kr(s);if(!o)return;let c=o.tenant||r.tenant,l=JSON.stringify({action:t,booster:St().BOOSTER,metadata:e,success:!0,tenant:c,timestamp:new Date().toISOString(),os:process.platform,user:{email:o.email||"",id:o.sub||"",name:o.name||o.email||""}}),p=lt(St().API_URL),T=await wr(p,l,s,c);a("metrics.logEvent",`action=${t} status=${T}`);}catch(r){a("metrics.logEvent",`silenced error: ${r.message}`);}}var Lr=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${D()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;async function vt(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Lr})+`
10
+ `);return}let n=!!(await x()).authError,i=t.session_id||"unknown",s=t.prompt||"",o=t.cwd||"",c=re(t.transcript_path)||Pt(),l=ie(s),p=l?dt(l,o):null,T=l?ft(l,o):null;Y(i,{traceId:Pt(),spanId:U(),startNs:L(),sessionId:i,prompt:s,cwd:o,traceName:c,transcriptPath:t.transcript_path||"",model:process.env[_.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:l,skillContent:p,skillArtifacts:T}),v("SESSION_STARTED",{traceType:l?"skill":"prompt",slashSkill:l,clientIdExpired:n}),a("UserPromptSubmit",`sid=${i}`,`traceName=${c}`,`slashSkill=${l}`),A(t);}async function ce(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},i=B(e);i&&(i.pendingTool={name:r,inputStr:w(n,k.TOOL_INPUT),startNs:L()},Y(e,i)),a("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!i}`),A(t);}var Rr={name:Tt.SCOPE_NAME,version:Tt.SCOPE_VERSION},f={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};function u(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function C(...t){return t.filter(e=>e!==null)}function le(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Rr,spans:Array.isArray(e)?e:[e]}]}]}}var ue=M.join(me.tmpdir(),"flow-obs-requests.ndjson");function pe(t,e,r,n,i){if(process.env[_.FLOW_OBS_DEBUG]!=="1")return;let s=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:i}});try{R.writeFileSync(ue,s+`
11
+ `,{flag:"a",encoding:"utf8",mode:384}),a("sendTraces:dump",`request appendada em ${ue}`);}catch(o){a("sendTraces:dump",`falha ao salvar: ${o.message}`);}}function vr(t){let e=new URL(t),r=new URL(W().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function de(t,e){return new Promise((r,n)=>{let i=t._isSSL?Je__default.default:Ke__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let s=i.request(t,o=>{let c=[];o.on("data",l=>c.push(l)),o.on("end",()=>r({statusCode:o.statusCode??0,body:c.join("")}));});s.setTimeout(1e4,()=>{s.destroy(new Error("Request timeout"));}),s.on("error",o=>n(new Error(`Network error: ${o.message}`))),e&&s.write(e),s.end();})}async function fe(t,e){let r;try{r=vr(t);}catch{return false}let n=r.protocol==="https:";try{let i={};e&&(i.Authorization=String(e).replace(/[\r\n]/g,""));let s=await de({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:i,_isSSL:n},null);return a("checkHealth",`url=${r.href} status=${s.statusCode}`),s.statusCode>=200&&s.statusCode<300}catch{return false}}async function mt(t,e,r){let n=JSON.stringify(t),i=new URL(e),s=i.protocol==="https:",o=String(r).replace(/[\r\n]/g,""),c={"Content-Type":"application/json",Authorization:o,"Content-Length":Buffer.byteLength(n)};a("sendTraces:request",`POST ${e}`),a("sendTraces:request",`headers=${JSON.stringify({...c,Authorization:o.slice(0,20)+"\u2026"})}`),a("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let l=await de({hostname:i.hostname,port:i.port||(s?443:80),path:i.pathname,method:"POST",headers:c,_isSSL:s},n);return a("sendTraces:response",`status=${l.statusCode}`),pe(e,c,n,l.statusCode,l.body),l.statusCode}catch(l){return a("sendTraces:error",l.message),pe(e,c,n,0,l.message),0}}function Cr(){let t=parseInt(process.env[_.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(O.MIN_TTL_DAYS,Math.min(O.MAX_TTL_DAYS,t)):O.DEFAULT_TTL_DAYS)*24*60*60*1e3}function $r(){let t=parseInt(process.env[_.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(O.MIN_MAX_FILES,Math.min(O.MAX_MAX_FILES,t)):O.DEFAULT_MAX_FILES}function ge(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return M__default.default.join(me__default.default.tmpdir(),`${O.FILE_PREFIX}${t}.json`)}function $t(){let t=me__default.default.tmpdir(),e;try{e=R__default.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(O.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=M__default.default.join(t,r),i=0;try{i=R__default.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:i}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function Z(t){try{let e=$r(),r=$t();if(r.length>=e){let s=r.slice(0,r.length-e+1);for(let o of s)try{R__default.default.unlinkSync(o);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,i={fileId:n,bufferedAt:Date.now(),payload:t};return R__default.default.writeFileSync(ge(n),JSON.stringify(i),{encoding:"utf8",mode:384}),a("buffer",`saved fileId=${n}`),n}catch(e){return a("buffer",`saveToBuffer failed: ${e.message}`),null}}function _e(t){let e=$t(),r=t,n=[];for(let i of e){if(n.length>=r)break;try{let s=R__default.default.readFileSync(i,"utf8"),o=JSON.parse(s);o&&o.fileId&&o.payload&&n.push(o);}catch{a("buffer",`skipping malformed file: ${i}`);}}return n}function Te(t){try{R__default.default.unlinkSync(ge(t)),a("buffer",`deleted fileId=${t}`);}catch{}}function Se(){let t=Date.now()-Cr();for(let e of $t())try{let{mtimeMs:r}=R__default.default.statSync(e);r<t&&(R__default.default.unlinkSync(e),a("buffer",`evicted stale: ${M__default.default.basename(e)}`));}catch{}}async function Fr(t){Se();let e=_e(O.REPLAY_BATCH_SIZE);e.length&&(a("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await mt(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(Te(r.fileId),a("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):a("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){a("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function Ee(t){let e=await x();if(!e.length)return e.authError&&(a("postToLangfuse","auth refresh failed \u2014 buffering trace"),Z(t)),0;let r=await Promise.all(e.map(async s=>{if(s.mode!=="gateway")return {creds:s,healthy:true};let o=await fe(s.endpoint,s.authHeader);return {creds:s,healthy:o}})),n=r.find(s=>s.creds.mode==="gateway"&&s.healthy)?.creds??r.find(s=>s.creds.mode==="direct")?.creds;return n&&await Fr(n),(await Promise.all(r.map(async({creds:s,healthy:o})=>{if(s.mode==="gateway"){if(!o)return a("postToLangfuse","gateway health check failed \u2014 buffering trace"),Z(t),0;let l=await mt(t,s.endpoint,s.authHeader);return (l===0||l>=500)&&(a("postToLangfuse",`gateway send failed (status ${l}) \u2014 buffering trace`),Z(t)),l}let c=await mt(t,s.endpoint,s.authHeader);return (c===0||c>=500)&&(a("postToLangfuse",`direct endpoint unavailable (status ${c}) \u2014 buffering trace`),Z(t)),c}))).find(s=>s!==0)??0}var y="[REDACTED]",Dr="[REDACTED-EMAIL]",Mr="[REDACTED-CPF]",xr="[REDACTED-CNPJ]",he="[REDACTED-PHONE]",Br=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${y}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${y}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${y}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${y}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
12
12
  ${y}
13
- ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${y}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${y}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${y}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${y}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${y}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${y}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${y}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>Dr},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Br},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>xr},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>he},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>he}];function R(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Mr.reduce((r,{re:n,replace:o})=>r.replace(n,o),e)}async function ye(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},o=t.tool_response,s=o!==null&&typeof o=="object"?o.output??JSON.stringify(o):o??"",i=M(e);if(!i){O(t);return}let l=L(),c=i.pendingTool,p=c?.name===r,_=p?c.startNs:String(BigInt(l)-200000000n),T=p?c.inputStr:k(n,w.TOOL_INPUT),m=T,g=null;if(r==="Skill"){let nt=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);g=nt?String(nt).trim():null;let P=g?dt(g,i.cwd):null;P&&(m=P,i.skillContent||(i.skillContent=P),i.skillArtifacts||(i.skillArtifacts=ft(g,i.cwd))),g&&!i.slashSkill&&(i.slashSkill=g),a("PostToolUse","Skill tool detected",`skillName=${g}`,`contentFound=${!!P}`);}let E=R(k(s,w.TOOL_OUTPUT)),h=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(E.slice(0,500)),Z=h?"ERROR":"DEFAULT",W=U(),Q=Math.round(Number(BigInt(l)-BigInt(_))/1e6),et={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",rt=r==="Skill"&&g?g:pt(T,60);i.toolCalls.push({tool:r,brief:rt,error:h,durationMs:Q});let Y=i.spans;Y.push({traceId:i.traceId,spanId:W,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:_,endTimeUnixNano:l,attributes:$(u(f.OBS_NAME,r),u(f.OBS_TYPE,et),u(f.OBS_LEVEL,Z),u(f.OBS_INPUT,R(m)),u(f.OBS_OUTPUT,E),u("tool.name",r),u("tool.error",String(h)),r==="Skill"&&g?u("skill.name",g):null,r==="Skill"?u("skill.invocation","slash-command"):null),status:{code:h?2:1}}),i.pendingTool=null,V(e,i),h&&C("TOOL_ERROR",{toolName:r}),a("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${h}`,`durationMs=${Q}`,`totalSpans=${Y.length}`),O(t);}var Ae={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};function Oe(t,e,r){let n=Object.keys(Ae).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let o=Ae[n],s=(e*o.input+r*o.output)/1e6;return Math.round(s*1e6)/1e6}async function we(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=M(e);if(!n){O(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(a("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let o=L(),s=await Xt(),i=n.toolCalls,l=n.spans;if(n.slashSkill&&!i.some(d=>d.tool==="Skill")){let d=U(),N=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});i.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),l.push({traceId:n.traceId,spanId:d,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:$(u(f.OBS_NAME,"Skill"),u(f.OBS_TYPE,"TOOL"),u(f.OBS_LEVEL,"DEFAULT"),u(f.OBS_INPUT,N),u(f.OBS_OUTPUT,"loaded via slash command"),u("tool.name","Skill"),u("tool.error","false"),u("skill.name",n.slashSkill),u("skill.invocation","slash-command")),status:{code:1}}),a("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||n.transcriptPath||"",p=vt(c);if(c&&(i.some(d=>d.tool==="Skill"&&!d.synthetic)||!!n.slashSkill)&&!p?.text){await new Promise(N=>setTimeout(N,500));let d=vt(c);d?.text&&(p=d);}a("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${p?`text=${p.text.length}chars`:"null"}`);let T=i.length,m=i.filter(d=>d.error).length,g=R(p?.text?k(p.text,w.TRACE_OUTPUT):T===0?"No tools used":i.map((d,N)=>`${N+1}. ${d.tool}${d.brief?` \u2192 ${d.brief}`:""}${d.error?" [ERROR]":""}`).join(`
14
- `)),E=p?.inputTokens??0,h=p?.outputTokens??0,Z=i.map((d,N)=>`${N+1}. ${d.tool}${d.brief?` \u2192 ${d.brief}`:""}${d.error?" [ERROR]":""} (${d.durationMs}ms)`),W=!!(n.slashSkill||i.some(d=>d.tool==="Skill")),Q=i.some(d=>d.tool==="Agent");if(!W&&!Q){a("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),C("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),bt(e),O(t);return}let tt=W?"skill":"agent",et=Math.round(Number(BigInt(o)-BigInt(n.startNs))/1e6),rt=Oe(n.model,E,h),D=ae(n);D==="prerequisite_required"&&p?.text&&(D="complete"),D==="prerequisite_required"&&(l.push({traceId:n.traceId,spanId:U(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:o,attributes:$(u(f.OBS_NAME,"prerequisite-check"),u(f.OBS_TYPE,"EVENT"),u(f.OBS_LEVEL,"WARNING"),u(f.OBS_OUTPUT,g),u("skill.name",n.slashSkill||void 0),u("execution_status","prerequisite_required")),status:{code:1}}),a("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let Y=(()=>{if(!(!W||!n.prompt)){if(n.slashSkill){let d=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return d?k(R(d),w.USER_INSTRUCTION):void 0}return k(R(n.prompt),w.USER_INSTRUCTION)||void 0}})(),nt=JSON.stringify({trace_type:tt,...D!==null&&{execution_status:D},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Y!==void 0&&{user_instruction:Y},latency_ms:et,...E&&{tokens_input:E},...h&&{tokens_output:h},cost_usd:rt,...n.model?{model:n.model}:{},toolCount:T,errorCount:m,stopReason:r,sessionId:n.sessionId,tools:Z.length?Z:void 0}),P=R(k(n.prompt,w.TRACE_INPUT)),ke=$(u(f.TRACE_NAME,n.traceName),u(f.TRACE_INPUT,P),u(f.TRACE_OUTPUT,g),u(f.OBS_INPUT,P),u(f.OBS_OUTPUT,g),u(f.TRACE_METADATA,nt),u(f.SESSION_ID,n.sessionId),u(f.USER_ID,s.user),u(f.OBS_TYPE,"GENERATION"),u(f.MODEL,n.model),E?u(f.INPUT_TOKENS,E):null,h?u(f.OUTPUT_TOKENS,h):null,u("claude.stop_reason",r),u("claude.tool_count",String(T)),u("claude.error_count",String(m)),u("claude.session_id",n.sessionId),u("flow.trace_type",tt),{key:f.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:tt}]}}}),Le={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:o,attributes:ke,status:{code:m>0?2:1}},Ie=$(u("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),u("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Ft=[...l,Le];a("Stop",`sid=${e}`,`totalTools=${T}`,`errorTools=${m}`,`spans=${Ft.length}`,`inputTokens=${E}`,`outputTokens=${h}`,`traceOutput="${pt(g,80)}"`);let Re=await Ee(le(Ie,Ft));a("Stop",`POST status=${Re}`,`traceId=${n.traceId}`),C("TRACE_SENT",{latencyMs:et,totalTools:T,errorTools:m,inputTokens:E,outputTokens:h,costUsd:rt}),bt(e),O(t);}var F=class t{static passthroughStdin(){let e=[];process.stdin.on("data",r=>e.push(r)),process.stdin.on("end",()=>process.stdout.write(Buffer.concat(e)));}static async userPromptSubmit(){let e=await z(),r;try{r=await v();}catch{process.stdout.write(JSON.stringify(e));return}r.authError?await Ut(e,true):r.length>0?await Ut(e):process.stdout.write(JSON.stringify(e));}static async preToolUse(){if(!await ut()){t.passthroughStdin();return}let e=await z();await ce(e);}static async postToolUse(){if(!await ut()){t.passthroughStdin();return}let e=await z();await ye(e);}static async stop(){if(!await ut()){t.passthroughStdin();return}let e=await z();await we(e);}};async function Vr(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await F.userPromptSubmit();break;case "PreToolUse":await F.preToolUse();break;case "PostToolUse":await F.postToolUse();break;case "Stop":await F.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
15
- `),process.stdin.on("data",e=>process.stdout.write(e));}}Vr().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
13
+ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${y}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${y}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${y}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${y}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${y}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${y}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${y}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>Dr},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Mr},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>xr},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>he},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>he}];function I(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Br.reduce((r,{re:n,replace:i})=>r.replace(n,i),e)}async function Ae(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},i=t.tool_response,s=i!==null&&typeof i=="object"?i.output??JSON.stringify(i):i??"",o=B(e);if(!o){A(t);return}let c=L(),l=o.pendingTool,p=l?.name===r,T=p?l.startNs:String(BigInt(c)-200000000n),S=p?l.inputStr:w(n,k.TOOL_INPUT),m=S,g=null;if(r==="Skill"){let st=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);g=st?String(st).trim():null;let P=g?dt(g,o.cwd):null;P&&(m=P,o.skillContent||(o.skillContent=P),o.skillArtifacts||(o.skillArtifacts=ft(g,o.cwd))),g&&!o.slashSkill&&(o.slashSkill=g),a("PostToolUse","Skill tool detected",`skillName=${g}`,`contentFound=${!!P}`);}let E=I(w(s,k.TOOL_OUTPUT)),h=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(E.slice(0,500)),Q=h?"ERROR":"DEFAULT",V=U(),tt=Math.round(Number(BigInt(c)-BigInt(T))/1e6),rt={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",nt=r==="Skill"&&g?g:pt(S,60);o.toolCalls.push({tool:r,brief:nt,error:h,durationMs:tt});let G=o.spans;G.push({traceId:o.traceId,spanId:V,parentSpanId:o.spanId,name:r,kind:3,startTimeUnixNano:T,endTimeUnixNano:c,attributes:C(u(f.OBS_NAME,r),u(f.OBS_TYPE,rt),u(f.OBS_LEVEL,Q),u(f.OBS_INPUT,I(m)),u(f.OBS_OUTPUT,E),u("tool.name",r),u("tool.error",String(h)),r==="Skill"&&g?u("skill.name",g):null,r==="Skill"?u("skill.invocation","slash-command"):null),status:{code:h?2:1}}),o.pendingTool=null,Y(e,o),h&&v("TOOL_ERROR",{toolName:r}),a("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${h}`,`durationMs=${tt}`,`totalSpans=${G.length}`),A(t);}var ye={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};function Oe(t,e,r){let n=Object.keys(ye).find(o=>(t??"").toLowerCase().includes(o));if(!n)return;let i=ye[n],s=(e*i.input+r*i.output)/1e6;return Math.round(s*1e6)/1e6}async function ke(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=B(e);if(!n){A(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(a("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let i=L(),s=await zt(),o=n.toolCalls,c=n.spans;if(n.slashSkill&&!o.some(d=>d.tool==="Skill")){let d=U(),N=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});o.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),c.push({traceId:n.traceId,spanId:d,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:C(u(f.OBS_NAME,"Skill"),u(f.OBS_TYPE,"TOOL"),u(f.OBS_LEVEL,"DEFAULT"),u(f.OBS_INPUT,N),u(f.OBS_OUTPUT,"loaded via slash command"),u("tool.name","Skill"),u("tool.error","false"),u("skill.name",n.slashSkill),u("skill.invocation","slash-command")),status:{code:1}}),a("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let l=t.transcript_path||n.transcriptPath||"",p=Ut(l);if(l&&(o.some(d=>d.tool==="Skill"&&!d.synthetic)||!!n.slashSkill)&&!p?.text){await new Promise(N=>setTimeout(N,500));let d=Ut(l);d?.text&&(p=d);}a("Stop",`transcriptPath=${l||"(empty)"}`,`assistantOut=${p?`text=${p.text.length}chars`:"null"}`);let S=o.length,m=o.filter(d=>d.error).length,g=I(p?.text?w(p.text,k.TRACE_OUTPUT):S===0?"No tools used":o.map((d,N)=>`${N+1}. ${d.tool}${d.brief?` \u2192 ${d.brief}`:""}${d.error?" [ERROR]":""}`).join(`
14
+ `)),E=p?.inputTokens??0,h=p?.outputTokens??0,Q=o.map((d,N)=>`${N+1}. ${d.tool}${d.brief?` \u2192 ${d.brief}`:""}${d.error?" [ERROR]":""} (${d.durationMs}ms)`),V=!!(n.slashSkill||o.some(d=>d.tool==="Skill")),tt=o.some(d=>d.tool==="Agent");if(!V&&!tt){a("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),v("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),bt(e),A(t);return}let et=V?"skill":"agent",rt=Math.round(Number(BigInt(i)-BigInt(n.startNs))/1e6),nt=Oe(n.model,E,h),F=ae(n);F==="prerequisite_required"&&p?.text&&(F="complete"),F==="prerequisite_required"&&(c.push({traceId:n.traceId,spanId:U(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:i,attributes:C(u(f.OBS_NAME,"prerequisite-check"),u(f.OBS_TYPE,"EVENT"),u(f.OBS_LEVEL,"WARNING"),u(f.OBS_OUTPUT,g),u("skill.name",n.slashSkill||void 0),u("execution_status","prerequisite_required")),status:{code:1}}),a("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let G=(()=>{if(!(!V||!n.prompt)){if(n.slashSkill){let d=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return d?w(I(d),k.USER_INSTRUCTION):void 0}return w(I(n.prompt),k.USER_INSTRUCTION)||void 0}})(),st=JSON.stringify({trace_type:et,...F!==null&&{execution_status:F},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...G!==void 0&&{user_instruction:G},latency_ms:rt,...E&&{tokens_input:E},...h&&{tokens_output:h},cost_usd:nt,...n.model?{model:n.model}:{},toolCount:S,errorCount:m,stopReason:r,sessionId:n.sessionId,tools:Q.length?Q:void 0}),P=I(w(n.prompt,k.TRACE_INPUT)),we=C(u(f.TRACE_NAME,n.traceName),u(f.TRACE_INPUT,P),u(f.TRACE_OUTPUT,g),u(f.OBS_INPUT,P),u(f.OBS_OUTPUT,g),u(f.TRACE_METADATA,st),u(f.SESSION_ID,n.sessionId),u(f.USER_ID,s.user),u(f.OBS_TYPE,"GENERATION"),u(f.MODEL,n.model),E?u(f.INPUT_TOKENS,E):null,h?u(f.OUTPUT_TOKENS,h):null,u("claude.stop_reason",r),u("claude.tool_count",String(S)),u("claude.error_count",String(m)),u("claude.session_id",n.sessionId),u("flow.trace_type",et),{key:f.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:et}]}}}),Le={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:i,attributes:we,status:{code:m>0?2:1}},Re=C(u("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),u("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Ft=[...c,Le];a("Stop",`sid=${e}`,`totalTools=${S}`,`errorTools=${m}`,`spans=${Ft.length}`,`inputTokens=${E}`,`outputTokens=${h}`,`traceOutput="${pt(g,80)}"`);let Ie=await Ee(le(Re,Ft));a("Stop",`POST status=${Ie}`,`traceId=${n.traceId}`),v("TRACE_SENT",{latencyMs:rt,totalTools:S,errorTools:m,inputTokens:E,outputTokens:h,costUsd:nt}),bt(e),A(t);}var $=class{static async userPromptSubmit(){let e=await z(),r;try{r=await x();}catch{A(e);return}r.authError?await vt(e,true):r.length>0?await vt(e):A(e);}static async preToolUse(){let e=await z();await ce(e);}static async postToolUse(){let e=await z();await Ae(e);}static async stop(){let e=await z();await ke(e);}};async function Yr(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await $.userPromptSubmit();break;case "PreToolUse":await $.preToolUse();break;case "PostToolUse":await $.postToolUse();break;case "Stop":await $.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
15
+ `),process.stdin.on("data",e=>process.stdout.write(e));}}Yr().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
16
16
  `),process.exit(0);});
package/dist/setup.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),f=require('path'),p=require('os'),ft=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var i__namespace=/*#__PURE__*/_interopNamespace(i);var f__namespace=/*#__PURE__*/_interopNamespace(f);var p__namespace=/*#__PURE__*/_interopNamespace(p);var ft__default=/*#__PURE__*/_interopDefault(ft);var I=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var Re=Object.getOwnPropertyNames;var ke=Object.prototype.hasOwnProperty;var A=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var L=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Pe=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}},R=(e,t)=>{for(var n in t)I(e,n,{get:t[n],enumerable:true});},Ie=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Re(t))!ke.call(e,s)&&s!==n&&I(e,s,{get:()=>t[s],enumerable:!(r=Le(t,s))||r.enumerable});return e};var Ne=e=>Ie(I({},"__esModule",{value:true}),e);var J={};R(J,{BUFFER:()=>De,CONFIG_DIR_NAME:()=>y,CONFIG_FILE_NAME:()=>_,DEBUG_LOG_FILENAME:()=>U,ENV:()=>u,FEATURES:()=>$e,FLOW_URLS:()=>be,HOOK_TIMEOUTS:()=>b,INSTALLER:()=>C,NATIVE_OTEL:()=>N,OTLP:()=>Ue,STATE_FILE_PREFIX:()=>Ve,TRACE_LIMITS:()=>xe,VAULT:()=>E,getFlowBaseUrl:()=>h,getFlowUrls:()=>k,getLlmProxy:()=>Fe,getMetrics:()=>He});function h(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ce}function k(){let e=h();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function Fe(){let e=h();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${e}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function He(){let e=h();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ce,be,E,y,_,Ue,N,u,$e,C,b,De,U,xe,Ve,l=L(()=>{"use strict";Ce="https://flow.ciandt.com";be=k(),E={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},y="FLOW-nodejs",_="config.json",Ue={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};N={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},u={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"},$e={KEYCHAIN_ENABLED:!1},C={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},b={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},De={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},U="flow-ai-obs-debug.log",xe={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};Ve="flow-obs-";});var X={};R(X,{MacOsKeyVaultProvider:()=>x});var D,x,q=L(()=>{"use strict";D=util.promisify(child_process.execFile),x=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(t,n){try{let{stdout:r}=await D("security",["find-generic-password","-w","-a",n,"-s",t]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await D("security",["add-generic-password","-U","-a",n,"-s",t,"-w",r]);}async deleteSecret(t,n){try{return await D("security",["delete-generic-password","-a",n,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Z={};R(Z,{LinuxKeyVaultProvider:()=>H});var z,H,Q=L(()=>{"use strict";z=util.promisify(child_process.execFile),H=class{static async isAvailable(){let t=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of t)try{return i.accessSync(n,i.constants.X_OK),!0}catch{}return !1}async getSecret(t,n){try{let{stdout:r}=await z("secret-tool",["lookup","service",t,"account",n]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await new Promise((s,o)=>{let a=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",n]);a.on("error",o),a.on("close",m=>{m===0?s():o(new Error(`secret-tool exited with code ${m}`));}),a.stdin.write(r),a.stdin.end();});}async deleteSecret(t,n){try{return await z("secret-tool",["clear","service",t,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var ee={};R(ee,{WindowsKeyVaultProvider:()=>V});var V,te=L(()=>{"use strict";V=class{static async isAvailable(){try{return await A("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,n){return A("keytar").getPassword(t,n)}async setSecret(t,n,r){await A("keytar").setPassword(t,n,r);}async deleteSecret(t,n){return A("keytar").deletePassword(t,n)}getStoragePath(){return "Windows Credential Manager"}};});var me=Pe((An,pt)=>{pt.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.11.0",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});l();l();var F={credentials:"credentials","token-cache":"tokenCache"};function T(){let e=p__namespace.default.homedir();if(process.platform==="darwin")return f__namespace.default.join(e,"Library","Preferences",y,_);if(process.platform==="win32"){let n=process.env.APPDATA??f__namespace.default.join(e,"AppData","Roaming");return f__namespace.default.join(n,y,_)}let t=process.env.XDG_CONFIG_HOME??f__namespace.default.join(e,".config");return f__namespace.default.join(t,y,_)}function $(){try{let e=i__namespace.default.readFileSync(T(),"utf8");return JSON.parse(e)}catch{return {}}}function K(e){let t=T();i__namespace.default.mkdirSync(f__namespace.default.dirname(t),{recursive:true}),i__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var w=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(T()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(T(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,n){let r=$(),s=F[n]??n,o=r[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,n,r){let s=$(),o=F[n]??n;if(n==="token-cache")try{s[o]=JSON.parse(r);}catch{s[o]=r;}else s[o]=r;K(s);}async deleteSecret(t,n){let r=$(),s=F[n]??n;return s in r?(delete r[s],K(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${T()}`}};async function ne(){return process.env[u.FLOW_OBS_USE_JSON_VAULT]==="1"?new w:await ze()??new w}async function ze(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(q(),X));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(Q(),Z));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(te(),ee));return await e.isAvailable()?new e:null}default:return null}}l();var Ze=E.SERVICE,Qe=E.ACCOUNT_CREDS;E.ACCOUNT_TOKEN;var M=null;function et(){return M||(M=ne()),M}async function re(){let t=await(await et()).getSecret(Ze,Qe);if(!t)return null;try{return JSON.parse(t)}catch{return null}}l();l();l();f.join(p.tmpdir(),U);!process.env.NO_COLOR&&process.stdout.isTTY;function j(){return process.platform==="win32"?false:process.getuid?.()===0}function se(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return {home:t,username:process.env.SUDO_USER}}return {home:p__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||p__namespace.userInfo().username}}function P(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(e=n);}if(e){let t=e.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return f__namespace.join(t,".claude","settings.json")}return f__namespace.join(p__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||p__namespace.homedir();return f__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return f__namespace.join(t,".claude","settings.json")}return f__namespace.join(p__namespace.homedir(),".claude","settings.json")}var oe="flow-ai-obs",ie="config.json";function ce(){if(process.platform==="win32"){let n=process.env.APPDATA||f__namespace.join(p__namespace.homedir(),"AppData","Roaming");return f__namespace.join(n,oe,ie)}let e=se(),t=process.env.XDG_CONFIG_HOME||f__namespace.join(e.home,".config");return f__namespace.join(t,oe,ie)}var ct=C.LOCK_STALE_MS;function le(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>ct&&i__namespace.unlinkSync(e);}catch{}try{i__namespace.writeFileSync(e,String(process.pid),{flag:"wx"});}catch(t){throw t.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+e):t}}function ue(e){try{i__namespace.unlinkSync(e);}catch{}}function lt(e,t){let r=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(a=>!a.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [t,...r]}function pe(e,t){let n=P(),r=n+".lock",s=[];i__namespace.mkdirSync(f__namespace.dirname(n),{recursive:true}),le(r);try{if(i__namespace.existsSync(n)){i__namespace.copyFileSync(n,n+".bkp");try{i__namespace.chmodSync(n+".bkp",384);}catch{}}let o=ce();if(i__namespace.existsSync(o)){let c=o+".bkp";i__namespace.copyFileSync(o,c);try{i__namespace.chmodSync(c,384);}catch{}}let a={};try{a=JSON.parse(i__namespace.readFileSync(n,"utf8"));}catch{}let m=a.env&&typeof a.env=="object"?a.env:{};delete m.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:Se}=(l(),Ne(J)),we=Se().OTEL_ENDPOINT,ve={...N,OTEL_EXPORTER_OTLP_ENDPOINT:e??we};a.env={...m,...ve,...t??{}},a.otelHeadersHelper="flow-ai-obs otel-headers",(!a.hooks||typeof a.hooks!="object"||Array.isArray(a.hooks))&&(a.hooks={});let Oe=(c,O)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:O}]}),Ae=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],B=a.hooks;for(let c of Ae){let O=lt(B[c],Oe(c,b[c]));O.length>1&&s.push(c),B[c]=O;}i__namespace.writeFileSync(n,JSON.stringify(a,null,2)+`
3
- `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(n,384);}catch{}}finally{ue(r);}return {settingsPath:n,preserved:s}}function fe(e){let t=P(),n=t+".lock";i__namespace.mkdirSync(f__namespace.dirname(t),{recursive:true}),le(n);try{let r={};try{r=JSON.parse(i__namespace.readFileSync(t,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,e),i__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
4
- `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}}finally{ue(n);}}l();function de(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let n=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:s,tenant:o}=n;return !r||!s||!o?null:{clientId:r,clientSecret:s,tenant:o}}catch{return null}}function ge(e){let t=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),n=Buffer.from(JSON.stringify({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant})).toString("base64url");return `${t}.${n}.`}l();var W;function Ee(){return W||(W=me()),W}var ye=f__namespace.default.join(p__namespace.default.tmpdir(),"flow-obs-update-cache.json"),mt=1440*60*1e3,ht=3e3;function Et(e,t){let n=o=>{let a=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[3]]:null},r=n(e),s=n(t);return !r||!s?false:s[0]!==r[0]?s[0]>r[0]:s[1]!==r[1]?s[1]>r[1]:s[2]>r[2]}function yt(){try{let e=JSON.parse(i__namespace.default.readFileSync(ye,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=mt?null:e}catch{return null}}function _t(e,t,n=Date.now()){try{i__namespace.default.writeFileSync(ye,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:n}),{mode:384});}catch{}}function Tt(e){let t=Ee().name,n=ft__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:ht},r=>{if(r.statusCode!==200)return r.resume(),e(new Error(`HTTP ${r.statusCode}`));let s="";r.setEncoding("utf8"),r.on("data",o=>{s+=o;}),r.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");e(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){e(o);}});});n.on("error",e),n.on("timeout",()=>{n.destroy(new Error("timeout"));});}function _e(){try{if(yt())return;setImmediate(()=>{Tt((e,t)=>{e||!t||Et(Ee().version,t.version)&&_t(t.version,t.updatePriority,0);});});}catch{}}var St=f__namespace.default.resolve(__dirname,".."),wt=process.env.INIT_CWD?f__namespace.default.resolve(process.env.INIT_CWD):null;wt===St&&process.exit(0);j()&&(process.stderr.write(`
2
+ 'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),f=require('path'),p=require('os'),dt=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var i__namespace=/*#__PURE__*/_interopNamespace(i);var f__namespace=/*#__PURE__*/_interopNamespace(f);var p__namespace=/*#__PURE__*/_interopNamespace(p);var dt__default=/*#__PURE__*/_interopDefault(dt);var I=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var Pe=Object.prototype.hasOwnProperty;var A=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var R=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Ie=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}},L=(e,t)=>{for(var n in t)I(e,n,{get:t[n],enumerable:true});},Ne=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ke(t))!Pe.call(e,s)&&s!==n&&I(e,s,{get:()=>t[s],enumerable:!(r=Le(t,s))||r.enumerable});return e};var Ce=e=>Ne(I({},"__esModule",{value:true}),e);var K={};L(K,{AUTH_ENGINE:()=>C,BUFFER:()=>Me,CONFIG_DIR_NAME:()=>y,CONFIG_FILE_NAME:()=>T,DEBUG_LOG_FILENAME:()=>F,ENV:()=>u,FEATURES:()=>De,FLOW_URLS:()=>be,HOOK_TIMEOUTS:()=>b,INSTALLER:()=>U,NATIVE_OTEL:()=>N,OTLP:()=>Fe,STATE_FILE_PREFIX:()=>Ve,TRACE_LIMITS:()=>xe,VAULT:()=>E,getFlowBaseUrl:()=>h,getFlowUrls:()=>k,getLlmProxy:()=>$e,getMetrics:()=>He});function h(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ue}function k(){let e=h();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function $e(){let e=h();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${e}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function He(){let e=h();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ue,be,E,y,T,Fe,N,u,De,C,U,b,Me,F,xe,Ve,l=R(()=>{"use strict";Ue="https://flow.ciandt.com";be=k(),E={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},y="FLOW-nodejs",T="config.json",Fe={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};N={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},u={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"},De={KEYCHAIN_ENABLED:!1},C={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},U={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},b={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},Me={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},F="flow-ai-obs-debug.log",xe={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};Ve="flow-obs-";});var q={};L(q,{MacOsKeyVaultProvider:()=>x});var M,x,z=R(()=>{"use strict";M=util.promisify(child_process.execFile),x=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(t,n){try{let{stdout:r}=await M("security",["find-generic-password","-w","-a",n,"-s",t]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await M("security",["add-generic-password","-U","-a",n,"-s",t,"-w",r]);}async deleteSecret(t,n){try{return await M("security",["delete-generic-password","-a",n,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Z={};L(Z,{LinuxKeyVaultProvider:()=>H});var Q,H,ee=R(()=>{"use strict";Q=util.promisify(child_process.execFile),H=class{static async isAvailable(){let t=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of t)try{return i.accessSync(n,i.constants.X_OK),!0}catch{}return !1}async getSecret(t,n){try{let{stdout:r}=await Q("secret-tool",["lookup","service",t,"account",n]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await new Promise((s,o)=>{let a=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",n]);a.on("error",o),a.on("close",m=>{m===0?s():o(new Error(`secret-tool exited with code ${m}`));}),a.stdin.write(r),a.stdin.end();});}async deleteSecret(t,n){try{return await Q("secret-tool",["clear","service",t,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var te={};L(te,{WindowsKeyVaultProvider:()=>V});var V,ne=R(()=>{"use strict";V=class{static async isAvailable(){try{return await A("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,n){return A("keytar").getPassword(t,n)}async setSecret(t,n,r){await A("keytar").setPassword(t,n,r);}async deleteSecret(t,n){return A("keytar").deletePassword(t,n)}getStoragePath(){return "Windows Credential Manager"}};});var he=Ie((Rn,ft)=>{ft.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.12.0-beta.6",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});l();l();var $={credentials:"credentials","token-cache":"tokenCache"};function _(){let e=p__namespace.default.homedir();if(process.platform==="darwin")return f__namespace.default.join(e,"Library","Preferences",y,T);if(process.platform==="win32"){let n=process.env.APPDATA??f__namespace.default.join(e,"AppData","Roaming");return f__namespace.default.join(n,y,T)}let t=process.env.XDG_CONFIG_HOME??f__namespace.default.join(e,".config");return f__namespace.default.join(t,y,T)}function D(){try{let e=i__namespace.default.readFileSync(_(),"utf8");return JSON.parse(e)}catch{return {}}}function X(e){let t=_();i__namespace.default.mkdirSync(f__namespace.default.dirname(t),{recursive:true}),i__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var w=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(_()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(_(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,n){let r=D(),s=$[n]??n,o=r[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,n,r){let s=D(),o=$[n]??n;if(n==="token-cache")try{s[o]=JSON.parse(r);}catch{s[o]=r;}else s[o]=r;X(s);}async deleteSecret(t,n){let r=D(),s=$[n]??n;return s in r?(delete r[s],X(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${_()}`}};async function re(){return process.env[u.FLOW_OBS_USE_JSON_VAULT]==="1"?new w:await Qe()??new w}async function Qe(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(z(),q));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(ee(),Z));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(ne(),te));return await e.isAvailable()?new e:null}default:return null}}l();var Ze=E.SERVICE,et=E.ACCOUNT_CREDS;E.ACCOUNT_TOKEN;var Y=null;function tt(){return Y||(Y=re()),Y}async function se(){let t=await(await tt()).getSecret(Ze,et);if(!t)return null;try{return JSON.parse(t)}catch{return null}}l();l();l();f.join(p.tmpdir(),F);!process.env.NO_COLOR&&process.stdout.isTTY;function j(){return process.platform==="win32"?false:process.getuid?.()===0}function oe(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return {home:t,username:process.env.SUDO_USER}}return {home:p__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||p__namespace.userInfo().username}}function P(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(e=n);}if(e){let t=e.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return f__namespace.join(t,".claude","settings.json")}return f__namespace.join(p__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||p__namespace.homedir();return f__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return f__namespace.join(t,".claude","settings.json")}return f__namespace.join(p__namespace.homedir(),".claude","settings.json")}var ie="flow-ai-obs",ae="config.json";function le(){if(process.platform==="win32"){let n=process.env.APPDATA||f__namespace.join(p__namespace.homedir(),"AppData","Roaming");return f__namespace.join(n,ie,ae)}let e=oe(),t=process.env.XDG_CONFIG_HOME||f__namespace.join(e.home,".config");return f__namespace.join(t,ie,ae)}var lt=U.LOCK_STALE_MS;function ue(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>lt&&i__namespace.unlinkSync(e);}catch{}try{i__namespace.writeFileSync(e,String(process.pid),{flag:"wx"});}catch(t){throw t.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+e):t}}function pe(e){try{i__namespace.unlinkSync(e);}catch{}}function ut(e,t){let r=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(a=>!a.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [t,...r]}function fe(e,t){let n=P(),r=n+".lock",s=[];i__namespace.mkdirSync(f__namespace.dirname(n),{recursive:true}),ue(r);try{if(i__namespace.existsSync(n)){i__namespace.copyFileSync(n,n+".bkp");try{i__namespace.chmodSync(n+".bkp",384);}catch{}}let o=le();if(i__namespace.existsSync(o)){let c=o+".bkp";i__namespace.copyFileSync(o,c);try{i__namespace.chmodSync(c,384);}catch{}}let a={};try{a=JSON.parse(i__namespace.readFileSync(n,"utf8"));}catch{}let m=a.env&&typeof a.env=="object"?a.env:{};delete m.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:we}=(l(),Ce(K)),Oe=we().OTEL_ENDPOINT,ve={...N,OTEL_EXPORTER_OTLP_ENDPOINT:e??Oe};a.env={...m,...ve,...t??{}},a.otelHeadersHelper="flow-ai-obs otel-headers",(!a.hooks||typeof a.hooks!="object"||Array.isArray(a.hooks))&&(a.hooks={});let Ae=(c,v)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:v}]}),Re=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],J=a.hooks;for(let c of Re){let v=ut(J[c],Ae(c,b[c]));v.length>1&&s.push(c),J[c]=v;}i__namespace.writeFileSync(n,JSON.stringify(a,null,2)+`
3
+ `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(n,384);}catch{}}finally{pe(r);}return {settingsPath:n,preserved:s}}function de(e){let t=P(),n=t+".lock";i__namespace.mkdirSync(f__namespace.dirname(t),{recursive:true}),ue(n);try{let r={};try{r=JSON.parse(i__namespace.readFileSync(t,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,e),i__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
4
+ `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}}finally{pe(n);}}l();function ge(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let n=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:s,tenant:o}=n;return !r||!s||!o?null:{clientId:r,clientSecret:s,tenant:o}}catch{return null}}function me(e){let t=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),n=Buffer.from(JSON.stringify({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant})).toString("base64url");return `${t}.${n}.`}l();var B;function ye(){return B||(B=he()),B}var Te=f__namespace.default.join(p__namespace.default.tmpdir(),"flow-obs-update-cache.json"),ht=1440*60*1e3,Et=3e3;function yt(e,t){let n=o=>{let a=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[3]]:null},r=n(e),s=n(t);return !r||!s?false:s[0]!==r[0]?s[0]>r[0]:s[1]!==r[1]?s[1]>r[1]:s[2]>r[2]}function Tt(){try{let e=JSON.parse(i__namespace.default.readFileSync(Te,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=ht?null:e}catch{return null}}function _t(e,t,n=Date.now()){try{i__namespace.default.writeFileSync(Te,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:n}),{mode:384});}catch{}}function St(e){let t=ye().name,n=dt__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Et},r=>{if(r.statusCode!==200)return r.resume(),e(new Error(`HTTP ${r.statusCode}`));let s="";r.setEncoding("utf8"),r.on("data",o=>{s+=o;}),r.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");e(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){e(o);}});});n.on("error",e),n.on("timeout",()=>{n.destroy(new Error("timeout"));});}function _e(){try{if(Tt())return;setImmediate(()=>{St((e,t)=>{e||!t||yt(ye().version,t.version)&&_t(t.version,t.updatePriority,0);});});}catch{}}var wt=f__namespace.default.resolve(__dirname,".."),Ot=process.env.INIT_CWD?f__namespace.default.resolve(process.env.INIT_CWD):null;Ot===wt&&process.exit(0);j()&&(process.stderr.write(`
5
5
  [flow-ai-obs] \u2717 Do not install with sudo.
6
6
  Run without sudo: npm install -g @ciandt-flow/flow-ai-obs
7
7
 
8
- `),process.exit(1));async function vt(){try{pe();}catch{}let e=await re();if(!e){process.stderr.write(`
8
+ `),process.exit(1));async function vt(){try{fe();}catch{}let e=await se();if(!e){process.stderr.write(`
9
9
  [flow-ai-obs] No credentials found.
10
10
  Run \`flow-ai-obs auth login\` to authenticate and enable telemetry.
11
11
 
12
- `);return}let t=de(process.env[u.ANTHROPIC_AUTH_TOKEN]);if(!t||t.clientId!==e.clientId||t.clientSecret!==e.clientSecret||t.tenant!==e.tenant)try{let r=ge(e);fe({[u.ANTHROPIC_AUTH_TOKEN]:r});}catch{}}vt().catch(()=>{}).finally(()=>_e());
12
+ `);return}let t=ge(process.env[u.ANTHROPIC_AUTH_TOKEN]);if(!t||t.clientId!==e.clientId||t.clientSecret!==e.clientSecret||t.tenant!==e.tenant)try{let r=me(e);de({[u.ANTHROPIC_AUTH_TOKEN]:r});}catch{}}vt().catch(()=>{}).finally(()=>_e());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.11.0",
3
+ "version": "0.12.0-beta.6",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {