@ciandt-flow/flow-ai-obs 0.9.1 → 0.9.2-beta.719

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