@ciandt-flow/flow-ai-obs 0.7.1-beta.542 → 0.7.1-beta.558

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,131 +1,131 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var Ie=require('readline/promises'),fs=require('https'),w=require('fs'),lt=require('os'),Lt=require('path'),child_process=require('child_process'),Is=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 Ie__namespace=/*#__PURE__*/_interopNamespace(Ie);var fs__default=/*#__PURE__*/_interopDefault(fs);var w__namespace=/*#__PURE__*/_interopNamespace(w);var lt__namespace=/*#__PURE__*/_interopNamespace(lt);var Lt__namespace=/*#__PURE__*/_interopNamespace(Lt);var Is__default=/*#__PURE__*/_interopDefault(Is);var Re=Object.defineProperty;var is=Object.getOwnPropertyDescriptor;var as=Object.getOwnPropertyNames;var cs=Object.prototype.hasOwnProperty;var xt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var m=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var us=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},B=(t,e)=>{for(var r in e)Re(t,r,{get:e[r],enumerable:true});},ls=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of as(e))!cs.call(t,s)&&s!==r&&Re(t,s,{get:()=>e[s],enumerable:!(n=is(e,s))||n.enumerable});return t};var I=t=>ls(Re({},"__esModule",{value:true}),t);var oe=us((si,ds)=>{ds.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.1-beta.542",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"}};});var Le={};B(Le,{bold:()=>H,cyan:()=>L,dim:()=>E,green:()=>P,red:()=>R,yellow:()=>k});function Tt(t,e){return ps?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var ps,P,R,k,L,H,E,it=m(()=>{"use strict";ps=!process.env.NO_COLOR&&process.stdout.isTTY;P=Tt("32","39"),R=Tt("31","39"),k=Tt("33","39"),L=Tt("36","39"),H=Tt("1","22"),E=Tt("2","22");});function St(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function Pe(t,e){let r=Ie__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&e!==void 0)return r.close(),e;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
- `);}catch(i){throw r.close(),i}if(r.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function wr(t,e){let r=Ie__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${t}: `)).trim();if(e);return n}catch(n){throw n}finally{r.close();}}var be=m(()=>{"use strict";});var _t={};B(_t,{checkForUpdate:()=>Ss,checkForUpdateInteractive:()=>ys,fetchLatestVersionAsync:()=>yr,isNewer:()=>yt,primeUpdateCache:()=>_s});function N(){return Ne||(Ne=oe()),Ne}function yt(t,e){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(t),s=r(e);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function $e(){try{let t=JSON.parse(w__namespace.default.readFileSync(Sr,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=hs?null:t}catch{return null}}function Fe(t,e,r=Date.now()){try{w__namespace.default.writeFileSync(Sr,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:r}),{mode:384});}catch{}}function xe(t){let e=N().name,r=fs__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:ws},n=>{if(n.statusCode!==200)return n.resume(),t(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});r.on("error",t),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function Ce(t){let e=N().name,n=` Update available: ${N().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
2
+ 'use strict';var Pe=require('readline/promises'),ms=require('https'),g=require('fs'),lt=require('os'),It=require('path'),child_process=require('child_process'),Ps=require('http'),util=require('util'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Pe__namespace=/*#__PURE__*/_interopNamespace(Pe);var ms__default=/*#__PURE__*/_interopDefault(ms);var g__namespace=/*#__PURE__*/_interopNamespace(g);var lt__namespace=/*#__PURE__*/_interopNamespace(lt);var It__namespace=/*#__PURE__*/_interopNamespace(It);var Ps__default=/*#__PURE__*/_interopDefault(Ps);var Re=Object.defineProperty;var as=Object.getOwnPropertyDescriptor;var cs=Object.getOwnPropertyNames;var us=Object.prototype.hasOwnProperty;var xt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var m=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var ls=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},M=(t,e)=>{for(var r in e)Re(t,r,{get:e[r],enumerable:true});},ds=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of cs(e))!us.call(t,s)&&s!==r&&Re(t,s,{get:()=>e[s],enumerable:!(n=as(e,s))||n.enumerable});return t};var I=t=>ds(Re({},"__esModule",{value:true}),t);var oe=ls((oi,ps)=>{ps.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.1-beta.558",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"}};});var Ie={};M(Ie,{bold:()=>H,cyan:()=>R,dim:()=>E,green:()=>P,red:()=>L,yellow:()=>k});function St(t,e){return fs?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var fs,P,L,k,R,H,E,it=m(()=>{"use strict";fs=!process.env.NO_COLOR&&process.stdout.isTTY;P=St("32","39"),L=St("31","39"),k=St("33","39"),R=St("36","39"),H=St("1","22"),E=St("2","22");});function yt(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function be(t,e){let r=Pe__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&e!==void 0)return r.close(),e;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
+ `);}catch(i){throw r.close(),i}if(r.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function Sr(t,e){let r=Pe__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${t}: `)).trim();if(e);return n}catch(n){throw n}finally{r.close();}}var Ce=m(()=>{"use strict";});var Ot={};M(Ot,{checkForUpdate:()=>ys,checkForUpdateInteractive:()=>_s,fetchLatestVersionAsync:()=>kr,isNewer:()=>_t,primeUpdateCache:()=>Os});function C(){return Ne||(Ne=oe()),Ne}function _t(t,e){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(t),s=r(e);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function Fe(){try{let t=JSON.parse(g__namespace.default.readFileSync(Or,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=ws?null:t}catch{return null}}function xe(t,e,r=Date.now()){try{g__namespace.default.writeFileSync(Or,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:r}),{mode:384});}catch{}}function De(t){let e=C().name,r=ms__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:Es},n=>{if(n.statusCode!==200)return n.resume(),t(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});r.on("error",t),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function Ue(t){let e=C().name,n=` Update available: ${C().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
4
4
  \u256D${i}\u256E
5
5
  \u2502${n.padEnd(o)}\u2502
6
6
  \u2502${s.padEnd(o)}\u2502
7
7
  \u2570${i}\u256F
8
8
 
9
- `);}function Ue(t){let e=N().name;process.stderr.write(`
9
+ `);}function $e(t){let e=C().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 Es(t,e=1e4){let r=xt("readline"),n=N().name,o=` Update available: ${N().version} \u2192 ${t}`,i=` Run: npm install -g ${n}`,a=" Install now? [y/N]: ",c=Math.max(o.length,i.length,a.length-2)+2,l="\u2500".repeat(c);return process.stderr.write(`
12
+ `),child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",windowsHide:true}).unref();}async function Ts(t,e=1e4){let r=xt("readline"),n=C().name,o=` Update available: ${C().version} \u2192 ${t}`,i=` Run: npm install -g ${n}`,a=" Install now? [y/N]: ",c=Math.max(o.length,i.length,a.length-2)+2,l="\u2500".repeat(c);return process.stderr.write(`
13
13
  \u256D${l}\u256E
14
14
  \u2502${o.padEnd(c)}\u2502
15
15
  \u2502${i.padEnd(c)}\u2502
16
16
  \u2502${a.padEnd(c)}\u2502
17
17
  \u2570${l}\u256F
18
- `),new Promise(d=>{let g=r.createInterface({input:process.stdin,output:void 0,terminal:false}),h=false;function T(_){h||(h=true,clearTimeout(A),g.close(),process.stderr.write(`
19
- `),d(_));}let A=setTimeout(()=>T(false),e);g.once("line",_=>T(_.trim().toLowerCase()==="y")),g.once("close",()=>T(false));})}async function Ts(t){let e=N().name;return process.stderr.write(` Installing ${e}@${t}...
18
+ `),new Promise(d=>{let h=r.createInterface({input:process.stdin,output:void 0,terminal:false}),w=false;function T(_){w||(w=true,clearTimeout(A),h.close(),process.stderr.write(`
19
+ `),d(_));}let A=setTimeout(()=>T(false),e);h.once("line",_=>T(_.trim().toLowerCase()==="y")),h.once("close",()=>T(false));})}async function Ss(t){let e=C().name;return process.stderr.write(` Installing ${e}@${t}...
20
20
  `),new Promise(r=>{let n=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit"});n.on("close",s=>{s!==0?process.stderr.write(` \u2717 Update failed \u2014 continuing with current version.
21
21
 
22
22
  `):process.stderr.write(` \u2713 Updated to ${t}. Please restart the command.
23
23
 
24
24
  `),r();}),n.on("error",()=>{process.stderr.write(` \u2717 Update failed \u2014 continuing with current version.
25
25
 
26
- `),r();});})}function yr(){return new Promise(t=>{xe((e,r)=>t(e||!r?null:r));})}function Ss(){try{let t=$e();if(t){yt(N().version,t.latestVersion)&&(t.updatePriority==="auto"?Ue(t.latestVersion):Ce(t.latestVersion));return}setImmediate(()=>{xe((e,r)=>{e||!r||(Fe(r.version,r.updatePriority),yt(N().version,r.version)&&(r.updatePriority==="auto"?Ue(r.version):Ce(r.version)));});});}catch{}}async function ys(t={}){try{let e=$e();if(e){if(!yt(N().version,e.latestVersion))return}else {let n=await yr();if(!n||(Fe(n.version,n.updatePriority),!yt(N().version,n.version)))return;e={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Ue(e.latestVersion);return}if(!St()){Ce(e.latestVersion);return}await Es(e.latestVersion,t.timeoutMs)&&await Ts(e.latestVersion);}catch{}}function _s(){try{if($e())return;setImmediate(()=>{xe((t,e)=>{t||!e||yt(N().version,e.version)&&Fe(e.version,e.updatePriority,0);});});}catch{}}var Ne,Sr,hs,ws,Ot=m(()=>{"use strict";be();Sr=Lt__namespace.default.join(lt__namespace.default.tmpdir(),"flow-obs-update-cache.json"),hs=1440*60*1e3,ws=3e3;});function at(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Dt}function kt(){let t=at();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 Mt(){let t=at();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-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function Be(){let t=at();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Dt,Os,ie,ae,ce,De,j,p,_r,Me,x,Or,V,O=m(()=>{"use strict";Dt="https://flow.ciandt.com";Os=kt(),ie={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},ae="FLOW-nodejs",ce="config.json",De={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};j={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:Os.OTEL_ENDPOINT,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"},_r={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3},Me={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15},x={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},Or="flow-ai-obs-debug.log",V={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};});function u(...t){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
27
- `;try{w.writeFileSync(Rs,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
28
- `);}}var Rs,D=m(()=>{"use strict";O();Rs=Lt.join(lt.tmpdir(),Or);});function bs(t){if(!Ps.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Ns(t,e){let r=e.length>400?e.slice(0,400)+"\u2026":e;u("toAuthError",`status=${t} body=${r}`);try{let n=JSON.parse(e);if(typeof n.error=="string"&&(u("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),kr[n.error]))return new ct(kr[n.error])}catch{}return t===401||t===403||t===500?new ct("Invalid credentials"):t>=400&&t<500?new ct("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function Y(t){return new Promise((e,r)=>{try{bs(t.tenant);}catch(l){return r(l)}let n=JSON.stringify({clientSecret:t.clientSecret}),s=new URL(kt().AUTH_ENGINE),o=s.protocol==="https:",i={hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),FlowTenant:t.tenant}};u("getToken",`requesting token tenant=${t.tenant} host=${i.hostname} path=${i.path}`);let c=(o?fs__default.default:Is__default.default).request(i,l=>{let d=[];l.on("data",g=>d.push(g)),l.on("end",()=>{let g=d.join("");if((l.statusCode??0)>=400)return r(Ns(l.statusCode??0,g));let h;try{h=JSON.parse(g);}catch{return r(new Error("Invalid response from auth engine"))}let T=h.expires_at??new Date(Date.now()+(h.expires_in??3600)*1e3).toISOString();e({accessToken:h.access_token??"",expiresAt:T});});});c.on("error",l=>r(new Error(`Network error: ${l.message}`))),c.write(n),c.end();})}var ct,Ps,kr,At=m(()=>{"use strict";O();D();ct=class extends Error{constructor(e){super(e),this.name="AuthError";}},Ps=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;kr={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};});function Ar(){return process.platform==="win32"?false:process.getuid?.()===0}function ut(){if(Ar())return process.stderr.write(`
29
- `+R(` \u2717 flow-ai-obs is not supported in a sudo context.
26
+ `),r();});})}function kr(){return new Promise(t=>{De((e,r)=>t(e||!r?null:r));})}function ys(){try{let t=Fe();if(t){_t(C().version,t.latestVersion)&&(t.updatePriority==="auto"?$e(t.latestVersion):Ue(t.latestVersion));return}setImmediate(()=>{De((e,r)=>{e||!r||(xe(r.version,r.updatePriority),_t(C().version,r.version)&&(r.updatePriority==="auto"?$e(r.version):Ue(r.version)));});});}catch{}}async function _s(t={}){try{let e=Fe();if(e){if(!_t(C().version,e.latestVersion))return}else {let n=await kr();if(!n||(xe(n.version,n.updatePriority),!_t(C().version,n.version)))return;e={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){$e(e.latestVersion);return}if(!yt()){Ue(e.latestVersion);return}await Ts(e.latestVersion,t.timeoutMs)&&await Ss(e.latestVersion);}catch{}}function Os(){try{if(Fe())return;setImmediate(()=>{De((t,e)=>{t||!e||_t(C().version,e.version)&&xe(e.version,e.updatePriority,0);});});}catch{}}var Ne,Or,ws,Es,kt=m(()=>{"use strict";Ce();Or=It__namespace.default.join(lt__namespace.default.tmpdir(),"flow-obs-update-cache.json"),ws=1440*60*1e3,Es=3e3;});function at(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Dt}function At(){let t=at();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 Bt(){let t=at();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-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function He(){let t=at();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Dt,ks,ie,ae,ce,Be,j,p,Ar,Me,x,vr,V,O=m(()=>{"use strict";Dt="https://flow.ciandt.com";ks=At(),ie={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},ae="FLOW-nodejs",ce="config.json",Be={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};j={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:ks.OTEL_ENDPOINT,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"},Ar={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3},Me={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15},x={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},vr="flow-ai-obs-debug.log",V={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};});function u(...t){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
27
+ `;try{g.writeFileSync(Rs,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
28
+ `);}}var Rs,D=m(()=>{"use strict";O();Rs=It.join(lt.tmpdir(),vr);});function Cs(t){if(!bs.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Ns(t,e){let r=e.length>400?e.slice(0,400)+"\u2026":e;u("toAuthError",`status=${t} body=${r}`);try{let n=JSON.parse(e);if(typeof n.error=="string"&&(u("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),Lr[n.error]))return new ct(Lr[n.error])}catch{}return t===401||t===403||t===500?new ct("Invalid credentials"):t>=400&&t<500?new ct("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function W(t){return new Promise((e,r)=>{try{Cs(t.tenant);}catch(l){return r(l)}let n=JSON.stringify({clientSecret:t.clientSecret}),s=new URL(At().AUTH_ENGINE),o=s.protocol==="https:",i={hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),FlowTenant:t.tenant}};u("getToken",`requesting token tenant=${t.tenant} host=${i.hostname} path=${i.path}`);let c=(o?ms__default.default:Ps__default.default).request(i,l=>{let d=[];l.on("data",h=>d.push(h)),l.on("end",()=>{let h=d.join("");if((l.statusCode??0)>=400)return r(Ns(l.statusCode??0,h));let w;try{w=JSON.parse(h);}catch{return r(new Error("Invalid response from auth engine"))}let T=w.expires_at??new Date(Date.now()+(w.expires_in??3600)*1e3).toISOString();e({accessToken:w.access_token??"",expiresAt:T});});});c.on("error",l=>r(new Error(`Network error: ${l.message}`))),c.write(n),c.end();})}var ct,bs,Lr,vt=m(()=>{"use strict";O();D();ct=class extends Error{constructor(e){super(e),this.name="AuthError";}},bs=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;Lr={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 Rr(){return process.platform==="win32"?false:process.getuid?.()===0}function ut(){if(Rr())return process.stderr.write(`
29
+ `+L(` \u2717 flow-ai-obs is not supported in a sudo context.
30
30
 
31
- `)+L(` npm install -g @ciandt-flow/flow-ai-obs
31
+ `)+R(` npm install -g @ciandt-flow/flow-ai-obs
32
32
  `)+`
33
- `),1}var Bt=m(()=>{"use strict";it();});function vr(){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:lt__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||lt__namespace.userInfo().username}}function v(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(t=r);}if(t){let e=t.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return Lt__namespace.join(e,".claude","settings.json")}return Lt__namespace.join(lt__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||lt__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(lt__namespace.homedir(),".claude","settings.json")}var ue=m(()=>{"use strict";Bt();});function le(t){try{let e=w__namespace.statSync(t);Date.now()-e.mtimeMs>Cs&&w__namespace.unlinkSync(t);}catch{}try{w__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 de(t){try{w__namespace.unlinkSync(t);}catch{}}function Rr(t,e){let n=(Array.isArray(t)?t:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [e,...n]}function Lr(){let t=v(),e=t+".lock",r=[];w__namespace.mkdirSync(Lt__namespace.dirname(t),{recursive:true}),le(e);try{if(w__namespace.existsSync(t)){w__namespace.copyFileSync(t,t+".bkp");try{w__namespace.chmodSync(t+".bkp",384);}catch{}}let n={};try{n=JSON.parse(w__namespace.readFileSync(t,"utf8"));}catch{}let s=n.env&&typeof n.env=="object"?n.env:{};delete s.OTEL_EXPORTER_OTLP_HEADERS,n.env={...s,...j,...Mt()},n.otelHeadersHelper="flow-ai-obs otel-headers",(!n.hooks||typeof n.hooks!="object"||Array.isArray(n.hooks))&&(n.hooks={});let o=(c,l)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:l}]}),i=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],a=n.hooks;for(let c of i){let l=Rr(a[c],o(c,Me[c]));l.length>1&&r.push(c),a[c]=l;}w__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
34
- `,{encoding:"utf8",mode:384});try{w__namespace.chmodSync(t,384);}catch{}}finally{de(e);}return {settingsPath:t,preserved:r}}function Rt(t){try{let e=w__namespace.readFileSync(v(),"utf8"),n=JSON.parse(e).env?.[t];return typeof n=="string"?n:null}catch{return null}}function J(t){let e=v(),r=e+".lock";w__namespace.mkdirSync(Lt__namespace.dirname(e),{recursive:true}),le(r);try{let n={};try{n=JSON.parse(w__namespace.readFileSync(e,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,t),w__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
35
- `,{encoding:"utf8",mode:384});try{w__namespace.chmodSync(e,384);}catch{}}finally{de(r);}}function Ir(){let t=v(),e=t+".lock",r=[];w__namespace.mkdirSync(Lt__namespace.dirname(t),{recursive:true}),le(e);try{if(w__namespace.existsSync(t)){w__namespace.copyFileSync(t,t+".bkp");try{w__namespace.chmodSync(t+".bkp",384);}catch{}}let n={};try{n=JSON.parse(w__namespace.readFileSync(t,"utf8"));}catch{}n.otelHeadersHelper="flow-ai-obs otel-headers",(!n.hooks||typeof n.hooks!="object"||Array.isArray(n.hooks))&&(n.hooks={});let s=(a,c)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${a}`,timeout:c}]}),o=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],i=n.hooks;for(let a of o){let c=Rr(i[a],s(a,Me[a]));c.length>1&&r.push(a),i[a]=c;}w__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
36
- `,{encoding:"utf8",mode:384});try{w__namespace.chmodSync(t,384);}catch{}}finally{de(e);}return {settingsPath:t,preserved:r}}function Pr(t){let e=v(),r=e+".lock";w__namespace.mkdirSync(Lt__namespace.dirname(e),{recursive:true}),le(r);try{let n={};try{n=JSON.parse(w__namespace.readFileSync(e,"utf8"));}catch{return}if(!n.env||typeof n.env!="object")return;for(let s of t)delete n.env[s];w__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
37
- `,{encoding:"utf8",mode:384});try{w__namespace.chmodSync(e,384);}catch{}}finally{de(r);}}var Cs,jt=m(()=>{"use strict";O();At();ue();Cs=_r.LOCK_STALE_MS;});function Ur(){if(process.platform==="win32"){let r=process.env.APPDATA||Lt__namespace.join(lt__namespace.homedir(),"AppData","Roaming");return Lt__namespace.join(r,br,Nr)}let t=vr(),e=process.env.XDG_CONFIG_HOME||Lt__namespace.join(t.home,".config");return Lt__namespace.join(e,br,Nr)}function pe(){try{let t=w__namespace.readFileSync(v(),"utf8"),r=JSON.parse(t).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}function $r(){try{let t=w__namespace.readFileSync(v(),"utf8");return JSON.parse(t).env??null}catch{return null}}var br,Nr,Fr=m(()=>{"use strict";ue();br="flow-ai-obs",Nr="config.json";});function Yt(){let t=lt__namespace.default.homedir();if(process.platform==="darwin")return Lt__namespace.default.join(t,"Library","Preferences",ae,ce);if(process.platform==="win32"){let r=process.env.APPDATA??Lt__namespace.default.join(t,"AppData","Roaming");return Lt__namespace.default.join(r,ae,ce)}let e=process.env.XDG_CONFIG_HOME??Lt__namespace.default.join(t,".config");return Lt__namespace.default.join(e,ae,ce)}function Ye(){try{let t=w__namespace.default.readFileSync(Yt(),"utf8");return JSON.parse(t)}catch{return {}}}function xr(t){let e=Yt();w__namespace.default.mkdirSync(Lt__namespace.default.dirname(e),{recursive:true}),w__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var Ve,fe,Dr=m(()=>{"use strict";O();Ve={credentials:"credentials","token-cache":"tokenCache"};fe=class{static isAvailable(){return !0}static hasExistingData(){try{if(!w__namespace.default.existsSync(Yt()))return !1;let e=JSON.parse(w__namespace.default.readFileSync(Yt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,r){let n=Ye(),s=Ve[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(e,r,n){let s=Ye(),o=Ve[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;xr(s);}async deleteSecret(e,r){let n=Ye(),s=Ve[r]??r;return s in n?(delete n[s],xr(n),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Yt()}`}};});var Mr={};B(Mr,{MacOsKeyVaultProvider:()=>Ge});var We,Ge,Br=m(()=>{"use strict";We=util.promisify(child_process.execFile),Ge=class{static async isAvailable(){try{return w.accessSync("/usr/bin/security",w.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await We("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await We("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await We("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var jr={};B(jr,{LinuxKeyVaultProvider:()=>Je});var Hr,Je,Vr=m(()=>{"use strict";Hr=util.promisify(child_process.execFile),Je=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of e)try{return w.accessSync(r,w.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await Hr("secret-tool",["lookup","service",e,"account",r]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await new Promise((s,o)=>{let i=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",r]);i.on("error",o),i.on("close",a=>{a===0?s():o(new Error(`secret-tool exited with code ${a}`));}),i.stdin.write(n),i.stdin.end();});}async deleteSecret(e,r){try{return await Hr("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Yr={};B(Yr,{WindowsKeyVaultProvider:()=>Ke});var Ke,Wr=m(()=>{"use strict";Ke=class{static async isAvailable(){try{return await xt("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return xt("keytar").getPassword(e,r)}async setSecret(e,r,n){await xt("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return xt("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});async function Gr(){return await Ys()??new fe}async function Ys(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Br(),Mr));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Vr(),jr));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Wr(),Yr));return await t.isAvailable()?new t:null}default:return null}}var Jr=m(()=>{"use strict";Dr();});function Xr(){return qe||(qe=Gr()),qe}async function Gt(t){await(await Xr()).setSecret(Kr,qr,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function It(){let e=await(await Xr()).getSecret(Kr,qr);if(!e)return null;try{let r=JSON.parse(e);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function me(){let t=await It();return t?new Date(t.expiresAt)>new Date:false}async function Jt(){let t=await It();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}var Kr,qi,qr,qe,ge=m(()=>{"use strict";Jr();O();Kr=ie.SERVICE,qi=ie.ACCOUNT_CREDS,qr=ie.ACCOUNT_TOKEN,qe=null;});function Gs(t){return Ws.some(e=>e.test(t))}function Js(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function b(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:s,tenant:o}=r;return !n||!s||!o?null:{clientId:n,clientSecret:s,tenant:o}}catch{return null}}function zr(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${r}.`}function Pt(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[p.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&Gs(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Zr(){let t=b(process.env[p.ANTHROPIC_AUTH_TOKEN]);return t?{user:await Jt().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function Ks(){return new Date().toISOString().slice(0,10)}async function qs(t){let e=Ks(),r=await It();if(r?.lastAuthCheckAt!==e){u("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let o=await Y(t);try{await Gt({...o,lastAuthCheckAt:e});}catch{}return u("getOrRefreshToken",`daily check passed, expires=${o.expiresAt}`),o.accessToken}catch(o){if(o instanceof ct)throw o;u("getOrRefreshToken",`daily check network error \u2014 using cache: ${o.message}`);}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(u("getOrRefreshToken",`cacheValid=${n}`),n)return u("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;u("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let s=await Y(t);try{await Gt({...s,lastAuthCheckAt:e});}catch(o){u("getOrRefreshToken",`token cache save failed (non-fatal): ${o.message}`);}return u("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function Xs(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function zs(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function K(){let t=[],e=process.env[p.ANTHROPIC_MODEL]??"",r=b(process.env[p.ANTHROPIC_AUTH_TOKEN]);u("resolveCredentials",r?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),r&&u("resolveCredentials",`clientId=${r.clientId}`,`tenant=${r.tenant}`);let n=r?r.tenant:"",s=process.env[p.FLOW_TELEMETRY]==="true",o=process.env[p.LANGFUSE_BASE_URL],i=process.env[p.LANGFUSE_PUBLIC_KEY],a=process.env[p.LANGFUSE_SECRET_KEY];if(s&&o&&i&&a){let h="",T=n;r&&(h=await Jt().catch(()=>null)??r.clientId);let A={user:h??"",tenant:T??"",team:"",project:"",model:e};t.push({mode:"direct",...zs(Pt(o),i,a),...A}),u("resolveCredentials","direct mode active",`user=${A.user}`,`tenant=${A.tenant}`);}if(!r){if(t.length===0){let h=[];return h.authError=false,h}return t}let c;try{c=await qs(r);}catch(h){if(u("resolveCredentials",`token refresh failed: ${h.message}`,`(tenant=${r.tenant} clientId=${r.clientId})`),t.length>0)return t.authError=true,t;let T=[];return T.authError=true,T}let d={user:Js(c)??r.clientId,tenant:n,team:"",project:"",model:e},g=process.env[p.FLOW_TELEMETRY_GATEWAY]??at();return t.push({mode:"gateway",...Xs(Pt(g),{accessToken:c}),...d}),t}async function Qr(){return (await K()).length>0}var Ws,W=m(()=>{"use strict";ge();At();O();D();Ws=[/^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 he(){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 ze(){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}}function tn(){if(child_process.spawnSync("node",["--version"],{encoding:"utf8",timeout:5e3}).status!==0)return {success:false,error:"no_nodejs",message:`Node.js is not installed. Install Node.js 18+ and try again:
33
+ `),1}var Mt=m(()=>{"use strict";it();});function Ir(){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:lt__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||lt__namespace.userInfo().username}}function v(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(t=r);}if(t){let e=t.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return It__namespace.join(e,".claude","settings.json")}return It__namespace.join(lt__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||lt__namespace.homedir();return It__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 It__namespace.join(e,".claude","settings.json")}return It__namespace.join(lt__namespace.homedir(),".claude","settings.json")}var ue=m(()=>{"use strict";Mt();});function le(){if(process.platform==="win32"){let r=process.env.APPDATA||It__namespace.join(lt__namespace.homedir(),"AppData","Roaming");return It__namespace.join(r,Pr,br)}let t=Ir(),e=process.env.XDG_CONFIG_HOME||It__namespace.join(t.home,".config");return It__namespace.join(e,Pr,br)}function de(){try{let t=g__namespace.readFileSync(v(),"utf8"),r=JSON.parse(t).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}function Nr(){try{let t=g__namespace.readFileSync(v(),"utf8");return JSON.parse(t).env??null}catch{return null}}var Pr,br,We=m(()=>{"use strict";ue();Pr="flow-ai-obs",br="config.json";});function pe(t){try{let e=g__namespace.statSync(t);Date.now()-e.mtimeMs>Us&&g__namespace.unlinkSync(t);}catch{}try{g__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 fe(t){try{g__namespace.unlinkSync(t);}catch{}}function Ur(t,e){let n=(Array.isArray(t)?t:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [e,...n]}function $r(){let t=v(),e=t+".lock",r=[];g__namespace.mkdirSync(It__namespace.dirname(t),{recursive:true}),pe(e);try{if(g__namespace.existsSync(t)){g__namespace.copyFileSync(t,t+".bkp");try{g__namespace.chmodSync(t+".bkp",384);}catch{}}let n=le();if(g__namespace.existsSync(n)){let l=n+".bkp";g__namespace.copyFileSync(n,l);try{g__namespace.chmodSync(l,384);}catch{}}let s={};try{s=JSON.parse(g__namespace.readFileSync(t,"utf8"));}catch{}let o=s.env&&typeof s.env=="object"?s.env:{};delete o.OTEL_EXPORTER_OTLP_HEADERS,s.env={...o,...j,...Bt()},s.otelHeadersHelper="flow-ai-obs otel-headers",(!s.hooks||typeof s.hooks!="object"||Array.isArray(s.hooks))&&(s.hooks={});let i=(l,d)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${l}`,timeout:d}]}),a=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],c=s.hooks;for(let l of a){let d=Ur(c[l],i(l,Me[l]));d.length>1&&r.push(l),c[l]=d;}g__namespace.writeFileSync(t,JSON.stringify(s,null,2)+`
34
+ `,{encoding:"utf8",mode:384});try{g__namespace.chmodSync(t,384);}catch{}}finally{fe(e);}return {settingsPath:t,preserved:r}}function Rt(t){try{let e=g__namespace.readFileSync(v(),"utf8"),n=JSON.parse(e).env?.[t];return typeof n=="string"?n:null}catch{return null}}function J(t){let e=v(),r=e+".lock";g__namespace.mkdirSync(It__namespace.dirname(e),{recursive:true}),pe(r);try{let n={};try{n=JSON.parse(g__namespace.readFileSync(e,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,t),g__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
35
+ `,{encoding:"utf8",mode:384});try{g__namespace.chmodSync(e,384);}catch{}}finally{fe(r);}}function Fr(){let t=v(),e=t+".lock",r=[];g__namespace.mkdirSync(It__namespace.dirname(t),{recursive:true}),pe(e);try{if(g__namespace.existsSync(t)){g__namespace.copyFileSync(t,t+".bkp");try{g__namespace.chmodSync(t+".bkp",384);}catch{}}let n={};try{n=JSON.parse(g__namespace.readFileSync(t,"utf8"));}catch{}n.otelHeadersHelper="flow-ai-obs otel-headers",(!n.hooks||typeof n.hooks!="object"||Array.isArray(n.hooks))&&(n.hooks={});let s=(a,c)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${a}`,timeout:c}]}),o=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],i=n.hooks;for(let a of o){let c=Ur(i[a],s(a,Me[a]));c.length>1&&r.push(a),i[a]=c;}g__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
36
+ `,{encoding:"utf8",mode:384});try{g__namespace.chmodSync(t,384);}catch{}}finally{fe(e);}return {settingsPath:t,preserved:r}}function xr(t){let e=v(),r=e+".lock";g__namespace.mkdirSync(It__namespace.dirname(e),{recursive:true}),pe(r);try{let n={};try{n=JSON.parse(g__namespace.readFileSync(e,"utf8"));}catch{return}if(!n.env||typeof n.env!="object")return;for(let s of t)delete n.env[s];g__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
37
+ `,{encoding:"utf8",mode:384});try{g__namespace.chmodSync(e,384);}catch{}}finally{fe(r);}}var Us,Vt=m(()=>{"use strict";O();vt();ue();We();Us=Ar.LOCK_STALE_MS;});function Wt(){let t=lt__namespace.default.homedir();if(process.platform==="darwin")return It__namespace.default.join(t,"Library","Preferences",ae,ce);if(process.platform==="win32"){let r=process.env.APPDATA??It__namespace.default.join(t,"AppData","Roaming");return It__namespace.default.join(r,ae,ce)}let e=process.env.XDG_CONFIG_HOME??It__namespace.default.join(t,".config");return It__namespace.default.join(e,ae,ce)}function Ge(){try{let t=g__namespace.default.readFileSync(Wt(),"utf8");return JSON.parse(t)}catch{return {}}}function Dr(t){let e=Wt();g__namespace.default.mkdirSync(It__namespace.default.dirname(e),{recursive:true}),g__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var Ye,me,Br=m(()=>{"use strict";O();Ye={credentials:"credentials","token-cache":"tokenCache"};me=class{static isAvailable(){return !0}static hasExistingData(){try{if(!g__namespace.default.existsSync(Wt()))return !1;let e=JSON.parse(g__namespace.default.readFileSync(Wt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,r){let n=Ge(),s=Ye[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(e,r,n){let s=Ge(),o=Ye[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;Dr(s);}async deleteSecret(e,r){let n=Ge(),s=Ye[r]??r;return s in n?(delete n[s],Dr(n),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Wt()}`}};});var Mr={};M(Mr,{MacOsKeyVaultProvider:()=>Ke});var Je,Ke,Hr=m(()=>{"use strict";Je=util.promisify(child_process.execFile),Ke=class{static async isAvailable(){try{return g.accessSync("/usr/bin/security",g.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await Je("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await Je("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await Je("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Vr={};M(Vr,{LinuxKeyVaultProvider:()=>qe});var jr,qe,Wr=m(()=>{"use strict";jr=util.promisify(child_process.execFile),qe=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of e)try{return g.accessSync(r,g.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await jr("secret-tool",["lookup","service",e,"account",r]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await new Promise((s,o)=>{let i=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",r]);i.on("error",o),i.on("close",a=>{a===0?s():o(new Error(`secret-tool exited with code ${a}`));}),i.stdin.write(n),i.stdin.end();});}async deleteSecret(e,r){try{return await jr("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Yr={};M(Yr,{WindowsKeyVaultProvider:()=>Xe});var Xe,Gr=m(()=>{"use strict";Xe=class{static async isAvailable(){try{return await xt("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return xt("keytar").getPassword(e,r)}async setSecret(e,r,n){await xt("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return xt("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});async function Jr(){return await Ys()??new me}async function Ys(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Hr(),Mr));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Wr(),Vr));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Gr(),Yr));return await t.isAvailable()?new t:null}default:return null}}var Kr=m(()=>{"use strict";Br();});function zr(){return ze||(ze=Jr()),ze}async function Gt(t){await(await zr()).setSecret(qr,Xr,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function Pt(){let e=await(await zr()).getSecret(qr,Xr);if(!e)return null;try{let r=JSON.parse(e);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function ge(){let t=await Pt();return t?new Date(t.expiresAt)>new Date:false}async function Jt(){let t=await Pt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}var qr,zi,Xr,ze,he=m(()=>{"use strict";Kr();O();qr=ie.SERVICE,zi=ie.ACCOUNT_CREDS,Xr=ie.ACCOUNT_TOKEN,ze=null;});function Js(t){return Gs.some(e=>e.test(t))}function Ks(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function b(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:s,tenant:o}=r;return !n||!s||!o?null:{clientId:n,clientSecret:s,tenant:o}}catch{return null}}function Zr(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${r}.`}function dt(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[p.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&Js(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Qr(){let t=b(process.env[p.ANTHROPIC_AUTH_TOKEN]);return t?{user:await Jt().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function qs(){return new Date().toISOString().slice(0,10)}async function Xs(t){let e=qs(),r=await Pt();if(r?.lastAuthCheckAt!==e){u("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let o=await W(t);try{await Gt({...o,lastAuthCheckAt:e});}catch{}return u("getOrRefreshToken",`daily check passed, expires=${o.expiresAt}`),o.accessToken}catch(o){if(o instanceof ct)throw o;u("getOrRefreshToken",`daily check network error \u2014 using cache: ${o.message}`);}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(u("getOrRefreshToken",`cacheValid=${n}`),n)return u("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;u("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let s=await W(t);try{await Gt({...s,lastAuthCheckAt:e});}catch(o){u("getOrRefreshToken",`token cache save failed (non-fatal): ${o.message}`);}return u("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function zs(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function Zs(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function K(){let t=[],e=process.env[p.ANTHROPIC_MODEL]??"",r=b(process.env[p.ANTHROPIC_AUTH_TOKEN]);u("resolveCredentials",r?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),r&&u("resolveCredentials",`clientId=${r.clientId}`,`tenant=${r.tenant}`);let n=r?r.tenant:"",s=process.env[p.FLOW_TELEMETRY]==="true",o=process.env[p.LANGFUSE_BASE_URL],i=process.env[p.LANGFUSE_PUBLIC_KEY],a=process.env[p.LANGFUSE_SECRET_KEY];if(s&&o&&i&&a){let w="",T=n;r&&(w=await Jt().catch(()=>null)??r.clientId);let A={user:w??"",tenant:T??"",team:"",project:"",model:e};t.push({mode:"direct",...Zs(dt(o),i,a),...A}),u("resolveCredentials","direct mode active",`user=${A.user}`,`tenant=${A.tenant}`);}if(!r){if(t.length===0){let w=[];return w.authError=false,w}return t}let c;try{c=await Xs(r);}catch(w){if(u("resolveCredentials",`token refresh failed: ${w.message}`,`(tenant=${r.tenant} clientId=${r.clientId})`),t.length>0)return t.authError=true,t;let T=[];return T.authError=true,T}let d={user:Ks(c)??r.clientId,tenant:n,team:"",project:"",model:e},h=process.env[p.FLOW_TELEMETRY_GATEWAY]??at();return t.push({mode:"gateway",...zs(dt(h),{accessToken:c}),...d}),t}async function tn(){return (await K()).length>0}var Gs,Y=m(()=>{"use strict";he();vt();O();D();Gs=[/^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 we(){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 Qe(){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}}function en(){if(child_process.spawnSync("node",["--version"],{encoding:"utf8",timeout:5e3}).status!==0)return {success:false,error:"no_nodejs",message:`Node.js is not installed. Install Node.js 18+ and try again:
38
38
  ${{darwin:`brew install node
39
39
  or download from: https://nodejs.org`,win32:`winget install OpenJS.NodeJS
40
- or download from: https://nodejs.org`,linux:"See package manager instructions at: https://nodejs.org/en/download/package-manager"}[process.platform]??"Download from: https://nodejs.org"}`};let e=child_process.spawnSync("npm",["install","-g",Xe],{encoding:"utf8",stdio:["inherit","inherit","pipe"],timeout:12e4});if(e.status===0)return {success:true};let r=String(e.stderr??""),n=e.error,s=n instanceof Error?n.message:r;return s.includes("EACCES")||s.includes("permission denied")||s.includes("EPERM")||r.includes("EACCES")||r.includes("EPERM")?{success:false,error:"permission_denied",message:process.platform==="win32"?`Run this terminal as Administrator and try again:
41
- npm install -g ${Xe}`:`Try with elevated permissions:
42
- sudo npm install -g ${Xe}`}:{success:false,error:"unknown",message:s||"npm install failed"}}var Xe,Ze=m(()=>{"use strict";Xe="@anthropic-ai/claude-code";});function Qe(){return Lt__namespace.default.join(lt__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function rn(){try{let t=Qe();w__namespace.default.mkdirSync(Lt__namespace.default.dirname(t),{recursive:!0}),w__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function nn(){try{w__namespace.default.unlinkSync(Qe());}catch{}}function tr(){try{return w__namespace.default.existsSync(Qe())}catch{return false}}var sn=m(()=>{"use strict";});var er={};B(er,{promptRaw:()=>X,runLogin:()=>dt,runLogout:()=>no,runStatus:()=>so});function z(t){return typeof t=="string"?t.replace(Qs,""):t}function X(t,e={}){return new Promise((r,n)=>{if(typeof process.stdin.setRawMode!="function"){n(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:o=""}=e;process.stdout.write(t+o);let i=o;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=d=>{if(d===""){l(),n(new Error("SIGINT"));return}if(d==="\r"||d===`
40
+ or download from: https://nodejs.org`,linux:"See package manager instructions at: https://nodejs.org/en/download/package-manager"}[process.platform]??"Download from: https://nodejs.org"}`};let e=child_process.spawnSync("npm",["install","-g",Ze],{encoding:"utf8",stdio:["inherit","inherit","pipe"],timeout:12e4});if(e.status===0)return {success:true};let r=String(e.stderr??""),n=e.error,s=n instanceof Error?n.message:r;return s.includes("EACCES")||s.includes("permission denied")||s.includes("EPERM")||r.includes("EACCES")||r.includes("EPERM")?{success:false,error:"permission_denied",message:process.platform==="win32"?`Run this terminal as Administrator and try again:
41
+ npm install -g ${Ze}`:`Try with elevated permissions:
42
+ sudo npm install -g ${Ze}`}:{success:false,error:"unknown",message:s||"npm install failed"}}var Ze,tr=m(()=>{"use strict";Ze="@anthropic-ai/claude-code";});function er(){return It__namespace.default.join(lt__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function nn(){try{let t=er();g__namespace.default.mkdirSync(It__namespace.default.dirname(t),{recursive:!0}),g__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function sn(){try{g__namespace.default.unlinkSync(er());}catch{}}function rr(){try{return g__namespace.default.existsSync(er())}catch{return false}}var on=m(()=>{"use strict";});var nr={};M(nr,{promptRaw:()=>X,runLogin:()=>pt,runLogout:()=>so,runStatus:()=>oo});function z(t){return typeof t=="string"?t.replace(to,""):t}function X(t,e={}){return new Promise((r,n)=>{if(typeof process.stdin.setRawMode!="function"){n(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:o=""}=e;process.stdout.write(t+o);let i=o;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=d=>{if(d===""){l(),n(new Error("SIGINT"));return}if(d==="\r"||d===`
43
43
  `){l(),process.stdout.write(`
44
- `),r(i);return}if(d==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}d.startsWith("\x1B")||(i+=d,process.stdout.write(s?"*".repeat(d.length):d));};function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",a),process.removeListener("unhandledRejection",a);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}async function on(t){let{accessToken:e,expiresAt:r}=await Y(t),n=zr(t);J({[p.ANTHROPIC_AUTH_TOKEN]:n}),nn(),await Gt({accessToken:e,expiresAt:r});}async function to(t){try{return await on(t),process.stdout.write(P(` \u2713 Setup complete. Tenant: ${z(t.tenant)}
44
+ `),r(i);return}if(d==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}d.startsWith("\x1B")||(i+=d,process.stdout.write(s?"*".repeat(d.length):d));};function l(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",a),process.removeListener("unhandledRejection",a);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}async function an(t){let{accessToken:e,expiresAt:r}=await W(t),n=Zr(t);J({[p.ANTHROPIC_AUTH_TOKEN]:n}),sn(),await Gt({accessToken:e,expiresAt:r});}async function eo(t){try{return await an(t),process.stdout.write(P(` \u2713 Setup complete. Tenant: ${z(t.tenant)}
45
45
 
46
- `)),0}catch(e){return process.stderr.write(R(` \u2717 Authentication failed: ${z(e.message)}
47
- `)),1}}async function eo(){try{process.stdout.write(`
48
- `);let t=(await X(L(" ? ")+"Client ID: ")).trim(),e=(await X(L(" ? ")+"Client Secret: ",{masked:!0})).trim(),r=(await X(L(" ? ")+"Tenant: ")).trim();if(!t||!e||!r)return process.stderr.write(R(` \u2717 All fields are required
49
- `)),1;try{await on({clientId:t,clientSecret:e,tenant:r});}catch(n){return process.stderr.write(R(` \u2717 Authentication failed: ${z(n.message)}
46
+ `)),0}catch(e){return process.stderr.write(L(` \u2717 Authentication failed: ${z(e.message)}
47
+ `)),1}}async function ro(){try{process.stdout.write(`
48
+ `);let t=(await X(R(" ? ")+"Client ID: ")).trim(),e=(await X(R(" ? ")+"Client Secret: ",{masked:!0})).trim(),r=(await X(R(" ? ")+"Tenant: ")).trim();if(!t||!e||!r)return process.stderr.write(L(` \u2717 All fields are required
49
+ `)),1;try{await an({clientId:t,clientSecret:e,tenant:r});}catch(n){return process.stderr.write(L(` \u2717 Authentication failed: ${z(n.message)}
50
50
  `)),1}return process.stdout.write(P(` \u2713 Setup complete. Tenant: ${z(r)}
51
51
  `)),process.stdout.write(` Storage: ANTHROPIC_AUTH_TOKEN (settings.json)
52
52
 
53
- `),0}catch(t){if(t.message==="SIGINT"||t.message==="NOT_A_TTY")throw t;return process.stderr.write(R(` \u2717 Unexpected error: ${t.message}
54
- `)),1}}async function dt(t={}){let e=ut();if(e)return e;if(t.clientId&&t.clientSecret&&t.tenant)return to({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant});let n=tr()?null:b(Rt(p.ANTHROPIC_AUTH_TOKEN)??process.env[p.ANTHROPIC_AUTH_TOKEN]);if(n){process.stdout.write(`
53
+ `),0}catch(t){if(t.message==="SIGINT"||t.message==="NOT_A_TTY")throw t;return process.stderr.write(L(` \u2717 Unexpected error: ${t.message}
54
+ `)),1}}async function pt(t={}){let e=ut();if(e)return e;if(t.clientId&&t.clientSecret&&t.tenant)return eo({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant});let n=rr()?null:b(Rt(p.ANTHROPIC_AUTH_TOKEN)??process.env[p.ANTHROPIC_AUTH_TOKEN]);if(n){process.stdout.write(`
55
55
  `),process.stdout.write(H(` Already authenticated
56
56
  `)),process.stdout.write(E(" Tenant: ")+z(n.tenant)+`
57
57
  `),process.stdout.write(E(" Client ID: ")+z(n.clientId)+`
58
58
  `),process.stdout.write(`
59
- `);let s;try{s=await X(L(" ? ")+"Re-authenticate? (y/N): ");}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
59
+ `);let s;try{s=await X(R(" ? ")+"Re-authenticate? (y/N): ");}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
60
60
  `),130;if(o.message==="NOT_A_TTY")return process.stdout.write(P(` \u2713 Using existing credentials.
61
61
 
62
62
  `)),0;throw o}if(s.trim().toLowerCase()!=="y")return process.stdout.write(P(` \u2713 Using existing credentials.
63
63
 
64
- `)),0}try{return await eo()}catch(s){if(s.message==="SIGINT")return process.stdout.write(`
65
- `),130;if(s.message==="NOT_A_TTY")return process.stderr.write(R(` \u2717 No credentials found and no TTY available for interactive login.
66
- `)+" Pass --client-id, --client-secret and --tenant, or run `flow-ai-obs auth login` in a terminal.\n\n"),1;throw s}}async function ro(){try{return process.stdout.write(`
67
- `),(await X(L(" ? ")+"Are you sure? This will remove your local credentials. (y/N): ")).toLowerCase()!=="y"?(process.stdout.write(k(` \u26A0 Logout cancelled
64
+ `)),0}try{return await ro()}catch(s){if(s.message==="SIGINT")return process.stdout.write(`
65
+ `),130;if(s.message==="NOT_A_TTY")return process.stderr.write(L(` \u2717 No credentials found and no TTY available for interactive login.
66
+ `)+" Pass --client-id, --client-secret and --tenant, or run `flow-ai-obs auth login` in a terminal.\n\n"),1;throw s}}async function no(){try{return process.stdout.write(`
67
+ `),(await X(R(" ? ")+"Are you sure? This will remove your local credentials. (y/N): ")).toLowerCase()!=="y"?(process.stdout.write(k(` \u26A0 Logout cancelled
68
68
  `)),0):null}catch(t){if(t.message==="SIGINT")return process.stdout.write(`
69
- `),130;throw t}}async function no(t=false){let e=ut();if(e)return e;if(!b(Rt(p.ANTHROPIC_AUTH_TOKEN)??process.env[p.ANTHROPIC_AUTH_TOKEN]))return process.stdout.write(k(` \u26A0 You are not authenticated
70
- `)),0;if(!t){let n=await ro();if(n!==null)return n}try{return Pr([p.ANTHROPIC_AUTH_TOKEN]),delete process.env[p.ANTHROPIC_AUTH_TOKEN],rn(),process.stdout.write(P(` \u2713 Credentials removed successfully
71
- `)),0}catch{return process.stderr.write(R(` \u2717 Error removing credentials
72
- `)),1}}async function so(){if(tr())return process.stdout.write(k(" \u26A0 Not authenticated. Run `flow-ai-obs auth login` to set up.\n")),0;let t=b(Rt(p.ANTHROPIC_AUTH_TOKEN)??process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!t)return process.stdout.write(k(" \u26A0 Not authenticated. Run `flow-ai-obs auth login` to set up.\n")),0;if(!await me())return process.stdout.write(k(" \u26A0 Session expired. Run `flow-ai-obs auth login` to re-authenticate.\n")),0;let e=t.clientSecret.length>4?"****...****"+t.clientSecret.slice(-4):"****";return process.stdout.write(`
69
+ `),130;throw t}}async function so(t=false){let e=ut();if(e)return e;if(!b(Rt(p.ANTHROPIC_AUTH_TOKEN)??process.env[p.ANTHROPIC_AUTH_TOKEN]))return process.stdout.write(k(` \u26A0 You are not authenticated
70
+ `)),0;if(!t){let n=await no();if(n!==null)return n}try{return xr([p.ANTHROPIC_AUTH_TOKEN]),delete process.env[p.ANTHROPIC_AUTH_TOKEN],nn(),process.stdout.write(P(` \u2713 Credentials removed successfully
71
+ `)),0}catch{return process.stderr.write(L(` \u2717 Error removing credentials
72
+ `)),1}}async function oo(){if(rr())return process.stdout.write(k(" \u26A0 Not authenticated. Run `flow-ai-obs auth login` to set up.\n")),0;let t=b(Rt(p.ANTHROPIC_AUTH_TOKEN)??process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!t)return process.stdout.write(k(" \u26A0 Not authenticated. Run `flow-ai-obs auth login` to set up.\n")),0;if(!await ge())return process.stdout.write(k(" \u26A0 Session expired. Run `flow-ai-obs auth login` to re-authenticate.\n")),0;let e=t.clientSecret.length>4?"****...****"+t.clientSecret.slice(-4):"****";return process.stdout.write(`
73
73
  `+H(` Authenticated
74
74
  `)),process.stdout.write(E(" Tenant: ")+z(t.tenant)+`
75
75
  `),process.stdout.write(E(" Client ID: ")+z(t.clientId)+`
76
76
  `),process.stdout.write(E(" Client Secret: ")+e+`
77
77
  `),process.stdout.write(E(" Storage: ")+`ANTHROPIC_AUTH_TOKEN (settings.json)
78
78
 
79
- `),0}var Qs,Kt=m(()=>{"use strict";ge();sn();At();W();jt();O();it();Bt();Qs=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var rr={};B(rr,{runInit:()=>ao});function oo(){try{let t=w__namespace.readFileSync(v(),"utf8"),e=JSON.parse(t);return !!(e.env&&e.env[p.ANTHROPIC_AUTH_TOKEN])}catch{return false}}function io(){let t=pe();if(!t)return null;J({FLOW_BASE_URL:t});try{let e=Ur(),r={};try{r=JSON.parse(w__namespace.readFileSync(e,"utf8"));}catch{return t}delete r.baseUrl,Object.keys(r).length===0?w__namespace.unlinkSync(e):w__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
80
- `,{encoding:"utf8",mode:384});}catch{}return t}function un(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}if(e.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);let r=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],Pt(t);}finally{r!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=r);}if(e.pathname!=="/"&&e.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
79
+ `),0}var to,Kt=m(()=>{"use strict";he();on();vt();Y();Vt();O();it();Mt();to=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var or={};M(or,{normalizeCustomUrl:()=>ln,runInit:()=>co,validateCustomUrl:()=>sr});function io(){try{let t=g__namespace.readFileSync(v(),"utf8"),e=JSON.parse(t);return !!(e.env&&e.env[p.ANTHROPIC_AUTH_TOKEN])}catch{return false}}function ao(){let t=de();if(!t)return null;J({FLOW_BASE_URL:t});try{let e=le(),r={};try{r=JSON.parse(g__namespace.readFileSync(e,"utf8"));}catch{return t}delete r.baseUrl,Object.keys(r).length===0?g__namespace.unlinkSync(e):g__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
80
+ `,{encoding:"utf8",mode:384});}catch{}return t}function ln(t){let e=t.trim().replace(/\\/g,"/");/^https?:\/\//i.test(e)||(e=`https://${e}`);try{let r=new URL(e);return `${r.protocol}//${r.host}`}catch{return e}}function sr(t,e=false){if(e){let o;try{o=new URL(t);}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.
81
81
  Received: ${t}
82
- Expected: https://tenant.example.com`);if(e.search)throw new Error(`Custom URL must not contain query parameters.
82
+ Expected: https://tenant.example.com`);if(o.search)throw new Error(`Custom URL must not contain query parameters.
83
83
  Received: ${t}
84
- Expected: https://tenant.example.com`);if(e.hash)throw new Error(`Custom URL must not contain fragment.
84
+ Expected: https://tenant.example.com`);if(o.hash)throw new Error(`Custom URL must not contain a fragment.
85
85
  Received: ${t}
86
- Expected: https://tenant.example.com`);return t.replace(/\/$/,"")}async function an(){for(let t=1;t<=3;t++)try{let e=await wr(" Enter your Flow base URL (e.g., https://tenant.ciandt.com)");return un(e)}catch(e){if(process.stderr.write(k(` \u2717 ${e.message}
86
+ Expected: https://tenant.example.com`);let i=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],dt(t);}finally{i!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=i);}return t.replace(/\/$/,"")}let r=ln(t),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${t}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!n.hostname.includes("."))throw new Error(`Invalid domain: ${n.hostname}. Expected format: tenant.example.com`);let s=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],dt(r);}finally{s!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function cn(){for(let t=1;t<=3;t++)try{let e=await Sr(" Enter your Flow domain (e.g., tenant.ciandt.com)");return sr(e)}catch(e){if(process.stderr.write(k(` \u2717 ${e.message}
87
87
 
88
- `)),t===3)throw process.stderr.write(R(` Too many invalid attempts.
88
+ `)),t===3)throw process.stderr.write(L(` Too many invalid attempts.
89
89
 
90
- `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function cn(){try{let t=w__namespace.readFileSync(v(),"utf8"),r=JSON.parse(t).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}async function ao(t={}){let e=ut();if(e)return e;let r=t.url;if(!he())return process.stderr.write(`
91
- `+R(` \u2717 Claude Code is not installed or not found in PATH.
90
+ `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function un(){try{let t=g__namespace.readFileSync(v(),"utf8"),r=JSON.parse(t).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}async function co(t={}){let e=ut();if(e)return e;let r=t.url;if(!we())return process.stderr.write(`
91
+ `+L(` \u2717 Claude Code is not installed or not found in PATH.
92
92
 
93
93
  `)+` flow-ai-obs requires Claude Code to function.
94
94
  Install it with:
95
95
 
96
- `+L(" npm install -g @anthropic-ai/claude-code")+`
96
+ `+R(" npm install -g @anthropic-ai/claude-code")+`
97
97
 
98
98
  `),1;process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(k(` \u26A0 WSL detected. If Claude Code is installed on Windows, install flow-ai-obs
99
- `)+k(" on Windows too: ")+L(`npm install -g @ciandt-flow/flow-ai-obs
99
+ `)+k(" on Windows too: ")+R(`npm install -g @ciandt-flow/flow-ai-obs
100
100
  `)+k(` Running Claude (Windows) + flow-ai-obs (WSL) is not a supported configuration.
101
101
 
102
- `));let n=io();if(n&&process.stdout.write(k(` \u26A0 Legacy config migrated.
102
+ `));let n=ao();if(n&&process.stdout.write(k(` \u26A0 Legacy config migrated.
103
103
  `)+E(` Custom URL moved from ~/.config/flow-ai-obs/config.json
104
104
  `)+E(` to FLOW_BASE_URL in ~/.claude/settings.json: ${n}
105
105
 
106
- `)),!r&&!t.noInteractive&&St()){let d=cn();try{d?(process.stdout.write(`
106
+ `)),!r&&!t.noInteractive&&yt()){let d=un();try{d?(process.stdout.write(`
107
107
  Current base URL: ${H(d)}
108
- `),await Pe(" Keep this URL?",!0)||(r=await an())):(process.stdout.write(`
109
- `),await Pe(" Does your organization use a custom Flow URL?",!1)&&(r=await an()));}catch{return 1}process.stdout.write(`
110
- `);}if(!r&&!t.noInteractive&&!St()){let d=cn(),g=process.env.FLOW_BASE_URL,h=d??g??Dt,T=!!(d??g);process.stdout.write(k(` \u26A0 Non-interactive environment detected.
111
- `)+E(` Using URL: ${h}
108
+ `),await be(" Keep this URL?",!0)||(r=await cn())):(process.stdout.write(`
109
+ `),await be(" Does your organization use a custom Flow URL?",!1)&&(r=await cn()));}catch{return 1}process.stdout.write(`
110
+ `);}if(!r&&!t.noInteractive&&!yt()){let d=un(),h=process.env.FLOW_BASE_URL,w=d??h??Dt,T=!!(d??h);process.stdout.write(k(` \u26A0 Non-interactive environment detected.
111
+ `)+E(` Using URL: ${w}
112
112
  `)+(T?"":E(` Run with --custom-url to configure a custom domain.
113
113
  `))+`
114
- `);}let s=null,o=null;if(r){let d;try{d=un(r);}catch(wt){return process.stderr.write(`
115
- \u2717 Invalid --custom-url: ${wt.message}
114
+ `);}let s=null,o=null;if(r){let d;try{d=sr(r,!0);}catch(Et){return process.stderr.write(`
115
+ \u2717 Invalid --custom-url: ${Et.message}
116
116
 
117
- `),1}let g=pe(),h=$r(),T=`${d}/otel`,A=`${d}/flow-llm-proxy/`,_=g??Dt,ht=h?.OTEL_EXPORTER_OTLP_ENDPOINT&&h.OTEL_EXPORTER_OTLP_ENDPOINT!==`${_}/otel`,nt=h?.ANTHROPIC_BASE_URL&&h.ANTHROPIC_BASE_URL!==`${_}/flow-llm-proxy/`;o={FLOW_BASE_URL:d,OTEL_EXPORTER_OTLP_ENDPOINT:ht?h.OTEL_EXPORTER_OTLP_ENDPOINT:T,ANTHROPIC_BASE_URL:nt?h.ANTHROPIC_BASE_URL:A},s=d,g&&g!==d?process.stdout.write(k(` \u26A0 Base URL updated.
118
- `)+E(` Previous: ${g}
117
+ `),1}let h=de(),w=Nr(),T=`${d}/otel`,A=`${d}/flow-llm-proxy/`,_=h??Dt,wt=w?.OTEL_EXPORTER_OTLP_ENDPOINT&&w.OTEL_EXPORTER_OTLP_ENDPOINT!==`${_}/otel`,nt=w?.ANTHROPIC_BASE_URL&&w.ANTHROPIC_BASE_URL!==`${_}/flow-llm-proxy/`;o={FLOW_BASE_URL:d,OTEL_EXPORTER_OTLP_ENDPOINT:wt?w.OTEL_EXPORTER_OTLP_ENDPOINT:T,ANTHROPIC_BASE_URL:nt?w.ANTHROPIC_BASE_URL:A},s=d,h&&h!==d?process.stdout.write(k(` \u26A0 Base URL updated.
118
+ `)+E(` Previous: ${h}
119
119
  `)+E(` New: ${d}
120
120
 
121
121
  `)):process.stdout.write(P(` \u2713 Base URL configured: ${d}
122
122
 
123
- `));}if(!oo())if(t.noInteractive||!St())process.stdout.write(k(" \u26A0 No credentials found in settings.json \u2014 run `flow-ai-obs auth login` to authenticate.\n\n"));else {process.stdout.write(k(` \u26A0 No credentials found in settings.json \u2014 authentication required.
123
+ `));}if(!io())if(t.noInteractive||!yt())process.stdout.write(k(" \u26A0 No credentials found in settings.json \u2014 run `flow-ai-obs auth login` to authenticate.\n\n"));else {process.stdout.write(k(` \u26A0 No credentials found in settings.json \u2014 authentication required.
124
124
 
125
- `));let{runLogin:d}=await Promise.resolve().then(()=>(Kt(),er)),g=await d();if(g!==0)return g}let i,a;try{(({settingsPath:i,preserved:a}=Lr())),o&&J(o);}catch(d){return process.stderr.write(` \u2717 Failed to write settings: ${d.message}
125
+ `));let{runLogin:d}=await Promise.resolve().then(()=>(Kt(),nr)),h=await d();if(h!==0)return h}let i,a;try{(({settingsPath:i,preserved:a}=$r())),o&&J(o);}catch(d){return process.stderr.write(` \u2717 Failed to write settings: ${d.message}
126
126
  `),1}process.stdout.write(`
127
127
  `+H(" Native OTEL configured")+` (metrics & logs)
128
- `);let c=o?{...j,OTEL_EXPORTER_OTLP_ENDPOINT:o.OTEL_EXPORTER_OTLP_ENDPOINT}:j;for(let[d,g]of Object.entries(c))process.stdout.write(E(` ${d.padEnd(36)}`)+g+`
128
+ `);let c=o?{...j,OTEL_EXPORTER_OTLP_ENDPOINT:o.OTEL_EXPORTER_OTLP_ENDPOINT}:j;for(let[d,h]of Object.entries(c))process.stdout.write(E(` ${d.padEnd(36)}`)+h+`
129
129
  `);process.stdout.write(`
130
130
  `),process.stdout.write(H(" Hooks registered")+` (Langfuse trace capture)
131
131
  `),process.stdout.write(E(" UserPromptSubmit")+` \u2192 flow-ai-obs UserPromptSubmit (timeout: 5s)
@@ -139,16 +139,16 @@
139
139
  `),process.stdout.write(E(" Settings: ")+i+`
140
140
  `),process.stdout.write(E(" Backup: ")+i+`.bkp
141
141
  `),process.stdout.write(E(" OTEL auth: flow-ai-obs otel-headers")+E(` (reads ANTHROPIC_AUTH_TOKEN from settings.json)
142
- `));let l=s??pe()??process.env.FLOW_BASE_URL??Dt;return process.stdout.write(E(" Base URL: ")+l+`
142
+ `));let l=s??de()??process.env.FLOW_BASE_URL??Dt;return process.stdout.write(E(" Base URL: ")+l+`
143
143
  `),process.stdout.write(`
144
144
  `),t.skipHint||(process.stdout.write(P(` \u2713 Ready. Native OTEL + Langfuse trace capture active.
145
- `)),process.stdout.write(E(" Run `flow-ai-obs setup` to configure a full environment from scratch.\n\n"))),0}var nr=m(()=>{"use strict";jt();O();it();ue();Bt();Fr();W();Ze();be();});var pn={};B(pn,{runSetup:()=>mo});function co(){try{return JSON.parse(w__namespace.readFileSync(v(),"utf8"))}catch{return {}}}function uo(t){return !!(t.env??{}).ANTHROPIC_BASE_URL}function lo(t){let e=t.env??{};return Object.keys(j).every(r=>!!e[r])}function po(t){let e=t.hooks??{};return ["UserPromptSubmit","PreToolUse","PostToolUse","Stop"].every(n=>{let s=e[n];return Array.isArray(s)?s.some(o=>{let i=o;return Array.isArray(i?.hooks)&&i.hooks.some(a=>a?.command?.startsWith("flow-ai-obs "))}):false})}async function fo(t){return (await X(t)).trim().toLowerCase()==="y"}function Ee(t,e,r){process.stdout.write(`
145
+ `)),process.stdout.write(E(" Run `flow-ai-obs setup` to configure a full environment from scratch.\n\n"))),0}var ir=m(()=>{"use strict";Vt();O();it();ue();Mt();We();Y();tr();Ce();});var fn={};M(fn,{runSetup:()=>go});function uo(){try{return JSON.parse(g__namespace.readFileSync(v(),"utf8"))}catch{return {}}}function lo(t){return !!(t.env??{}).ANTHROPIC_BASE_URL}function po(t){let e=t.env??{};return Object.keys(j).every(r=>!!e[r])}function fo(t){let e=t.hooks??{};return ["UserPromptSubmit","PreToolUse","PostToolUse","Stop"].every(n=>{let s=e[n];return Array.isArray(s)?s.some(o=>{let i=o;return Array.isArray(i?.hooks)&&i.hooks.some(a=>a?.command?.startsWith("flow-ai-obs "))}):false})}async function mo(t){return (await X(t)).trim().toLowerCase()==="y"}function Te(t,e,r){process.stdout.write(`
146
146
  ${H(`[${t}/${e}]`)} ${r}
147
147
  `);}function q(t){process.stdout.write(P(` \u2713 ${t}
148
- `));}function ln(t){process.stdout.write(k(` \u26A0 ${t}
149
- `));}function qt(t){process.stderr.write(R(` \u2717 ${t}
150
- `));}function pt(t){process.stdout.write(E(` ${t}
151
- `));}async function mo(t={}){let e=ut();if(e)return e;let r=4;process.stdout.write(`
148
+ `));}function dn(t){process.stdout.write(k(` \u26A0 ${t}
149
+ `));}function qt(t){process.stderr.write(L(` \u2717 ${t}
150
+ `));}function ft(t){process.stdout.write(E(` ${t}
151
+ `));}async function go(t={}){let e=ut();if(e)return e;let r=4;process.stdout.write(`
152
152
  \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
153
153
  `),process.stdout.write(`\u2551 flow-ai-obs \u2014 setup \u2551
154
154
  `),process.stdout.write(`\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
@@ -159,40 +159,40 @@ ${H(`[${t}/${e}]`)} ${r}
159
159
  `)),process.stdout.write(E(` [3/4] AI Usage Enable native OTEL telemetry
160
160
  `)),process.stdout.write(E(` [4/4] Langfuse Register trace capture hooks
161
161
  `)),process.stdout.write(`
162
- `);let n=co();if(Ee(1,r,"Checking Claude Code..."),he()){let s=ze();q(s?`Already installed (${s}) \u2014 skipping.`:"Already installed \u2014 skipping.");}else {pt("Not found. Installing via npm...");let s=tn();if(!s.success)return qt(s.message??"Failed to install Claude Code."),process.stderr.write(R(` Setup aborted at step 1. Resolve the error above and try again.
163
- `)),1;let o=ze();q(o?`Claude Code ${o} installed.`:"Claude Code installed.");}if(Ee(2,r,"Configuring proxy..."),uo(n)){let s=n.env.ANTHROPIC_BASE_URL;ln(`Proxy already configured (${s})`);let o=t.nonInteractive||!process.stdin.isTTY,i=false;if(!o)try{i=await fo(L(" ? ")+"Replace existing proxy configuration? [y/N]: ");}catch(a){if(a.message==="SIGINT")return process.stdout.write(`
164
- `),130;throw a}if(!i)pt("Keeping existing proxy configuration.");else {let a=await dt(t);if(a!==0)return a;try{J(Mt()),q("Proxy reconfigured.");}catch(c){return qt(`Could not write proxy config: ${c.message}`),1}}}else {let s=await dt(t);if(s!==0)return s;try{J(Mt()),q("Proxy configured."),pt(`Settings: ${v()}`);}catch(o){return qt(`Could not write proxy config: ${o.message}`),1}}if(Ee(3,r,"Configuring AI Usage..."),t.url){let{runInit:s}=await Promise.resolve().then(()=>(nr(),rr)),o=await s({noInteractive:true,url:t.url,skipHint:true});if(o!==0)return o;q("AI Usage configured with custom URL.");}else if(lo(n))q("Already configured \u2014 skipping.");else try{J(j),q("AI Usage configured."),pt(`Settings: ${v()}`);}catch(s){return qt(`Could not write AI Usage config: ${s.message}`),1}if(Ee(4,r,"Configuring Langfuse..."),po(n))q("Already configured \u2014 skipping.");else {let s,o;try{({settingsPath:s,preserved:o}=Ir());}catch(i){return qt(`Could not write hooks: ${i.message}`),1}q("Hooks registered (UserPromptSubmit, PreToolUse, PostToolUse, Stop)"),o.length>0&&(ln(`Third-party hooks preserved on: ${o.join(", ")}`),pt("flow-ai-obs was prepended \u2014 it executes first.")),pt(`Settings: ${s}`),pt(`Backup: ${s}.bkp`);}return process.stdout.write(`
165
- `+P(" \u2713 Setup complete. Run `claude` to start.\n\n")),0}var fn=m(()=>{"use strict";O();it();Bt();Kt();jt();Ze();});var mn={};B(mn,{runOtelHeaders:()=>go});async function go(){let t=b(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!t)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs auth login
166
- `),1;let e;try{e=(await Y(t)).accessToken;}catch(r){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${r.message}
162
+ `);let n=uo();if(Te(1,r,"Checking Claude Code..."),we()){let s=Qe();q(s?`Already installed (${s}) \u2014 skipping.`:"Already installed \u2014 skipping.");}else {ft("Not found. Installing via npm...");let s=en();if(!s.success)return qt(s.message??"Failed to install Claude Code."),process.stderr.write(L(` Setup aborted at step 1. Resolve the error above and try again.
163
+ `)),1;let o=Qe();q(o?`Claude Code ${o} installed.`:"Claude Code installed.");}if(Te(2,r,"Configuring proxy..."),lo(n)){let s=n.env.ANTHROPIC_BASE_URL;dn(`Proxy already configured (${s})`);let o=t.nonInteractive||!process.stdin.isTTY,i=false;if(!o)try{i=await mo(R(" ? ")+"Replace existing proxy configuration? [y/N]: ");}catch(a){if(a.message==="SIGINT")return process.stdout.write(`
164
+ `),130;throw a}if(!i)ft("Keeping existing proxy configuration.");else {let a=await pt(t);if(a!==0)return a;try{J(Bt()),q("Proxy reconfigured.");}catch(c){return qt(`Could not write proxy config: ${c.message}`),1}}}else {let s=await pt(t);if(s!==0)return s;try{J(Bt()),q("Proxy configured."),ft(`Settings: ${v()}`);}catch(o){return qt(`Could not write proxy config: ${o.message}`),1}}if(Te(3,r,"Configuring AI Usage..."),t.url){let{runInit:s}=await Promise.resolve().then(()=>(ir(),or)),o=await s({noInteractive:true,url:t.url,skipHint:true});if(o!==0)return o;q("AI Usage configured with custom URL.");}else if(po(n))q("Already configured \u2014 skipping.");else try{J(j),q("AI Usage configured."),ft(`Settings: ${v()}`);}catch(s){return qt(`Could not write AI Usage config: ${s.message}`),1}if(Te(4,r,"Configuring Langfuse..."),fo(n))q("Already configured \u2014 skipping.");else {let s,o;try{({settingsPath:s,preserved:o}=Fr());}catch(i){return qt(`Could not write hooks: ${i.message}`),1}q("Hooks registered (UserPromptSubmit, PreToolUse, PostToolUse, Stop)"),o.length>0&&(dn(`Third-party hooks preserved on: ${o.join(", ")}`),ft("flow-ai-obs was prepended \u2014 it executes first.")),ft(`Settings: ${s}`),ft(`Backup: ${s}.bkp`);}return process.stdout.write(`
165
+ `+P(" \u2713 Setup complete. Run `claude` to start.\n\n")),0}var mn=m(()=>{"use strict";O();it();Mt();Kt();Vt();tr();});var gn={};M(gn,{runOtelHeaders:()=>ho});async function ho(){let t=b(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!t)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs auth login
166
+ `),1;let e;try{e=(await W(t)).accessToken;}catch(r){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${r.message}
167
167
  `),1}return e?(process.stdout.write(`{"Authorization": "Bearer ${e}"}
168
168
  `),0):(process.stderr.write(`[flow-ai-obs otel-headers] Empty token received
169
- `),1)}var gn=m(()=>{"use strict";At();W();O();});var wn={};B(wn,{runCheck:()=>ho});function sr(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function Xt(t){process.stdout.write(` \u2713 ${t}
170
- `);}function Te(t){process.stdout.write(` \u26A0 ${t}
171
- `);}function Se(t){process.stdout.write(` \u2717 ${t}
172
- `);}function C(t){process.stdout.write(` ${t}
169
+ `),1)}var hn=m(()=>{"use strict";vt();Y();O();});var En={};M(En,{runCheck:()=>wo});function ar(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function Xt(t){process.stdout.write(` \u2713 ${t}
170
+ `);}function Se(t){process.stdout.write(` \u26A0 ${t}
171
+ `);}function ye(t){process.stdout.write(` \u2717 ${t}
172
+ `);}function N(t){process.stdout.write(` ${t}
173
173
  `);}function U(){process.stdout.write(`
174
- `);}async function ho(){U(),process.stdout.write(` flow-claude-observability \u2014 configuration check
174
+ `);}async function wo(){U(),process.stdout.write(` flow-claude-observability \u2014 configuration check
175
175
  `),U(),process.stdout.write(` Auth
176
- `);let t=()=>Rt(p.ANTHROPIC_AUTH_TOKEN)??process.env[p.ANTHROPIC_AUTH_TOKEN],e=b(t());if(!e){Te("Not authenticated \u2014 starting setup..."),U();let a=await dt();if(a!==0)return a;if(e=b(t()),!e)return Se("Authentication failed"),U(),1;U(),process.stdout.write(` Auth
177
- `);}if(!await me()){Te("Session expired \u2014 re-authenticating..."),U();let a=await dt();if(a!==0)return a;U(),process.stdout.write(` Auth
178
- `);}let r=await Jt()||e.clientId;Xt("Authenticated"),C(`Tenant: ${e.tenant}`),C(`User: ${r}`),U(),process.stdout.write(` Native OTEL
179
- `);let n={};try{let a=w__namespace.readFileSync(v(),"utf8");n=JSON.parse(a).env||{};}catch{}let s=Object.keys(j).filter(a=>!n[a]);if(s.length===0?(Xt("All OTEL env vars present in settings.json"),C(`Endpoint: ${n.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(Te(`${s.length} OTEL var(s) missing from settings.json \u2014 native metrics/logs disabled`),s.forEach(a=>Se(`Missing: ${a}`)),C("Run: flow-ai-obs init (restores missing vars automatically)")),U(),process.stdout.write(` Tracing
180
- `),process.env[p.FLOW_TELEMETRY]==="true"){Xt("FLOW_TELEMETRY=true (direct mode enabled)");let a=[p.LANGFUSE_BASE_URL,p.LANGFUSE_PUBLIC_KEY,p.LANGFUSE_SECRET_KEY].filter(c=>!process.env[c]);a.length>0&&a.forEach(c=>Te(`Missing: ${c}`));}else C("FLOW_TELEMETRY not set \u2014 direct mode inactive (gateway mode may still be active)");let i=await K();if(!i||i.length===0)return i&&i.authError?Se("Token refresh failed \u2014 gateway mode could not activate"):(Se("No active destinations \u2014 no traces will be sent"),C("For direct mode: set FLOW_TELEMETRY=true + LANGFUSE_BASE_URL + LANGFUSE_PUBLIC_KEY + LANGFUSE_SECRET_KEY"),C("For gateway mode: run flow-claude-observability auth login")),U(),1;for(let a of i)if(a.mode==="gateway"){let c=await It();Xt("Mode: gateway"),C(`Endpoint: ${a.endpoint}`),C(`Token: ${sr(c?.accessToken)}`);}else a.mode==="direct"&&(Xt("Mode: direct"),C(`Endpoint: ${a.endpoint}`),C(`PK: ${sr(process.env[p.LANGFUSE_PUBLIC_KEY])}`),C(`SK: ${sr(process.env[p.LANGFUSE_SECRET_KEY])}`));return U(),process.stdout.write(` All checks passed \u2014 observability is active.
181
- `),U(),0}var En=m(()=>{"use strict";ge();W();jt();O();Kt();});function G(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function ye(t,e=100){return String(t??"").split(`
182
- `)[0].slice(0,e).trim()}function or(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function M(t){process.stdout.write(JSON.stringify(t));}var Nt=m(()=>{"use strict";});function Q(){return String(BigInt(Date.now())*1000000n)}var ir,ft,zt=m(()=>{"use strict";ir=()=>crypto.randomBytes(16).toString("hex"),ft=()=>crypto.randomBytes(8).toString("hex");});function Ro(t,e){let r=Lt.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function ar(t){if(!Ao.test(t))throw new Error(`Invalid session ID: ${t}`);return Ro(Lt.join(lt.tmpdir(),`flow-obs-${t}.json`),vo)}function Ct(t){let e=ar(t);if(!w.existsSync(e))return null;try{return JSON.parse(w.readFileSync(e,"utf8"))}catch{return null}}function Ut(t,e){w.writeFileSync(ar(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function cr(t){try{w.unlinkSync(ar(t));}catch{}}var Ao,vo,Zt=m(()=>{"use strict";Ao=/^[0-9a-f-]{1,64}$/i,vo=Lt.normalize(lt.tmpdir())+Lt.sep;});function On(t){if(!t||!w.existsSync(t))return null;try{let e=w.readFileSync(t,"utf8").trimEnd().split(`
183
- `);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function ur(t){if(!t||!w.existsSync(t))return null;try{let e=w.readFileSync(t,"utf8").trimEnd().split(`
176
+ `);let t=()=>Rt(p.ANTHROPIC_AUTH_TOKEN)??process.env[p.ANTHROPIC_AUTH_TOKEN],e=b(t());if(!e){Se("Not authenticated \u2014 starting setup..."),U();let a=await pt();if(a!==0)return a;if(e=b(t()),!e)return ye("Authentication failed"),U(),1;U(),process.stdout.write(` Auth
177
+ `);}if(!await ge()){Se("Session expired \u2014 re-authenticating..."),U();let a=await pt();if(a!==0)return a;U(),process.stdout.write(` Auth
178
+ `);}let r=await Jt()||e.clientId;Xt("Authenticated"),N(`Tenant: ${e.tenant}`),N(`User: ${r}`),U(),process.stdout.write(` Native OTEL
179
+ `);let n={};try{let a=g__namespace.readFileSync(v(),"utf8");n=JSON.parse(a).env||{};}catch{}let s=Object.keys(j).filter(a=>!n[a]);if(s.length===0?(Xt("All OTEL env vars present in settings.json"),N(`Endpoint: ${n.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(Se(`${s.length} OTEL var(s) missing from settings.json \u2014 native metrics/logs disabled`),s.forEach(a=>ye(`Missing: ${a}`)),N("Run: flow-ai-obs init (restores missing vars automatically)")),U(),process.stdout.write(` Tracing
180
+ `),process.env[p.FLOW_TELEMETRY]==="true"){Xt("FLOW_TELEMETRY=true (direct mode enabled)");let a=[p.LANGFUSE_BASE_URL,p.LANGFUSE_PUBLIC_KEY,p.LANGFUSE_SECRET_KEY].filter(c=>!process.env[c]);a.length>0&&a.forEach(c=>Se(`Missing: ${c}`));}else N("FLOW_TELEMETRY not set \u2014 direct mode inactive (gateway mode may still be active)");let i=await K();if(!i||i.length===0)return i&&i.authError?ye("Token refresh failed \u2014 gateway mode could not activate"):(ye("No active destinations \u2014 no traces will be sent"),N("For direct mode: set FLOW_TELEMETRY=true + LANGFUSE_BASE_URL + LANGFUSE_PUBLIC_KEY + LANGFUSE_SECRET_KEY"),N("For gateway mode: run flow-claude-observability auth login")),U(),1;for(let a of i)if(a.mode==="gateway"){let c=await Pt();Xt("Mode: gateway"),N(`Endpoint: ${a.endpoint}`),N(`Token: ${ar(c?.accessToken)}`);}else a.mode==="direct"&&(Xt("Mode: direct"),N(`Endpoint: ${a.endpoint}`),N(`PK: ${ar(process.env[p.LANGFUSE_PUBLIC_KEY])}`),N(`SK: ${ar(process.env[p.LANGFUSE_SECRET_KEY])}`));return U(),process.stdout.write(` All checks passed \u2014 observability is active.
181
+ `),U(),0}var Tn=m(()=>{"use strict";he();Y();Vt();O();Kt();});function G(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function _e(t,e=100){return String(t??"").split(`
182
+ `)[0].slice(0,e).trim()}function cr(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function B(t){process.stdout.write(JSON.stringify(t));}var Ct=m(()=>{"use strict";});function Q(){return String(BigInt(Date.now())*1000000n)}var ur,mt,zt=m(()=>{"use strict";ur=()=>crypto.randomBytes(16).toString("hex"),mt=()=>crypto.randomBytes(8).toString("hex");});function Ro(t,e){let r=It.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function lr(t){if(!vo.test(t))throw new Error(`Invalid session ID: ${t}`);return Ro(It.join(lt.tmpdir(),`flow-obs-${t}.json`),Lo)}function Nt(t){let e=lr(t);if(!g.existsSync(e))return null;try{return JSON.parse(g.readFileSync(e,"utf8"))}catch{return null}}function Ut(t,e){g.writeFileSync(lr(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function dr(t){try{g.unlinkSync(lr(t));}catch{}}var vo,Lo,Zt=m(()=>{"use strict";vo=/^[0-9a-f-]{1,64}$/i,Lo=It.normalize(lt.tmpdir())+It.sep;});function kn(t){if(!t||!g.existsSync(t))return null;try{let e=g.readFileSync(t,"utf8").trimEnd().split(`
183
+ `);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function pr(t){if(!t||!g.existsSync(t))return null;try{let e=g.readFileSync(t,"utf8").trimEnd().split(`
184
184
  `),r=[],n=0,s=0;for(let o=e.length-1;o>=0;o--)try{let i=JSON.parse(e[o]);if(i.type==="user")break;if(i.type==="assistant"){let c=(i.message?.content??[]).filter(d=>d.type==="text").map(d=>d.text??"").join("");c&&r.unshift(c);let l=i.message?.usage??{};n+=(l.input_tokens??0)+(l.cache_read_input_tokens??0)+(l.cache_creation_input_tokens??0),s+=l.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
185
185
 
186
- `),inputTokens:n,outputTokens:s}}catch{}return null}var lr=m(()=>{"use strict";});function vn(t){return t.replace(":","/")}function _e(t,e){if(!t)return null;let r=vn(t),n=[Lt.join(lt.homedir(),".claude","skills",r,"SKILL.md"),Lt.join(e??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(w.existsSync(s))try{return w.readFileSync(s,"utf8")}catch{}return null}function Rn(t){return t.split(`
187
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function Ln(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Uo.has(n.tool))?"complete":"prerequisite_required":null}function Oe(t,e){if(!t)return null;let r=vn(t),n=[Lt.join(lt.homedir(),".claude","skills",r),Lt.join(e??"",".claude","skills",r)],s=null;for(let a of n)if(w.existsSync(Lt.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let l of w.readdirSync(a,{withFileTypes:true})){if(bo.has(l.name)||Co.has(l.name)||No.has(Lt.extname(l.name)))continue;let d=c?`${c}/${l.name}`:l.name;l.isDirectory()?i(Lt.join(a,l.name),d):o.push(d);}}return i(s,""),o.length>0?o:null}var bo,No,Co,Uo,ke=m(()=>{"use strict";bo=new Set([".venv","__pycache__",".git","node_modules"]),No=new Set([".pyc",".pyo"]),Co=new Set(["SKILL.md",".DS_Store",".gitignore"]);Uo=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function xo(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Do(t,e,r,n){return new Promise(s=>{let o=new URL(t),i=o.protocol==="https:",a=(i?fs__default.default:Is__default.default).request({hostname:o.hostname,port:o.port||(i?443:80),path:o.pathname+o.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),Authorization:`Bearer ${String(r).replace(/[\r\n]/g,"")}`,FlowTenant:String(n).replace(/[\r\n]/g,"")}},c=>{c.resume(),s(c.statusCode??0);});a.on("error",()=>s(0)),a.setTimeout(5e3,()=>{a.destroy(),s(0);}),a.write(e),a.end();})}async function mt(t,e={}){try{let r=b(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,s=new Promise((g,h)=>{n=setTimeout(()=>h(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:o}=await Promise.race([Y(r),s]);clearTimeout(n);let i=xo(o);if(!i)return;let a=i.tenant||r.tenant,c=JSON.stringify({action:t,booster:Be().BOOSTER,metadata:e,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:i.email||"",id:i.sub||"",name:i.name||i.email||""}}),l=Pt(Be().API_URL),d=await Do(l,c,o,a);u("metrics.logEvent",`action=${t} status=${d}`);}catch(r){u("metrics.logEvent",`silenced error: ${r.message}`);}}var Ae=m(()=>{"use strict";O();At();W();D();});async function dr(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Mo})+`
188
- `);return}let n=!!(await K()).authError,s=t.session_id||"unknown",o=t.prompt||"",i=t.cwd||"",a=On(t.transcript_path)||ir(),c=Rn(o),l=c?_e(c,i):null,d=c?Oe(c,i):null;Ut(s,{traceId:ir(),spanId:ft(),startNs:Q(),sessionId:s,prompt:o,cwd:i,traceName:a,transcriptPath:t.transcript_path||"",model:process.env[p.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:l,skillArtifacts:d}),mt("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),u("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),M(t);}var Mo,In=m(()=>{"use strict";zt();Zt();lr();ke();Nt();D();O();W();Ae();Mo=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${at()}/settings/api-keys to generate a new API key, then run: flow-ai-obs auth login`;});async function Pn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=Ct(e);s&&(s.pendingTool={name:r,inputStr:G(n,V.TOOL_INPUT),startNs:Q()},Ut(e,s)),u("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!s}`),M(t);}var bn=m(()=>{"use strict";zt();Zt();Nt();D();O();});function f(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function gt(...t){return t.filter(e=>e!==null)}function Nn(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Bo,spans:Array.isArray(e)?e:[e]}]}]}}var Bo,y,Cn=m(()=>{"use strict";O();Bo={name:De.SCOPE_NAME,version:De.SCOPE_VERSION},y={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 $n(t,e,r,n,s){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:s}});try{w.writeFileSync(Un,o+`
189
- `,{flag:"a",encoding:"utf8",mode:384}),u("sendTraces:dump",`request appendada em ${Un}`);}catch(i){u("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Go(t){let e=new URL(t),r=new URL(kt().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function Fn(t,e){return new Promise((r,n)=>{let s=t._isSSL?fs__default.default:Is__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=s.request(t,i=>{let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>r({statusCode:i.statusCode??0,body:a.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}async function xn(t,e){let r;try{r=Go(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let o=await Fn({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:s,_isSSL:n},null);return u("checkHealth",`url=${r.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function ve(t,e,r){let n=JSON.stringify(t),s=new URL(e),o=s.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};u("sendTraces:request",`POST ${e}`),u("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:i.slice(0,20)+"\u2026"})}`),u("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let c=await Fn({hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname,method:"POST",headers:a,_isSSL:o},n);return u("sendTraces:response",`status=${c.statusCode}`),$n(e,a,n,c.statusCode,c.body),c.statusCode}catch(c){return u("sendTraces:error",c.message),$n(e,a,n,0,c.message),0}}var Un,Dn=m(()=>{"use strict";O();D();Un=Lt.join(lt.tmpdir(),"flow-obs-requests.ndjson");});function Jo(){let t=parseInt(process.env[p.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(x.MIN_TTL_DAYS,Math.min(x.MAX_TTL_DAYS,t)):x.DEFAULT_TTL_DAYS)*24*60*60*1e3}function Ko(){let t=parseInt(process.env[p.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(x.MIN_MAX_FILES,Math.min(x.MAX_MAX_FILES,t)):x.DEFAULT_MAX_FILES}function Bn(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return Lt__namespace.default.join(lt__namespace.default.tmpdir(),`${x.FILE_PREFIX}${t}.json`)}function fr(){let t=lt__namespace.default.tmpdir(),e;try{e=w__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(x.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=Lt__namespace.default.join(t,r),s=0;try{s=w__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function Qt(t){try{let e=Ko(),r=fr();if(r.length>=e){let o=r.slice(0,r.length-e+1);for(let i of o)try{w__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:t};return w__namespace.default.writeFileSync(Bn(n),JSON.stringify(s),{encoding:"utf8",mode:384}),u("buffer",`saved fileId=${n}`),n}catch(e){return u("buffer",`saveToBuffer failed: ${e.message}`),null}}function Hn(t){let e=fr(),r=t!=null&&t>0?t:e.length,n=[];for(let s of e){if(n.length>=r)break;try{let o=w__namespace.default.readFileSync(s,"utf8"),i=JSON.parse(o);i&&i.fileId&&i.payload&&n.push(i);}catch{u("buffer",`skipping malformed file: ${s}`);}}return n}function jn(t){try{w__namespace.default.unlinkSync(Bn(t)),u("buffer",`deleted fileId=${t}`);}catch{}}function Vn(){let t=Date.now()-Jo();for(let e of fr())try{let{mtimeMs:r}=w__namespace.default.statSync(e);r<t&&(w__namespace.default.unlinkSync(e),u("buffer",`evicted stale: ${Lt__namespace.default.basename(e)}`));}catch{}}var Yn=m(()=>{"use strict";O();D();});async function qo(t){Vn();let e=Hn(x.REPLAY_BATCH_SIZE);e.length&&(u("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await ve(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(jn(r.fileId),u("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):u("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){u("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function Wn(t){let e=await K();if(!e.length)return e.authError&&(u("postToLangfuse","auth refresh failed \u2014 buffering trace"),Qt(t)),0;let r=await Promise.all(e.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await xn(o.endpoint,o.authHeader);return {creds:o,healthy:i}})),n=r.find(o=>o.creds.mode==="gateway"&&o.healthy)?.creds??r.find(o=>o.creds.mode==="direct")?.creds;return n&&await qo(n),(await Promise.all(r.map(async({creds:o,healthy:i})=>{if(o.mode==="gateway"){if(!i)return u("postToLangfuse","gateway health check failed \u2014 buffering trace"),Qt(t),0;let c=await ve(t,o.endpoint,o.authHeader);return (c===0||c>=500)&&(u("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),Qt(t)),c}let a=await ve(t,o.endpoint,o.authHeader);return (a===0||a>=500)&&(u("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),Qt(t)),a}))).find(o=>o!==0)??0}var Gn=m(()=>{"use strict";W();D();Dn();Yn();O();});var mr=m(()=>{"use strict";Cn();Gn();});function et(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Qo.reduce((r,{re:n,replace:s})=>r.replace(n,s),e)}var $,Xo,zo,Zo,Jn,Qo,gr=m(()=>{"use strict";$="[REDACTED]",Xo="[REDACTED-EMAIL]",zo="[REDACTED-CPF]",Zo="[REDACTED-CNPJ]",Jn="[REDACTED-PHONE]",Qo=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${$}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${$}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${$}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${$}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
186
+ `),inputTokens:n,outputTokens:s}}catch{}return null}var fr=m(()=>{"use strict";});function Ln(t){return t.replace(":","/")}function Oe(t,e){if(!t)return null;let r=Ln(t),n=[It.join(lt.homedir(),".claude","skills",r,"SKILL.md"),It.join(e??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(g.existsSync(s))try{return g.readFileSync(s,"utf8")}catch{}return null}function Rn(t){return t.split(`
187
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function In(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||$o.has(n.tool))?"complete":"prerequisite_required":null}function ke(t,e){if(!t)return null;let r=Ln(t),n=[It.join(lt.homedir(),".claude","skills",r),It.join(e??"",".claude","skills",r)],s=null;for(let a of n)if(g.existsSync(It.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let l of g.readdirSync(a,{withFileTypes:true})){if(Co.has(l.name)||Uo.has(l.name)||No.has(It.extname(l.name)))continue;let d=c?`${c}/${l.name}`:l.name;l.isDirectory()?i(It.join(a,l.name),d):o.push(d);}}return i(s,""),o.length>0?o:null}var Co,No,Uo,$o,Ae=m(()=>{"use strict";Co=new Set([".venv","__pycache__",".git","node_modules"]),No=new Set([".pyc",".pyo"]),Uo=new Set(["SKILL.md",".DS_Store",".gitignore"]);$o=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function Do(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Bo(t,e,r,n){return new Promise(s=>{let o=new URL(t),i=o.protocol==="https:",a=(i?ms__default.default:Ps__default.default).request({hostname:o.hostname,port:o.port||(i?443:80),path:o.pathname+o.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),Authorization:`Bearer ${String(r).replace(/[\r\n]/g,"")}`,FlowTenant:String(n).replace(/[\r\n]/g,"")}},c=>{c.resume(),s(c.statusCode??0);});a.on("error",()=>s(0)),a.setTimeout(5e3,()=>{a.destroy(),s(0);}),a.write(e),a.end();})}async function gt(t,e={}){try{let r=b(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,s=new Promise((h,w)=>{n=setTimeout(()=>w(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:o}=await Promise.race([W(r),s]);clearTimeout(n);let i=Do(o);if(!i)return;let a=i.tenant||r.tenant,c=JSON.stringify({action:t,booster:He().BOOSTER,metadata:e,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:i.email||"",id:i.sub||"",name:i.name||i.email||""}}),l=dt(He().API_URL),d=await Bo(l,c,o,a);u("metrics.logEvent",`action=${t} status=${d}`);}catch(r){u("metrics.logEvent",`silenced error: ${r.message}`);}}var ve=m(()=>{"use strict";O();vt();Y();D();});async function mr(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Mo})+`
188
+ `);return}let n=!!(await K()).authError,s=t.session_id||"unknown",o=t.prompt||"",i=t.cwd||"",a=kn(t.transcript_path)||ur(),c=Rn(o),l=c?Oe(c,i):null,d=c?ke(c,i):null;Ut(s,{traceId:ur(),spanId:mt(),startNs:Q(),sessionId:s,prompt:o,cwd:i,traceName:a,transcriptPath:t.transcript_path||"",model:process.env[p.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:l,skillArtifacts:d}),gt("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),u("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),B(t);}var Mo,Pn=m(()=>{"use strict";zt();Zt();fr();Ae();Ct();D();O();Y();ve();Mo=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${at()}/settings/api-keys to generate a new API key, then run: flow-ai-obs auth login`;});async function bn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=Nt(e);s&&(s.pendingTool={name:r,inputStr:G(n,V.TOOL_INPUT),startNs:Q()},Ut(e,s)),u("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!s}`),B(t);}var Cn=m(()=>{"use strict";zt();Zt();Ct();D();O();});function f(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function ht(...t){return t.filter(e=>e!==null)}function Nn(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Ho,spans:Array.isArray(e)?e:[e]}]}]}}var Ho,y,Un=m(()=>{"use strict";O();Ho={name:Be.SCOPE_NAME,version:Be.SCOPE_VERSION},y={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 Fn(t,e,r,n,s){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:s}});try{g.writeFileSync($n,o+`
189
+ `,{flag:"a",encoding:"utf8",mode:384}),u("sendTraces:dump",`request appendada em ${$n}`);}catch(i){u("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Jo(t){let e=new URL(t),r=new URL(At().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function xn(t,e){return new Promise((r,n)=>{let s=t._isSSL?ms__default.default:Ps__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=s.request(t,i=>{let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>r({statusCode:i.statusCode??0,body:a.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}async function Dn(t,e){let r;try{r=Jo(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let o=await xn({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:s,_isSSL:n},null);return u("checkHealth",`url=${r.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function Le(t,e,r){let n=JSON.stringify(t),s=new URL(e),o=s.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};u("sendTraces:request",`POST ${e}`),u("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:i.slice(0,20)+"\u2026"})}`),u("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let c=await xn({hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname,method:"POST",headers:a,_isSSL:o},n);return u("sendTraces:response",`status=${c.statusCode}`),Fn(e,a,n,c.statusCode,c.body),c.statusCode}catch(c){return u("sendTraces:error",c.message),Fn(e,a,n,0,c.message),0}}var $n,Bn=m(()=>{"use strict";O();D();$n=It.join(lt.tmpdir(),"flow-obs-requests.ndjson");});function Ko(){let t=parseInt(process.env[p.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(x.MIN_TTL_DAYS,Math.min(x.MAX_TTL_DAYS,t)):x.DEFAULT_TTL_DAYS)*24*60*60*1e3}function qo(){let t=parseInt(process.env[p.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(x.MIN_MAX_FILES,Math.min(x.MAX_MAX_FILES,t)):x.DEFAULT_MAX_FILES}function Hn(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return It__namespace.default.join(lt__namespace.default.tmpdir(),`${x.FILE_PREFIX}${t}.json`)}function hr(){let t=lt__namespace.default.tmpdir(),e;try{e=g__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(x.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=It__namespace.default.join(t,r),s=0;try{s=g__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function Qt(t){try{let e=qo(),r=hr();if(r.length>=e){let o=r.slice(0,r.length-e+1);for(let i of o)try{g__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:t};return g__namespace.default.writeFileSync(Hn(n),JSON.stringify(s),{encoding:"utf8",mode:384}),u("buffer",`saved fileId=${n}`),n}catch(e){return u("buffer",`saveToBuffer failed: ${e.message}`),null}}function jn(t){let e=hr(),r=t!=null&&t>0?t:e.length,n=[];for(let s of e){if(n.length>=r)break;try{let o=g__namespace.default.readFileSync(s,"utf8"),i=JSON.parse(o);i&&i.fileId&&i.payload&&n.push(i);}catch{u("buffer",`skipping malformed file: ${s}`);}}return n}function Vn(t){try{g__namespace.default.unlinkSync(Hn(t)),u("buffer",`deleted fileId=${t}`);}catch{}}function Wn(){let t=Date.now()-Ko();for(let e of hr())try{let{mtimeMs:r}=g__namespace.default.statSync(e);r<t&&(g__namespace.default.unlinkSync(e),u("buffer",`evicted stale: ${It__namespace.default.basename(e)}`));}catch{}}var Yn=m(()=>{"use strict";O();D();});async function Xo(t){Wn();let e=jn(x.REPLAY_BATCH_SIZE);e.length&&(u("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await Le(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(Vn(r.fileId),u("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):u("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){u("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function Gn(t){let e=await K();if(!e.length)return e.authError&&(u("postToLangfuse","auth refresh failed \u2014 buffering trace"),Qt(t)),0;let r=await Promise.all(e.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await Dn(o.endpoint,o.authHeader);return {creds:o,healthy:i}})),n=r.find(o=>o.creds.mode==="gateway"&&o.healthy)?.creds??r.find(o=>o.creds.mode==="direct")?.creds;return n&&await Xo(n),(await Promise.all(r.map(async({creds:o,healthy:i})=>{if(o.mode==="gateway"){if(!i)return u("postToLangfuse","gateway health check failed \u2014 buffering trace"),Qt(t),0;let c=await Le(t,o.endpoint,o.authHeader);return (c===0||c>=500)&&(u("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),Qt(t)),c}let a=await Le(t,o.endpoint,o.authHeader);return (a===0||a>=500)&&(u("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),Qt(t)),a}))).find(o=>o!==0)??0}var Jn=m(()=>{"use strict";Y();D();Bn();Yn();O();});var wr=m(()=>{"use strict";Un();Jn();});function et(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return ti.reduce((r,{re:n,replace:s})=>r.replace(n,s),e)}var $,zo,Zo,Qo,Kn,ti,Er=m(()=>{"use strict";$="[REDACTED]",zo="[REDACTED-EMAIL]",Zo="[REDACTED-CPF]",Qo="[REDACTED-CNPJ]",Kn="[REDACTED-PHONE]",ti=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${$}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${$}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${$}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${$}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
190
190
  ${$}
191
- ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${$}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${$}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${$}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${$}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${$}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${$}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${$}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>Xo},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>zo},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Zo},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Jn},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Jn}];});async function Kn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=t.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=Ct(e);if(!i){M(t);return}let a=Q(),c=i.pendingTool,l=c?.name===r,d=l?c.startNs:String(BigInt(a)-200000000n),g=l?c.inputStr:G(n,V.TOOL_INPUT),h=g,T=null;if(r==="Skill"){let se=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);T=se?String(se).trim():null;let st=T?_e(T,i.cwd):null;st&&(h=st,i.skillContent||(i.skillContent=st),i.skillArtifacts||(i.skillArtifacts=Oe(T,i.cwd))),T&&!i.slashSkill&&(i.slashSkill=T),u("PostToolUse","Skill tool detected",`skillName=${T}`,`contentFound=${!!st}`);}let A=et(G(o,V.TOOL_OUTPUT)),_=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(A.slice(0,500)),ht=_?"ERROR":"DEFAULT",nt=ft(),wt=Math.round(Number(BigInt(a)-BigInt(d))/1e6),re={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",ne=r==="Skill"&&T?T:ye(g,60);i.toolCalls.push({tool:r,brief:ne,error:_,durationMs:wt});let Ft=i.spans;Ft.push({traceId:i.traceId,spanId:nt,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:d,endTimeUnixNano:a,attributes:gt(f(y.OBS_NAME,r),f(y.OBS_TYPE,re),f(y.OBS_LEVEL,ht),f(y.OBS_INPUT,et(h)),f(y.OBS_OUTPUT,A),f("tool.name",r),f("tool.error",String(_)),r==="Skill"&&T?f("skill.name",T):null,r==="Skill"?f("skill.invocation","slash-command"):null),status:{code:_?2:1}}),i.pendingTool=null,Ut(e,i),_&&mt("TOOL_ERROR",{toolName:r}),u("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${_}`,`durationMs=${wt}`,`totalSpans=${Ft.length}`),M(t);}var qn=m(()=>{"use strict";zt();Zt();mr();Nt();ke();D();O();gr();Ae();});function zn(t,e,r){let n=Object.keys(Xn).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let s=Xn[n],o=(e*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var Xn,Zn=m(()=>{"use strict";Xn={"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 Qn(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=Ct(e);if(!n){M(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(u("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=Q(),o=await Zr(),i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(S=>S.tool==="Skill")){let S=ft(),ot=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});i.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),a.push({traceId:n.traceId,spanId:S,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:gt(f(y.OBS_NAME,"Skill"),f(y.OBS_TYPE,"TOOL"),f(y.OBS_LEVEL,"DEFAULT"),f(y.OBS_INPUT,ot),f(y.OBS_OUTPUT,"loaded via slash command"),f("tool.name","Skill"),f("tool.error","false"),f("skill.name",n.slashSkill),f("skill.invocation","slash-command")),status:{code:1}}),u("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||n.transcriptPath||"",l=ur(c);if(c&&(i.some(S=>S.tool==="Skill"&&!S.synthetic)||!!n.slashSkill)&&!l?.text){await new Promise(ot=>setTimeout(ot,500));let S=ur(c);S?.text&&(l=S);}u("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${l?`text=${l.text.length}chars`:"null"}`);let g=i.length,h=i.filter(S=>S.error).length,T=et(l?.text?G(l.text,V.TRACE_OUTPUT):g===0?"No tools used":i.map((S,ot)=>`${ot+1}. ${S.tool}${S.brief?` \u2192 ${S.brief}`:""}${S.error?" [ERROR]":""}`).join(`
192
- `)),A=l?.inputTokens??0,_=l?.outputTokens??0,ht=i.map((S,ot)=>`${ot+1}. ${S.tool}${S.brief?` \u2192 ${S.brief}`:""}${S.error?" [ERROR]":""} (${S.durationMs}ms)`),nt=!!(n.slashSkill||i.some(S=>S.tool==="Skill")),wt=i.some(S=>S.tool==="Agent");if(!nt&&!wt){u("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),mt("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),cr(e),M(t);return}let ee=nt?"skill":"agent",re=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),ne=zn(n.model,A,_),Et=Ln(n);Et==="prerequisite_required"&&l?.text&&(Et="complete"),Et==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:ft(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:gt(f(y.OBS_NAME,"prerequisite-check"),f(y.OBS_TYPE,"EVENT"),f(y.OBS_LEVEL,"WARNING"),f(y.OBS_OUTPUT,T),f("skill.name",n.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),u("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let Ft=(()=>{if(!(!nt||!n.prompt)){if(n.slashSkill){let S=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return S?G(et(S),V.USER_INSTRUCTION):void 0}return G(et(n.prompt),V.USER_INSTRUCTION)||void 0}})(),se=JSON.stringify({trace_type:ee,...Et!==null&&{execution_status:Et},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Ft!==void 0&&{user_instruction:Ft},latency_ms:re,...A&&{tokens_input:A},..._&&{tokens_output:_},cost_usd:ne,...n.model?{model:n.model}:{},toolCount:g,errorCount:h,stopReason:r,sessionId:n.sessionId,tools:ht.length?ht:void 0}),st=et(G(n.prompt,V.TRACE_INPUT)),rs=gt(f(y.TRACE_NAME,n.traceName),f(y.TRACE_INPUT,st),f(y.TRACE_OUTPUT,T),f(y.OBS_INPUT,st),f(y.OBS_OUTPUT,T),f(y.TRACE_METADATA,se),f(y.SESSION_ID,n.sessionId),f(y.USER_ID,o.user),f(y.OBS_TYPE,"GENERATION"),f(y.MODEL,n.model),A?f(y.INPUT_TOKENS,A):null,_?f(y.OUTPUT_TOKENS,_):null,f("claude.stop_reason",r),f("claude.tool_count",String(g)),f("claude.error_count",String(h)),f("claude.session_id",n.sessionId),f("flow.trace_type",ee),{key:y.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:ee}]}}}),ns={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:rs,status:{code:h>0?2:1}},ss=gt(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),hr=[...a,ns];u("Stop",`sid=${e}`,`totalTools=${g}`,`errorTools=${h}`,`spans=${hr.length}`,`inputTokens=${A}`,`outputTokens=${_}`,`traceOutput="${ye(T,80)}"`);let os=await Wn(Nn(ss,hr));u("Stop",`POST status=${os}`,`traceId=${n.traceId}`),mt("TRACE_SENT",{latencyMs:re,totalTools:g,errorTools:h,inputTokens:A,outputTokens:_,costUsd:ne}),cr(e),M(t);}var ts=m(()=>{"use strict";zt();Zt();mr();W();Zn();lr();Nt();D();ke();gr();O();Ae();});async function ti(){let t=process.argv[2];if(t==="UserPromptSubmit"){let r=await or(),n;try{n=await K();}catch{process.stdout.write(JSON.stringify(r));return}n.authError?await dr(r,true):n.length>0?await dr(r):process.stdout.write(JSON.stringify(r));return}if(!await Qr()){let r=[];process.stdin.on("data",n=>r.push(n)),process.stdin.on("end",()=>process.stdout.write(r.join("")));return}let e=await or();switch(t){case "PreToolUse":await Pn(e);break;case "PostToolUse":await Kn(e);break;case "Stop":await Qn(e);break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
193
- `),process.stdout.write(JSON.stringify(e));}}var es=m(()=>{"use strict";W();Nt();In();bn();qn();ts();ti().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
194
- `),process.exit(0);});});var ri=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,F,te]=process.argv;function rt(t,e){let r=t.indexOf(e);return r!==-1?t[r+1]:void 0}if(F==="--version"||F==="-v"){let{version:t}=oe();process.stdout.write(t+`
195
- `),process.exit(0);}else if(F==="--help"||F==="-h"){let{bold:t,cyan:e,dim:r}=(it(),I(Le)),{version:n}=oe();process.stdout.write(`
191
+ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${$}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${$}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${$}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${$}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${$}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${$}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${$}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>zo},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Zo},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Qo},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Kn},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Kn}];});async function qn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=t.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=Nt(e);if(!i){B(t);return}let a=Q(),c=i.pendingTool,l=c?.name===r,d=l?c.startNs:String(BigInt(a)-200000000n),h=l?c.inputStr:G(n,V.TOOL_INPUT),w=h,T=null;if(r==="Skill"){let se=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);T=se?String(se).trim():null;let st=T?Oe(T,i.cwd):null;st&&(w=st,i.skillContent||(i.skillContent=st),i.skillArtifacts||(i.skillArtifacts=ke(T,i.cwd))),T&&!i.slashSkill&&(i.slashSkill=T),u("PostToolUse","Skill tool detected",`skillName=${T}`,`contentFound=${!!st}`);}let A=et(G(o,V.TOOL_OUTPUT)),_=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(A.slice(0,500)),wt=_?"ERROR":"DEFAULT",nt=mt(),Et=Math.round(Number(BigInt(a)-BigInt(d))/1e6),re={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",ne=r==="Skill"&&T?T:_e(h,60);i.toolCalls.push({tool:r,brief:ne,error:_,durationMs:Et});let Ft=i.spans;Ft.push({traceId:i.traceId,spanId:nt,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:d,endTimeUnixNano:a,attributes:ht(f(y.OBS_NAME,r),f(y.OBS_TYPE,re),f(y.OBS_LEVEL,wt),f(y.OBS_INPUT,et(w)),f(y.OBS_OUTPUT,A),f("tool.name",r),f("tool.error",String(_)),r==="Skill"&&T?f("skill.name",T):null,r==="Skill"?f("skill.invocation","slash-command"):null),status:{code:_?2:1}}),i.pendingTool=null,Ut(e,i),_&&gt("TOOL_ERROR",{toolName:r}),u("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${_}`,`durationMs=${Et}`,`totalSpans=${Ft.length}`),B(t);}var Xn=m(()=>{"use strict";zt();Zt();wr();Ct();Ae();D();O();Er();ve();});function Zn(t,e,r){let n=Object.keys(zn).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let s=zn[n],o=(e*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var zn,Qn=m(()=>{"use strict";zn={"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 ts(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=Nt(e);if(!n){B(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(u("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=Q(),o=await Qr(),i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(S=>S.tool==="Skill")){let S=mt(),ot=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});i.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),a.push({traceId:n.traceId,spanId:S,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:ht(f(y.OBS_NAME,"Skill"),f(y.OBS_TYPE,"TOOL"),f(y.OBS_LEVEL,"DEFAULT"),f(y.OBS_INPUT,ot),f(y.OBS_OUTPUT,"loaded via slash command"),f("tool.name","Skill"),f("tool.error","false"),f("skill.name",n.slashSkill),f("skill.invocation","slash-command")),status:{code:1}}),u("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||n.transcriptPath||"",l=pr(c);if(c&&(i.some(S=>S.tool==="Skill"&&!S.synthetic)||!!n.slashSkill)&&!l?.text){await new Promise(ot=>setTimeout(ot,500));let S=pr(c);S?.text&&(l=S);}u("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${l?`text=${l.text.length}chars`:"null"}`);let h=i.length,w=i.filter(S=>S.error).length,T=et(l?.text?G(l.text,V.TRACE_OUTPUT):h===0?"No tools used":i.map((S,ot)=>`${ot+1}. ${S.tool}${S.brief?` \u2192 ${S.brief}`:""}${S.error?" [ERROR]":""}`).join(`
192
+ `)),A=l?.inputTokens??0,_=l?.outputTokens??0,wt=i.map((S,ot)=>`${ot+1}. ${S.tool}${S.brief?` \u2192 ${S.brief}`:""}${S.error?" [ERROR]":""} (${S.durationMs}ms)`),nt=!!(n.slashSkill||i.some(S=>S.tool==="Skill")),Et=i.some(S=>S.tool==="Agent");if(!nt&&!Et){u("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),gt("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),dr(e),B(t);return}let ee=nt?"skill":"agent",re=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),ne=Zn(n.model,A,_),Tt=In(n);Tt==="prerequisite_required"&&l?.text&&(Tt="complete"),Tt==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:mt(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:ht(f(y.OBS_NAME,"prerequisite-check"),f(y.OBS_TYPE,"EVENT"),f(y.OBS_LEVEL,"WARNING"),f(y.OBS_OUTPUT,T),f("skill.name",n.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),u("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let Ft=(()=>{if(!(!nt||!n.prompt)){if(n.slashSkill){let S=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return S?G(et(S),V.USER_INSTRUCTION):void 0}return G(et(n.prompt),V.USER_INSTRUCTION)||void 0}})(),se=JSON.stringify({trace_type:ee,...Tt!==null&&{execution_status:Tt},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Ft!==void 0&&{user_instruction:Ft},latency_ms:re,...A&&{tokens_input:A},..._&&{tokens_output:_},cost_usd:ne,...n.model?{model:n.model}:{},toolCount:h,errorCount:w,stopReason:r,sessionId:n.sessionId,tools:wt.length?wt:void 0}),st=et(G(n.prompt,V.TRACE_INPUT)),ns=ht(f(y.TRACE_NAME,n.traceName),f(y.TRACE_INPUT,st),f(y.TRACE_OUTPUT,T),f(y.OBS_INPUT,st),f(y.OBS_OUTPUT,T),f(y.TRACE_METADATA,se),f(y.SESSION_ID,n.sessionId),f(y.USER_ID,o.user),f(y.OBS_TYPE,"GENERATION"),f(y.MODEL,n.model),A?f(y.INPUT_TOKENS,A):null,_?f(y.OUTPUT_TOKENS,_):null,f("claude.stop_reason",r),f("claude.tool_count",String(h)),f("claude.error_count",String(w)),f("claude.session_id",n.sessionId),f("flow.trace_type",ee),{key:y.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:ee}]}}}),ss={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:ns,status:{code:w>0?2:1}},os=ht(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Tr=[...a,ss];u("Stop",`sid=${e}`,`totalTools=${h}`,`errorTools=${w}`,`spans=${Tr.length}`,`inputTokens=${A}`,`outputTokens=${_}`,`traceOutput="${_e(T,80)}"`);let is=await Gn(Nn(os,Tr));u("Stop",`POST status=${is}`,`traceId=${n.traceId}`),gt("TRACE_SENT",{latencyMs:re,totalTools:h,errorTools:w,inputTokens:A,outputTokens:_,costUsd:ne}),dr(e),B(t);}var es=m(()=>{"use strict";zt();Zt();wr();Y();Qn();fr();Ct();D();Ae();Er();O();ve();});async function ei(){let t=process.argv[2];if(t==="UserPromptSubmit"){let r=await cr(),n;try{n=await K();}catch{process.stdout.write(JSON.stringify(r));return}n.authError?await mr(r,true):n.length>0?await mr(r):process.stdout.write(JSON.stringify(r));return}if(!await tn()){let r=[];process.stdin.on("data",n=>r.push(n)),process.stdin.on("end",()=>process.stdout.write(r.join("")));return}let e=await cr();switch(t){case "PreToolUse":await bn(e);break;case "PostToolUse":await qn(e);break;case "Stop":await ts(e);break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
193
+ `),process.stdout.write(JSON.stringify(e));}}var rs=m(()=>{"use strict";Y();Ct();Pn();Cn();Xn();es();ei().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
194
+ `),process.exit(0);});});var ni=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,F,te]=process.argv;function rt(t,e){let r=t.indexOf(e);return r!==-1?t[r+1]:void 0}if(F==="--version"||F==="-v"){let{version:t}=oe();process.stdout.write(t+`
195
+ `),process.exit(0);}else if(F==="--help"||F==="-h"){let{bold:t,cyan:e,dim:r}=(it(),I(Ie)),{version:n}=oe();process.stdout.write(`
196
196
  `+t(" flow-ai-obs")+r(" v"+n)+`
197
197
 
198
198
  `),process.stdout.write(e(" init")+r(` Auth (if needed) + hooks + native OTEL
@@ -213,12 +213,12 @@ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${$}`},{re:/(aws_secret_ac
213
213
  `)),process.stdout.write(r(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
214
214
 
215
215
  `)),process.exit(0);}else if(F==="init"||F==="install")(async()=>{F==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
216
- `),await(Ot(),I(_t)).checkForUpdateInteractive();let{runInit:t}=(nr(),I(rr)),e=process.argv.slice(3);process.exit(await t({url:rt(e,"--custom-url"),noInteractive:e.includes("--no-interactive")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
217
- `),process.exit(1);});else if(F==="setup")(async()=>{await(Ot(),I(_t)).checkForUpdateInteractive();let{runSetup:t}=(fn(),I(pn)),e=process.argv.slice(3);process.exit(await t({clientId:rt(e,"--client-id"),clientSecret:rt(e,"--client-secret"),tenant:rt(e,"--tenant"),nonInteractive:e.includes("--non-interactive"),url:rt(e,"--custom-url")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
218
- `),process.exit(1);});else if(F==="auth")(async()=>{let{runLogin:t,runLogout:e,runStatus:r}=(Kt(),I(er)),n=0;if(te==="login"||!te){await(Ot(),I(_t)).checkForUpdateInteractive();let s=process.argv.slice(4);n=await t({clientId:rt(s,"--client-id"),clientSecret:rt(s,"--client-secret"),tenant:rt(s,"--tenant")});}else if(te==="logout"){let s=process.argv.includes("--force");n=await e(s);}else te==="status"?(await(Ot(),I(_t)).checkForUpdateInteractive(),n=await r()):(process.stderr.write(`Unknown auth subcommand: ${te}
216
+ `),await(kt(),I(Ot)).checkForUpdateInteractive();let{runInit:t}=(ir(),I(or)),e=process.argv.slice(3);process.exit(await t({url:rt(e,"--custom-url"),noInteractive:e.includes("--no-interactive")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
217
+ `),process.exit(1);});else if(F==="setup")(async()=>{await(kt(),I(Ot)).checkForUpdateInteractive();let{runSetup:t}=(mn(),I(fn)),e=process.argv.slice(3);process.exit(await t({clientId:rt(e,"--client-id"),clientSecret:rt(e,"--client-secret"),tenant:rt(e,"--tenant"),nonInteractive:e.includes("--non-interactive"),url:rt(e,"--custom-url")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
218
+ `),process.exit(1);});else if(F==="auth")(async()=>{let{runLogin:t,runLogout:e,runStatus:r}=(Kt(),I(nr)),n=0;if(te==="login"||!te){await(kt(),I(Ot)).checkForUpdateInteractive();let s=process.argv.slice(4);n=await t({clientId:rt(s,"--client-id"),clientSecret:rt(s,"--client-secret"),tenant:rt(s,"--tenant")});}else if(te==="logout"){let s=process.argv.includes("--force");n=await e(s);}else te==="status"?(await(kt(),I(Ot)).checkForUpdateInteractive(),n=await r()):(process.stderr.write(`Unknown auth subcommand: ${te}
219
219
  `),process.stderr.write(`Usage: flow-ai-obs auth [login|logout|status]
220
- `),n=1);process.exit(n);})();else if(F==="otel-headers"){let{runOtelHeaders:t}=(gn(),I(mn));t().then(e=>process.exit(e)).catch(()=>process.exit(1));}else if(F==="check")(async()=>{await(Ot(),I(_t)).checkForUpdateInteractive();let{runCheck:t}=(En(),I(wn));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
221
- `),process.exit(1);});else if(ri.has(F))es();else {let{bold:t,cyan:e,dim:r}=(it(),I(Le));process.stdout.write(`
220
+ `),n=1);process.exit(n);})();else if(F==="otel-headers"){let{runOtelHeaders:t}=(hn(),I(gn));t().then(e=>process.exit(e)).catch(()=>process.exit(1));}else if(F==="check")(async()=>{await(kt(),I(Ot)).checkForUpdateInteractive();let{runCheck:t}=(Tn(),I(En));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
221
+ `),process.exit(1);});else if(ni.has(F))rs();else {let{bold:t,cyan:e,dim:r}=(it(),I(Ie));process.stdout.write(`
222
222
  `+t(" flow-ai-obs")+`
223
223
 
224
224
  `),process.stdout.write(e(" init")+r(` Auth (if needed) + hooks + native OTEL
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'),l=require('path'),h=require('os'),Ve=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 l__namespace=/*#__PURE__*/_interopNamespace(l);var h__namespace=/*#__PURE__*/_interopNamespace(h);var Ve__default=/*#__PURE__*/_interopDefault(Ve);var de=Object.defineProperty;var E=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var v=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var fe=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},O=(e,t)=>{for(var r in t)de(e,r,{get:t[r],enumerable:true});};var G={};O(G,{MacOsKeyVaultProvider:()=>I});var P,I,W=v(()=>{"use strict";P=util.promisify(child_process.execFile),I=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(t,r){try{let{stdout:n}=await P("security",["find-generic-password","-w","-a",r,"-s",t]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await P("security",["add-generic-password","-U","-a",r,"-s",t,"-w",n]);}async deleteSecret(t,r){try{return await P("security",["delete-generic-password","-a",r,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var J={};O(J,{LinuxKeyVaultProvider:()=>N});var B,N,K=v(()=>{"use strict";B=util.promisify(child_process.execFile),N=class{static async isAvailable(){let t=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of t)try{return i.accessSync(r,i.constants.X_OK),!0}catch{}return !1}async getSecret(t,r){try{let{stdout:n}=await B("secret-tool",["lookup","service",t,"account",r]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await new Promise((o,s)=>{let a=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",r]);a.on("error",s),a.on("close",d=>{d===0?o():s(new Error(`secret-tool exited with code ${d}`));}),a.stdin.write(n),a.stdin.end();});}async deleteSecret(t,r){try{return await B("secret-tool",["clear","service",t,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var X={};O(X,{WindowsKeyVaultProvider:()=>C});var C,q=v(()=>{"use strict";C=class{static async isAvailable(){try{return await E("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,r){return E("keytar").getPassword(t,r)}async setSecret(t,r,n){await E("keytar").setPassword(t,r,n);}async deleteSecret(t,r){return E("keytar").deletePassword(t,r)}getStoragePath(){return "Windows Credential Manager"}};});var ie=fe((qt,Me)=>{Me.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.1-beta.542",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"}};});var me="https://flow.ciandt.com";function A(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():me}function L(){let e=A();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`}}var ge=L(),T={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials"},_="FLOW-nodejs",S="config.json";function x(){let e=A();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-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}var H={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:ge.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},f={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var M={LOCK_STALE_MS:3e4},V={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15};var Y="flow-ai-obs-debug.log";var R={credentials:"credentials","token-cache":"tokenCache"};function m(){let e=h__namespace.default.homedir();if(process.platform==="darwin")return l__namespace.default.join(e,"Library","Preferences",_,S);if(process.platform==="win32"){let r=process.env.APPDATA??l__namespace.default.join(e,"AppData","Roaming");return l__namespace.default.join(r,_,S)}let t=process.env.XDG_CONFIG_HOME??l__namespace.default.join(e,".config");return l__namespace.default.join(t,_,S)}function k(){try{let e=i__namespace.default.readFileSync(m(),"utf8");return JSON.parse(e)}catch{return {}}}function j(e){let t=m();i__namespace.default.mkdirSync(l__namespace.default.dirname(t),{recursive:true}),i__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var w=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(m()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(m(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,r){let n=k(),o=R[r]??r,s=n[o];return s?typeof s=="string"?s:JSON.stringify(s):null}async setSecret(t,r,n){let o=k(),s=R[r]??r;if(r==="token-cache")try{o[s]=JSON.parse(n);}catch{o[s]=n;}else o[s]=n;j(o);}async deleteSecret(t,r){let n=k(),o=R[r]??r;return o in n?(delete n[o],j(n),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${m()}`}};async function z(){return await Le()??new w}async function Le(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(W(),G));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(K(),J));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(q(),X));return await e.isAvailable()?new e:null}default:return null}}var Re=T.SERVICE,ke=T.ACCOUNT_CREDS,b=null;function Pe(){return b||(b=z()),b}async function Z(){let t=await(await Pe()).getSecret(Re,ke);if(!t)return null;try{return JSON.parse(t)}catch{return null}}l.join(h.tmpdir(),Y);!process.env.NO_COLOR&&process.stdout.isTTY;function U(){return process.platform==="win32"?false:process.getuid?.()===0}function F(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(e=r);}if(e){let t=e.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return l__namespace.join(t,".claude","settings.json")}return l__namespace.join(h__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||h__namespace.homedir();return l__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return l__namespace.join(t,".claude","settings.json")}return l__namespace.join(h__namespace.homedir(),".claude","settings.json")}var De=M.LOCK_STALE_MS;function ee(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>De&&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 te(e){try{i__namespace.unlinkSync(e);}catch{}}function xe(e,t){let n=(Array.isArray(e)?e:[]).map(o=>{if(!Array.isArray(o?.hooks))return null;let s=o.hooks.filter(a=>!a.command?.startsWith?.("flow-ai-obs "));return s.length>0?{...o,hooks:s}:null}).filter(o=>o!=null);return [t,...n]}function re(){let e=F(),t=e+".lock",r=[];i__namespace.mkdirSync(l__namespace.dirname(e),{recursive:true}),ee(t);try{if(i__namespace.existsSync(e)){i__namespace.copyFileSync(e,e+".bkp");try{i__namespace.chmodSync(e+".bkp",384);}catch{}}let n={};try{n=JSON.parse(i__namespace.readFileSync(e,"utf8"));}catch{}let o=n.env&&typeof n.env=="object"?n.env:{};delete o.OTEL_EXPORTER_OTLP_HEADERS,n.env={...o,...H,...x()},n.otelHeadersHelper="flow-ai-obs otel-headers",(!n.hooks||typeof n.hooks!="object"||Array.isArray(n.hooks))&&(n.hooks={});let s=(c,y)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:y}]}),a=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],d=n.hooks;for(let c of a){let y=xe(d[c],s(c,V[c]));y.length>1&&r.push(c),d[c]=y;}i__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
3
- `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(e,384);}catch{}}finally{te(t);}return {settingsPath:e,preserved:r}}function ne(e){let t=F(),r=t+".lock";i__namespace.mkdirSync(l__namespace.dirname(t),{recursive:true}),ee(r);try{let n={};try{n=JSON.parse(i__namespace.readFileSync(t,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,e),i__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
4
- `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}}finally{te(r);}}function oe(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:o,tenant:s}=r;return !n||!o||!s?null:{clientId:n,clientSecret:o,tenant:s}}catch{return null}}function se(e){let t=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant})).toString("base64url");return `${t}.${r}.`}var D;function ce(){return D||(D=ie()),D}var le=l__namespace.default.join(h__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Ge=1440*60*1e3,We=3e3;function Be(e,t){let r=s=>{let a=String(s).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[3]]:null},n=r(e),o=r(t);return !n||!o?false:o[0]!==n[0]?o[0]>n[0]:o[1]!==n[1]?o[1]>n[1]:o[2]>n[2]}function Je(){try{let e=JSON.parse(i__namespace.default.readFileSync(le,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=Ge?null:e}catch{return null}}function Ke(e,t,r=Date.now()){try{i__namespace.default.writeFileSync(le,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function Xe(e){let t=ce().name,r=Ve__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:We},n=>{if(n.statusCode!==200)return n.resume(),e(new Error(`HTTP ${n.statusCode}`));let o="";n.setEncoding("utf8"),n.on("data",s=>{o+=s;}),n.on("end",()=>{try{let s=JSON.parse(o);if(typeof s.version!="string")throw new Error("no version field");e(null,{version:s.version,updatePriority:typeof s.updatePriority=="string"?s.updatePriority:null});}catch(s){e(s);}});});r.on("error",e),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function ue(){try{if(Je())return;setImmediate(()=>{Xe((e,t)=>{e||!t||Be(ce().version,t.version)&&Ke(t.version,t.updatePriority,0);});});}catch{}}var qe=l__namespace.default.resolve(__dirname,".."),ze=process.env.INIT_CWD?l__namespace.default.resolve(process.env.INIT_CWD):null;ze===qe&&process.exit(0);U()&&(process.stderr.write(`
2
+ 'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),u=require('path'),l=require('os'),Ke=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 u__namespace=/*#__PURE__*/_interopNamespace(u);var l__namespace=/*#__PURE__*/_interopNamespace(l);var Ke__default=/*#__PURE__*/_interopDefault(Ke);var Te=Object.defineProperty;var T=(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 _e=(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)Te(e,n,{get:t[n],enumerable:true});};var J={};L(J,{MacOsKeyVaultProvider:()=>N});var C,N,K=A(()=>{"use strict";C=util.promisify(child_process.execFile),N=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 C("security",["find-generic-password","-w","-a",n,"-s",t]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await C("security",["add-generic-password","-U","-a",n,"-s",t,"-w",r]);}async deleteSecret(t,n){try{return await C("security",["delete-generic-password","-a",n,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var q={};L(q,{LinuxKeyVaultProvider:()=>b});var X,b,z=A(()=>{"use strict";X=util.promisify(child_process.execFile),b=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 X("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",y=>{y===0?s():o(new Error(`secret-tool exited with code ${y}`));}),a.stdin.write(r),a.stdin.end();});}async deleteSecret(t,n){try{return await X("secret-tool",["clear","service",t,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Z={};L(Z,{WindowsKeyVaultProvider:()=>U});var U,Q=A(()=>{"use strict";U=class{static async isAvailable(){try{return await T("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,n){return T("keytar").getPassword(t,n)}async setSecret(t,n,r){await T("keytar").setPassword(t,n,r);}async deleteSecret(t,n){return T("keytar").deletePassword(t,n)}getStoragePath(){return "Windows Credential Manager"}};});var fe=_e((an,Je)=>{Je.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.1-beta.558",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"}};});var Se="https://flow.ciandt.com";function R(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Se}function k(){let e=R();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`}}var we=k(),_={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials"},S="FLOW-nodejs",w="config.json";function V(){let e=R();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-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}var j={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:we.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},f={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var Y={LOCK_STALE_MS:3e4},G={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15};var W="flow-ai-obs-debug.log";var P={credentials:"credentials","token-cache":"tokenCache"};function m(){let e=l__namespace.default.homedir();if(process.platform==="darwin")return u__namespace.default.join(e,"Library","Preferences",S,w);if(process.platform==="win32"){let n=process.env.APPDATA??u__namespace.default.join(e,"AppData","Roaming");return u__namespace.default.join(n,S,w)}let t=process.env.XDG_CONFIG_HOME??u__namespace.default.join(e,".config");return u__namespace.default.join(t,S,w)}function I(){try{let e=i__namespace.default.readFileSync(m(),"utf8");return JSON.parse(e)}catch{return {}}}function B(e){let t=m();i__namespace.default.mkdirSync(u__namespace.default.dirname(t),{recursive:true}),i__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var v=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(m()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(m(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,n){let r=I(),s=P[n]??n,o=r[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,n,r){let s=I(),o=P[n]??n;if(n==="token-cache")try{s[o]=JSON.parse(r);}catch{s[o]=r;}else s[o]=r;B(s);}async deleteSecret(t,n){let r=I(),s=P[n]??n;return s in r?(delete r[s],B(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${m()}`}};async function ee(){return await be()??new v}async function be(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(K(),J));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(z(),q));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(Q(),Z));return await e.isAvailable()?new e:null}default:return null}}var Ue=_.SERVICE,Fe=_.ACCOUNT_CREDS,F=null;function $e(){return F||(F=ee()),F}async function te(){let t=await(await $e()).getSecret(Ue,Fe);if(!t)return null;try{return JSON.parse(t)}catch{return null}}u.join(l.tmpdir(),W);!process.env.NO_COLOR&&process.stdout.isTTY;function $(){return process.platform==="win32"?false:process.getuid?.()===0}function ne(){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:l__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||l__namespace.userInfo().username}}function O(){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 u__namespace.join(t,".claude","settings.json")}return u__namespace.join(l__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||l__namespace.homedir();return u__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 u__namespace.join(t,".claude","settings.json")}return u__namespace.join(l__namespace.homedir(),".claude","settings.json")}var re="flow-ai-obs",se="config.json";function ie(){if(process.platform==="win32"){let n=process.env.APPDATA||u__namespace.join(l__namespace.homedir(),"AppData","Roaming");return u__namespace.join(n,re,se)}let e=ne(),t=process.env.XDG_CONFIG_HOME||u__namespace.join(e.home,".config");return u__namespace.join(t,re,se)}var Ge=Y.LOCK_STALE_MS;function ae(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>Ge&&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 ce(e){try{i__namespace.unlinkSync(e);}catch{}}function We(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 le(){let e=O(),t=e+".lock",n=[];i__namespace.mkdirSync(u__namespace.dirname(e),{recursive:true}),ae(t);try{if(i__namespace.existsSync(e)){i__namespace.copyFileSync(e,e+".bkp");try{i__namespace.chmodSync(e+".bkp",384);}catch{}}let r=ie();if(i__namespace.existsSync(r)){let c=r+".bkp";i__namespace.copyFileSync(r,c);try{i__namespace.chmodSync(c,384);}catch{}}let s={};try{s=JSON.parse(i__namespace.readFileSync(e,"utf8"));}catch{}let o=s.env&&typeof s.env=="object"?s.env:{};delete o.OTEL_EXPORTER_OTLP_HEADERS,s.env={...o,...j,...V()},s.otelHeadersHelper="flow-ai-obs otel-headers",(!s.hooks||typeof s.hooks!="object"||Array.isArray(s.hooks))&&(s.hooks={});let a=(c,E)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:E}]}),y=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],M=s.hooks;for(let c of y){let E=We(M[c],a(c,G[c]));E.length>1&&n.push(c),M[c]=E;}i__namespace.writeFileSync(e,JSON.stringify(s,null,2)+`
3
+ `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(e,384);}catch{}}finally{ce(t);}return {settingsPath:e,preserved:n}}function ue(e){let t=O(),n=t+".lock";i__namespace.mkdirSync(u__namespace.dirname(t),{recursive:true}),ae(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{ce(n);}}function pe(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 de(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}.`}var H;function ge(){return H||(H=fe()),H}var he=u__namespace.default.join(l__namespace.default.tmpdir(),"flow-obs-update-cache.json"),ze=1440*60*1e3,Ze=3e3;function Qe(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(he,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=ze?null:e}catch{return null}}function tt(e,t,n=Date.now()){try{i__namespace.default.writeFileSync(he,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:n}),{mode:384});}catch{}}function nt(e){let t=ge().name,n=Ke__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Ze},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 ye(){try{if(et())return;setImmediate(()=>{nt((e,t)=>{e||!t||Qe(ge().version,t.version)&&tt(t.version,t.updatePriority,0);});});}catch{}}var rt=u__namespace.default.resolve(__dirname,".."),st=process.env.INIT_CWD?u__namespace.default.resolve(process.env.INIT_CWD):null;st===rt&&process.exit(0);$()&&(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 Ze(){try{re();}catch{}let e=await Z();if(!e){process.stderr.write(`
8
+ `),process.exit(1));async function ot(){try{le();}catch{}let e=await te();if(!e){process.stderr.write(`
9
9
  [flow-ai-obs] No credentials found.
10
10
  Run \`flow-ai-obs auth login\` to authenticate and enable telemetry.
11
11
 
12
- `);return}let t=oe(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(!t||t.clientId!==e.clientId||t.clientSecret!==e.clientSecret||t.tenant!==e.tenant)try{let n=se(e);ne({[f.ANTHROPIC_AUTH_TOKEN]:n});}catch{}}Ze().catch(()=>{}).finally(()=>ue());
12
+ `);return}let t=pe(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(!t||t.clientId!==e.clientId||t.clientSecret!==e.clientSecret||t.tenant!==e.tenant)try{let r=de(e);ue({[f.ANTHROPIC_AUTH_TOKEN]:r});}catch{}}ot().catch(()=>{}).finally(()=>ye());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.7.1-beta.542",
3
+ "version": "0.7.1-beta.558",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {