@ciandt-flow/flow-ai-obs 0.9.3-beta.752 → 0.9.3-beta.761

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