@ciandt-flow/flow-ai-obs 0.9.3-beta.750 → 0.9.3-beta.756

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,38 +1,38 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var Ue=require('readline/promises'),fs=require('https'),A=require('fs'),gt=require('os'),Rt=require('path'),child_process=require('child_process'),Ps=require('http'),util=require('util'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Ue__namespace=/*#__PURE__*/_interopNamespace(Ue);var fs__default=/*#__PURE__*/_interopDefault(fs);var A__namespace=/*#__PURE__*/_interopNamespace(A);var gt__namespace=/*#__PURE__*/_interopNamespace(gt);var Rt__namespace=/*#__PURE__*/_interopNamespace(Rt);var Ps__default=/*#__PURE__*/_interopDefault(Ps);var be=Object.defineProperty;var is=Object.getOwnPropertyDescriptor;var as=Object.getOwnPropertyNames;var cs=Object.prototype.hasOwnProperty;var Dt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var E=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var ls=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},N=(t,e)=>{for(var r in e)be(t,r,{get:e[r],enumerable:true});},us=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of as(e))!cs.call(t,s)&&s!==r&&be(t,s,{get:()=>e[s],enumerable:!(n=is(e,s))||n.enumerable});return t};var P=t=>us(be({},"__esModule",{value:true}),t);var Ie={};N(Ie,{bold:()=>b,cyan:()=>U,dim:()=>g,green:()=>k,red:()=>I,yellow:()=>R});function yt(t,e){return ds?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var ds,k,I,R,U,b,g,ut=E(()=>{"use strict";ds=!process.env.NO_COLOR&&process.stdout.isTTY;k=yt("32","39"),I=yt("31","39"),R=yt("33","39"),U=yt("36","39"),b=yt("1","22"),g=yt("2","22");});var Mt=ls((di,ps)=>{ps.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.9.3-beta.750",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function Z(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function Bt(t,e){let r=Ue__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let i=1;i<=3;i++)try{let o=(await r.question(s)).trim().toLowerCase();if(o===""&&e!==void 0)return r.close(),e;if(o==="y"||o==="yes")return r.close(),!0;if(o==="n"||o==="no")return r.close(),!1;i<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
- `);}catch(o){throw r.close(),o}if(r.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function Pe(t,e){let r=Ue__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${t}: `)).trim();if(e);return n}catch(n){throw n}finally{r.close();}}var Ne=E(()=>{"use strict";});var At={};N(At,{checkForUpdate:()=>Ss,checkForUpdateInteractive:()=>Ts,fetchLatestVersionAsync:()=>vr,isNewer:()=>Ot,primeUpdateCache:()=>_s,runUpdate:()=>kr});function C(){return Ce||(Ce=Mt()),Ce}function Ot(t,e){let r=i=>{let o=String(i).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return o?[+o[1],+o[2],+o[3]]:null},n=r(t),s=r(e);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function xe(){try{let t=JSON.parse(A__namespace.default.readFileSync(Lr,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=hs?null:t}catch{return null}}function De(t,e,r=Date.now()){try{A__namespace.default.writeFileSync(Lr,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:r}),{mode:384});}catch{}}function Me(t){let e=C().name,r=fs__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:Es},n=>{if(n.statusCode!==200)return n.resume(),t(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",i=>{s+=i;}),n.on("end",()=>{try{let i=JSON.parse(s);if(typeof i.version!="string")throw new Error("no version field");t(null,{version:i.version,updatePriority:typeof i.updatePriority=="string"?i.updatePriority:null});}catch(i){t(i);}});});r.on("error",t),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function $e(t){let e=C().name,n=` Update available: ${C().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,i=Math.max(n.length,s.length)+2,o="\u2500".repeat(i);process.stderr.write(`
4
- \u256D${o}\u256E
5
- \u2502${n.padEnd(i)}\u2502
6
- \u2502${s.padEnd(i)}\u2502
7
- \u2570${o}\u256F
2
+ 'use strict';var Ue=require('readline/promises'),fs=require('https'),A=require('fs'),gt=require('os'),Rt=require('path'),child_process=require('child_process'),Ps=require('http'),util=require('util'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Ue__namespace=/*#__PURE__*/_interopNamespace(Ue);var fs__default=/*#__PURE__*/_interopDefault(fs);var A__namespace=/*#__PURE__*/_interopNamespace(A);var gt__namespace=/*#__PURE__*/_interopNamespace(gt);var Rt__namespace=/*#__PURE__*/_interopNamespace(Rt);var Ps__default=/*#__PURE__*/_interopDefault(Ps);var be=Object.defineProperty;var is=Object.getOwnPropertyDescriptor;var as=Object.getOwnPropertyNames;var cs=Object.prototype.hasOwnProperty;var Dt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var E=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var ls=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},N=(t,e)=>{for(var r in e)be(t,r,{get:e[r],enumerable:true});},us=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of as(e))!cs.call(t,s)&&s!==r&&be(t,s,{get:()=>e[s],enumerable:!(n=is(e,s))||n.enumerable});return t};var P=t=>us(be({},"__esModule",{value:true}),t);var Ie={};N(Ie,{bold:()=>b,cyan:()=>U,dim:()=>g,green:()=>k,red:()=>I,yellow:()=>R});function yt(t,e){return ds?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var ds,k,I,R,U,b,g,ut=E(()=>{"use strict";ds=!process.env.NO_COLOR&&process.stdout.isTTY;k=yt("32","39"),I=yt("31","39"),R=yt("33","39"),U=yt("36","39"),b=yt("1","22"),g=yt("2","22");});var Mt=ls((ui,ps)=>{ps.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.9.3-beta.756",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function Z(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function Bt(t,e){let r=Ue__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&e!==void 0)return r.close(),e;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
+ `);}catch(i){throw r.close(),i}if(r.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function Pe(t,e){let r=Ue__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${t}: `)).trim();if(e);return n}catch(n){throw n}finally{r.close();}}var Ne=E(()=>{"use strict";});var At={};N(At,{checkForUpdate:()=>Ss,checkForUpdateInteractive:()=>Ts,fetchLatestVersionAsync:()=>vr,isNewer:()=>Ot,primeUpdateCache:()=>_s,runUpdate:()=>kr});function C(){return Ce||(Ce=Mt()),Ce}function Ot(t,e){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(t),s=r(e);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function xe(){try{let t=JSON.parse(A__namespace.default.readFileSync(Lr,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=hs?null:t}catch{return null}}function De(t,e,r=Date.now()){try{A__namespace.default.writeFileSync(Lr,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:r}),{mode:384});}catch{}}function Me(t){let e=C().name,r=fs__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:Es},n=>{if(n.statusCode!==200)return n.resume(),t(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});r.on("error",t),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function $e(t){let e=C().name,n=` Update available: ${C().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
4
+ \u256D${i}\u256E
5
+ \u2502${n.padEnd(o)}\u2502
6
+ \u2502${s.padEnd(o)}\u2502
7
+ \u2570${i}\u256F
8
8
 
9
9
  `);}function Fe(t){let e=C().name;process.stderr.write(`
10
10
  [${e}] Critical update detected \u2014 auto-updating to ${t}...
11
11
 
12
- `);let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});r.on("error",()=>{}),r.unref();}async function ws(t,e=1e4){let r=Dt("readline"),n=C().name,i=` Update available: ${C().version} \u2192 ${t}`,o=` Run: npm install -g ${n}`,c=" Install now? [y/N]: ",l=Math.max(i.length,o.length,c.length-2)+2,a="\u2500".repeat(l);return process.stderr.write(`
12
+ `);let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});r.on("error",()=>{}),r.unref();}async function ws(t,e=1e4){let r=Dt("readline"),n=C().name,o=` Update available: ${C().version} \u2192 ${t}`,i=` Run: npm install -g ${n}`,l=" Install now? [y/N]: ",c=Math.max(o.length,i.length,l.length-2)+2,a="\u2500".repeat(c);return process.stderr.write(`
13
13
  \u256D${a}\u256E
14
- \u2502${i.padEnd(l)}\u2502
15
- \u2502${o.padEnd(l)}\u2502
16
- \u2502${c.padEnd(l)}\u2502
14
+ \u2502${o.padEnd(c)}\u2502
15
+ \u2502${i.padEnd(c)}\u2502
16
+ \u2502${l.padEnd(c)}\u2502
17
17
  \u2570${a}\u256F
18
- `),new Promise(d=>{let m=r.createInterface({input:process.stdin,output:void 0,terminal:false}),T=false;function S(w){T||(T=true,clearTimeout(p),m.close(),process.stderr.write(`
19
- `),d(w));}let p=setTimeout(()=>S(false),e);m.once("line",w=>S(w.trim().toLowerCase()==="y")),m.once("close",()=>S(false));})}async function kr(t){let e=C().name;return process.stderr.write(` Installing ${e}@${t}...
20
- `),new Promise(r=>{let n=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit",shell:process.platform==="win32"}),s=false;function i(o,c){if(!s){if(s=true,o)process.stderr.write(` \u2713 Updated to ${t}. Please restart the command.
18
+ `),new Promise(p=>{let m=r.createInterface({input:process.stdin,output:void 0,terminal:false}),T=false;function S(w){T||(T=true,clearTimeout(d),m.close(),process.stderr.write(`
19
+ `),p(w));}let d=setTimeout(()=>S(false),e);m.once("line",w=>S(w.trim().toLowerCase()==="y")),m.once("close",()=>S(false));})}async function kr(t){let e=C().name;return process.stderr.write(` Installing ${e}@${t}...
20
+ `),new Promise(r=>{let n=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit",shell:process.platform==="win32"}),s=false;function o(i,l){if(!s){if(s=true,i)process.stderr.write(` \u2713 Updated to ${t}. Please restart the command.
21
21
 
22
- `);else {let l=c?` (${c})`:"";process.stderr.write(` \u2717 Update failed${l} \u2014 continuing with current version.
22
+ `);else {let c=l?` (${l})`:"";process.stderr.write(` \u2717 Update failed${c} \u2014 continuing with current version.
23
23
 
24
- `);}r();}}n.on("close",(o,c)=>i(o===0,c??void 0)),n.on("error",o=>i(false,o.code));})}function vr(){return new Promise(t=>{Me((e,r)=>t(e||!r?null:r));})}function Ss(){try{let t=xe();if(t){Ot(C().version,t.latestVersion)&&(t.updatePriority==="auto"?Fe(t.latestVersion):$e(t.latestVersion));return}setImmediate(()=>{Me((e,r)=>{e||!r||(De(r.version,r.updatePriority),Ot(C().version,r.version)&&(r.updatePriority==="auto"?Fe(r.version):$e(r.version)));});});}catch{}}async function Ts(t={}){try{let e=xe();if(e){if(!Ot(C().version,e.latestVersion))return}else {let n=await vr();if(!n||(De(n.version,n.updatePriority),!Ot(C().version,n.version)))return;e={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Fe(e.latestVersion);return}if(!Z()){$e(e.latestVersion);return}await ws(e.latestVersion,t.timeoutMs)&&await kr(e.latestVersion);}catch{}}function _s(){try{if(xe())return;setImmediate(()=>{Me((t,e)=>{t||!e||Ot(C().version,e.version)&&De(e.version,e.updatePriority,0);});});}catch{}}var Ce,Lr,hs,Es,Lt=E(()=>{"use strict";Ne();Lr=Rt__namespace.default.join(gt__namespace.default.tmpdir(),"flow-obs-update-cache.json"),hs=1440*60*1e3,Es=3e3;});var Rr={};N(Rr,{BUFFER:()=>$,CONFIG_DIR_NAME:()=>Wt,CONFIG_FILE_NAME:()=>jt,DEBUG_LOG_FILENAME:()=>Be,ENV:()=>f,FEATURES:()=>Ls,FLOW_URLS:()=>Os,HOOK_TIMEOUTS:()=>pt,INSTALLER:()=>Vt,NATIVE_OTEL:()=>tt,OTLP:()=>ce,STATE_FILE_PREFIX:()=>ks,TRACE_LIMITS:()=>B,VAULT:()=>Ht,getFlowBaseUrl:()=>Q,getFlowUrls:()=>dt,getLlmProxy:()=>As,getMetrics:()=>le});function Q(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():ys}function dt(){let t=Q();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}function As(){let t=Q();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function le(){let t=Q();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var ys,Os,Ht,Wt,jt,ce,tt,f,Ls,Vt,pt,$,Be,B,ks,v=E(()=>{"use strict";ys="https://flow.ciandt.com";Os=dt(),Ht={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},Wt="FLOW-nodejs",jt="config.json",ce={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};tt={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},f={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL",OTEL_EXPORTER_OTLP_HEADERS:"OTEL_EXPORTER_OTLP_HEADERS"},Ls={KEYCHAIN_ENABLED:!1},Vt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},pt={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},$={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},Be="flow-ai-obs-debug.log",B={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};ks="flow-obs-";});function u(...t){if(process.env[f.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
24
+ `);}r();}}n.on("close",(i,l)=>o(i===0,l??void 0)),n.on("error",i=>o(false,i.code));})}function vr(){return new Promise(t=>{Me((e,r)=>t(e||!r?null:r));})}function Ss(){try{let t=xe();if(t){Ot(C().version,t.latestVersion)&&(t.updatePriority==="auto"?Fe(t.latestVersion):$e(t.latestVersion));return}setImmediate(()=>{Me((e,r)=>{e||!r||(De(r.version,r.updatePriority),Ot(C().version,r.version)&&(r.updatePriority==="auto"?Fe(r.version):$e(r.version)));});});}catch{}}async function Ts(t={}){try{let e=xe();if(e){if(!Ot(C().version,e.latestVersion))return}else {let n=await vr();if(!n||(De(n.version,n.updatePriority),!Ot(C().version,n.version)))return;e={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Fe(e.latestVersion);return}if(!Z()){$e(e.latestVersion);return}await ws(e.latestVersion,t.timeoutMs)&&await kr(e.latestVersion);}catch{}}function _s(){try{if(xe())return;setImmediate(()=>{Me((t,e)=>{t||!e||Ot(C().version,e.version)&&De(e.version,e.updatePriority,0);});});}catch{}}var Ce,Lr,hs,Es,Lt=E(()=>{"use strict";Ne();Lr=Rt__namespace.default.join(gt__namespace.default.tmpdir(),"flow-obs-update-cache.json"),hs=1440*60*1e3,Es=3e3;});var Rr={};N(Rr,{BUFFER:()=>$,CONFIG_DIR_NAME:()=>Wt,CONFIG_FILE_NAME:()=>jt,DEBUG_LOG_FILENAME:()=>Be,ENV:()=>f,FEATURES:()=>Ls,FLOW_URLS:()=>Os,HOOK_TIMEOUTS:()=>pt,INSTALLER:()=>Vt,NATIVE_OTEL:()=>tt,OTLP:()=>ce,STATE_FILE_PREFIX:()=>ks,TRACE_LIMITS:()=>B,VAULT:()=>Ht,getFlowBaseUrl:()=>Q,getFlowUrls:()=>dt,getLlmProxy:()=>As,getMetrics:()=>le});function Q(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():ys}function dt(){let t=Q();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}function As(){let t=Q();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function le(){let t=Q();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var ys,Os,Ht,Wt,jt,ce,tt,f,Ls,Vt,pt,$,Be,B,ks,v=E(()=>{"use strict";ys="https://flow.ciandt.com";Os=dt(),Ht={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},Wt="FLOW-nodejs",jt="config.json",ce={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};tt={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},f={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL",FLOW_API_KEY:"FLOW_API_KEY"},Ls={KEYCHAIN_ENABLED:!1},Vt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},pt={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},$={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},Be="flow-ai-obs-debug.log",B={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};ks="flow-obs-";});function u(...t){if(process.env[f.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
25
25
  `;try{A.writeFileSync(Is,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
26
- `);}}var Is,H=E(()=>{"use strict";v();Is=Rt.join(gt.tmpdir(),Be);});function Cs(t){if(!Ns.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function $s(t,e){let r=e.length>400?e.slice(0,400)+"\u2026":e;u("toAuthError",`status=${t} body=${r}`);try{let n=JSON.parse(e);if(typeof n.error=="string"&&(u("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),br[n.error]))return new ft(br[n.error])}catch{}return t===401||t===403||t===500?new ft("Invalid credentials"):t>=400&&t<500?new ft("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function F(t){return new Promise((e,r)=>{try{Cs(t.tenant);}catch(a){return r(a)}let n=JSON.stringify({clientSecret:t.clientSecret}),s=new URL(dt().AUTH_ENGINE),i=s.protocol==="https:",o={hostname:s.hostname,port:s.port||(i?443:80),path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),FlowTenant:t.tenant}};u("getToken",`requesting token tenant=${t.tenant} host=${o.hostname} path=${o.path}`);let l=(i?fs__default.default:Ps__default.default).request(o,a=>{let d=[];a.on("data",m=>d.push(m)),a.on("end",()=>{let m=d.join("");if((a.statusCode??0)>=400)return r($s(a.statusCode??0,m));let T;try{T=JSON.parse(m);}catch{return r(new Error("Invalid response from auth engine"))}let S=T.expires_at??new Date(Date.now()+(T.expires_in??3600)*1e3).toISOString();e({accessToken:T.access_token??"",expiresAt:S});});});l.on("error",a=>r(new Error(`Network error: ${a.message}`))),l.write(n),l.end();})}var ft,Ns,br,mt=E(()=>{"use strict";v();H();ft=class extends Error{constructor(e){super(e),this.name="AuthError";}},Ns=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;br={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};});function Ir(){return process.platform==="win32"?false:process.getuid?.()===0}function ue(){if(Ir())return process.stderr.write(`
26
+ `);}}var Is,H=E(()=>{"use strict";v();Is=Rt.join(gt.tmpdir(),Be);});function Cs(t){if(!Ns.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function $s(t,e){let r=e.length>400?e.slice(0,400)+"\u2026":e;u("toAuthError",`status=${t} body=${r}`);try{let n=JSON.parse(e);if(typeof n.error=="string"&&(u("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),br[n.error]))return new ft(br[n.error])}catch{}return t===401||t===403||t===500?new ft("Invalid credentials"):t>=400&&t<500?new ft("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function F(t){return new Promise((e,r)=>{try{Cs(t.tenant);}catch(a){return r(a)}let n=JSON.stringify({clientSecret:t.clientSecret}),s=new URL(dt().AUTH_ENGINE),o=s.protocol==="https:",i={hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),FlowTenant:t.tenant}};u("getToken",`requesting token tenant=${t.tenant} host=${i.hostname} path=${i.path}`);let c=(o?fs__default.default:Ps__default.default).request(i,a=>{let p=[];a.on("data",m=>p.push(m)),a.on("end",()=>{let m=p.join("");if((a.statusCode??0)>=400)return r($s(a.statusCode??0,m));let T;try{T=JSON.parse(m);}catch{return r(new Error("Invalid response from auth engine"))}let S=T.expires_at??new Date(Date.now()+(T.expires_in??3600)*1e3).toISOString();e({accessToken:T.access_token??"",expiresAt:S});});});c.on("error",a=>r(new Error(`Network error: ${a.message}`))),c.write(n),c.end();})}var ft,Ns,br,mt=E(()=>{"use strict";v();H();ft=class extends Error{constructor(e){super(e),this.name="AuthError";}},Ns=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;br={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};});function Ir(){return process.platform==="win32"?false:process.getuid?.()===0}function ue(){if(Ir())return process.stderr.write(`
27
27
  `+I(` \u2717 flow-ai-obs is not supported in a sudo context.
28
28
 
29
29
  `)+U(` npm install -g @ciandt-flow/flow-ai-obs
30
30
  `)+`
31
- `),1}var de=E(()=>{"use strict";ut();});function Ur(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:gt__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||gt__namespace.userInfo().username}}function x(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(t=r);}if(t){let e=t.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return Rt__namespace.join(e,".claude","settings.json")}return Rt__namespace.join(gt__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||gt__namespace.homedir();return Rt__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return Rt__namespace.join(e,".claude","settings.json")}return Rt__namespace.join(gt__namespace.homedir(),".claude","settings.json")}var pe=E(()=>{"use strict";de();});function fe(){if(process.platform==="win32"){let r=process.env.APPDATA||Rt__namespace.join(gt__namespace.homedir(),"AppData","Roaming");return Rt__namespace.join(r,Pr,Nr)}let t=Ur(),e=process.env.XDG_CONFIG_HOME||Rt__namespace.join(t.home,".config");return Rt__namespace.join(e,Pr,Nr)}function We(){try{let t=A__namespace.readFileSync(x(),"utf8"),r=JSON.parse(t).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}var Pr,Nr,je=E(()=>{"use strict";pe();Pr="flow-ai-obs",Nr="config.json";});function Fr(t){try{let e=A__namespace.statSync(t);Date.now()-e.mtimeMs>Fs&&A__namespace.unlinkSync(t);}catch{}try{A__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function xr(t){try{A__namespace.unlinkSync(t);}catch{}}function xs(t,e){let n=(Array.isArray(t)?t:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let i=s.hooks.filter(o=>!o.command?.startsWith?.("flow-ai-obs "));return i.length>0?{...s,hooks:i}:null}).filter(s=>s!=null);return [e,...n]}function Dr(t,e){let r=x(),n=r+".lock",s=[];A__namespace.mkdirSync(Rt__namespace.dirname(r),{recursive:true}),Fr(n);try{if(A__namespace.existsSync(r)){A__namespace.copyFileSync(r,r+".bkp");try{A__namespace.chmodSync(r+".bkp",384);}catch{}}let i=fe();if(A__namespace.existsSync(i)){let p=i+".bkp";A__namespace.copyFileSync(i,p);try{A__namespace.chmodSync(p,384);}catch{}}let o={};try{o=JSON.parse(A__namespace.readFileSync(r,"utf8"));}catch{}let c=o.env&&typeof o.env=="object"?o.env:{};delete c.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:l}=(v(),P(Rr)),a=l().OTEL_ENDPOINT,d={...tt,OTEL_EXPORTER_OTLP_ENDPOINT:t??a};o.env={...c,...d,...e??{}},o.otelHeadersHelper="flow-ai-obs otel-headers",(!o.hooks||typeof o.hooks!="object"||Array.isArray(o.hooks))&&(o.hooks={});let m=(p,w)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${p}`,timeout:w}]}),T=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],S=o.hooks;for(let p of T){let w=xs(S[p],m(p,pt[p]));w.length>1&&s.push(p),S[p]=w;}A__namespace.writeFileSync(r,JSON.stringify(o,null,2)+`
31
+ `),1}var de=E(()=>{"use strict";ut();});function Ur(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:gt__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||gt__namespace.userInfo().username}}function x(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(t=r);}if(t){let e=t.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return Rt__namespace.join(e,".claude","settings.json")}return Rt__namespace.join(gt__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||gt__namespace.homedir();return Rt__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return Rt__namespace.join(e,".claude","settings.json")}return Rt__namespace.join(gt__namespace.homedir(),".claude","settings.json")}var pe=E(()=>{"use strict";de();});function fe(){if(process.platform==="win32"){let r=process.env.APPDATA||Rt__namespace.join(gt__namespace.homedir(),"AppData","Roaming");return Rt__namespace.join(r,Pr,Nr)}let t=Ur(),e=process.env.XDG_CONFIG_HOME||Rt__namespace.join(t.home,".config");return Rt__namespace.join(e,Pr,Nr)}function We(){try{let t=A__namespace.readFileSync(x(),"utf8"),r=JSON.parse(t).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}var Pr,Nr,je=E(()=>{"use strict";pe();Pr="flow-ai-obs",Nr="config.json";});function Fr(t){try{let e=A__namespace.statSync(t);Date.now()-e.mtimeMs>Fs&&A__namespace.unlinkSync(t);}catch{}try{A__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function xr(t){try{A__namespace.unlinkSync(t);}catch{}}function xs(t,e){let n=(Array.isArray(t)?t:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [e,...n]}function Dr(t,e){let r=x(),n=r+".lock",s=[];A__namespace.mkdirSync(Rt__namespace.dirname(r),{recursive:true}),Fr(n);try{if(A__namespace.existsSync(r)){A__namespace.copyFileSync(r,r+".bkp");try{A__namespace.chmodSync(r+".bkp",384);}catch{}}let o=fe();if(A__namespace.existsSync(o)){let d=o+".bkp";A__namespace.copyFileSync(o,d);try{A__namespace.chmodSync(d,384);}catch{}}let i={};try{i=JSON.parse(A__namespace.readFileSync(r,"utf8"));}catch{}let l=i.env&&typeof i.env=="object"?i.env:{};delete l.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:c}=(v(),P(Rr)),a=c().OTEL_ENDPOINT,p={...tt,OTEL_EXPORTER_OTLP_ENDPOINT:t??a};i.env={...l,...p,...e??{}},i.otelHeadersHelper="flow-ai-obs otel-headers",(!i.hooks||typeof i.hooks!="object"||Array.isArray(i.hooks))&&(i.hooks={});let m=(d,w)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${d}`,timeout:w}]}),T=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],S=i.hooks;for(let d of T){let w=xs(S[d],m(d,pt[d]));w.length>1&&s.push(d),S[d]=w;}A__namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
32
32
  `,{encoding:"utf8",mode:384});try{A__namespace.chmodSync(r,384);}catch{}}finally{xr(n);}return {settingsPath:r,preserved:s}}function Gt(t){try{let e=A__namespace.readFileSync(x(),"utf8"),n=JSON.parse(e).env?.[t];return typeof n=="string"?n:null}catch{return null}}function J(t){let e=x(),r=e+".lock";A__namespace.mkdirSync(Rt__namespace.dirname(e),{recursive:true}),Fr(r);try{let n={};try{n=JSON.parse(A__namespace.readFileSync(e,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,t),A__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
33
- `,{encoding:"utf8",mode:384});try{A__namespace.chmodSync(e,384);}catch{}}finally{xr(r);}}var Fs,vt=E(()=>{"use strict";v();mt();pe();je();Fs=Vt.LOCK_STALE_MS;});function Jt(){let t=gt__namespace.default.homedir();if(process.platform==="darwin")return Rt__namespace.default.join(t,"Library","Preferences",Wt,jt);if(process.platform==="win32"){let r=process.env.APPDATA??Rt__namespace.default.join(t,"AppData","Roaming");return Rt__namespace.default.join(r,Wt,jt)}let e=process.env.XDG_CONFIG_HOME??Rt__namespace.default.join(t,".config");return Rt__namespace.default.join(e,Wt,jt)}function Ge(){try{let t=A__namespace.default.readFileSync(Jt(),"utf8");return JSON.parse(t)}catch{return {}}}function Mr(t){let e=Jt();A__namespace.default.mkdirSync(Rt__namespace.default.dirname(e),{recursive:true}),A__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var Ye,qt,Br=E(()=>{"use strict";v();Ye={credentials:"credentials","token-cache":"tokenCache"};qt=class{static isAvailable(){return !0}static hasExistingData(){try{if(!A__namespace.default.existsSync(Jt()))return !1;let e=JSON.parse(A__namespace.default.readFileSync(Jt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,r){let n=Ge(),s=Ye[r]??r,i=n[s];return i?typeof i=="string"?i:JSON.stringify(i):null}async setSecret(e,r,n){let s=Ge(),i=Ye[r]??r;if(r==="token-cache")try{s[i]=JSON.parse(n);}catch{s[i]=n;}else s[i]=n;Mr(s);}async deleteSecret(e,r){let n=Ge(),s=Ye[r]??r;return s in n?(delete n[s],Mr(n),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Jt()}`}};});var Hr={};N(Hr,{MacOsKeyVaultProvider:()=>Ke});var Je,Ke,Wr=E(()=>{"use strict";Je=util.promisify(child_process.execFile),Ke=class{static async isAvailable(){try{return A.accessSync("/usr/bin/security",A.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await Je("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await Je("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await Je("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Vr={};N(Vr,{LinuxKeyVaultProvider:()=>qe});var jr,qe,Yr=E(()=>{"use strict";jr=util.promisify(child_process.execFile),qe=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of e)try{return A.accessSync(r,A.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await jr("secret-tool",["lookup","service",e,"account",r]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await new Promise((s,i)=>{let o=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",r]);o.on("error",i),o.on("close",c=>{c===0?s():i(new Error(`secret-tool exited with code ${c}`));}),o.stdin.write(n),o.stdin.end();});}async deleteSecret(e,r){try{return await jr("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Gr={};N(Gr,{WindowsKeyVaultProvider:()=>Xe});var Xe,Jr=E(()=>{"use strict";Xe=class{static async isAvailable(){try{return await Dt("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return Dt("keytar").getPassword(e,r)}async setSecret(e,r,n){await Dt("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return Dt("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});async function Kr(){return process.env[f.FLOW_OBS_USE_JSON_VAULT]==="1"?new qt:await Ks()??new qt}async function Ks(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Wr(),Hr));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Yr(),Vr));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Jr(),Gr));return await t.isAvailable()?new t:null}default:return null}}var qr=E(()=>{"use strict";v();Br();});var zr={};N(zr,{clearFlowCredentials:()=>Xs,getConfigPath:()=>Zs,getEmailFromToken:()=>Ut,getFlowCredentials:()=>Xr,getTokenCache:()=>Xt,hasCredentials:()=>Qs,isTokenValid:()=>zs,saveFlowCredentials:()=>qs,saveTokenCache:()=>et});function It(){return ze||(ze=Kr()),ze}async function Xr(){let e=await(await It()).getSecret(bt,Ze);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function qs(t){if(!t.clientId||!t.clientSecret||!t.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await It()).setSecret(bt,Ze,JSON.stringify(t));}async function Xs(){let t=await It();await t.deleteSecret(bt,Ze),await t.deleteSecret(bt,Qe);}async function et(t){await(await It()).setSecret(bt,Qe,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function Xt(){let e=await(await It()).getSecret(bt,Qe);if(!e)return null;try{let r=JSON.parse(e);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function zs(){let t=await Xt();return t?new Date(t.expiresAt)>new Date:false}async function Ut(){let t=await Xt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}async function Zs(){let t=await It();if(typeof t.getStoragePath=="function")return t.getStoragePath();let e=process.platform;return e==="darwin"?"macOS Keychain":e==="win32"?"Windows Credential Manager":"Linux Secret Service (libsecret)"}async function Qs(){let t=await Xr();return !!(t&&t.clientId&&t.clientSecret&&t.tenant)}var bt,Ze,Qe,ze,zt=E(()=>{"use strict";qr();v();bt=Ht.SERVICE,Ze=Ht.ACCOUNT_CREDS,Qe=Ht.ACCOUNT_TOKEN,ze=null;});function ro(t){return eo.some(e=>e.test(t))}function no(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function rt(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:s,tenant:i}=r;return !n||!s||!i?null:{clientId:n,clientSecret:s,tenant:i}}catch{return null}}function tn(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${r}.`}function ht(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[f.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&ro(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function en(){let t=rt(process.env[f.ANTHROPIC_AUTH_TOKEN]);return t?{user:await Ut().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function so(){return new Date().toISOString().slice(0,10)}async function oo(t){let e=so(),r=await Xt();if(r?.lastAuthCheckAt!==e){u("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let i=await F(t);try{await et({...i,lastAuthCheckAt:e});}catch{}return u("getOrRefreshToken",`daily check passed, expires=${i.expiresAt}`),i.accessToken}catch(i){if(i instanceof ft)throw i;u("getOrRefreshToken",`daily check network error \u2014 using cache: ${i.message}`);}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(u("getOrRefreshToken",`cacheValid=${n}`),n)return u("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;u("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let s=await F(t);try{await et({...s,lastAuthCheckAt:e});}catch(i){u("getOrRefreshToken",`token cache save failed (non-fatal): ${i.message}`);}return u("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function io(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function ao(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function K(){let t=[],e=process.env[f.ANTHROPIC_MODEL]??"",r=rt(process.env[f.ANTHROPIC_AUTH_TOKEN]);u("resolveCredentials",r?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),r&&u("resolveCredentials",`clientId=${r.clientId}`,`tenant=${r.tenant}`);let n=r?r.tenant:"",s=process.env[f.FLOW_TELEMETRY]==="true",i=process.env[f.LANGFUSE_BASE_URL],o=process.env[f.LANGFUSE_PUBLIC_KEY],c=process.env[f.LANGFUSE_SECRET_KEY];if(s&&i&&o&&c){let T="",S=n;r&&(T=await Ut().catch(()=>null)??r.clientId);let p={user:T??"",tenant:S??"",team:"",project:"",model:e};t.push({mode:"direct",...ao(ht(i),o,c),...p}),u("resolveCredentials","direct mode active",`user=${p.user}`,`tenant=${p.tenant}`);}if(!r){if(t.length===0){let T=[];return T.authError=false,T}return t}let l;try{l=await oo(r);}catch(T){if(u("resolveCredentials",`token refresh failed: ${T.message}`,`(tenant=${r.tenant} clientId=${r.clientId})`),t.length>0)return t.authError=true,t;let S=[];return S.authError=true,S}let d={user:no(l)??r.clientId,tenant:n,team:"",project:"",model:e},m=process.env[f.FLOW_TELEMETRY_GATEWAY]??Q();return t.push({mode:"gateway",...io(ht(m),{accessToken:l}),...d}),t}async function me(){return (await K()).length>0}function ge(){let t=process.env[f.FLOW_USER_EMAIL];if(t){let e=t.replace(/[\r\n]/g,"").trim();return e?(u("resolveUserEmail","using FLOW_USER_EMAIL override: [REDACTED]"),e):null}try{let e=gt__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",r=e.lastIndexOf("\\");if(r!==-1&&(e=e.slice(r+1)),e=e.trim().replace(/[^a-zA-Z0-9._%+\-]/g,""),!e)return u("resolveUserEmail","username empty after sanitisation \u2014 omitting x-flow-user"),Zr||(Zr=!0,console.warn("[flow-ai-obs] Could not derive x-flow-user: username is empty. Set FLOW_USER_EMAIL to fix this.")),null;let n=`${e}@ciandt.com`;return u("resolveUserEmail","derived email: [REDACTED]"),n}catch(e){return u("resolveUserEmail",`os.userInfo() threw: ${e.message} \u2014 omitting x-flow-user`),Qr||(Qr=true,console.warn("[flow-ai-obs] Could not derive x-flow-user from OS username. Set FLOW_USER_EMAIL to fix this.")),null}}function co(t){let e=process.env.OTEL_EXPORTER_OTLP_HEADERS;if(!e)return null;for(let r of e.split(",")){let n=r.indexOf("=");if(!(n<=0)&&r.slice(0,n).trim().toLowerCase()===t.toLowerCase())return r.slice(n+1).replace(/[\r\n]/g,"").trim()||null}return null}function rn(){return co("x-flow-api-key")}var eo,Zr,Qr,W=E(()=>{"use strict";zt();mt();v();H();eo=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];Zr=!1,Qr=!1;});var sn={};N(sn,{clearLoggedOutMarker:()=>er,isLoggedOut:()=>po,markLoggedOut:()=>uo});function tr(){return Rt__namespace.default.join(gt__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function uo(){try{let t=tr();A__namespace.default.mkdirSync(Rt__namespace.default.dirname(t),{recursive:!0}),A__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function er(){try{A__namespace.default.unlinkSync(tr());}catch{}}function po(){try{return A__namespace.default.existsSync(tr())}catch{return false}}var rr=E(()=>{"use strict";});function nr(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Gt("FLOW_BASE_URL")}function fo(){return Gt(f.ANTHROPIC_AUTH_TOKEN)??void 0}async function Ee(){let t=nr();if(!t)return {ok:false,baseUrl:"",user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let s=new URL(t);if(s.protocol!=="https:"&&s.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:t,user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"}}let e=fo(),r=rt(e);if(!r)return {ok:false,baseUrl:t,user:"",tenant:"",error:"No credentials found"};let n=process.env.FLOW_BASE_URL;process.env.FLOW_BASE_URL=t;try{let s=await F({clientId:r.clientId,clientSecret:r.clientSecret,tenant:r.tenant});await et({accessToken:s.accessToken,expiresAt:s.expiresAt});let i=r.clientId;try{let o=s.accessToken.split(".");if(o.length>=2){let c=JSON.parse(Buffer.from(o[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));i=c.email??c.preferred_username??c.upn??c.sub??i;}}catch{}return {ok:!0,baseUrl:t,user:i,tenant:r.tenant}}catch(s){return {ok:false,baseUrl:t,user:r.clientId,tenant:r.tenant,error:s.message}}finally{n===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=n;}}var sr=E(()=>{"use strict";zt();W();vt();v();mt();});var Se={};N(Se,{promptRaw:()=>Zt,runLogin:()=>ho});function j(t){return typeof t=="string"?t.replace(mo,""):t}function Zt(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:i=""}=e;process.stdout.write(t+i);let o=i;function c(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",c),process.once("unhandledRejection",c);let l=d=>{if(d===""){a(),n(new Error("SIGINT"));return}if(d==="\r"||d===`
33
+ `,{encoding:"utf8",mode:384});try{A__namespace.chmodSync(e,384);}catch{}}finally{xr(r);}}var Fs,vt=E(()=>{"use strict";v();mt();pe();je();Fs=Vt.LOCK_STALE_MS;});function Jt(){let t=gt__namespace.default.homedir();if(process.platform==="darwin")return Rt__namespace.default.join(t,"Library","Preferences",Wt,jt);if(process.platform==="win32"){let r=process.env.APPDATA??Rt__namespace.default.join(t,"AppData","Roaming");return Rt__namespace.default.join(r,Wt,jt)}let e=process.env.XDG_CONFIG_HOME??Rt__namespace.default.join(t,".config");return Rt__namespace.default.join(e,Wt,jt)}function Ge(){try{let t=A__namespace.default.readFileSync(Jt(),"utf8");return JSON.parse(t)}catch{return {}}}function Mr(t){let e=Jt();A__namespace.default.mkdirSync(Rt__namespace.default.dirname(e),{recursive:true}),A__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var Ye,qt,Br=E(()=>{"use strict";v();Ye={credentials:"credentials","token-cache":"tokenCache"};qt=class{static isAvailable(){return !0}static hasExistingData(){try{if(!A__namespace.default.existsSync(Jt()))return !1;let e=JSON.parse(A__namespace.default.readFileSync(Jt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,r){let n=Ge(),s=Ye[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(e,r,n){let s=Ge(),o=Ye[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;Mr(s);}async deleteSecret(e,r){let n=Ge(),s=Ye[r]??r;return s in n?(delete n[s],Mr(n),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Jt()}`}};});var Hr={};N(Hr,{MacOsKeyVaultProvider:()=>Ke});var Je,Ke,Wr=E(()=>{"use strict";Je=util.promisify(child_process.execFile),Ke=class{static async isAvailable(){try{return A.accessSync("/usr/bin/security",A.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await Je("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await Je("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await Je("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Vr={};N(Vr,{LinuxKeyVaultProvider:()=>qe});var jr,qe,Yr=E(()=>{"use strict";jr=util.promisify(child_process.execFile),qe=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of e)try{return A.accessSync(r,A.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await jr("secret-tool",["lookup","service",e,"account",r]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await new Promise((s,o)=>{let i=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",r]);i.on("error",o),i.on("close",l=>{l===0?s():o(new Error(`secret-tool exited with code ${l}`));}),i.stdin.write(n),i.stdin.end();});}async deleteSecret(e,r){try{return await jr("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Gr={};N(Gr,{WindowsKeyVaultProvider:()=>ze});var ze,Jr=E(()=>{"use strict";ze=class{static async isAvailable(){try{return await Dt("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return Dt("keytar").getPassword(e,r)}async setSecret(e,r,n){await Dt("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return Dt("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});async function Kr(){return process.env[f.FLOW_OBS_USE_JSON_VAULT]==="1"?new qt:await Ks()??new qt}async function Ks(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Wr(),Hr));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Yr(),Vr));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Jr(),Gr));return await t.isAvailable()?new t:null}default:return null}}var qr=E(()=>{"use strict";v();Br();});var Xr={};N(Xr,{clearFlowCredentials:()=>zs,getConfigPath:()=>Zs,getEmailFromToken:()=>Ut,getFlowCredentials:()=>zr,getTokenCache:()=>zt,hasCredentials:()=>Qs,isTokenValid:()=>Xs,saveFlowCredentials:()=>qs,saveTokenCache:()=>et});function It(){return Xe||(Xe=Kr()),Xe}async function zr(){let e=await(await It()).getSecret(bt,Ze);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function qs(t){if(!t.clientId||!t.clientSecret||!t.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await It()).setSecret(bt,Ze,JSON.stringify(t));}async function zs(){let t=await It();await t.deleteSecret(bt,Ze),await t.deleteSecret(bt,Qe);}async function et(t){await(await It()).setSecret(bt,Qe,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function zt(){let e=await(await It()).getSecret(bt,Qe);if(!e)return null;try{let r=JSON.parse(e);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function Xs(){let t=await zt();return t?new Date(t.expiresAt)>new Date:false}async function Ut(){let t=await zt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}async function Zs(){let t=await It();if(typeof t.getStoragePath=="function")return t.getStoragePath();let e=process.platform;return e==="darwin"?"macOS Keychain":e==="win32"?"Windows Credential Manager":"Linux Secret Service (libsecret)"}async function Qs(){let t=await zr();return !!(t&&t.clientId&&t.clientSecret&&t.tenant)}var bt,Ze,Qe,Xe,Xt=E(()=>{"use strict";qr();v();bt=Ht.SERVICE,Ze=Ht.ACCOUNT_CREDS,Qe=Ht.ACCOUNT_TOKEN,Xe=null;});function ro(t){return eo.some(e=>e.test(t))}function no(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function rt(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:s,tenant:o}=r;return !n||!s||!o?null:{clientId:n,clientSecret:s,tenant:o}}catch{return null}}function tn(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${r}.`}function ht(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[f.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&ro(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function en(){let t=rt(process.env[f.ANTHROPIC_AUTH_TOKEN]);return t?{user:await Ut().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function so(){return new Date().toISOString().slice(0,10)}async function oo(t){let e=so(),r=await zt();if(r?.lastAuthCheckAt!==e){u("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let o=await F(t);try{await et({...o,lastAuthCheckAt:e});}catch{}return u("getOrRefreshToken",`daily check passed, expires=${o.expiresAt}`),o.accessToken}catch(o){if(o instanceof ft)throw o;u("getOrRefreshToken",`daily check network error \u2014 using cache: ${o.message}`);}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(u("getOrRefreshToken",`cacheValid=${n}`),n)return u("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;u("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let s=await F(t);try{await et({...s,lastAuthCheckAt:e});}catch(o){u("getOrRefreshToken",`token cache save failed (non-fatal): ${o.message}`);}return u("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function io(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function ao(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function K(){let t=[],e=process.env[f.ANTHROPIC_MODEL]??"",r=rt(process.env[f.ANTHROPIC_AUTH_TOKEN]);u("resolveCredentials",r?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),r&&u("resolveCredentials",`clientId=${r.clientId}`,`tenant=${r.tenant}`);let n=r?r.tenant:"",s=process.env[f.FLOW_TELEMETRY]==="true",o=process.env[f.LANGFUSE_BASE_URL],i=process.env[f.LANGFUSE_PUBLIC_KEY],l=process.env[f.LANGFUSE_SECRET_KEY];if(s&&o&&i&&l){let T="",S=n;r&&(T=await Ut().catch(()=>null)??r.clientId);let d={user:T??"",tenant:S??"",team:"",project:"",model:e};t.push({mode:"direct",...ao(ht(o),i,l),...d}),u("resolveCredentials","direct mode active",`user=${d.user}`,`tenant=${d.tenant}`);}if(!r){if(t.length===0){let T=[];return T.authError=false,T}return t}let c;try{c=await oo(r);}catch(T){if(u("resolveCredentials",`token refresh failed: ${T.message}`,`(tenant=${r.tenant} clientId=${r.clientId})`),t.length>0)return t.authError=true,t;let S=[];return S.authError=true,S}let p={user:no(c)??r.clientId,tenant:n,team:"",project:"",model:e},m=process.env[f.FLOW_TELEMETRY_GATEWAY]??Q();return t.push({mode:"gateway",...io(ht(m),{accessToken:c}),...p}),t}async function me(){return (await K()).length>0}function ge(){let t=process.env[f.FLOW_USER_EMAIL];if(t){let e=t.replace(/[\r\n]/g,"").trim();return e?(u("resolveUserEmail","using FLOW_USER_EMAIL override: [REDACTED]"),e):null}try{let e=gt__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",r=e.lastIndexOf("\\");if(r!==-1&&(e=e.slice(r+1)),e=e.trim().replace(/[^a-zA-Z0-9._%+\-]/g,""),!e)return u("resolveUserEmail","username empty after sanitisation \u2014 omitting x-flow-user"),Zr||(Zr=!0,console.warn("[flow-ai-obs] Could not derive x-flow-user: username is empty. Set FLOW_USER_EMAIL to fix this.")),null;let n=`${e}@ciandt.com`;return u("resolveUserEmail","derived email: [REDACTED]"),n}catch(e){return u("resolveUserEmail",`os.userInfo() threw: ${e.message} \u2014 omitting x-flow-user`),Qr||(Qr=true,console.warn("[flow-ai-obs] Could not derive x-flow-user from OS username. Set FLOW_USER_EMAIL to fix this.")),null}}function rn(){let t=process.env[f.FLOW_API_KEY];return t&&t.replace(/[\r\n]/g,"").trim()||null}var eo,Zr,Qr,W=E(()=>{"use strict";Xt();mt();v();H();eo=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];Zr=!1,Qr=!1;});var sn={};N(sn,{clearLoggedOutMarker:()=>er,isLoggedOut:()=>uo,markLoggedOut:()=>lo});function tr(){return Rt__namespace.default.join(gt__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function lo(){try{let t=tr();A__namespace.default.mkdirSync(Rt__namespace.default.dirname(t),{recursive:!0}),A__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function er(){try{A__namespace.default.unlinkSync(tr());}catch{}}function uo(){try{return A__namespace.default.existsSync(tr())}catch{return false}}var rr=E(()=>{"use strict";});function nr(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Gt("FLOW_BASE_URL")}function po(){return Gt(f.ANTHROPIC_AUTH_TOKEN)??void 0}async function Ee(){let t=nr();if(!t)return {ok:false,baseUrl:"",user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let s=new URL(t);if(s.protocol!=="https:"&&s.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:t,user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"}}let e=po(),r=rt(e);if(!r)return {ok:false,baseUrl:t,user:"",tenant:"",error:"No credentials found"};let n=process.env.FLOW_BASE_URL;process.env.FLOW_BASE_URL=t;try{let s=await F({clientId:r.clientId,clientSecret:r.clientSecret,tenant:r.tenant});await et({accessToken:s.accessToken,expiresAt:s.expiresAt});let o=r.clientId;try{let i=s.accessToken.split(".");if(i.length>=2){let l=JSON.parse(Buffer.from(i[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));o=l.email??l.preferred_username??l.upn??l.sub??o;}}catch{}return {ok:!0,baseUrl:t,user:o,tenant:r.tenant}}catch(s){return {ok:false,baseUrl:t,user:r.clientId,tenant:r.tenant,error:s.message}}finally{n===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=n;}}var sr=E(()=>{"use strict";Xt();W();vt();v();mt();});var Se={};N(Se,{promptRaw:()=>Zt,runLogin:()=>go});function j(t){return typeof t=="string"?t.replace(fo,""):t}function Zt(t,e={}){return new Promise((r,n)=>{if(typeof process.stdin.setRawMode!="function"){n(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:o=""}=e;process.stdout.write(t+o);let i=o;function l(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",l),process.once("unhandledRejection",l);let c=p=>{if(p===""){a(),n(new Error("SIGINT"));return}if(p==="\r"||p===`
34
34
  `){a(),process.stdout.write(`
35
- `),r(o);return}if(d==="\x7F"){o.length>0&&(o=o.slice(0,-1),process.stdout.write("\b \b"));return}d.startsWith("\x1B")||(o+=d,process.stdout.write(s?"*".repeat(d.length):d));};function a(){process.stdin.setRawMode(false),process.stdin.removeListener("data",l),process.removeListener("uncaughtException",c),process.removeListener("unhandledRejection",c);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",l);})}async function we(t,e=false){let r=nr(),n=process.env.FLOW_BASE_URL;r&&(process.env.FLOW_BASE_URL=r);try{let{accessToken:s,expiresAt:i}=await F(t),o=tn(t);if(e)return {jwt:o,accessToken:s,expiresAt:i};J({[f.ANTHROPIC_AUTH_TOKEN]:o}),er(),await et({accessToken:s,expiresAt:i});}finally{n===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=n;}}async function go(t=false){try{let e=(await Zt(U(" ? ")+"Client ID: ")).trim(),r=(await Zt(U(" ? ")+"Client Secret: ",{masked:!0})).trim(),n=(await Zt(U(" ? ")+"Tenant: ")).trim();if(!e||!r||!n)return process.stderr.write(I(` \u2717 All fields are required
35
+ `),r(i);return}if(p==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}p.startsWith("\x1B")||(i+=p,process.stdout.write(s?"*".repeat(p.length):p));};function a(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",l),process.removeListener("unhandledRejection",l);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}async function we(t,e=false){let r=nr(),n=process.env.FLOW_BASE_URL;r&&(process.env.FLOW_BASE_URL=r);try{let{accessToken:s,expiresAt:o}=await F(t),i=tn(t);if(e)return {jwt:i,accessToken:s,expiresAt:o};J({[f.ANTHROPIC_AUTH_TOKEN]:i}),er(),await et({accessToken:s,expiresAt:o});}finally{n===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=n;}}async function mo(t=false){try{let e=(await Zt(U(" ? ")+"Client ID: ")).trim(),r=(await Zt(U(" ? ")+"Client Secret: ",{masked:!0})).trim(),n=(await Zt(U(" ? ")+"Tenant: ")).trim();if(!e||!r||!n)return process.stderr.write(I(` \u2717 All fields are required
36
36
  `)),1;if(process.stdout.write(g(` Authenticating...
37
37
  `)),t){let s=await we({clientId:e,clientSecret:r,tenant:n},!0);return process.stdout.write(`
38
38
  ${k("\u2713")} ${b("Authenticated")}
@@ -48,11 +48,11 @@
48
48
  ${I("\u2717")} ${b("Authentication failed:")}
49
49
  ${j(e.message)}
50
50
 
51
- `),1}}async function ho(t={}){let e=ue();if(e)return e;let{deferPersist:r=false,skipAuthCheck:n=false}=t;if(t.clientId&&t.clientSecret&&t.tenant)try{if(r){let i=await we({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant},!0);return process.stdout.write(k(` \u2713 Authenticated. Tenant: ${j(t.tenant)}
51
+ `),1}}async function go(t={}){let e=ue();if(e)return e;let{deferPersist:r=false,skipAuthCheck:n=false}=t;if(t.clientId&&t.clientSecret&&t.tenant)try{if(r){let o=await we({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant},!0);return process.stdout.write(k(` \u2713 Authenticated. Tenant: ${j(t.tenant)}
52
52
 
53
- `)),{code:0,result:i}}return await we({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant}),process.stdout.write(k(` \u2713 Authenticated. Tenant: ${j(t.tenant)}
53
+ `)),{code:0,result:o}}return await we({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant}),process.stdout.write(k(` \u2713 Authenticated. Tenant: ${j(t.tenant)}
54
54
 
55
- `)),0}catch(i){return process.stderr.write(I(` \u2717 Authentication failed: ${j(i.message)}
55
+ `)),0}catch(o){return process.stderr.write(I(` \u2717 Authentication failed: ${j(o.message)}
56
56
  `)),1}let s=await Ee();if(!n){if(process.stdout.write(`
57
57
  `),process.stdout.write(b(` Auth
58
58
  `)),s.notConfigured)return process.stdout.write(` ${R("\u26A0")} Not configured
@@ -62,10 +62,10 @@
62
62
  `),process.stdout.write(g(" Tenant: ")+j(s.tenant)+`
63
63
  `),process.stdout.write(g(" User: ")+j(s.user)+`
64
64
  `),process.stdout.write(`
65
- `);let i;try{i=await Zt(U(" ? ")+"Re-authenticate? (y/N): ");}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
66
- `),130;if(o.message==="NOT_A_TTY")return process.stdout.write(k(` \u2713 Using existing credentials.
65
+ `);let o;try{o=await Zt(U(" ? ")+"Re-authenticate? (y/N): ");}catch(i){if(i.message==="SIGINT")return process.stdout.write(`
66
+ `),130;if(i.message==="NOT_A_TTY")return process.stdout.write(k(` \u2713 Using existing credentials.
67
67
 
68
- `)),0;throw o}if(i.trim().toLowerCase()!=="y")return process.stdout.write(k(` \u2713 Using existing credentials.
68
+ `)),0;throw i}if(o.trim().toLowerCase()!=="y")return process.stdout.write(k(` \u2713 Using existing credentials.
69
69
 
70
70
  `)),0}else s.error==="No credentials found"?(process.stdout.write(` ${R("\u26A0")} Not authenticated
71
71
  `),process.stdout.write(g(` URL: ${s.baseUrl}
@@ -75,47 +75,47 @@
75
75
  `),process.stdout.write(g(" Tenant: ")+j(s.tenant)+`
76
76
  `),process.stdout.write(g(" User: ")+g("(not authenticated)")+`
77
77
  `),process.stdout.write(`
78
- `));}try{return await go(r)}catch(i){if(i.message==="SIGINT")return process.stdout.write(`
79
- `),130;if(i.message==="NOT_A_TTY")return process.stderr.write(I(` \u2717 No TTY available for interactive login.
78
+ `));}try{return await mo(r)}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
79
+ `),130;if(o.message==="NOT_A_TTY")return process.stderr.write(I(` \u2717 No TTY available for interactive login.
80
80
  `)+` Pass --client-id, --client-secret and --tenant for non-interactive use.
81
81
 
82
- `),1;throw i}}var mo,Te=E(()=>{"use strict";zt();rr();mt();W();vt();v();ut();de();sr();mo=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var ln={};N(ln,{normalizeCustomUrl:()=>cn,runInit:()=>To,validateCustomUrl:()=>cr});function _e(t,e,r){process.stdout.write(b(U(`
82
+ `),1;throw o}}var fo,Te=E(()=>{"use strict";Xt();rr();mt();W();vt();v();ut();de();sr();fo=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var ln={};N(ln,{normalizeCustomUrl:()=>cn,runInit:()=>So,validateCustomUrl:()=>cr});function _e(t,e,r){process.stdout.write(b(U(`
83
83
  [${t}/${e}] ${r}
84
84
  `)));}function or(t){process.stdout.write(` ${k("\u2713")} ${t}
85
- `);}function Eo(t){process.stdout.write(` ${R("\u26A0")} ${t}
85
+ `);}function ho(t){process.stdout.write(` ${R("\u26A0")} ${t}
86
86
  `);}function on(t){process.stdout.write(` ${g(t)}
87
- `);}function ar(){try{let t=A__namespace.readFileSync(x(),"utf8");return JSON.parse(t).env||{}}catch{return {}}}function an(){try{let t=A__namespace.readFileSync(x(),"utf8"),e=JSON.parse(t);return !!(e.env&&e.env[f.ANTHROPIC_AUTH_TOKEN])}catch{return false}}function wo(){let t=We();if(!t)return null;J({FLOW_BASE_URL:t});try{let e=fe(),r={};try{r=JSON.parse(A__namespace.readFileSync(e,"utf8"));}catch{return t}delete r.baseUrl,Object.keys(r).length===0?A__namespace.unlinkSync(e):A__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
88
- `,{encoding:"utf8",mode:384});}catch{}return t}function cn(t){let e=t.trim().replace(/\\/g,"/");/^https?:\/\//i.test(e)||(e=`https://${e}`);try{let r=new URL(e);return `${r.protocol}//${r.host}`}catch{return e}}function cr(t,e=false){if(e){let i=/^https?:\/\//i.test(t.trim())?t.trim().replace(/\\/g,"/"):`https://${t.trim().replace(/\\/g,"/")}`,o;try{o=new URL(i);}catch{throw new Error(`Invalid URL: ${t}`)}if(o.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(o.pathname!=="/"&&o.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
87
+ `);}function ar(){try{let t=A__namespace.readFileSync(x(),"utf8");return JSON.parse(t).env||{}}catch{return {}}}function an(){try{let t=A__namespace.readFileSync(x(),"utf8"),e=JSON.parse(t);return !!(e.env&&e.env[f.ANTHROPIC_AUTH_TOKEN])}catch{return false}}function Eo(){let t=We();if(!t)return null;J({FLOW_BASE_URL:t});try{let e=fe(),r={};try{r=JSON.parse(A__namespace.readFileSync(e,"utf8"));}catch{return t}delete r.baseUrl,Object.keys(r).length===0?A__namespace.unlinkSync(e):A__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
88
+ `,{encoding:"utf8",mode:384});}catch{}return t}function cn(t){let e=t.trim().replace(/\\/g,"/");/^https?:\/\//i.test(e)||(e=`https://${e}`);try{let r=new URL(e);return `${r.protocol}//${r.host}`}catch{return e}}function cr(t,e=false){if(e){let o=/^https?:\/\//i.test(t.trim())?t.trim().replace(/\\/g,"/"):`https://${t.trim().replace(/\\/g,"/")}`,i;try{i=new URL(o);}catch{throw new Error(`Invalid URL: ${t}`)}if(i.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(i.pathname!=="/"&&i.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
89
89
  Received: ${t}
90
- Expected: https://tenant.example.com`);if(o.search)throw new Error(`Custom URL must not contain query parameters.
90
+ Expected: https://tenant.example.com`);if(i.search)throw new Error(`Custom URL must not contain query parameters.
91
91
  Received: ${t}
92
- Expected: https://tenant.example.com`);if(o.hash)throw new Error(`Custom URL must not contain a fragment.
92
+ Expected: https://tenant.example.com`);if(i.hash)throw new Error(`Custom URL must not contain a fragment.
93
93
  Received: ${t}
94
- Expected: https://tenant.example.com`);if(o.username||o.password)throw new Error(`Custom URL must not contain embedded credentials.
94
+ Expected: https://tenant.example.com`);if(i.username||i.password)throw new Error(`Custom URL must not contain embedded credentials.
95
95
  Received: ${t}
96
- Expected: https://tenant.example.com`);if(!o.hostname.includes("."))throw new Error(`Invalid domain: ${o.hostname}. Expected format: tenant.example.com`);let c=`${o.protocol}//${o.host}`,l=process.env[f.FLOW_OBS_ALLOW_HTTP];try{delete process.env[f.FLOW_OBS_ALLOW_HTTP],ht(c);}finally{l!==void 0&&(process.env[f.FLOW_OBS_ALLOW_HTTP]=l);}return c}let r=cn(t),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${t}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!n.hostname.includes("."))throw new Error(`Invalid domain: ${n.hostname}. Expected format: tenant.example.com`);let s=process.env[f.FLOW_OBS_ALLOW_HTTP];try{delete process.env[f.FLOW_OBS_ALLOW_HTTP],ht(r);}finally{s!==void 0&&(process.env[f.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function ir(){for(let t=1;t<=3;t++)try{let e=await Pe(" Enter your Flow domain (e.g., tenant.ciandt.com)");return cr(e)}catch(e){if(process.stderr.write(R(` \u2717 ${e.message}
96
+ Expected: https://tenant.example.com`);if(!i.hostname.includes("."))throw new Error(`Invalid domain: ${i.hostname}. Expected format: tenant.example.com`);let l=`${i.protocol}//${i.host}`,c=process.env[f.FLOW_OBS_ALLOW_HTTP];try{delete process.env[f.FLOW_OBS_ALLOW_HTTP],ht(l);}finally{c!==void 0&&(process.env[f.FLOW_OBS_ALLOW_HTTP]=c);}return l}let r=cn(t),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${t}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!n.hostname.includes("."))throw new Error(`Invalid domain: ${n.hostname}. Expected format: tenant.example.com`);let s=process.env[f.FLOW_OBS_ALLOW_HTTP];try{delete process.env[f.FLOW_OBS_ALLOW_HTTP],ht(r);}finally{s!==void 0&&(process.env[f.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function ir(){for(let t=1;t<=3;t++)try{let e=await Pe(" Enter your Flow domain (e.g., tenant.ciandt.com)");return cr(e)}catch(e){if(process.stderr.write(R(` \u2717 ${e.message}
97
97
 
98
98
  `)),t===3)throw process.stderr.write(I(` Too many invalid attempts.
99
99
 
100
- `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}async function So(t,e,r){let n=ar()[f.FLOW_USER_EMAIL]??null,s=ge(),i=s??"(could not be derived)";if(!t||!Z()){if(r){let a=r.replace(/[\r\n]/g,"").trim();if(a)return J({[f.FLOW_USER_EMAIL]:a}),a}return n??s}function o(a){return a.trim()}function c(a){if(/\s/.test(a))return "Email must not contain spaces";if((a.match(/@/g)??[]).length!==1)return "Email must contain exactly one @";let d=a.indexOf("@");if(d<=0)return "Email must contain a local part before @";let m=a.slice(d+1);if(!m)return "Email must contain a domain after @";if(m.startsWith("."))return `Invalid email domain: ${m}`;try{if(!new URL(`https://${m}`).hostname.includes("."))return "Email domain must contain at least one dot"}catch{return `Invalid email domain: ${m}`}return null}async function l(){for(let a=1;a<=3;a++)try{let d=await Pe(" Enter your corporate email (e.g., user@company.com)"),m=o(d),T=c(m);if(T)throw new Error(T);return m}catch(d){if(process.stderr.write(R(` \u2717 ${d.message}
100
+ `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}async function wo(t,e,r){let n=ar()[f.FLOW_USER_EMAIL]??null,s=ge(),o=s??"(could not be derived)";if(!t||!Z()){if(r){let a=r.replace(/[\r\n]/g,"").trim();if(a)return J({[f.FLOW_USER_EMAIL]:a}),a}return n??s}function i(a){return a.trim()}function l(a){if(/\s/.test(a))return "Email must not contain spaces";if((a.match(/@/g)??[]).length!==1)return "Email must contain exactly one @";let p=a.indexOf("@");if(p<=0)return "Email must contain a local part before @";let m=a.slice(p+1);if(!m)return "Email must contain a domain after @";if(m.startsWith("."))return `Invalid email domain: ${m}`;try{if(!new URL(`https://${m}`).hostname.includes("."))return "Email domain must contain at least one dot"}catch{return `Invalid email domain: ${m}`}return null}async function c(){for(let a=1;a<=3;a++)try{let p=await Pe(" Enter your corporate email (e.g., user@company.com)"),m=i(p),T=l(m);if(T)throw new Error(T);return m}catch(p){if(process.stderr.write(R(` \u2717 ${p.message}
101
101
 
102
102
  `)),a===3)throw process.stderr.write(I(` Too many invalid attempts.
103
103
 
104
104
  `)),new Error("Too many invalid email attempts")}throw new Error("Too many invalid email attempts")}if(n){if(await Bt(` Registered email: ${b(n)} \u2014 still correct?`,true))return process.stdout.write(k(` \u2713 Email: ${b(n)}
105
105
 
106
- `)),n;let d=await l();return J({[f.FLOW_USER_EMAIL]:d}),process.stdout.write(k(` \u2713 Email updated: ${d}
106
+ `)),n;let p=await c();return J({[f.FLOW_USER_EMAIL]:p}),process.stdout.write(k(` \u2713 Email updated: ${p}
107
107
 
108
- `)),d}if(!s){process.stdout.write(R(`
108
+ `)),p}if(!s){process.stdout.write(R(`
109
109
  \u26A0 Could not derive email from OS username.
110
- `));let a=await l();return J({[f.FLOW_USER_EMAIL]:a}),process.stdout.write(k(` \u2713 Email saved: ${a}
110
+ `));let a=await c();return J({[f.FLOW_USER_EMAIL]:a}),process.stdout.write(k(` \u2713 Email saved: ${a}
111
111
 
112
- `)),a}if(e){if(await Bt(" Is your corporate email domain @ciandt.com?",true))return process.stdout.write(k(` \u2713 Email: ${b(i)}
112
+ `)),a}if(e){if(await Bt(" Is your corporate email domain @ciandt.com?",true))return process.stdout.write(k(` \u2713 Email: ${b(o)}
113
113
 
114
- `)),s;{let d=await l();return J({[f.FLOW_USER_EMAIL]:d}),process.stdout.write(k(` \u2713 Email saved: ${d}
114
+ `)),s;{let p=await c();return J({[f.FLOW_USER_EMAIL]:p}),process.stdout.write(k(` \u2713 Email saved: ${p}
115
115
 
116
- `)),d}}else return process.stdout.write(k(` \u2713 Email: ${b(i)}
116
+ `)),p}}else return process.stdout.write(k(` \u2713 Email: ${b(o)}
117
117
 
118
- `)),s}function Qt(){try{let t=A__namespace.readFileSync(x(),"utf8"),r=JSON.parse(t).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}async function To(t={}){let e=ue();if(e)return e;let r=t.url,n=4;process.stdout.write(b(U(`
118
+ `)),s}function Qt(){try{let t=A__namespace.readFileSync(x(),"utf8"),r=JSON.parse(t).env?.FLOW_BASE_URL;return typeof r=="string"&&r.trim()?r.trim():null}catch{return null}}async function So(t={}){let e=ue();if(e)return e;let r=t.url,n=4;process.stdout.write(b(U(`
119
119
  flow-ai-obs init
120
120
  `))),process.stdout.write(g(` Configuring your development environment:
121
121
 
@@ -123,11 +123,11 @@
123
123
  `)),process.stdout.write(g(` [2/4] User Identity Capture user email for telemetry
124
124
  `)),process.stdout.write(g(` [3/4] Authentication Authenticate with Flow
125
125
  `)),process.stdout.write(g(` [4/4] Observability OpenTelemetry metrics, logs and trace hooks
126
- `)),_e(1,n,"Flow Environment Setup");let s=false;{let _=ar().FLOW_BASE_URL;if(_&&(Eo(`Base URL already configured (FLOW_BASE_URL=${_})`),!t.noInteractive&&Z()))try{let{promptRaw:L}=await Promise.resolve().then(()=>(Te(),Se));s=(await L(U(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",s||on("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(R(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
126
+ `)),_e(1,n,"Flow Environment Setup");let s=false;{let _=ar().FLOW_BASE_URL;if(_&&(ho(`Base URL already configured (FLOW_BASE_URL=${_})`),!t.noInteractive&&Z()))try{let{promptRaw:L}=await Promise.resolve().then(()=>(Te(),Se));s=(await L(U(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",s||on("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(R(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
127
127
  `)+R(" on Windows too: ")+U(`npm install -g @ciandt-flow/flow-ai-obs
128
128
  `)+R(` Running a Windows code assistant + flow-ai-obs (WSL) is not a supported configuration.
129
129
 
130
- `)),wo(),!r&&!t.noInteractive&&Z()){let _=Qt();try{s?r=await ir():_?(process.stdout.write(`
130
+ `)),Eo(),!r&&!t.noInteractive&&Z()){let _=Qt();try{s?r=await ir():_?(process.stdout.write(`
131
131
  Current base URL: ${b(_)}
132
132
  `),await Bt(" Keep this URL?",!0)||(r=await ir())):(process.stdout.write(`
133
133
  `),await Bt(" Does your organization use a custom Flow URL?",!1)?r=await ir():or("Using default Flow Base URL: https://flow.ciandt.com"));}catch{return 1}process.stdout.write(`
@@ -137,34 +137,34 @@
137
137
  `));else return process.stderr.write(` \u2717 No URL configured and no TTY available.
138
138
  Run: flow-ai-obs init --custom-url <URL>
139
139
 
140
- `),1}let i,o=false;if(r){let _;try{_=cr(r,!0);}catch(at){return process.stderr.write(`
140
+ `),1}let o,i=false;if(r){let _;try{_=cr(r,!0);}catch(at){return process.stderr.write(`
141
141
  \u2717 Invalid --custom-url: ${at.message}
142
142
 
143
- `),1}let L=Qt();i=_,o=!!L&&L!==_,o?process.stdout.write(R(` \u26A0 Base URL changed \u2014 re-authentication required.
143
+ `),1}let L=Qt();o=_,i=!!L&&L!==_,i?process.stdout.write(R(` \u26A0 Base URL changed \u2014 re-authentication required.
144
144
  `)+g(` Previous: ${L}
145
145
  `)+g(` New: ${_}
146
146
 
147
147
  `)):process.stdout.write(k(` \u2713 Base URL configured: ${_}
148
148
 
149
- `));}else i=Qt()??"https://flow.ciandt.com";let c={FLOW_BASE_URL:i,OTEL_EXPORTER_OTLP_ENDPOINT:`${i}/otel`,ANTHROPIC_BASE_URL:`${i}/flow-llm-proxy/`,ANTHROPIC_MODEL:"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"};process.env.FLOW_BASE_URL=i,process.stdout.write(k(`
149
+ `));}else o=Qt()??"https://flow.ciandt.com";let l={FLOW_BASE_URL:o,OTEL_EXPORTER_OTLP_ENDPOINT:`${o}/otel`,ANTHROPIC_BASE_URL:`${o}/flow-llm-proxy/`,ANTHROPIC_MODEL:"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"};process.env.FLOW_BASE_URL=o,process.stdout.write(k(`
150
150
  \u2713 Flow environment ready.
151
- `));let l=36;for(let[_,L]of Object.entries(c))process.stdout.write(g(` ${_.padEnd(l)}`)+L+`
152
- `);_e(2,n,"User Identity"),await So(!t.noInteractive,!!(r??We()),t.email),_e(3,n,"Authentication");let a=null,d=Qt(),m=!!d&&d!==i;if(!an()||o||m){if(t.noInteractive||!Z())return process.stderr.write(`
151
+ `));let c=36;for(let[_,L]of Object.entries(l))process.stdout.write(g(` ${_.padEnd(c)}`)+L+`
152
+ `);_e(2,n,"User Identity"),await wo(!t.noInteractive,!!(r??We()),t.email),_e(3,n,"Authentication");let a=null,p=Qt(),m=!!p&&p!==o;if(!an()||i||m){if(t.noInteractive||!Z())return process.stderr.write(`
153
153
  ${I("\u2717")} Authentication required.
154
154
  Run: flow-ai-obs login
155
155
 
156
156
  `),1;{process.stdout.write(`
157
157
  ${R("\u26A0")} Authentication required for the new endpoint.
158
158
 
159
- `);let{runLogin:_}=await Promise.resolve().then(()=>(Te(),Se)),L=await _({deferPersist:true,skipAuthCheck:o});if(typeof L=="number")return L;a=L.result;}}else or("Already authenticated \u2014 skipping."),on("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");let S=an()?ar()[f.ANTHROPIC_AUTH_TOKEN]:null,p={...c,...a?{[f.ANTHROPIC_AUTH_TOKEN]:a.jwt}:{},...S&&!a?{[f.ANTHROPIC_AUTH_TOKEN]:S}:{}},w,Y;_e(4,n,"Observability (OpenTelemetry)"),process.stdout.write(`
159
+ `);let{runLogin:_}=await Promise.resolve().then(()=>(Te(),Se)),L=await _({deferPersist:true,skipAuthCheck:i});if(typeof L=="number")return L;a=L.result;}}else or("Already authenticated \u2014 skipping."),on("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");let S=an()?ar()[f.ANTHROPIC_AUTH_TOKEN]:null,d={...l,...a?{[f.ANTHROPIC_AUTH_TOKEN]:a.jwt}:{},...S&&!a?{[f.ANTHROPIC_AUTH_TOKEN]:S}:{}},w,Y;_e(4,n,"Observability (OpenTelemetry)"),process.stdout.write(`
160
160
  ${b("Metrics and Logs")}
161
- `);let G={...tt,OTEL_EXPORTER_OTLP_ENDPOINT:c.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[_,L]of Object.entries(G))process.stdout.write(g(` ${_.padEnd(36)}`)+L+`
161
+ `);let G={...tt,OTEL_EXPORTER_OTLP_ENDPOINT:l.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[_,L]of Object.entries(G))process.stdout.write(g(` ${_.padEnd(36)}`)+L+`
162
162
  `);process.stdout.write(`
163
163
  `),process.stdout.write(` ${b("Trace (Hook)")}
164
- `);let z=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"];for(let _ of z){let L=pt[_];process.stdout.write(g(` ${_.padEnd(18)}`)+`\u2192 flow-ai-obs ${_} (timeout: ${L}s)
164
+ `);let X=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"];for(let _ of X){let L=pt[_];process.stdout.write(g(` ${_.padEnd(18)}`)+`\u2192 flow-ai-obs ${_} (timeout: ${L}s)
165
165
  `);}process.stdout.write(`
166
- `);try{({settingsPath:w,preserved:Y}=Dr(c.OTEL_EXPORTER_OTLP_ENDPOINT,p));}catch(_){return process.stderr.write(` \u2717 Failed to write settings: ${_.message}
167
- `),1}if(a){let{saveTokenCache:_}=await Promise.resolve().then(()=>(zt(),zr));await _({accessToken:a.accessToken,expiresAt:a.expiresAt});let{clearLoggedOutMarker:L}=await Promise.resolve().then(()=>(rr(),sn));L();}return or(`Settings written: ${w}`),Y.length>0&&(process.stdout.write(`
166
+ `);try{({settingsPath:w,preserved:Y}=Dr(l.OTEL_EXPORTER_OTLP_ENDPOINT,d));}catch(_){return process.stderr.write(` \u2717 Failed to write settings: ${_.message}
167
+ `),1}if(a){let{saveTokenCache:_}=await Promise.resolve().then(()=>(Xt(),Xr));await _({accessToken:a.accessToken,expiresAt:a.expiresAt});let{clearLoggedOutMarker:L}=await Promise.resolve().then(()=>(rr(),sn));L();}return or(`Settings written: ${w}`),Y.length>0&&(process.stdout.write(`
168
168
  `),process.stdout.write(R(` \u26A0 Third-party hooks preserved on: ${Y.join(", ")}
169
169
  `)),process.stdout.write(g(` flow-ai-obs was prepended \u2014 it executes first.
170
170
  `))),process.stdout.write(`
@@ -176,7 +176,7 @@
176
176
 
177
177
  `)+g(` Start your code assistant and begin working.
178
178
 
179
- `))),0}var un=E(()=>{"use strict";vt();v();ut();pe();de();je();W();Ne();});var fn={};N(fn,{runStatus:()=>yo});function dn(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function _o(t){process.stdout.write(` ${k("\u2713")} ${t}
179
+ `))),0}var un=E(()=>{"use strict";vt();v();ut();pe();de();je();W();Ne();});var fn={};N(fn,{runStatus:()=>_o});function dn(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function To(t){process.stdout.write(` ${k("\u2713")} ${t}
180
180
  `);}function lr(t){process.stdout.write(` ${R("\u26A0")} ${t}
181
181
  `);}function Pt(t){process.stdout.write(` ${k("\u2713")} ${t}
182
182
  `);}function te(t){process.stdout.write(` ${R("\u26A0")} ${t}
@@ -187,42 +187,42 @@
187
187
  `)));}function dr(t,e=false){let r=e?`${R("\u26A0")} ${b(R(t))}`:b(t);process.stdout.write(`
188
188
  ${r}
189
189
  `);}function ye(){process.stdout.write(`
190
- `);}async function yo(){ur("Auth");let t=await Ee();t.notConfigured?(lr("Not configured."),process.stdout.write(`
190
+ `);}async function _o(){ur("Auth");let t=await Ee();t.notConfigured?(lr("Not configured."),process.stdout.write(`
191
191
  `),process.stdout.write(` ${g("Run `flow-ai-obs init` to set up.")}
192
- `)):!t.ok&&t.error==="No credentials found"?lr("Not authenticated. Run `flow-ai-obs login` to set up."):t.ok?(_o("Authenticated"),process.stdout.write(` ${g("URL: ")}${t.baseUrl}
192
+ `)):!t.ok&&t.error==="No credentials found"?lr("Not authenticated. Run `flow-ai-obs login` to set up."):t.ok?(To("Authenticated"),process.stdout.write(` ${g("URL: ")}${t.baseUrl}
193
193
  `),process.stdout.write(` ${g("Tenant: ")}${t.tenant}
194
194
  `),process.stdout.write(` ${g("User: ")}${t.user}
195
195
  `),process.stdout.write(` ${g("Storage: ANTHROPIC_AUTH_TOKEN (settings.json)")}
196
- `)):lr(`Session rejected by ${t.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`),ur("Flow Provider Configuration");let e=["ANTHROPIC_BASE_URL","ANTHROPIC_MODEL","ANTHROPIC_SMALL_FAST_MODEL","CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS"],r={},n={};try{let p=A__namespace.readFileSync(x(),"utf8");n=JSON.parse(p),r=n.env||{};}catch{}let s=e.filter(p=>!r[p]),i=s.length===0;dr("LLM Proxy",!i),i?(Pt("Flow LLM Proxy configured"),nt(`Endpoint: ${r.ANTHROPIC_BASE_URL}`),nt(`Model: ${r.ANTHROPIC_MODEL}`)):(process.stdout.write(`
196
+ `)):lr(`Session rejected by ${t.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`),ur("Flow Provider Configuration");let e=["ANTHROPIC_BASE_URL","ANTHROPIC_MODEL","ANTHROPIC_SMALL_FAST_MODEL","CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS"],r={},n={};try{let d=A__namespace.readFileSync(x(),"utf8");n=JSON.parse(d),r=n.env||{};}catch{}let s=e.filter(d=>!r[d]),o=s.length===0;dr("LLM Proxy",!o),o?(Pt("Flow LLM Proxy configured"),nt(`Endpoint: ${r.ANTHROPIC_BASE_URL}`),nt(`Model: ${r.ANTHROPIC_MODEL}`)):(process.stdout.write(`
197
197
  `),process.stdout.write(` ${g("Run: flow-ai-obs init (configures the Flow LLM proxy)")}
198
198
  `),process.stdout.write(`
199
- `),te(`${s.length} proxy var(s) missing from settings.json`),s.forEach(p=>ee(`Missing: ${p}`))),ye();for(let p of e){let w=r[p]??I("(missing)");process.stdout.write(g(` ${p.padEnd(36)}`)+w+`
200
- `);}ur("Observability configuration (OpenTelemetry)");let o=Object.keys(tt).filter(p=>!r[p]);dr("Metrics and Logs",o.length>0),o.length===0?(Pt("All OTEL env vars present in settings.json"),nt(`Endpoint: ${r.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
199
+ `),te(`${s.length} proxy var(s) missing from settings.json`),s.forEach(d=>ee(`Missing: ${d}`))),ye();for(let d of e){let w=r[d]??I("(missing)");process.stdout.write(g(` ${d.padEnd(36)}`)+w+`
200
+ `);}ur("Observability configuration (OpenTelemetry)");let i=Object.keys(tt).filter(d=>!r[d]);dr("Metrics and Logs",i.length>0),i.length===0?(Pt("All OTEL env vars present in settings.json"),nt(`Endpoint: ${r.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
201
201
  `),process.stdout.write(` ${g("Run: flow-ai-obs init (restores missing vars automatically)")}
202
202
  `),process.stdout.write(`
203
- `),te(`${o.length} OTEL var(s) missing from settings.json`),o.forEach(p=>ee(`Missing: ${p}`))),ye();for(let p of Object.keys(tt)){let w=r[p]??I("(missing)");process.stdout.write(g(` ${p.padEnd(36)}`)+w+`
204
- `);}let c=n.hooks??{},l=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],a=l.every(p=>{let w=c[p];return Array.isArray(w)?w.some(Y=>{let G=Y;return Array.isArray(G?.hooks)&&G.hooks.some(z=>z?.command?.startsWith(Vt.CLI))}):false});dr("Tracing",!a),a?Pt("Hooks registered (trace capture)"):(process.stdout.write(`
203
+ `),te(`${i.length} OTEL var(s) missing from settings.json`),i.forEach(d=>ee(`Missing: ${d}`))),ye();for(let d of Object.keys(tt)){let w=r[d]??I("(missing)");process.stdout.write(g(` ${d.padEnd(36)}`)+w+`
204
+ `);}let l=n.hooks??{},c=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],a=c.every(d=>{let w=l[d];return Array.isArray(w)?w.some(Y=>{let G=Y;return Array.isArray(G?.hooks)&&G.hooks.some(X=>X?.command?.startsWith(Vt.CLI))}):false});dr("Tracing",!a),a?Pt("Hooks registered (trace capture)"):(process.stdout.write(`
205
205
  `),process.stdout.write(` ${g("Run `flow-ai-obs init` to configure.")}
206
206
  `),process.stdout.write(`
207
- `),te("Hooks NOT registered."));for(let p of l){let w=pt[p];process.stdout.write(g(` ${p.padEnd(18)}`)+`\u2192 flow-ai-obs ${p} (timeout: ${w}s)
208
- `);}ye();let d=process.env[f.FLOW_TELEMETRY]==="true",m=process.env[f.LANGFUSE_BASE_URL],T=process.env[f.LANGFUSE_PUBLIC_KEY],S=process.env[f.LANGFUSE_SECRET_KEY];if(d)if(m&&T&&S){let p=await K();for(let w of p)w.mode==="direct"&&(Pt("FLOW_TELEMETRY=true (direct mode enabled)"),Pt("Mode: direct"),nt(`Endpoint: ${w.endpoint}`),nt(`PK: ${dn(T)}`),nt(`SK: ${dn(S)}`));}else te("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),m||ee("LANGFUSE_BASE_URL not set"),T||ee("LANGFUSE_PUBLIC_KEY not set"),S||ee("LANGFUSE_SECRET_KEY not set");else {let p=await K();if(p.length>0)for(let w of p)w.mode==="gateway"&&(Pt("Mode: gateway"),nt(`Endpoint: ${w.endpoint}`));else p.authError?te("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):nt("No active tracing destination configured.");}return ye(),0}var mn=E(()=>{"use strict";W();vt();v();ut();sr();});var gn={};N(gn,{runOtelHeaders:()=>Oo});async function Oo(){let t=rt(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(!t)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs auth login
207
+ `),te("Hooks NOT registered."));for(let d of c){let w=pt[d];process.stdout.write(g(` ${d.padEnd(18)}`)+`\u2192 flow-ai-obs ${d} (timeout: ${w}s)
208
+ `);}ye();let p=process.env[f.FLOW_TELEMETRY]==="true",m=process.env[f.LANGFUSE_BASE_URL],T=process.env[f.LANGFUSE_PUBLIC_KEY],S=process.env[f.LANGFUSE_SECRET_KEY];if(p)if(m&&T&&S){let d=await K();for(let w of d)w.mode==="direct"&&(Pt("FLOW_TELEMETRY=true (direct mode enabled)"),Pt("Mode: direct"),nt(`Endpoint: ${w.endpoint}`),nt(`PK: ${dn(T)}`),nt(`SK: ${dn(S)}`));}else te("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),m||ee("LANGFUSE_BASE_URL not set"),T||ee("LANGFUSE_PUBLIC_KEY not set"),S||ee("LANGFUSE_SECRET_KEY not set");else {let d=await K();if(d.length>0)for(let w of d)w.mode==="gateway"&&(Pt("Mode: gateway"),nt(`Endpoint: ${w.endpoint}`));else d.authError?te("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):nt("No active tracing destination configured.");}return ye(),0}var mn=E(()=>{"use strict";W();vt();v();ut();sr();});var gn={};N(gn,{runOtelHeaders:()=>yo});async function yo(){let t=rt(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(!t)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs auth login
209
209
  `),1;let e;try{e=(await F(t)).accessToken;}catch(r){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${r.message}
210
210
  `),1}return e?(process.stdout.write(`{"Authorization": "Bearer ${e}"}
211
211
  `),0):(process.stderr.write(`[flow-ai-obs otel-headers] Empty token received
212
212
  `),1)}var hn=E(()=>{"use strict";mt();W();v();});function q(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function Oe(t,e=100){return String(t??"").split(`
213
- `)[0].slice(0,e).trim()}function re(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function V(t){process.stdout.write(JSON.stringify(t));}var Nt=E(()=>{"use strict";});function st(){return String(BigInt(Date.now())*1000000n)}var pr,Et,ne=E(()=>{"use strict";pr=()=>crypto.randomBytes(16).toString("hex"),Et=()=>crypto.randomBytes(8).toString("hex");});function Co(t,e){let r=Rt.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function fr(t){if(!Po.test(t))throw new Error(`Invalid session ID: ${t}`);return Co(Rt.join(gt.tmpdir(),`flow-obs-${t}.json`),No)}function Ct(t){let e=fr(t);if(!A.existsSync(e))return null;try{return JSON.parse(A.readFileSync(e,"utf8"))}catch{return null}}function $t(t,e){A.writeFileSync(fr(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function mr(t){try{A.unlinkSync(fr(t));}catch{}}var Po,No,se=E(()=>{"use strict";Po=/^[0-9a-f-]{1,64}$/i,No=Rt.normalize(gt.tmpdir())+Rt.sep;});function _n(t){if(!t||!A.existsSync(t))return null;try{let e=A.readFileSync(t,"utf8").trimEnd().split(`
213
+ `)[0].slice(0,e).trim()}function re(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function V(t){process.stdout.write(JSON.stringify(t));}var Nt=E(()=>{"use strict";});function st(){return String(BigInt(Date.now())*1000000n)}var pr,Et,ne=E(()=>{"use strict";pr=()=>crypto.randomBytes(16).toString("hex"),Et=()=>crypto.randomBytes(8).toString("hex");});function No(t,e){let r=Rt.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function fr(t){if(!Uo.test(t))throw new Error(`Invalid session ID: ${t}`);return No(Rt.join(gt.tmpdir(),`flow-obs-${t}.json`),Po)}function Ct(t){let e=fr(t);if(!A.existsSync(e))return null;try{return JSON.parse(A.readFileSync(e,"utf8"))}catch{return null}}function $t(t,e){A.writeFileSync(fr(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function mr(t){try{A.unlinkSync(fr(t));}catch{}}var Uo,Po,se=E(()=>{"use strict";Uo=/^[0-9a-f-]{1,64}$/i,Po=Rt.normalize(gt.tmpdir())+Rt.sep;});function _n(t){if(!t||!A.existsSync(t))return null;try{let e=A.readFileSync(t,"utf8").trimEnd().split(`
214
214
  `);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function gr(t){if(!t||!A.existsSync(t))return null;try{let e=A.readFileSync(t,"utf8").trimEnd().split(`
215
- `),r=[],n=0,s=0;for(let i=e.length-1;i>=0;i--)try{let o=JSON.parse(e[i]);if(o.type==="user")break;if(o.type==="assistant"){let l=(o.message?.content??[]).filter(d=>d.type==="text").map(d=>d.text??"").join("");l&&r.unshift(l);let a=o.message?.usage??{};n+=(a.input_tokens??0)+(a.cache_read_input_tokens??0)+(a.cache_creation_input_tokens??0),s+=a.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
215
+ `),r=[],n=0,s=0;for(let o=e.length-1;o>=0;o--)try{let i=JSON.parse(e[o]);if(i.type==="user")break;if(i.type==="assistant"){let c=(i.message?.content??[]).filter(p=>p.type==="text").map(p=>p.text??"").join("");c&&r.unshift(c);let a=i.message?.usage??{};n+=(a.input_tokens??0)+(a.cache_read_input_tokens??0)+(a.cache_creation_input_tokens??0),s+=a.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
216
216
 
217
217
  `),inputTokens:n,outputTokens:s}}catch{}return null}var hr=E(()=>{"use strict";});function An(t){return t.replace(":","/")}function Ae(t,e){if(!t)return null;let r=An(t),n=[Rt.join(gt.homedir(),".claude","skills",r,"SKILL.md"),Rt.join(e??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(A.existsSync(s))try{return A.readFileSync(s,"utf8")}catch{}return null}function Ln(t){return t.split(`
218
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function kn(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Ho.has(n.tool))?"complete":"prerequisite_required":null}function Le(t,e){if(!t)return null;let r=An(t),n=[Rt.join(gt.homedir(),".claude","skills",r),Rt.join(e??"",".claude","skills",r)],s=null;for(let c of n)if(A.existsSync(Rt.join(c,"SKILL.md"))){s=c;break}if(!s)return null;let i=[];function o(c,l){for(let a of A.readdirSync(c,{withFileTypes:true})){if(Do.has(a.name)||Bo.has(a.name)||Mo.has(Rt.extname(a.name)))continue;let d=l?`${l}/${a.name}`:a.name;a.isDirectory()?o(Rt.join(c,a.name),d):i.push(d);}}return o(s,""),i.length>0?i:null}var Do,Mo,Bo,Ho,ke=E(()=>{"use strict";Do=new Set([".venv","__pycache__",".git","node_modules"]),Mo=new Set([".pyc",".pyo"]),Bo=new Set(["SKILL.md",".DS_Store",".gitignore"]);Ho=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function Vo(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Yo(t,e,r,n,s,i){return new Promise(o=>{let c=new URL(t),l=c.protocol==="https:",a=m=>m.replace(/[\r\n]/g,""),d=(l?fs__default.default:Ps__default.default).request({hostname:c.hostname,port:c.port||(l?443:80),path:c.pathname+c.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),...i?{}:{Authorization:`Bearer ${a(String(r))}`},FlowTenant:a(String(n)),...s?{"x-flow-user":a(s)}:{},...i?{"x-flow-api-key":a(i)}:{}}},m=>{m.resume(),o(m.statusCode??0);});d.on("error",()=>o(0)),d.setTimeout(5e3,()=>{d.destroy(),o(0);}),d.write(e),d.end();})}async function wt(t,e={}){try{let r=rt(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,s=new Promise((S,p)=>{n=setTimeout(()=>p(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:i}=await Promise.race([F(r),s]);clearTimeout(n);let o=Vo(i);if(!o)return;let c=o.tenant||r.tenant,l=JSON.stringify({action:t,booster:le().BOOSTER,metadata:e,success:!0,tenant:c,timestamp:new Date().toISOString(),os:process.platform,user:{email:o.email||"",id:o.sub||"",name:o.name||o.email||""}}),a=ge(),d=rn(),m=ht(le().API_URL),T=await Yo(m,l,i,c,a,d);u("metrics.logEvent",`action=${t} status=${T} x-flow-user=${a?"[REDACTED]":"omitted"} x-flow-api-key=${d?"[REDACTED]":"omitted"}`);}catch(r){u("metrics.logEvent",`silenced error: ${r.message}`);}}var ve=E(()=>{"use strict";v();mt();W();H();});async function Er(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Go})+`
219
- `);return}let n=!!(await K()).authError;!process.env[f.FLOW_USER_EMAIL]&&!Gt(f.FLOW_USER_EMAIL)&&Ut().then(m=>{m&&(J({[f.FLOW_USER_EMAIL]:m}),u("UserPromptSubmit","auto-persisted FLOW_USER_EMAIL from access token"));}).catch(()=>{});let s=t.session_id||"unknown",i=t.prompt||"",o=t.cwd||"",c=_n(t.transcript_path)||pr(),l=Ln(i),a=l?Ae(l,o):null,d=l?Le(l,o):null;$t(s,{traceId:pr(),spanId:Et(),startNs:st(),sessionId:s,prompt:i,cwd:o,traceName:c,transcriptPath:t.transcript_path||"",model:process.env[f.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:l,skillContent:a,skillArtifacts:d}),wt("SESSION_STARTED",{traceType:l?"skill":"prompt",slashSkill:l,clientIdExpired:n}),u("UserPromptSubmit",`sid=${s}`,`traceName=${c}`,`slashSkill=${l}`),V(t);}var Go,vn=E(()=>{"use strict";ne();se();hr();ke();Nt();H();v();W();vt();ve();Go=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${Q()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;});async function Rn(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:q(n,B.TOOL_INPUT),startNs:st()},$t(e,s)),u("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!s}`),V(t);}var bn=E(()=>{"use strict";ne();se();Nt();H();v();});function h(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function St(...t){return t.filter(e=>e!==null)}function In(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Jo,spans:Array.isArray(e)?e:[e]}]}]}}var Jo,O,Un=E(()=>{"use strict";v();Jo={name:ce.SCOPE_NAME,version:ce.SCOPE_VERSION},O={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};});function Nn(t,e,r,n,s){if(process.env[f.FLOW_OBS_DEBUG]!=="1")return;let i=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:s}});try{A.writeFileSync(Pn,i+`
220
- `,{flag:"a",encoding:"utf8",mode:384}),u("sendTraces:dump",`request appendada em ${Pn}`);}catch(o){u("sendTraces:dump",`falha ao salvar: ${o.message}`);}}function Qo(t){let e=new URL(t),r=new URL(dt().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function Cn(t,e){return new Promise((r,n)=>{let s=t._isSSL?fs__default.default:Ps__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let i=s.request(t,o=>{let c=[];o.on("data",l=>c.push(l)),o.on("end",()=>r({statusCode:o.statusCode??0,body:c.join("")}));});i.setTimeout(1e4,()=>{i.destroy(new Error("Request timeout"));}),i.on("error",o=>n(new Error(`Network error: ${o.message}`))),e&&i.write(e),i.end();})}async function $n(t,e){let r;try{r=Qo(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let i=await Cn({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:s,_isSSL:n},null);return u("checkHealth",`url=${r.href} status=${i.statusCode}`),i.statusCode>=200&&i.statusCode<300}catch{return false}}async function Re(t,e,r){let n=JSON.stringify(t),s=new URL(e),i=s.protocol==="https:",o=String(r).replace(/[\r\n]/g,""),c={"Content-Type":"application/json",Authorization:o,"Content-Length":Buffer.byteLength(n)};u("sendTraces:request",`POST ${e}`),u("sendTraces:request",`headers=${JSON.stringify({...c,Authorization:o.slice(0,20)+"\u2026"})}`),u("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let l=await Cn({hostname:s.hostname,port:s.port||(i?443:80),path:s.pathname,method:"POST",headers:c,_isSSL:i},n);return u("sendTraces:response",`status=${l.statusCode}`),Nn(e,c,n,l.statusCode,l.body),l.statusCode}catch(l){return u("sendTraces:error",l.message),Nn(e,c,n,0,l.message),0}}var Pn,Fn=E(()=>{"use strict";v();H();Pn=Rt.join(gt.tmpdir(),"flow-obs-requests.ndjson");});function ti(){let t=parseInt(process.env[f.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max($.MIN_TTL_DAYS,Math.min($.MAX_TTL_DAYS,t)):$.DEFAULT_TTL_DAYS)*24*60*60*1e3}function ei(){let t=parseInt(process.env[f.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max($.MIN_MAX_FILES,Math.min($.MAX_MAX_FILES,t)):$.DEFAULT_MAX_FILES}function Dn(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return Rt__namespace.default.join(gt__namespace.default.tmpdir(),`${$.FILE_PREFIX}${t}.json`)}function Sr(){let t=gt__namespace.default.tmpdir(),e;try{e=A__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith($.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=Rt__namespace.default.join(t,r),s=0;try{s=A__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function oe(t){try{let e=ei(),r=Sr();if(r.length>=e){let i=r.slice(0,r.length-e+1);for(let o of i)try{A__namespace.default.unlinkSync(o);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:t};return A__namespace.default.writeFileSync(Dn(n),JSON.stringify(s),{encoding:"utf8",mode:384}),u("buffer",`saved fileId=${n}`),n}catch(e){return u("buffer",`saveToBuffer failed: ${e.message}`),null}}function Mn(t){let e=Sr(),r=t!=null&&t>0?t:e.length,n=[];for(let s of e){if(n.length>=r)break;try{let i=A__namespace.default.readFileSync(s,"utf8"),o=JSON.parse(i);o&&o.fileId&&o.payload&&n.push(o);}catch{u("buffer",`skipping malformed file: ${s}`);}}return n}function Bn(t){try{A__namespace.default.unlinkSync(Dn(t)),u("buffer",`deleted fileId=${t}`);}catch{}}function Hn(){let t=Date.now()-ti();for(let e of Sr())try{let{mtimeMs:r}=A__namespace.default.statSync(e);r<t&&(A__namespace.default.unlinkSync(e),u("buffer",`evicted stale: ${Rt__namespace.default.basename(e)}`));}catch{}}var Wn=E(()=>{"use strict";v();H();});async function ri(t){Hn();let e=Mn($.REPLAY_BATCH_SIZE);e.length&&(u("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await Re(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(Bn(r.fileId),u("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):u("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){u("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function jn(t){let e=await K();if(!e.length)return e.authError&&(u("postToLangfuse","auth refresh failed \u2014 buffering trace"),oe(t)),0;let r=await Promise.all(e.map(async i=>{if(i.mode!=="gateway")return {creds:i,healthy:true};let o=await $n(i.endpoint,i.authHeader);return {creds:i,healthy:o}})),n=r.find(i=>i.creds.mode==="gateway"&&i.healthy)?.creds??r.find(i=>i.creds.mode==="direct")?.creds;return n&&await ri(n),(await Promise.all(r.map(async({creds:i,healthy:o})=>{if(i.mode==="gateway"){if(!o)return u("postToLangfuse","gateway health check failed \u2014 buffering trace"),oe(t),0;let l=await Re(t,i.endpoint,i.authHeader);return (l===0||l>=500)&&(u("postToLangfuse",`gateway send failed (status ${l}) \u2014 buffering trace`),oe(t)),l}let c=await Re(t,i.endpoint,i.authHeader);return (c===0||c>=500)&&(u("postToLangfuse",`direct endpoint unavailable (status ${c}) \u2014 buffering trace`),oe(t)),c}))).find(i=>i!==0)??0}var Vn=E(()=>{"use strict";W();H();Fn();Wn();v();});var Tr=E(()=>{"use strict";Un();Vn();});function it(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return ii.reduce((r,{re:n,replace:s})=>r.replace(n,s),e)}var D,ni,si,oi,Yn,ii,_r=E(()=>{"use strict";D="[REDACTED]",ni="[REDACTED-EMAIL]",si="[REDACTED-CPF]",oi="[REDACTED-CNPJ]",Yn="[REDACTED-PHONE]",ii=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${D}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${D}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${D}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${D}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
218
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function kn(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Bo.has(n.tool))?"complete":"prerequisite_required":null}function Le(t,e){if(!t)return null;let r=An(t),n=[Rt.join(gt.homedir(),".claude","skills",r),Rt.join(e??"",".claude","skills",r)],s=null;for(let l of n)if(A.existsSync(Rt.join(l,"SKILL.md"))){s=l;break}if(!s)return null;let o=[];function i(l,c){for(let a of A.readdirSync(l,{withFileTypes:true})){if(xo.has(a.name)||Mo.has(a.name)||Do.has(Rt.extname(a.name)))continue;let p=c?`${c}/${a.name}`:a.name;a.isDirectory()?i(Rt.join(l,a.name),p):o.push(p);}}return i(s,""),o.length>0?o:null}var xo,Do,Mo,Bo,ke=E(()=>{"use strict";xo=new Set([".venv","__pycache__",".git","node_modules"]),Do=new Set([".pyc",".pyo"]),Mo=new Set(["SKILL.md",".DS_Store",".gitignore"]);Bo=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function jo(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Vo(t,e,r,n,s,o){return new Promise(i=>{let l=new URL(t),c=l.protocol==="https:",a=m=>m.replace(/[\r\n]/g,""),p=(c?fs__default.default:Ps__default.default).request({hostname:l.hostname,port:l.port||(c?443:80),path:l.pathname+l.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),...o?{}:{Authorization:`Bearer ${a(String(r))}`},FlowTenant:a(String(n)),...o&&s?{"x-flow-user":a(s)}:{},...o?{"x-flow-api-key":a(o)}:{}}},m=>{m.resume(),i(m.statusCode??0);});p.on("error",()=>i(0)),p.setTimeout(5e3,()=>{p.destroy(),i(0);}),p.write(e),p.end();})}async function wt(t,e={}){try{let r=ge(),n=rn(),s=rt(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(!s)return;let o,i=new Promise((S,d)=>{o=setTimeout(()=>d(new Error("getToken timeout")),4e3),o.unref();}),{accessToken:l}=await Promise.race([F(s),i]);clearTimeout(o);let c=jo(l);if(!c)return;let a=c.tenant||s.tenant,p=JSON.stringify({action:t,booster:le().BOOSTER,metadata:e,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:c.email||"",id:c.sub||"",name:c.name||c.email||""}}),m=ht(le().API_URL),T=await Vo(m,p,l,a,r,n);u("metrics.logEvent",`action=${t} status=${T} x-flow-user=${r?"[REDACTED]":"omitted"} x-flow-api-key=${n?"[REDACTED]":"omitted"}`);}catch(r){u("metrics.logEvent",`silenced error: ${r.message}`);}}var ve=E(()=>{"use strict";v();mt();W();H();});async function Er(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Yo})+`
219
+ `);return}let n=!!(await K()).authError;!process.env[f.FLOW_USER_EMAIL]&&!Gt(f.FLOW_USER_EMAIL)&&Ut().then(m=>{m&&(J({[f.FLOW_USER_EMAIL]:m}),u("UserPromptSubmit","auto-persisted FLOW_USER_EMAIL from access token"));}).catch(()=>{});let s=t.session_id||"unknown",o=t.prompt||"",i=t.cwd||"",l=_n(t.transcript_path)||pr(),c=Ln(o),a=c?Ae(c,i):null,p=c?Le(c,i):null;$t(s,{traceId:pr(),spanId:Et(),startNs:st(),sessionId:s,prompt:o,cwd:i,traceName:l,transcriptPath:t.transcript_path||"",model:process.env[f.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:a,skillArtifacts:p}),wt("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),u("UserPromptSubmit",`sid=${s}`,`traceName=${l}`,`slashSkill=${c}`),V(t);}var Yo,vn=E(()=>{"use strict";ne();se();hr();ke();Nt();H();v();W();vt();ve();Yo=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${Q()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;});async function Rn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=Ct(e);s&&(s.pendingTool={name:r,inputStr:q(n,B.TOOL_INPUT),startNs:st()},$t(e,s)),u("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!s}`),V(t);}var bn=E(()=>{"use strict";ne();se();Nt();H();v();});function h(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function St(...t){return t.filter(e=>e!==null)}function In(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Go,spans:Array.isArray(e)?e:[e]}]}]}}var Go,O,Un=E(()=>{"use strict";v();Go={name:ce.SCOPE_NAME,version:ce.SCOPE_VERSION},O={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};});function Nn(t,e,r,n,s){if(process.env[f.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:s}});try{A.writeFileSync(Pn,o+`
220
+ `,{flag:"a",encoding:"utf8",mode:384}),u("sendTraces:dump",`request appendada em ${Pn}`);}catch(i){u("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Zo(t){let e=new URL(t),r=new URL(dt().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function Cn(t,e){return new Promise((r,n)=>{let s=t._isSSL?fs__default.default:Ps__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=s.request(t,i=>{let l=[];i.on("data",c=>l.push(c)),i.on("end",()=>r({statusCode:i.statusCode??0,body:l.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}async function $n(t,e){let r;try{r=Zo(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let o=await Cn({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:s,_isSSL:n},null);return u("checkHealth",`url=${r.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function Re(t,e,r){let n=JSON.stringify(t),s=new URL(e),o=s.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),l={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};u("sendTraces:request",`POST ${e}`),u("sendTraces:request",`headers=${JSON.stringify({...l,Authorization:i.slice(0,20)+"\u2026"})}`),u("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let c=await Cn({hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname,method:"POST",headers:l,_isSSL:o},n);return u("sendTraces:response",`status=${c.statusCode}`),Nn(e,l,n,c.statusCode,c.body),c.statusCode}catch(c){return u("sendTraces:error",c.message),Nn(e,l,n,0,c.message),0}}var Pn,Fn=E(()=>{"use strict";v();H();Pn=Rt.join(gt.tmpdir(),"flow-obs-requests.ndjson");});function Qo(){let t=parseInt(process.env[f.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max($.MIN_TTL_DAYS,Math.min($.MAX_TTL_DAYS,t)):$.DEFAULT_TTL_DAYS)*24*60*60*1e3}function ti(){let t=parseInt(process.env[f.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max($.MIN_MAX_FILES,Math.min($.MAX_MAX_FILES,t)):$.DEFAULT_MAX_FILES}function Dn(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return Rt__namespace.default.join(gt__namespace.default.tmpdir(),`${$.FILE_PREFIX}${t}.json`)}function Sr(){let t=gt__namespace.default.tmpdir(),e;try{e=A__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith($.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=Rt__namespace.default.join(t,r),s=0;try{s=A__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function oe(t){try{let e=ti(),r=Sr();if(r.length>=e){let o=r.slice(0,r.length-e+1);for(let i of o)try{A__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:t};return A__namespace.default.writeFileSync(Dn(n),JSON.stringify(s),{encoding:"utf8",mode:384}),u("buffer",`saved fileId=${n}`),n}catch(e){return u("buffer",`saveToBuffer failed: ${e.message}`),null}}function Mn(t){let e=Sr(),r=t!=null&&t>0?t:e.length,n=[];for(let s of e){if(n.length>=r)break;try{let o=A__namespace.default.readFileSync(s,"utf8"),i=JSON.parse(o);i&&i.fileId&&i.payload&&n.push(i);}catch{u("buffer",`skipping malformed file: ${s}`);}}return n}function Bn(t){try{A__namespace.default.unlinkSync(Dn(t)),u("buffer",`deleted fileId=${t}`);}catch{}}function Hn(){let t=Date.now()-Qo();for(let e of Sr())try{let{mtimeMs:r}=A__namespace.default.statSync(e);r<t&&(A__namespace.default.unlinkSync(e),u("buffer",`evicted stale: ${Rt__namespace.default.basename(e)}`));}catch{}}var Wn=E(()=>{"use strict";v();H();});async function ei(t){Hn();let e=Mn($.REPLAY_BATCH_SIZE);e.length&&(u("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await Re(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(Bn(r.fileId),u("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):u("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){u("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function jn(t){let e=await K();if(!e.length)return e.authError&&(u("postToLangfuse","auth refresh failed \u2014 buffering trace"),oe(t)),0;let r=await Promise.all(e.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await $n(o.endpoint,o.authHeader);return {creds:o,healthy:i}})),n=r.find(o=>o.creds.mode==="gateway"&&o.healthy)?.creds??r.find(o=>o.creds.mode==="direct")?.creds;return n&&await ei(n),(await Promise.all(r.map(async({creds:o,healthy:i})=>{if(o.mode==="gateway"){if(!i)return u("postToLangfuse","gateway health check failed \u2014 buffering trace"),oe(t),0;let c=await Re(t,o.endpoint,o.authHeader);return (c===0||c>=500)&&(u("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),oe(t)),c}let l=await Re(t,o.endpoint,o.authHeader);return (l===0||l>=500)&&(u("postToLangfuse",`direct endpoint unavailable (status ${l}) \u2014 buffering trace`),oe(t)),l}))).find(o=>o!==0)??0}var Vn=E(()=>{"use strict";W();H();Fn();Wn();v();});var Tr=E(()=>{"use strict";Un();Vn();});function it(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return oi.reduce((r,{re:n,replace:s})=>r.replace(n,s),e)}var D,ri,ni,si,Yn,oi,_r=E(()=>{"use strict";D="[REDACTED]",ri="[REDACTED-EMAIL]",ni="[REDACTED-CPF]",si="[REDACTED-CNPJ]",Yn="[REDACTED-PHONE]",oi=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${D}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${D}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${D}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${D}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
221
221
  ${D}
222
- ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${D}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${D}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${D}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${D}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${D}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${D}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${D}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>ni},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>si},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>oi},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Yn},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Yn}];});async function Gn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=t.tool_response,i=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",o=Ct(e);if(!o){V(t);return}let c=st(),l=o.pendingTool,a=l?.name===r,d=a?l.startNs:String(BigInt(c)-200000000n),m=a?l.inputStr:q(n,B.TOOL_INPUT),T=m,S=null;if(r==="Skill"){let ae=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);S=ae?String(ae).trim():null;let ct=S?Ae(S,o.cwd):null;ct&&(T=ct,o.skillContent||(o.skillContent=ct),o.skillArtifacts||(o.skillArtifacts=Le(S,o.cwd))),S&&!o.slashSkill&&(o.slashSkill=S),u("PostToolUse","Skill tool detected",`skillName=${S}`,`contentFound=${!!ct}`);}let p=it(q(i,B.TOOL_OUTPUT)),w=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(p.slice(0,500)),Y=w?"ERROR":"DEFAULT",G=Et(),z=Math.round(Number(BigInt(c)-BigInt(d))/1e6),L={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",at=r==="Skill"&&S?S:Oe(m,60);o.toolCalls.push({tool:r,brief:at,error:w,durationMs:z});let xt=o.spans;xt.push({traceId:o.traceId,spanId:G,parentSpanId:o.spanId,name:r,kind:3,startTimeUnixNano:d,endTimeUnixNano:c,attributes:St(h(O.OBS_NAME,r),h(O.OBS_TYPE,L),h(O.OBS_LEVEL,Y),h(O.OBS_INPUT,it(T)),h(O.OBS_OUTPUT,p),h("tool.name",r),h("tool.error",String(w)),r==="Skill"&&S?h("skill.name",S):null,r==="Skill"?h("skill.invocation","slash-command"):null),status:{code:w?2:1}}),o.pendingTool=null,$t(e,o),w&&wt("TOOL_ERROR",{toolName:r}),u("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${w}`,`durationMs=${z}`,`totalSpans=${xt.length}`),V(t);}var Jn=E(()=>{"use strict";ne();se();Tr();Nt();ke();H();v();_r();ve();});function qn(t,e,r){let n=Object.keys(Kn).find(o=>(t??"").toLowerCase().includes(o));if(!n)return;let s=Kn[n],i=(e*s.input+r*s.output)/1e6;return Math.round(i*1e6)/1e6}var Kn,Xn=E(()=>{"use strict";Kn={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};});async function zn(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=Ct(e);if(!n){V(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(u("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=st(),i=await en(),o=n.toolCalls,c=n.spans;if(n.slashSkill&&!o.some(y=>y.tool==="Skill")){let y=Et(),lt=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});o.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),c.push({traceId:n.traceId,spanId:y,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:St(h(O.OBS_NAME,"Skill"),h(O.OBS_TYPE,"TOOL"),h(O.OBS_LEVEL,"DEFAULT"),h(O.OBS_INPUT,lt),h(O.OBS_OUTPUT,"loaded via slash command"),h("tool.name","Skill"),h("tool.error","false"),h("skill.name",n.slashSkill),h("skill.invocation","slash-command")),status:{code:1}}),u("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let l=t.transcript_path||n.transcriptPath||"",a=gr(l);if(l&&(o.some(y=>y.tool==="Skill"&&!y.synthetic)||!!n.slashSkill)&&!a?.text){await new Promise(lt=>setTimeout(lt,500));let y=gr(l);y?.text&&(a=y);}u("Stop",`transcriptPath=${l||"(empty)"}`,`assistantOut=${a?`text=${a.text.length}chars`:"null"}`);let m=o.length,T=o.filter(y=>y.error).length,S=it(a?.text?q(a.text,B.TRACE_OUTPUT):m===0?"No tools used":o.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""}`).join(`
223
- `)),p=a?.inputTokens??0,w=a?.outputTokens??0,Y=o.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""} (${y.durationMs}ms)`),G=!!(n.slashSkill||o.some(y=>y.tool==="Skill")),z=o.some(y=>y.tool==="Agent");if(!G&&!z){u("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),wt("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),mr(e),V(t);return}let _=G?"skill":"agent",L=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),at=qn(n.model,p,w),_t=kn(n);_t==="prerequisite_required"&&a?.text&&(_t="complete"),_t==="prerequisite_required"&&(c.push({traceId:n.traceId,spanId:Et(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:St(h(O.OBS_NAME,"prerequisite-check"),h(O.OBS_TYPE,"EVENT"),h(O.OBS_LEVEL,"WARNING"),h(O.OBS_OUTPUT,S),h("skill.name",n.slashSkill||void 0),h("execution_status","prerequisite_required")),status:{code:1}}),u("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let xt=(()=>{if(!(!G||!n.prompt)){if(n.slashSkill){let y=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return y?q(it(y),B.USER_INSTRUCTION):void 0}return q(it(n.prompt),B.USER_INSTRUCTION)||void 0}})(),ae=JSON.stringify({trace_type:_,..._t!==null&&{execution_status:_t},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...xt!==void 0&&{user_instruction:xt},latency_ms:L,...p&&{tokens_input:p},...w&&{tokens_output:w},cost_usd:at,...n.model?{model:n.model}:{},toolCount:m,errorCount:T,stopReason:r,sessionId:n.sessionId,tools:Y.length?Y:void 0}),ct=it(q(n.prompt,B.TRACE_INPUT)),rs=St(h(O.TRACE_NAME,n.traceName),h(O.TRACE_INPUT,ct),h(O.TRACE_OUTPUT,S),h(O.OBS_INPUT,ct),h(O.OBS_OUTPUT,S),h(O.TRACE_METADATA,ae),h(O.SESSION_ID,n.sessionId),h(O.USER_ID,i.user),h(O.OBS_TYPE,"GENERATION"),h(O.MODEL,n.model),p?h(O.INPUT_TOKENS,p):null,w?h(O.OUTPUT_TOKENS,w):null,h("claude.stop_reason",r),h("claude.tool_count",String(m)),h("claude.error_count",String(T)),h("claude.session_id",n.sessionId),h("flow.trace_type",_),{key:O.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:_}]}}}),ns={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:rs,status:{code:T>0?2:1}},ss=St(h("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),h("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),yr=[...c,ns];u("Stop",`sid=${e}`,`totalTools=${m}`,`errorTools=${T}`,`spans=${yr.length}`,`inputTokens=${p}`,`outputTokens=${w}`,`traceOutput="${Oe(S,80)}"`);let os=await jn(In(ss,yr));u("Stop",`POST status=${os}`,`traceId=${n.traceId}`),wt("TRACE_SENT",{latencyMs:L,totalTools:m,errorTools:T,inputTokens:p,outputTokens:w,costUsd:at}),mr(e),V(t);}var Zn=E(()=>{"use strict";ne();se();Tr();W();Xn();hr();Nt();H();ke();_r();v();ve();});var Tt,Qn=E(()=>{"use strict";W();Nt();vn();bn();Jn();Zn();Tt=class t{static passthroughStdin(){let e=[];process.stdin.on("data",r=>e.push(r)),process.stdin.on("end",()=>process.stdout.write(Buffer.concat(e)));}static async userPromptSubmit(){let e=await re(),r;try{r=await K();}catch{process.stdout.write(JSON.stringify(e));return}r.authError?await Er(e,!0):r.length>0?await Er(e):process.stdout.write(JSON.stringify(e));}static async preToolUse(){if(!await me()){t.passthroughStdin();return}let e=await re();await Rn(e);}static async postToolUse(){if(!await me()){t.passthroughStdin();return}let e=await re();await Gn(e);}static async stop(){if(!await me()){t.passthroughStdin();return}let e=await re();await zn(e);}};});var ci={};async function ai(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await Tt.userPromptSubmit();break;case "PreToolUse":await Tt.preToolUse();break;case "PostToolUse":await Tt.postToolUse();break;case "Stop":await Tt.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
224
- `),process.stdin.on("data",e=>process.stdout.write(e));}}var ts=E(()=>{"use strict";Qn();ai().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
225
- `),process.exit(0);});});var li=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,M]=process.argv;function ie(t,e){let r=t.indexOf(e);return r!==-1?t[r+1]:void 0}function es(){let{bold:t,cyan:e,dim:r,green:n}=(ut(),P(Ie)),{version:s}=Mt();process.stdout.write(`
222
+ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${D}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${D}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${D}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${D}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${D}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${D}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${D}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>ri},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>ni},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>si},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Yn},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Yn}];});async function Gn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=t.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=Ct(e);if(!i){V(t);return}let l=st(),c=i.pendingTool,a=c?.name===r,p=a?c.startNs:String(BigInt(l)-200000000n),m=a?c.inputStr:q(n,B.TOOL_INPUT),T=m,S=null;if(r==="Skill"){let ae=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);S=ae?String(ae).trim():null;let ct=S?Ae(S,i.cwd):null;ct&&(T=ct,i.skillContent||(i.skillContent=ct),i.skillArtifacts||(i.skillArtifacts=Le(S,i.cwd))),S&&!i.slashSkill&&(i.slashSkill=S),u("PostToolUse","Skill tool detected",`skillName=${S}`,`contentFound=${!!ct}`);}let d=it(q(o,B.TOOL_OUTPUT)),w=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(d.slice(0,500)),Y=w?"ERROR":"DEFAULT",G=Et(),X=Math.round(Number(BigInt(l)-BigInt(p))/1e6),L={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",at=r==="Skill"&&S?S:Oe(m,60);i.toolCalls.push({tool:r,brief:at,error:w,durationMs:X});let xt=i.spans;xt.push({traceId:i.traceId,spanId:G,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:p,endTimeUnixNano:l,attributes:St(h(O.OBS_NAME,r),h(O.OBS_TYPE,L),h(O.OBS_LEVEL,Y),h(O.OBS_INPUT,it(T)),h(O.OBS_OUTPUT,d),h("tool.name",r),h("tool.error",String(w)),r==="Skill"&&S?h("skill.name",S):null,r==="Skill"?h("skill.invocation","slash-command"):null),status:{code:w?2:1}}),i.pendingTool=null,$t(e,i),w&&wt("TOOL_ERROR",{toolName:r}),u("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${w}`,`durationMs=${X}`,`totalSpans=${xt.length}`),V(t);}var Jn=E(()=>{"use strict";ne();se();Tr();Nt();ke();H();v();_r();ve();});function qn(t,e,r){let n=Object.keys(Kn).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let s=Kn[n],o=(e*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var Kn,zn=E(()=>{"use strict";Kn={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};});async function Xn(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=Ct(e);if(!n){V(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(u("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=st(),o=await en(),i=n.toolCalls,l=n.spans;if(n.slashSkill&&!i.some(y=>y.tool==="Skill")){let y=Et(),lt=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});i.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),l.push({traceId:n.traceId,spanId:y,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:St(h(O.OBS_NAME,"Skill"),h(O.OBS_TYPE,"TOOL"),h(O.OBS_LEVEL,"DEFAULT"),h(O.OBS_INPUT,lt),h(O.OBS_OUTPUT,"loaded via slash command"),h("tool.name","Skill"),h("tool.error","false"),h("skill.name",n.slashSkill),h("skill.invocation","slash-command")),status:{code:1}}),u("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||n.transcriptPath||"",a=gr(c);if(c&&(i.some(y=>y.tool==="Skill"&&!y.synthetic)||!!n.slashSkill)&&!a?.text){await new Promise(lt=>setTimeout(lt,500));let y=gr(c);y?.text&&(a=y);}u("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${a?`text=${a.text.length}chars`:"null"}`);let m=i.length,T=i.filter(y=>y.error).length,S=it(a?.text?q(a.text,B.TRACE_OUTPUT):m===0?"No tools used":i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""}`).join(`
223
+ `)),d=a?.inputTokens??0,w=a?.outputTokens??0,Y=i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""} (${y.durationMs}ms)`),G=!!(n.slashSkill||i.some(y=>y.tool==="Skill")),X=i.some(y=>y.tool==="Agent");if(!G&&!X){u("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),wt("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),mr(e),V(t);return}let _=G?"skill":"agent",L=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),at=qn(n.model,d,w),_t=kn(n);_t==="prerequisite_required"&&a?.text&&(_t="complete"),_t==="prerequisite_required"&&(l.push({traceId:n.traceId,spanId:Et(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:St(h(O.OBS_NAME,"prerequisite-check"),h(O.OBS_TYPE,"EVENT"),h(O.OBS_LEVEL,"WARNING"),h(O.OBS_OUTPUT,S),h("skill.name",n.slashSkill||void 0),h("execution_status","prerequisite_required")),status:{code:1}}),u("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let xt=(()=>{if(!(!G||!n.prompt)){if(n.slashSkill){let y=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return y?q(it(y),B.USER_INSTRUCTION):void 0}return q(it(n.prompt),B.USER_INSTRUCTION)||void 0}})(),ae=JSON.stringify({trace_type:_,..._t!==null&&{execution_status:_t},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...xt!==void 0&&{user_instruction:xt},latency_ms:L,...d&&{tokens_input:d},...w&&{tokens_output:w},cost_usd:at,...n.model?{model:n.model}:{},toolCount:m,errorCount:T,stopReason:r,sessionId:n.sessionId,tools:Y.length?Y:void 0}),ct=it(q(n.prompt,B.TRACE_INPUT)),rs=St(h(O.TRACE_NAME,n.traceName),h(O.TRACE_INPUT,ct),h(O.TRACE_OUTPUT,S),h(O.OBS_INPUT,ct),h(O.OBS_OUTPUT,S),h(O.TRACE_METADATA,ae),h(O.SESSION_ID,n.sessionId),h(O.USER_ID,o.user),h(O.OBS_TYPE,"GENERATION"),h(O.MODEL,n.model),d?h(O.INPUT_TOKENS,d):null,w?h(O.OUTPUT_TOKENS,w):null,h("claude.stop_reason",r),h("claude.tool_count",String(m)),h("claude.error_count",String(T)),h("claude.session_id",n.sessionId),h("flow.trace_type",_),{key:O.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:_}]}}}),ns={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:rs,status:{code:T>0?2:1}},ss=St(h("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),h("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),yr=[...l,ns];u("Stop",`sid=${e}`,`totalTools=${m}`,`errorTools=${T}`,`spans=${yr.length}`,`inputTokens=${d}`,`outputTokens=${w}`,`traceOutput="${Oe(S,80)}"`);let os=await jn(In(ss,yr));u("Stop",`POST status=${os}`,`traceId=${n.traceId}`),wt("TRACE_SENT",{latencyMs:L,totalTools:m,errorTools:T,inputTokens:d,outputTokens:w,costUsd:at}),mr(e),V(t);}var Zn=E(()=>{"use strict";ne();se();Tr();W();zn();hr();Nt();H();ke();_r();v();ve();});var Tt,Qn=E(()=>{"use strict";W();Nt();vn();bn();Jn();Zn();Tt=class t{static passthroughStdin(){let e=[];process.stdin.on("data",r=>e.push(r)),process.stdin.on("end",()=>process.stdout.write(Buffer.concat(e)));}static async userPromptSubmit(){let e=await re(),r;try{r=await K();}catch{process.stdout.write(JSON.stringify(e));return}r.authError?await Er(e,!0):r.length>0?await Er(e):process.stdout.write(JSON.stringify(e));}static async preToolUse(){if(!await me()){t.passthroughStdin();return}let e=await re();await Rn(e);}static async postToolUse(){if(!await me()){t.passthroughStdin();return}let e=await re();await Gn(e);}static async stop(){if(!await me()){t.passthroughStdin();return}let e=await re();await Xn(e);}};});var ai={};async function ii(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await Tt.userPromptSubmit();break;case "PreToolUse":await Tt.preToolUse();break;case "PostToolUse":await Tt.postToolUse();break;case "Stop":await Tt.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
224
+ `),process.stdin.on("data",e=>process.stdout.write(e));}}var ts=E(()=>{"use strict";Qn();ii().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
225
+ `),process.exit(0);});});var ci=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,M]=process.argv;function ie(t,e){let r=t.indexOf(e);return r!==-1?t[r+1]:void 0}function es(){let{bold:t,cyan:e,dim:r,green:n}=(ut(),P(Ie)),{version:s}=Mt();process.stdout.write(`
226
226
  `+t(" flow-ai-obs")+r(" v"+s)+`
227
227
 
228
228
  `),process.stdout.write(e(" init")+r(` Configure environment: Claude Code + Proxy + OTEL + Trace hooks
@@ -250,4 +250,4 @@ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${D}`},{re:/(aws_secret_ac
250
250
  `),process.exit(1);});else if(M==="update")(async()=>{let t=(Lt(),P(At)),{version:e}=Mt(),r=await t.fetchLatestVersionAsync();r||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
251
251
  `),process.exit(1)),t.isNewer(e,r.version)||(process.stdout.write(` \u2713 Already up to date (v${e})
252
252
  `),process.exit(0)),await t.runUpdate(r.version),process.exit(0);})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
253
- `),process.exit(1);});else if(M==="otel-headers"){let{runOtelHeaders:t}=(hn(),P(gn));t().then(e=>process.exit(e)).catch(()=>process.exit(1));}else li.has(M)?(ts(),P(ci)):(es(),process.exit(0));
253
+ `),process.exit(1);});else if(M==="otel-headers"){let{runOtelHeaders:t}=(hn(),P(gn));t().then(e=>process.exit(e)).catch(()=>process.exit(1));}else ci.has(M)?(ts(),P(ai)):(es(),process.exit(0));
package/dist/index.js CHANGED
@@ -1,17 +1,17 @@
1
- 'use strict';var child_process=require('child_process'),util=require('util'),T=require('fs'),nt=require('os'),W=require('path'),cn=require('https'),ln=require('http'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var T__namespace=/*#__PURE__*/_interopNamespace(T);var nt__namespace=/*#__PURE__*/_interopNamespace(nt);var W__namespace=/*#__PURE__*/_interopNamespace(W);var cn__default=/*#__PURE__*/_interopDefault(cn);var ln__default=/*#__PURE__*/_interopDefault(ln);var Ge=Object.defineProperty;var ut=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var pt=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var Ot=(t,e)=>{for(var n in e)Ge(t,n,{get:e[n],enumerable:true});};function B(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():je}function H(){let t=B();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}function kt(){let t=B();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var je,dr,ft,dt,mt,wt,m,Vt,w,Gt,R,_=pt(()=>{"use strict";je="https://flow.ciandt.com";dr=H(),ft={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},dt="FLOW-nodejs",mt="config.json",wt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},m={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL",OTEL_EXPORTER_OTLP_HEADERS:"OTEL_EXPORTER_OTLP_HEADERS"},Vt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},w={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},Gt="flow-ai-obs-debug.log",R={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};});var Yt={};Ot(Yt,{MacOsKeyVaultProvider:()=>vt});var It,vt,Jt=pt(()=>{"use strict";It=util.promisify(child_process.execFile),vt=class{static async isAvailable(){try{return T.accessSync("/usr/bin/security",T.constants.X_OK),!0}catch{return !1}}async getSecret(e,n){try{let{stdout:r}=await It("security",["find-generic-password","-w","-a",n,"-s",e]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await It("security",["add-generic-password","-U","-a",n,"-s",e,"-w",r]);}async deleteSecret(e,n){try{return await It("security",["delete-generic-password","-a",n,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var qt={};Ot(qt,{LinuxKeyVaultProvider:()=>Pt});var Kt,Pt,Xt=pt(()=>{"use strict";Kt=util.promisify(child_process.execFile),Pt=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of e)try{return T.accessSync(n,T.constants.X_OK),!0}catch{}return !1}async getSecret(e,n){try{let{stdout:r}=await Kt("secret-tool",["lookup","service",e,"account",n]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await new Promise((o,s)=>{let i=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",n]);i.on("error",s),i.on("close",l=>{l===0?o():s(new Error(`secret-tool exited with code ${l}`));}),i.stdin.write(r),i.stdin.end();});}async deleteSecret(e,n){try{return await Kt("secret-tool",["clear","service",e,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var zt={};Ot(zt,{WindowsKeyVaultProvider:()=>Nt});var Nt,Zt=pt(()=>{"use strict";Nt=class{static async isAvailable(){try{return await ut("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,n){return ut("keytar").getPassword(e,n)}async setSecret(e,n,r){await ut("keytar").setPassword(e,n,r);}async deleteSecret(e,n){return ut("keytar").deletePassword(e,n)}getStoragePath(){return "Windows Credential Manager"}};});_();_();var Rt={credentials:"credentials","token-cache":"tokenCache"};function z(){let t=nt__namespace.default.homedir();if(process.platform==="darwin")return W__namespace.default.join(t,"Library","Preferences",dt,mt);if(process.platform==="win32"){let n=process.env.APPDATA??W__namespace.default.join(t,"AppData","Roaming");return W__namespace.default.join(n,dt,mt)}let e=process.env.XDG_CONFIG_HOME??W__namespace.default.join(t,".config");return W__namespace.default.join(e,dt,mt)}function Lt(){try{let t=T__namespace.default.readFileSync(z(),"utf8");return JSON.parse(t)}catch{return {}}}function jt(t){let e=z();T__namespace.default.mkdirSync(W__namespace.default.dirname(e),{recursive:true}),T__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var Q=class{static isAvailable(){return true}static hasExistingData(){try{if(!T__namespace.default.existsSync(z()))return !1;let e=JSON.parse(T__namespace.default.readFileSync(z(),"utf8"));return !!(e&&e.credentials)}catch{return false}}async getSecret(e,n){let r=Lt(),o=Rt[n]??n,s=r[o];return s?typeof s=="string"?s:JSON.stringify(s):null}async setSecret(e,n,r){let o=Lt(),s=Rt[n]??n;if(n==="token-cache")try{o[s]=JSON.parse(r);}catch{o[s]=r;}else o[s]=r;jt(o);}async deleteSecret(e,n){let r=Lt(),o=Rt[n]??n;return o in r?(delete r[o],jt(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${z()}`}};async function Qt(){return process.env[m.FLOW_OBS_USE_JSON_VAULT]==="1"?new Q:await nn()??new Q}async function nn(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Jt(),Yt));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(Xt(),qt));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Zt(),zt));return await t.isAvailable()?new t:null}default:return null}}_();var te=ft.SERVICE;ft.ACCOUNT_CREDS;var ee=ft.ACCOUNT_TOKEN,bt=null;function ne(){return bt||(bt=Qt()),bt}async function Ut(t){await(await ne()).setSecret(te,ee,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function Ct(){let e=await(await ne()).getSecret(te,ee);if(!e)return null;try{let n=JSON.parse(e);return {accessToken:n.accessToken,expiresAt:n.expiresAt,lastAuthCheckAt:n.lastAuthCheckAt}}catch{return null}}async function tt(){let t=await Ct();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email??n.preferred_username??n.upn??n.sub??null}catch{return null}}_();_();var an=W.join(nt.tmpdir(),Gt);function a(...t){if(process.env[m.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
1
+ 'use strict';var child_process=require('child_process'),util=require('util'),T=require('fs'),nt=require('os'),W=require('path'),cn=require('https'),ln=require('http'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var T__namespace=/*#__PURE__*/_interopNamespace(T);var nt__namespace=/*#__PURE__*/_interopNamespace(nt);var W__namespace=/*#__PURE__*/_interopNamespace(W);var cn__default=/*#__PURE__*/_interopDefault(cn);var ln__default=/*#__PURE__*/_interopDefault(ln);var Ge=Object.defineProperty;var ut=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var pt=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var Ot=(t,e)=>{for(var n in e)Ge(t,n,{get:e[n],enumerable:true});};function B(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():Ye}function H(){let t=B();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}function kt(){let t=B();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ye,fr,ft,dt,mt,wt,m,Vt,w,Gt,R,_=pt(()=>{"use strict";Ye="https://flow.ciandt.com";fr=H(),ft={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},dt="FLOW-nodejs",mt="config.json",wt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},m={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL",FLOW_API_KEY:"FLOW_API_KEY"},Vt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},w={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},Gt="flow-ai-obs-debug.log",R={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};});var jt={};Ot(jt,{MacOsKeyVaultProvider:()=>vt});var It,vt,Jt=pt(()=>{"use strict";It=util.promisify(child_process.execFile),vt=class{static async isAvailable(){try{return T.accessSync("/usr/bin/security",T.constants.X_OK),!0}catch{return !1}}async getSecret(e,n){try{let{stdout:r}=await It("security",["find-generic-password","-w","-a",n,"-s",e]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await It("security",["add-generic-password","-U","-a",n,"-s",e,"-w",r]);}async deleteSecret(e,n){try{return await It("security",["delete-generic-password","-a",n,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var qt={};Ot(qt,{LinuxKeyVaultProvider:()=>Pt});var Kt,Pt,zt=pt(()=>{"use strict";Kt=util.promisify(child_process.execFile),Pt=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of e)try{return T.accessSync(n,T.constants.X_OK),!0}catch{}return !1}async getSecret(e,n){try{let{stdout:r}=await Kt("secret-tool",["lookup","service",e,"account",n]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await new Promise((o,s)=>{let i=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",n]);i.on("error",s),i.on("close",l=>{l===0?o():s(new Error(`secret-tool exited with code ${l}`));}),i.stdin.write(r),i.stdin.end();});}async deleteSecret(e,n){try{return await Kt("secret-tool",["clear","service",e,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Xt={};Ot(Xt,{WindowsKeyVaultProvider:()=>Nt});var Nt,Zt=pt(()=>{"use strict";Nt=class{static async isAvailable(){try{return await ut("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,n){return ut("keytar").getPassword(e,n)}async setSecret(e,n,r){await ut("keytar").setPassword(e,n,r);}async deleteSecret(e,n){return ut("keytar").deletePassword(e,n)}getStoragePath(){return "Windows Credential Manager"}};});_();_();var Rt={credentials:"credentials","token-cache":"tokenCache"};function X(){let t=nt__namespace.default.homedir();if(process.platform==="darwin")return W__namespace.default.join(t,"Library","Preferences",dt,mt);if(process.platform==="win32"){let n=process.env.APPDATA??W__namespace.default.join(t,"AppData","Roaming");return W__namespace.default.join(n,dt,mt)}let e=process.env.XDG_CONFIG_HOME??W__namespace.default.join(t,".config");return W__namespace.default.join(e,dt,mt)}function Lt(){try{let t=T__namespace.default.readFileSync(X(),"utf8");return JSON.parse(t)}catch{return {}}}function Yt(t){let e=X();T__namespace.default.mkdirSync(W__namespace.default.dirname(e),{recursive:true}),T__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var Q=class{static isAvailable(){return true}static hasExistingData(){try{if(!T__namespace.default.existsSync(X()))return !1;let e=JSON.parse(T__namespace.default.readFileSync(X(),"utf8"));return !!(e&&e.credentials)}catch{return false}}async getSecret(e,n){let r=Lt(),o=Rt[n]??n,s=r[o];return s?typeof s=="string"?s:JSON.stringify(s):null}async setSecret(e,n,r){let o=Lt(),s=Rt[n]??n;if(n==="token-cache")try{o[s]=JSON.parse(r);}catch{o[s]=r;}else o[s]=r;Yt(o);}async deleteSecret(e,n){let r=Lt(),o=Rt[n]??n;return o in r?(delete r[o],Yt(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${X()}`}};async function Qt(){return process.env[m.FLOW_OBS_USE_JSON_VAULT]==="1"?new Q:await nn()??new Q}async function nn(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Jt(),jt));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(zt(),qt));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Zt(),Xt));return await t.isAvailable()?new t:null}default:return null}}_();var te=ft.SERVICE;ft.ACCOUNT_CREDS;var ee=ft.ACCOUNT_TOKEN,bt=null;function ne(){return bt||(bt=Qt()),bt}async function Ut(t){await(await ne()).setSecret(te,ee,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function Ct(){let e=await(await ne()).getSecret(te,ee);if(!e)return null;try{let n=JSON.parse(e);return {accessToken:n.accessToken,expiresAt:n.expiresAt,lastAuthCheckAt:n.lastAuthCheckAt}}catch{return null}}async function tt(){let t=await Ct();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email??n.preferred_username??n.upn??n.sub??null}catch{return null}}_();_();var an=W.join(nt.tmpdir(),Gt);function a(...t){if(process.env[m.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
2
2
  `;try{T.writeFileSync(an,e,{flag:"a"});}catch(n){process.stderr.write(`[flow-obs debug ERROR] ${n.message}
3
- `);}}var U=class extends Error{constructor(e){super(e),this.name="AuthError";}},un=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;function pn(t){if(!un.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var re={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};function fn(t,e){let n=e.length>400?e.slice(0,400)+"\u2026":e;a("toAuthError",`status=${t} body=${n}`);try{let r=JSON.parse(e);if(typeof r.error=="string"&&(a("toAuthError",`api_error_code=${r.error}`+(r.message?` api_message=${r.message}`:"")),re[r.error]))return new U(re[r.error])}catch{}return t===401||t===403||t===500?new U("Invalid credentials"):t>=400&&t<500?new U("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function V(t){return new Promise((e,n)=>{try{pn(t.tenant);}catch(u){return n(u)}let r=JSON.stringify({clientSecret:t.clientSecret}),o=new URL(H().AUTH_ENGINE),s=o.protocol==="https:",i={hostname:o.hostname,port:o.port||(s?443:80),path:o.pathname+o.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(r),FlowTenant:t.tenant}};a("getToken",`requesting token tenant=${t.tenant} host=${i.hostname} path=${i.path}`);let c=(s?cn__default.default:ln__default.default).request(i,u=>{let g=[];u.on("data",S=>g.push(S)),u.on("end",()=>{let S=g.join("");if((u.statusCode??0)>=400)return n(fn(u.statusCode??0,S));let h;try{h=JSON.parse(S);}catch{return n(new Error("Invalid response from auth engine"))}let E=h.expires_at??new Date(Date.now()+(h.expires_in??3600)*1e3).toISOString();e({accessToken:h.access_token??"",expiresAt:E});});});c.on("error",u=>n(new Error(`Network error: ${u.message}`))),c.write(r),c.end();})}_();var mn=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];function gn(t){return mn.some(e=>e.test(t))}function Sn(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email||n.preferred_username||n.upn||n.sub||null}catch{return null}}function St(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:o,tenant:s}=n;return !r||!o||!s?null:{clientId:r,clientSecret:o,tenant:s}}catch{return null}}function gt(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let n=process.env[m.FLOW_OBS_ALLOW_HTTP]==="true";if(!n&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!n&&gn(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function ie(){let t=St(process.env[m.ANTHROPIC_AUTH_TOKEN]);return t?{user:await tt().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function En(){return new Date().toISOString().slice(0,10)}async function hn(t){let e=En(),n=await Ct();if(n?.lastAuthCheckAt!==e){a("getOrRefreshToken",`daily auth check (last: ${n?.lastAuthCheckAt??"never"})`);try{let s=await V(t);try{await Ut({...s,lastAuthCheckAt:e});}catch{}return a("getOrRefreshToken",`daily check passed, expires=${s.expiresAt}`),s.accessToken}catch(s){if(s instanceof U)throw s;a("getOrRefreshToken",`daily check network error \u2014 using cache: ${s.message}`);}}let r=n!=null&&new Date(n.expiresAt)>new Date;if(a("getOrRefreshToken",`cacheValid=${r}`),r)return a("getOrRefreshToken",`using cached token, expires=${n.expiresAt}`),n.accessToken;a("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let o=await V(t);try{await Ut({...o,lastAuthCheckAt:e});}catch(s){a("getOrRefreshToken",`token cache save failed (non-fatal): ${s.message}`);}return a("getOrRefreshToken",`token refreshed, expires=${o.expiresAt}`),o.accessToken}function _n(t,e){let n=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${n}`}}function Tn(t,e,n){let r=Buffer.from(`${e}:${n}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${r}`}}async function C(){let t=[],e=process.env[m.ANTHROPIC_MODEL]??"",n=St(process.env[m.ANTHROPIC_AUTH_TOKEN]);a("resolveCredentials",n?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),n&&a("resolveCredentials",`clientId=${n.clientId}`,`tenant=${n.tenant}`);let r=n?n.tenant:"",o=process.env[m.FLOW_TELEMETRY]==="true",s=process.env[m.LANGFUSE_BASE_URL],i=process.env[m.LANGFUSE_PUBLIC_KEY],l=process.env[m.LANGFUSE_SECRET_KEY];if(o&&s&&i&&l){let h="",E=r;n&&(h=await tt().catch(()=>null)??n.clientId);let y={user:h??"",tenant:E??"",team:"",project:"",model:e};t.push({mode:"direct",...Tn(gt(s),i,l),...y}),a("resolveCredentials","direct mode active",`user=${y.user}`,`tenant=${y.tenant}`);}if(!n){if(t.length===0){let h=[];return h.authError=false,h}return t}let c;try{c=await hn(n);}catch(h){if(a("resolveCredentials",`token refresh failed: ${h.message}`,`(tenant=${n.tenant} clientId=${n.clientId})`),t.length>0)return t.authError=true,t;let E=[];return E.authError=true,E}let g={user:Sn(c)??n.clientId,tenant:r,team:"",project:"",model:e},S=process.env[m.FLOW_TELEMETRY_GATEWAY]??B();return t.push({mode:"gateway",..._n(gt(S),{accessToken:c}),...g}),t}async function Et(){return (await C()).length>0}var se=false,oe=false;function ae(){let t=process.env[m.FLOW_USER_EMAIL];if(t){let e=t.replace(/[\r\n]/g,"").trim();return e?(a("resolveUserEmail","using FLOW_USER_EMAIL override: [REDACTED]"),e):null}try{let e=nt__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",n=e.lastIndexOf("\\");if(n!==-1&&(e=e.slice(n+1)),e=e.trim().replace(/[^a-zA-Z0-9._%+\-]/g,""),!e)return a("resolveUserEmail","username empty after sanitisation \u2014 omitting x-flow-user"),se||(se=!0,console.warn("[flow-ai-obs] Could not derive x-flow-user: username is empty. Set FLOW_USER_EMAIL to fix this.")),null;let r=`${e}@ciandt.com`;return a("resolveUserEmail","derived email: [REDACTED]"),r}catch(e){return a("resolveUserEmail",`os.userInfo() threw: ${e.message} \u2014 omitting x-flow-user`),oe||(oe=true,console.warn("[flow-ai-obs] Could not derive x-flow-user from OS username. Set FLOW_USER_EMAIL to fix this.")),null}}function yn(t){let e=process.env.OTEL_EXPORTER_OTLP_HEADERS;if(!e)return null;for(let n of e.split(",")){let r=n.indexOf("=");if(!(r<=0)&&n.slice(0,r).trim().toLowerCase()===t.toLowerCase())return n.slice(r+1).replace(/[\r\n]/g,"").trim()||null}return null}function ce(){return yn("x-flow-api-key")}function L(t,e){let n=typeof t=="object"?JSON.stringify(t):String(t??"");return n.length>e?n.slice(0,e)+" \u2026[truncated]":n}function ht(t,e=100){return String(t??"").split(`
4
- `)[0].slice(0,e).trim()}function et(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function k(t){process.stdout.write(JSON.stringify(t));}var Ft=()=>crypto.randomBytes(16).toString("hex"),F=()=>crypto.randomBytes(8).toString("hex");function I(){return String(BigInt(Date.now())*1000000n)}var Pn=/^[0-9a-f-]{1,64}$/i,Nn=W.normalize(nt.tmpdir())+W.sep;function bn(t,e){let n=W.resolve(t);if(!n.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return n}function $t(t){if(!Pn.test(t))throw new Error(`Invalid session ID: ${t}`);return bn(W.join(nt.tmpdir(),`flow-obs-${t}.json`),Nn)}function G(t){let e=$t(t);if(!T.existsSync(e))return null;try{return JSON.parse(T.readFileSync(e,"utf8"))}catch{return null}}function j(t,e){T.writeFileSync($t(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function Dt(t){try{T.unlinkSync($t(t));}catch{}}function de(t){if(!t||!T.existsSync(t))return null;try{let e=T.readFileSync(t,"utf8").trimEnd().split(`
3
+ `);}}var U=class extends Error{constructor(e){super(e),this.name="AuthError";}},un=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;function pn(t){if(!un.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var re={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};function fn(t,e){let n=e.length>400?e.slice(0,400)+"\u2026":e;a("toAuthError",`status=${t} body=${n}`);try{let r=JSON.parse(e);if(typeof r.error=="string"&&(a("toAuthError",`api_error_code=${r.error}`+(r.message?` api_message=${r.message}`:"")),re[r.error]))return new U(re[r.error])}catch{}return t===401||t===403||t===500?new U("Invalid credentials"):t>=400&&t<500?new U("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function V(t){return new Promise((e,n)=>{try{pn(t.tenant);}catch(u){return n(u)}let r=JSON.stringify({clientSecret:t.clientSecret}),o=new URL(H().AUTH_ENGINE),s=o.protocol==="https:",i={hostname:o.hostname,port:o.port||(s?443:80),path:o.pathname+o.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(r),FlowTenant:t.tenant}};a("getToken",`requesting token tenant=${t.tenant} host=${i.hostname} path=${i.path}`);let c=(s?cn__default.default:ln__default.default).request(i,u=>{let g=[];u.on("data",S=>g.push(S)),u.on("end",()=>{let S=g.join("");if((u.statusCode??0)>=400)return n(fn(u.statusCode??0,S));let h;try{h=JSON.parse(S);}catch{return n(new Error("Invalid response from auth engine"))}let E=h.expires_at??new Date(Date.now()+(h.expires_in??3600)*1e3).toISOString();e({accessToken:h.access_token??"",expiresAt:E});});});c.on("error",u=>n(new Error(`Network error: ${u.message}`))),c.write(r),c.end();})}_();var mn=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];function gn(t){return mn.some(e=>e.test(t))}function Sn(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return n.email||n.preferred_username||n.upn||n.sub||null}catch{return null}}function St(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:o,tenant:s}=n;return !r||!o||!s?null:{clientId:r,clientSecret:o,tenant:s}}catch{return null}}function gt(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let n=process.env[m.FLOW_OBS_ALLOW_HTTP]==="true";if(!n&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!n&&gn(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function ie(){let t=St(process.env[m.ANTHROPIC_AUTH_TOKEN]);return t?{user:await tt().catch(()=>null)??t.clientId,tenant:t.tenant}:{user:"",tenant:""}}function En(){return new Date().toISOString().slice(0,10)}async function hn(t){let e=En(),n=await Ct();if(n?.lastAuthCheckAt!==e){a("getOrRefreshToken",`daily auth check (last: ${n?.lastAuthCheckAt??"never"})`);try{let s=await V(t);try{await Ut({...s,lastAuthCheckAt:e});}catch{}return a("getOrRefreshToken",`daily check passed, expires=${s.expiresAt}`),s.accessToken}catch(s){if(s instanceof U)throw s;a("getOrRefreshToken",`daily check network error \u2014 using cache: ${s.message}`);}}let r=n!=null&&new Date(n.expiresAt)>new Date;if(a("getOrRefreshToken",`cacheValid=${r}`),r)return a("getOrRefreshToken",`using cached token, expires=${n.expiresAt}`),n.accessToken;a("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let o=await V(t);try{await Ut({...o,lastAuthCheckAt:e});}catch(s){a("getOrRefreshToken",`token cache save failed (non-fatal): ${s.message}`);}return a("getOrRefreshToken",`token refreshed, expires=${o.expiresAt}`),o.accessToken}function _n(t,e){let n=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${n}`}}function Tn(t,e,n){let r=Buffer.from(`${e}:${n}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${r}`}}async function C(){let t=[],e=process.env[m.ANTHROPIC_MODEL]??"",n=St(process.env[m.ANTHROPIC_AUTH_TOKEN]);a("resolveCredentials",n?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),n&&a("resolveCredentials",`clientId=${n.clientId}`,`tenant=${n.tenant}`);let r=n?n.tenant:"",o=process.env[m.FLOW_TELEMETRY]==="true",s=process.env[m.LANGFUSE_BASE_URL],i=process.env[m.LANGFUSE_PUBLIC_KEY],l=process.env[m.LANGFUSE_SECRET_KEY];if(o&&s&&i&&l){let h="",E=r;n&&(h=await tt().catch(()=>null)??n.clientId);let y={user:h??"",tenant:E??"",team:"",project:"",model:e};t.push({mode:"direct",...Tn(gt(s),i,l),...y}),a("resolveCredentials","direct mode active",`user=${y.user}`,`tenant=${y.tenant}`);}if(!n){if(t.length===0){let h=[];return h.authError=false,h}return t}let c;try{c=await hn(n);}catch(h){if(a("resolveCredentials",`token refresh failed: ${h.message}`,`(tenant=${n.tenant} clientId=${n.clientId})`),t.length>0)return t.authError=true,t;let E=[];return E.authError=true,E}let g={user:Sn(c)??n.clientId,tenant:r,team:"",project:"",model:e},S=process.env[m.FLOW_TELEMETRY_GATEWAY]??B();return t.push({mode:"gateway",..._n(gt(S),{accessToken:c}),...g}),t}async function Et(){return (await C()).length>0}var se=false,oe=false;function ae(){let t=process.env[m.FLOW_USER_EMAIL];if(t){let e=t.replace(/[\r\n]/g,"").trim();return e?(a("resolveUserEmail","using FLOW_USER_EMAIL override: [REDACTED]"),e):null}try{let e=nt__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",n=e.lastIndexOf("\\");if(n!==-1&&(e=e.slice(n+1)),e=e.trim().replace(/[^a-zA-Z0-9._%+\-]/g,""),!e)return a("resolveUserEmail","username empty after sanitisation \u2014 omitting x-flow-user"),se||(se=!0,console.warn("[flow-ai-obs] Could not derive x-flow-user: username is empty. Set FLOW_USER_EMAIL to fix this.")),null;let r=`${e}@ciandt.com`;return a("resolveUserEmail","derived email: [REDACTED]"),r}catch(e){return a("resolveUserEmail",`os.userInfo() threw: ${e.message} \u2014 omitting x-flow-user`),oe||(oe=true,console.warn("[flow-ai-obs] Could not derive x-flow-user from OS username. Set FLOW_USER_EMAIL to fix this.")),null}}function ce(){let t=process.env[m.FLOW_API_KEY];return t&&t.replace(/[\r\n]/g,"").trim()||null}function L(t,e){let n=typeof t=="object"?JSON.stringify(t):String(t??"");return n.length>e?n.slice(0,e)+" \u2026[truncated]":n}function ht(t,e=100){return String(t??"").split(`
4
+ `)[0].slice(0,e).trim()}function et(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function k(t){process.stdout.write(JSON.stringify(t));}var Ft=()=>crypto.randomBytes(16).toString("hex"),F=()=>crypto.randomBytes(8).toString("hex");function I(){return String(BigInt(Date.now())*1000000n)}var vn=/^[0-9a-f-]{1,64}$/i,Pn=W.normalize(nt.tmpdir())+W.sep;function Nn(t,e){let n=W.resolve(t);if(!n.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return n}function $t(t){if(!vn.test(t))throw new Error(`Invalid session ID: ${t}`);return Nn(W.join(nt.tmpdir(),`flow-obs-${t}.json`),Pn)}function G(t){let e=$t(t);if(!T.existsSync(e))return null;try{return JSON.parse(T.readFileSync(e,"utf8"))}catch{return null}}function Y(t,e){T.writeFileSync($t(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function Dt(t){try{T.unlinkSync($t(t));}catch{}}function de(t){if(!t||!T.existsSync(t))return null;try{let e=T.readFileSync(t,"utf8").trimEnd().split(`
5
5
  `);for(let n=e.length-1;n>=0;n--)try{let r=JSON.parse(e[n]);if(r.type==="user"&&r.uuid)return r.uuid}catch{}}catch{}return null}function xt(t){if(!t||!T.existsSync(t))return null;try{let e=T.readFileSync(t,"utf8").trimEnd().split(`
6
6
  `),n=[],r=0,o=0;for(let s=e.length-1;s>=0;s--)try{let i=JSON.parse(e[s]);if(i.type==="user")break;if(i.type==="assistant"){let c=(i.message?.content??[]).filter(g=>g.type==="text").map(g=>g.text??"").join("");c&&n.unshift(c);let u=i.message?.usage??{};r+=(u.input_tokens??0)+(u.cache_read_input_tokens??0)+(u.cache_creation_input_tokens??0),o+=u.output_tokens??0;}}catch{}return !n.length&&r===0?null:{text:n.join(`
7
7
 
8
- `),inputTokens:r,outputTokens:o}}catch{}return null}var $n=new Set([".venv","__pycache__",".git","node_modules"]),Dn=new Set([".pyc",".pyo"]),xn=new Set(["SKILL.md",".DS_Store",".gitignore"]);function Se(t){return t.replace(":","/")}function _t(t,e){if(!t)return null;let n=Se(t),r=[W.join(nt.homedir(),".claude","skills",n,"SKILL.md"),W.join(e??"",".claude","skills",n,"SKILL.md")];for(let o of r)if(T.existsSync(o))try{return T.readFileSync(o,"utf8")}catch{}return null}function Ee(t){return t.split(`
9
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}var Mn=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);function he(t){return !!t.slashSkill||t.toolCalls.some(r=>r.tool==="Skill")?t.toolCalls.some(r=>r.tool==="Skill"&&!r.synthetic||Mn.has(r.tool))?"complete":"prerequisite_required":null}function Tt(t,e){if(!t)return null;let n=Se(t),r=[W.join(nt.homedir(),".claude","skills",n),W.join(e??"",".claude","skills",n)],o=null;for(let l of r)if(T.existsSync(W.join(l,"SKILL.md"))){o=l;break}if(!o)return null;let s=[];function i(l,c){for(let u of T.readdirSync(l,{withFileTypes:true})){if($n.has(u.name)||xn.has(u.name)||Dn.has(W.extname(u.name)))continue;let g=c?`${c}/${u.name}`:u.name;u.isDirectory()?i(W.join(l,u.name),g):s.push(g);}}return i(o,""),s.length>0?s:null}_();_();!process.env.NO_COLOR&&process.stdout.isTTY;function yt(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(t=n);}if(t){let e=t.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return W__namespace.join(e,".claude","settings.json")}return W__namespace.join(nt__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||nt__namespace.homedir();return W__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return W__namespace.join(e,".claude","settings.json")}return W__namespace.join(nt__namespace.homedir(),".claude","settings.json")}var Vn=Vt.LOCK_STALE_MS;function Gn(t){try{let e=T__namespace.statSync(t);Date.now()-e.mtimeMs>Vn&&T__namespace.unlinkSync(t);}catch{}try{T__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function jn(t){try{T__namespace.unlinkSync(t);}catch{}}function ye(t){try{let e=T__namespace.readFileSync(yt(),"utf8"),r=JSON.parse(e).env?.[t];return typeof r=="string"?r:null}catch{return null}}function Ae(t){let e=yt(),n=e+".lock";T__namespace.mkdirSync(W__namespace.dirname(e),{recursive:true}),Gn(n);try{let r={};try{r=JSON.parse(T__namespace.readFileSync(e,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,t),T__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
10
- `,{encoding:"utf8",mode:384});try{T__namespace.chmodSync(e,384);}catch{}}finally{jn(n);}}_();function Kn(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function qn(t,e,n,r,o,s){return new Promise(i=>{let l=new URL(t),c=l.protocol==="https:",u=S=>S.replace(/[\r\n]/g,""),g=(c?cn__default.default:ln__default.default).request({hostname:l.hostname,port:l.port||(c?443:80),path:l.pathname+l.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),...s?{}:{Authorization:`Bearer ${u(String(n))}`},FlowTenant:u(String(r)),...o?{"x-flow-user":u(o)}:{},...s?{"x-flow-api-key":u(s)}:{}}},S=>{S.resume(),i(S.statusCode??0);});g.on("error",()=>i(0)),g.setTimeout(5e3,()=>{g.destroy(),i(0);}),g.write(e),g.end();})}async function $(t,e={}){try{let n=St(process.env[m.ANTHROPIC_AUTH_TOKEN]);if(!n)return;let r,o=new Promise((E,y)=>{r=setTimeout(()=>y(new Error("getToken timeout")),4e3),r.unref();}),{accessToken:s}=await Promise.race([V(n),o]);clearTimeout(r);let i=Kn(s);if(!i)return;let l=i.tenant||n.tenant,c=JSON.stringify({action:t,booster:kt().BOOSTER,metadata:e,success:!0,tenant:l,timestamp:new Date().toISOString(),os:process.platform,user:{email:i.email||"",id:i.sub||"",name:i.name||i.email||""}}),u=ae(),g=ce(),S=gt(kt().API_URL),h=await qn(S,c,s,l,u,g);a("metrics.logEvent",`action=${t} status=${h} x-flow-user=${u?"[REDACTED]":"omitted"} x-flow-api-key=${g?"[REDACTED]":"omitted"}`);}catch(n){a("metrics.logEvent",`silenced error: ${n.message}`);}}var Xn=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${B()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;async function Mt(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Xn})+`
11
- `);return}let r=!!(await C()).authError;!process.env[m.FLOW_USER_EMAIL]&&!ye(m.FLOW_USER_EMAIL)&&tt().then(S=>{S&&(Ae({[m.FLOW_USER_EMAIL]:S}),a("UserPromptSubmit","auto-persisted FLOW_USER_EMAIL from access token"));}).catch(()=>{});let o=t.session_id||"unknown",s=t.prompt||"",i=t.cwd||"",l=de(t.transcript_path)||Ft(),c=Ee(s),u=c?_t(c,i):null,g=c?Tt(c,i):null;j(o,{traceId:Ft(),spanId:F(),startNs:I(),sessionId:o,prompt:s,cwd:i,traceName:l,transcriptPath:t.transcript_path||"",model:process.env[m.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:u,skillArtifacts:g}),$("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:r}),a("UserPromptSubmit",`sid=${o}`,`traceName=${l}`,`slashSkill=${c}`),k(t);}_();async function Oe(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},o=G(e);o&&(o.pendingTool={name:n,inputStr:L(r,R.TOOL_INPUT),startNs:I()},j(e,o)),a("PreToolUse",`sid=${e}`,`tool=${n}`,`stateFound=${!!o}`),k(t);}_();var zn={name:wt.SCOPE_NAME,version:wt.SCOPE_VERSION},d={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};function p(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function D(...t){return t.filter(e=>e!==null)}function we(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:zn,spans:Array.isArray(e)?e:[e]}]}]}}_();var ke=W.join(nt.tmpdir(),"flow-obs-requests.ndjson");function Re(t,e,n,r,o){if(process.env[m.FLOW_OBS_DEBUG]!=="1")return;let s=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(n)},response:{status:r,body:o}});try{T.writeFileSync(ke,s+`
12
- `,{flag:"a",encoding:"utf8",mode:384}),a("sendTraces:dump",`request appendada em ${ke}`);}catch(i){a("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function rr(t){let e=new URL(t),n=new URL(H().GATEWAY_HEALTH);return n.hostname=e.hostname,n.port=e.port,n.protocol=e.protocol,n}function Le(t,e){return new Promise((n,r)=>{let o=t._isSSL?cn__default.default:ln__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let s=o.request(t,i=>{let l=[];i.on("data",c=>l.push(c)),i.on("end",()=>n({statusCode:i.statusCode??0,body:l.join("")}));});s.setTimeout(1e4,()=>{s.destroy(new Error("Request timeout"));}),s.on("error",i=>r(new Error(`Network error: ${i.message}`))),e&&s.write(e),s.end();})}async function Ie(t,e){let n;try{n=rr(t);}catch{return false}let r=n.protocol==="https:";try{let o={};e&&(o.Authorization=String(e).replace(/[\r\n]/g,""));let s=await Le({hostname:n.hostname,port:n.port||(r?443:80),path:n.pathname,method:"GET",headers:o,_isSSL:r},null);return a("checkHealth",`url=${n.href} status=${s.statusCode}`),s.statusCode>=200&&s.statusCode<300}catch{return false}}async function At(t,e,n){let r=JSON.stringify(t),o=new URL(e),s=o.protocol==="https:",i=String(n).replace(/[\r\n]/g,""),l={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(r)};a("sendTraces:request",`POST ${e}`),a("sendTraces:request",`headers=${JSON.stringify({...l,Authorization:i.slice(0,20)+"\u2026"})}`),a("sendTraces:request",`body=${r.slice(0,500)}${r.length>500?"\u2026":""}`);try{let c=await Le({hostname:o.hostname,port:o.port||(s?443:80),path:o.pathname,method:"POST",headers:l,_isSSL:s},r);return a("sendTraces:response",`status=${c.statusCode}`),Re(e,l,r,c.statusCode,c.body),c.statusCode}catch(c){return a("sendTraces:error",c.message),Re(e,l,r,0,c.message),0}}_();function sr(){let t=parseInt(process.env[m.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(w.MIN_TTL_DAYS,Math.min(w.MAX_TTL_DAYS,t)):w.DEFAULT_TTL_DAYS)*24*60*60*1e3}function or(){let t=parseInt(process.env[m.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(w.MIN_MAX_FILES,Math.min(w.MAX_MAX_FILES,t)):w.DEFAULT_MAX_FILES}function Pe(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return W__namespace.default.join(nt__namespace.default.tmpdir(),`${w.FILE_PREFIX}${t}.json`)}function Ht(){let t=nt__namespace.default.tmpdir(),e;try{e=T__namespace.default.readdirSync(t);}catch{return []}return e.filter(n=>n.startsWith(w.FILE_PREFIX)&&n.endsWith(".json")).map(n=>{let r=W__namespace.default.join(t,n),o=0;try{o=T__namespace.default.statSync(r).mtimeMs;}catch{}return {full:r,mtime:o}}).sort((n,r)=>n.mtime-r.mtime).map(n=>n.full)}function rt(t){try{let e=or(),n=Ht();if(n.length>=e){let s=n.slice(0,n.length-e+1);for(let i of s)try{T__namespace.default.unlinkSync(i);}catch{}}let r=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,o={fileId:r,bufferedAt:Date.now(),payload:t};return T__namespace.default.writeFileSync(Pe(r),JSON.stringify(o),{encoding:"utf8",mode:384}),a("buffer",`saved fileId=${r}`),r}catch(e){return a("buffer",`saveToBuffer failed: ${e.message}`),null}}function Ne(t){let e=Ht(),n=t!=null&&t>0?t:e.length,r=[];for(let o of e){if(r.length>=n)break;try{let s=T__namespace.default.readFileSync(o,"utf8"),i=JSON.parse(s);i&&i.fileId&&i.payload&&r.push(i);}catch{a("buffer",`skipping malformed file: ${o}`);}}return r}function be(t){try{T__namespace.default.unlinkSync(Pe(t)),a("buffer",`deleted fileId=${t}`);}catch{}}function Ue(){let t=Date.now()-sr();for(let e of Ht())try{let{mtimeMs:n}=T__namespace.default.statSync(e);n<t&&(T__namespace.default.unlinkSync(e),a("buffer",`evicted stale: ${W__namespace.default.basename(e)}`));}catch{}}_();async function ir(t){Ue();let e=Ne(w.REPLAY_BATCH_SIZE);e.length&&(a("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async n=>{try{let r=await At(n.payload,t.endpoint,t.authHeader);r>=200&&r<300?(be(n.fileId),a("replayBufferedTraces",`replayed fileId=${n.fileId} status=${r}`)):a("replayBufferedTraces",`replay failed fileId=${n.fileId} status=${r}`);}catch(r){a("replayBufferedTraces",`replay error fileId=${n.fileId}: ${r.message}`);}})));}async function Ce(t){let e=await C();if(!e.length)return e.authError&&(a("postToLangfuse","auth refresh failed \u2014 buffering trace"),rt(t)),0;let n=await Promise.all(e.map(async s=>{if(s.mode!=="gateway")return {creds:s,healthy:true};let i=await Ie(s.endpoint,s.authHeader);return {creds:s,healthy:i}})),r=n.find(s=>s.creds.mode==="gateway"&&s.healthy)?.creds??n.find(s=>s.creds.mode==="direct")?.creds;return r&&await ir(r),(await Promise.all(n.map(async({creds:s,healthy:i})=>{if(s.mode==="gateway"){if(!i)return a("postToLangfuse","gateway health check failed \u2014 buffering trace"),rt(t),0;let c=await At(t,s.endpoint,s.authHeader);return (c===0||c>=500)&&(a("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),rt(t)),c}let l=await At(t,s.endpoint,s.authHeader);return (l===0||l>=500)&&(a("postToLangfuse",`direct endpoint unavailable (status ${l}) \u2014 buffering trace`),rt(t)),l}))).find(s=>s!==0)??0}_();var O="[REDACTED]",ar="[REDACTED-EMAIL]",cr="[REDACTED-CPF]",lr="[REDACTED-CNPJ]",Fe="[REDACTED-PHONE]",ur=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${O}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${O}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${O}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${O}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,n)=>`${e}
8
+ `),inputTokens:r,outputTokens:o}}catch{}return null}var Fn=new Set([".venv","__pycache__",".git","node_modules"]),$n=new Set([".pyc",".pyo"]),Dn=new Set(["SKILL.md",".DS_Store",".gitignore"]);function Se(t){return t.replace(":","/")}function _t(t,e){if(!t)return null;let n=Se(t),r=[W.join(nt.homedir(),".claude","skills",n,"SKILL.md"),W.join(e??"",".claude","skills",n,"SKILL.md")];for(let o of r)if(T.existsSync(o))try{return T.readFileSync(o,"utf8")}catch{}return null}function Ee(t){return t.split(`
9
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}var xn=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);function he(t){return !!t.slashSkill||t.toolCalls.some(r=>r.tool==="Skill")?t.toolCalls.some(r=>r.tool==="Skill"&&!r.synthetic||xn.has(r.tool))?"complete":"prerequisite_required":null}function Tt(t,e){if(!t)return null;let n=Se(t),r=[W.join(nt.homedir(),".claude","skills",n),W.join(e??"",".claude","skills",n)],o=null;for(let l of r)if(T.existsSync(W.join(l,"SKILL.md"))){o=l;break}if(!o)return null;let s=[];function i(l,c){for(let u of T.readdirSync(l,{withFileTypes:true})){if(Fn.has(u.name)||Dn.has(u.name)||$n.has(W.extname(u.name)))continue;let g=c?`${c}/${u.name}`:u.name;u.isDirectory()?i(W.join(l,u.name),g):s.push(g);}}return i(o,""),s.length>0?s:null}_();_();!process.env.NO_COLOR&&process.stdout.isTTY;function yt(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(t=n);}if(t){let e=t.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return W__namespace.join(e,".claude","settings.json")}return W__namespace.join(nt__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||nt__namespace.homedir();return W__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return W__namespace.join(e,".claude","settings.json")}return W__namespace.join(nt__namespace.homedir(),".claude","settings.json")}var Wn=Vt.LOCK_STALE_MS;function Vn(t){try{let e=T__namespace.statSync(t);Date.now()-e.mtimeMs>Wn&&T__namespace.unlinkSync(t);}catch{}try{T__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function Gn(t){try{T__namespace.unlinkSync(t);}catch{}}function ye(t){try{let e=T__namespace.readFileSync(yt(),"utf8"),r=JSON.parse(e).env?.[t];return typeof r=="string"?r:null}catch{return null}}function Ae(t){let e=yt(),n=e+".lock";T__namespace.mkdirSync(W__namespace.dirname(e),{recursive:true}),Vn(n);try{let r={};try{r=JSON.parse(T__namespace.readFileSync(e,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,t),T__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
10
+ `,{encoding:"utf8",mode:384});try{T__namespace.chmodSync(e,384);}catch{}}finally{Gn(n);}}_();function Jn(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Kn(t,e,n,r,o,s){return new Promise(i=>{let l=new URL(t),c=l.protocol==="https:",u=S=>S.replace(/[\r\n]/g,""),g=(c?cn__default.default:ln__default.default).request({hostname:l.hostname,port:l.port||(c?443:80),path:l.pathname+l.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e),...s?{}:{Authorization:`Bearer ${u(String(n))}`},FlowTenant:u(String(r)),...s&&o?{"x-flow-user":u(o)}:{},...s?{"x-flow-api-key":u(s)}:{}}},S=>{S.resume(),i(S.statusCode??0);});g.on("error",()=>i(0)),g.setTimeout(5e3,()=>{g.destroy(),i(0);}),g.write(e),g.end();})}async function $(t,e={}){try{let n=ae(),r=ce(),o=St(process.env[m.ANTHROPIC_AUTH_TOKEN]);if(!o)return;let s,i=new Promise((E,y)=>{s=setTimeout(()=>y(new Error("getToken timeout")),4e3),s.unref();}),{accessToken:l}=await Promise.race([V(o),i]);clearTimeout(s);let c=Jn(l);if(!c)return;let u=c.tenant||o.tenant,g=JSON.stringify({action:t,booster:kt().BOOSTER,metadata:e,success:!0,tenant:u,timestamp:new Date().toISOString(),os:process.platform,user:{email:c.email||"",id:c.sub||"",name:c.name||c.email||""}}),S=gt(kt().API_URL),h=await Kn(S,g,l,u,n,r);a("metrics.logEvent",`action=${t} status=${h} x-flow-user=${n?"[REDACTED]":"omitted"} x-flow-api-key=${r?"[REDACTED]":"omitted"}`);}catch(n){a("metrics.logEvent",`silenced error: ${n.message}`);}}var qn=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${B()}/settings/api-keys to generate a new API key, then run: flow-ai-obs login`;async function Mt(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:qn})+`
11
+ `);return}let r=!!(await C()).authError;!process.env[m.FLOW_USER_EMAIL]&&!ye(m.FLOW_USER_EMAIL)&&tt().then(S=>{S&&(Ae({[m.FLOW_USER_EMAIL]:S}),a("UserPromptSubmit","auto-persisted FLOW_USER_EMAIL from access token"));}).catch(()=>{});let o=t.session_id||"unknown",s=t.prompt||"",i=t.cwd||"",l=de(t.transcript_path)||Ft(),c=Ee(s),u=c?_t(c,i):null,g=c?Tt(c,i):null;Y(o,{traceId:Ft(),spanId:F(),startNs:I(),sessionId:o,prompt:s,cwd:i,traceName:l,transcriptPath:t.transcript_path||"",model:process.env[m.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:u,skillArtifacts:g}),$("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:r}),a("UserPromptSubmit",`sid=${o}`,`traceName=${l}`,`slashSkill=${c}`),k(t);}_();async function Oe(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},o=G(e);o&&(o.pendingTool={name:n,inputStr:L(r,R.TOOL_INPUT),startNs:I()},Y(e,o)),a("PreToolUse",`sid=${e}`,`tool=${n}`,`stateFound=${!!o}`),k(t);}_();var zn={name:wt.SCOPE_NAME,version:wt.SCOPE_VERSION},d={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};function p(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function D(...t){return t.filter(e=>e!==null)}function we(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:zn,spans:Array.isArray(e)?e:[e]}]}]}}_();var ke=W.join(nt.tmpdir(),"flow-obs-requests.ndjson");function Re(t,e,n,r,o){if(process.env[m.FLOW_OBS_DEBUG]!=="1")return;let s=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(n)},response:{status:r,body:o}});try{T.writeFileSync(ke,s+`
12
+ `,{flag:"a",encoding:"utf8",mode:384}),a("sendTraces:dump",`request appendada em ${ke}`);}catch(i){a("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function nr(t){let e=new URL(t),n=new URL(H().GATEWAY_HEALTH);return n.hostname=e.hostname,n.port=e.port,n.protocol=e.protocol,n}function Le(t,e){return new Promise((n,r)=>{let o=t._isSSL?cn__default.default:ln__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let s=o.request(t,i=>{let l=[];i.on("data",c=>l.push(c)),i.on("end",()=>n({statusCode:i.statusCode??0,body:l.join("")}));});s.setTimeout(1e4,()=>{s.destroy(new Error("Request timeout"));}),s.on("error",i=>r(new Error(`Network error: ${i.message}`))),e&&s.write(e),s.end();})}async function Ie(t,e){let n;try{n=nr(t);}catch{return false}let r=n.protocol==="https:";try{let o={};e&&(o.Authorization=String(e).replace(/[\r\n]/g,""));let s=await Le({hostname:n.hostname,port:n.port||(r?443:80),path:n.pathname,method:"GET",headers:o,_isSSL:r},null);return a("checkHealth",`url=${n.href} status=${s.statusCode}`),s.statusCode>=200&&s.statusCode<300}catch{return false}}async function At(t,e,n){let r=JSON.stringify(t),o=new URL(e),s=o.protocol==="https:",i=String(n).replace(/[\r\n]/g,""),l={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(r)};a("sendTraces:request",`POST ${e}`),a("sendTraces:request",`headers=${JSON.stringify({...l,Authorization:i.slice(0,20)+"\u2026"})}`),a("sendTraces:request",`body=${r.slice(0,500)}${r.length>500?"\u2026":""}`);try{let c=await Le({hostname:o.hostname,port:o.port||(s?443:80),path:o.pathname,method:"POST",headers:l,_isSSL:s},r);return a("sendTraces:response",`status=${c.statusCode}`),Re(e,l,r,c.statusCode,c.body),c.statusCode}catch(c){return a("sendTraces:error",c.message),Re(e,l,r,0,c.message),0}}_();function rr(){let t=parseInt(process.env[m.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(w.MIN_TTL_DAYS,Math.min(w.MAX_TTL_DAYS,t)):w.DEFAULT_TTL_DAYS)*24*60*60*1e3}function sr(){let t=parseInt(process.env[m.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(w.MIN_MAX_FILES,Math.min(w.MAX_MAX_FILES,t)):w.DEFAULT_MAX_FILES}function Pe(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return W__namespace.default.join(nt__namespace.default.tmpdir(),`${w.FILE_PREFIX}${t}.json`)}function Ht(){let t=nt__namespace.default.tmpdir(),e;try{e=T__namespace.default.readdirSync(t);}catch{return []}return e.filter(n=>n.startsWith(w.FILE_PREFIX)&&n.endsWith(".json")).map(n=>{let r=W__namespace.default.join(t,n),o=0;try{o=T__namespace.default.statSync(r).mtimeMs;}catch{}return {full:r,mtime:o}}).sort((n,r)=>n.mtime-r.mtime).map(n=>n.full)}function rt(t){try{let e=sr(),n=Ht();if(n.length>=e){let s=n.slice(0,n.length-e+1);for(let i of s)try{T__namespace.default.unlinkSync(i);}catch{}}let r=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,o={fileId:r,bufferedAt:Date.now(),payload:t};return T__namespace.default.writeFileSync(Pe(r),JSON.stringify(o),{encoding:"utf8",mode:384}),a("buffer",`saved fileId=${r}`),r}catch(e){return a("buffer",`saveToBuffer failed: ${e.message}`),null}}function Ne(t){let e=Ht(),n=t!=null&&t>0?t:e.length,r=[];for(let o of e){if(r.length>=n)break;try{let s=T__namespace.default.readFileSync(o,"utf8"),i=JSON.parse(s);i&&i.fileId&&i.payload&&r.push(i);}catch{a("buffer",`skipping malformed file: ${o}`);}}return r}function be(t){try{T__namespace.default.unlinkSync(Pe(t)),a("buffer",`deleted fileId=${t}`);}catch{}}function Ue(){let t=Date.now()-rr();for(let e of Ht())try{let{mtimeMs:n}=T__namespace.default.statSync(e);n<t&&(T__namespace.default.unlinkSync(e),a("buffer",`evicted stale: ${W__namespace.default.basename(e)}`));}catch{}}_();async function or(t){Ue();let e=Ne(w.REPLAY_BATCH_SIZE);e.length&&(a("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async n=>{try{let r=await At(n.payload,t.endpoint,t.authHeader);r>=200&&r<300?(be(n.fileId),a("replayBufferedTraces",`replayed fileId=${n.fileId} status=${r}`)):a("replayBufferedTraces",`replay failed fileId=${n.fileId} status=${r}`);}catch(r){a("replayBufferedTraces",`replay error fileId=${n.fileId}: ${r.message}`);}})));}async function Ce(t){let e=await C();if(!e.length)return e.authError&&(a("postToLangfuse","auth refresh failed \u2014 buffering trace"),rt(t)),0;let n=await Promise.all(e.map(async s=>{if(s.mode!=="gateway")return {creds:s,healthy:true};let i=await Ie(s.endpoint,s.authHeader);return {creds:s,healthy:i}})),r=n.find(s=>s.creds.mode==="gateway"&&s.healthy)?.creds??n.find(s=>s.creds.mode==="direct")?.creds;return r&&await or(r),(await Promise.all(n.map(async({creds:s,healthy:i})=>{if(s.mode==="gateway"){if(!i)return a("postToLangfuse","gateway health check failed \u2014 buffering trace"),rt(t),0;let c=await At(t,s.endpoint,s.authHeader);return (c===0||c>=500)&&(a("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),rt(t)),c}let l=await At(t,s.endpoint,s.authHeader);return (l===0||l>=500)&&(a("postToLangfuse",`direct endpoint unavailable (status ${l}) \u2014 buffering trace`),rt(t)),l}))).find(s=>s!==0)??0}_();var O="[REDACTED]",ir="[REDACTED-EMAIL]",ar="[REDACTED-CPF]",cr="[REDACTED-CNPJ]",Fe="[REDACTED-PHONE]",lr=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${O}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${O}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${O}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${O}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,n)=>`${e}
13
13
  ${O}
14
- ${n}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${O}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${O}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${O}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${O}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${O}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,n)=>`${e}${n}${O}${n}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${O}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>ar},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>cr},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>lr},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Fe},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Fe}];function P(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return ur.reduce((n,{re:r,replace:o})=>n.replace(r,o),e)}async function $e(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},o=t.tool_response,s=o!==null&&typeof o=="object"?o.output??JSON.stringify(o):o??"",i=G(e);if(!i){k(t);return}let l=I(),c=i.pendingTool,u=c?.name===n,g=u?c.startNs:String(BigInt(l)-200000000n),S=u?c.inputStr:L(r,R.TOOL_INPUT),h=S,E=null;if(n==="Skill"){let lt=typeof r=="object"&&r!==null?r.skill||r.name||r.skillName||r.commandName||String(Object.values(r)[0]??""):String(r);E=lt?String(lt).trim():null;let N=E?_t(E,i.cwd):null;N&&(h=N,i.skillContent||(i.skillContent=N),i.skillArtifacts||(i.skillArtifacts=Tt(E,i.cwd))),E&&!i.slashSkill&&(i.slashSkill=E),a("PostToolUse","Skill tool detected",`skillName=${E}`,`contentFound=${!!N}`);}let y=P(L(s,R.TOOL_OUTPUT)),A=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(y.slice(0,500)),st=A?"ERROR":"DEFAULT",q=F(),ot=Math.round(Number(BigInt(l)-BigInt(g))/1e6),at={Agent:"AGENT",Task:"AGENT"}[n]??"TOOL",ct=n==="Skill"&&E?E:ht(S,60);i.toolCalls.push({tool:n,brief:ct,error:A,durationMs:ot});let X=i.spans;X.push({traceId:i.traceId,spanId:q,parentSpanId:i.spanId,name:n,kind:3,startTimeUnixNano:g,endTimeUnixNano:l,attributes:D(p(d.OBS_NAME,n),p(d.OBS_TYPE,at),p(d.OBS_LEVEL,st),p(d.OBS_INPUT,P(h)),p(d.OBS_OUTPUT,y),p("tool.name",n),p("tool.error",String(A)),n==="Skill"&&E?p("skill.name",E):null,n==="Skill"?p("skill.invocation","slash-command"):null),status:{code:A?2:1}}),i.pendingTool=null,j(e,i),A&&$("TOOL_ERROR",{toolName:n}),a("PostToolUse",`sid=${e}`,`tool=${n}`,`error=${A}`,`durationMs=${ot}`,`totalSpans=${X.length}`),k(t);}var De={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};function xe(t,e,n){let r=Object.keys(De).find(i=>(t??"").toLowerCase().includes(i));if(!r)return;let o=De[r],s=(e*o.input+n*o.output)/1e6;return Math.round(s*1e6)/1e6}_();async function Me(t){let e=t.session_id||"unknown",n=t.stop_reason||"end_turn",r=G(e);if(!r){k(t);return}r.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(r.slashSkill)&&(a("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${r.slashSkill}"`),r.slashSkill=null);let o=I(),s=await ie(),i=r.toolCalls,l=r.spans;if(r.slashSkill&&!i.some(f=>f.tool==="Skill")){let f=F(),b=r.skillContent?r.skillContent:JSON.stringify({skill:r.slashSkill});i.push({tool:"Skill",brief:r.slashSkill,error:false,durationMs:0,synthetic:true}),l.push({traceId:r.traceId,spanId:f,parentSpanId:r.spanId,name:"Skill",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:r.startNs,attributes:D(p(d.OBS_NAME,"Skill"),p(d.OBS_TYPE,"TOOL"),p(d.OBS_LEVEL,"DEFAULT"),p(d.OBS_INPUT,b),p(d.OBS_OUTPUT,"loaded via slash command"),p("tool.name","Skill"),p("tool.error","false"),p("skill.name",r.slashSkill),p("skill.invocation","slash-command")),status:{code:1}}),a("Stop",`slashSkill=${r.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||r.transcriptPath||"",u=xt(c);if(c&&(i.some(f=>f.tool==="Skill"&&!f.synthetic)||!!r.slashSkill)&&!u?.text){await new Promise(b=>setTimeout(b,500));let f=xt(c);f?.text&&(u=f);}a("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${u?`text=${u.text.length}chars`:"null"}`);let S=i.length,h=i.filter(f=>f.error).length,E=P(u?.text?L(u.text,R.TRACE_OUTPUT):S===0?"No tools used":i.map((f,b)=>`${b+1}. ${f.tool}${f.brief?` \u2192 ${f.brief}`:""}${f.error?" [ERROR]":""}`).join(`
15
- `)),y=u?.inputTokens??0,A=u?.outputTokens??0,st=i.map((f,b)=>`${b+1}. ${f.tool}${f.brief?` \u2192 ${f.brief}`:""}${f.error?" [ERROR]":""} (${f.durationMs}ms)`),q=!!(r.slashSkill||i.some(f=>f.tool==="Skill")),ot=i.some(f=>f.tool==="Agent");if(!q&&!ot){a("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),$("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),Dt(e),k(t);return}let it=q?"skill":"agent",at=Math.round(Number(BigInt(o)-BigInt(r.startNs))/1e6),ct=xe(r.model,y,A),M=he(r);M==="prerequisite_required"&&u?.text&&(M="complete"),M==="prerequisite_required"&&(l.push({traceId:r.traceId,spanId:F(),parentSpanId:r.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:o,attributes:D(p(d.OBS_NAME,"prerequisite-check"),p(d.OBS_TYPE,"EVENT"),p(d.OBS_LEVEL,"WARNING"),p(d.OBS_OUTPUT,E),p("skill.name",r.slashSkill||void 0),p("execution_status","prerequisite_required")),status:{code:1}}),a("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${r.slashSkill}`));let X=(()=>{if(!(!q||!r.prompt)){if(r.slashSkill){let f=r.prompt.replace(new RegExp(`^\\/${r.slashSkill}\\s*`,"i"),"").trim();return f?L(P(f),R.USER_INSTRUCTION):void 0}return L(P(r.prompt),R.USER_INSTRUCTION)||void 0}})(),lt=JSON.stringify({trace_type:it,...M!==null&&{execution_status:M},...r.slashSkill?{skill_name:r.slashSkill}:{},...r.skillArtifacts?.length&&{skill_artifacts:r.skillArtifacts},...X!==void 0&&{user_instruction:X},latency_ms:at,...y&&{tokens_input:y},...A&&{tokens_output:A},cost_usd:ct,...r.model?{model:r.model}:{},toolCount:S,errorCount:h,stopReason:n,sessionId:r.sessionId,tools:st.length?st:void 0}),N=P(L(r.prompt,R.TRACE_INPUT)),Be=D(p(d.TRACE_NAME,r.traceName),p(d.TRACE_INPUT,N),p(d.TRACE_OUTPUT,E),p(d.OBS_INPUT,N),p(d.OBS_OUTPUT,E),p(d.TRACE_METADATA,lt),p(d.SESSION_ID,r.sessionId),p(d.USER_ID,s.user),p(d.OBS_TYPE,"GENERATION"),p(d.MODEL,r.model),y?p(d.INPUT_TOKENS,y):null,A?p(d.OUTPUT_TOKENS,A):null,p("claude.stop_reason",n),p("claude.tool_count",String(S)),p("claude.error_count",String(h)),p("claude.session_id",r.sessionId),p("flow.trace_type",it),{key:d.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:it}]}}}),He={traceId:r.traceId,spanId:r.spanId,name:r.traceName,kind:1,startTimeUnixNano:r.startNs,endTimeUnixNano:o,attributes:Be,status:{code:h>0?2:1}},We=D(p("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),p("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Wt=[...l,He];a("Stop",`sid=${e}`,`totalTools=${S}`,`errorTools=${h}`,`spans=${Wt.length}`,`inputTokens=${y}`,`outputTokens=${A}`,`traceOutput="${ht(E,80)}"`);let Ve=await Ce(we(We,Wt));a("Stop",`POST status=${Ve}`,`traceId=${r.traceId}`),$("TRACE_SENT",{latencyMs:at,totalTools:S,errorTools:h,inputTokens:y,outputTokens:A,costUsd:ct}),Dt(e),k(t);}var x=class t{static passthroughStdin(){let e=[];process.stdin.on("data",n=>e.push(n)),process.stdin.on("end",()=>process.stdout.write(Buffer.concat(e)));}static async userPromptSubmit(){let e=await et(),n;try{n=await C();}catch{process.stdout.write(JSON.stringify(e));return}n.authError?await Mt(e,true):n.length>0?await Mt(e):process.stdout.write(JSON.stringify(e));}static async preToolUse(){if(!await Et()){t.passthroughStdin();return}let e=await et();await Oe(e);}static async postToolUse(){if(!await Et()){t.passthroughStdin();return}let e=await et();await $e(e);}static async stop(){if(!await Et()){t.passthroughStdin();return}let e=await et();await Me(e);}};async function pr(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await x.userPromptSubmit();break;case "PreToolUse":await x.preToolUse();break;case "PostToolUse":await x.postToolUse();break;case "Stop":await x.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
16
- `),process.stdin.on("data",e=>process.stdout.write(e));}}pr().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
14
+ ${n}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${O}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${O}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${O}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${O}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${O}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,n)=>`${e}${n}${O}${n}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${O}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>ir},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>ar},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>cr},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Fe},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Fe}];function P(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return lr.reduce((n,{re:r,replace:o})=>n.replace(r,o),e)}async function $e(t){let e=t.session_id||"unknown",n=t.tool_name||"unknown",r=t.tool_input||{},o=t.tool_response,s=o!==null&&typeof o=="object"?o.output??JSON.stringify(o):o??"",i=G(e);if(!i){k(t);return}let l=I(),c=i.pendingTool,u=c?.name===n,g=u?c.startNs:String(BigInt(l)-200000000n),S=u?c.inputStr:L(r,R.TOOL_INPUT),h=S,E=null;if(n==="Skill"){let lt=typeof r=="object"&&r!==null?r.skill||r.name||r.skillName||r.commandName||String(Object.values(r)[0]??""):String(r);E=lt?String(lt).trim():null;let N=E?_t(E,i.cwd):null;N&&(h=N,i.skillContent||(i.skillContent=N),i.skillArtifacts||(i.skillArtifacts=Tt(E,i.cwd))),E&&!i.slashSkill&&(i.slashSkill=E),a("PostToolUse","Skill tool detected",`skillName=${E}`,`contentFound=${!!N}`);}let y=P(L(s,R.TOOL_OUTPUT)),A=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(y.slice(0,500)),st=A?"ERROR":"DEFAULT",q=F(),ot=Math.round(Number(BigInt(l)-BigInt(g))/1e6),at={Agent:"AGENT",Task:"AGENT"}[n]??"TOOL",ct=n==="Skill"&&E?E:ht(S,60);i.toolCalls.push({tool:n,brief:ct,error:A,durationMs:ot});let z=i.spans;z.push({traceId:i.traceId,spanId:q,parentSpanId:i.spanId,name:n,kind:3,startTimeUnixNano:g,endTimeUnixNano:l,attributes:D(p(d.OBS_NAME,n),p(d.OBS_TYPE,at),p(d.OBS_LEVEL,st),p(d.OBS_INPUT,P(h)),p(d.OBS_OUTPUT,y),p("tool.name",n),p("tool.error",String(A)),n==="Skill"&&E?p("skill.name",E):null,n==="Skill"?p("skill.invocation","slash-command"):null),status:{code:A?2:1}}),i.pendingTool=null,Y(e,i),A&&$("TOOL_ERROR",{toolName:n}),a("PostToolUse",`sid=${e}`,`tool=${n}`,`error=${A}`,`durationMs=${ot}`,`totalSpans=${z.length}`),k(t);}var De={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};function xe(t,e,n){let r=Object.keys(De).find(i=>(t??"").toLowerCase().includes(i));if(!r)return;let o=De[r],s=(e*o.input+n*o.output)/1e6;return Math.round(s*1e6)/1e6}_();async function Me(t){let e=t.session_id||"unknown",n=t.stop_reason||"end_turn",r=G(e);if(!r){k(t);return}r.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(r.slashSkill)&&(a("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${r.slashSkill}"`),r.slashSkill=null);let o=I(),s=await ie(),i=r.toolCalls,l=r.spans;if(r.slashSkill&&!i.some(f=>f.tool==="Skill")){let f=F(),b=r.skillContent?r.skillContent:JSON.stringify({skill:r.slashSkill});i.push({tool:"Skill",brief:r.slashSkill,error:false,durationMs:0,synthetic:true}),l.push({traceId:r.traceId,spanId:f,parentSpanId:r.spanId,name:"Skill",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:r.startNs,attributes:D(p(d.OBS_NAME,"Skill"),p(d.OBS_TYPE,"TOOL"),p(d.OBS_LEVEL,"DEFAULT"),p(d.OBS_INPUT,b),p(d.OBS_OUTPUT,"loaded via slash command"),p("tool.name","Skill"),p("tool.error","false"),p("skill.name",r.slashSkill),p("skill.invocation","slash-command")),status:{code:1}}),a("Stop",`slashSkill=${r.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||r.transcriptPath||"",u=xt(c);if(c&&(i.some(f=>f.tool==="Skill"&&!f.synthetic)||!!r.slashSkill)&&!u?.text){await new Promise(b=>setTimeout(b,500));let f=xt(c);f?.text&&(u=f);}a("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${u?`text=${u.text.length}chars`:"null"}`);let S=i.length,h=i.filter(f=>f.error).length,E=P(u?.text?L(u.text,R.TRACE_OUTPUT):S===0?"No tools used":i.map((f,b)=>`${b+1}. ${f.tool}${f.brief?` \u2192 ${f.brief}`:""}${f.error?" [ERROR]":""}`).join(`
15
+ `)),y=u?.inputTokens??0,A=u?.outputTokens??0,st=i.map((f,b)=>`${b+1}. ${f.tool}${f.brief?` \u2192 ${f.brief}`:""}${f.error?" [ERROR]":""} (${f.durationMs}ms)`),q=!!(r.slashSkill||i.some(f=>f.tool==="Skill")),ot=i.some(f=>f.tool==="Agent");if(!q&&!ot){a("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),$("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),Dt(e),k(t);return}let it=q?"skill":"agent",at=Math.round(Number(BigInt(o)-BigInt(r.startNs))/1e6),ct=xe(r.model,y,A),M=he(r);M==="prerequisite_required"&&u?.text&&(M="complete"),M==="prerequisite_required"&&(l.push({traceId:r.traceId,spanId:F(),parentSpanId:r.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:o,attributes:D(p(d.OBS_NAME,"prerequisite-check"),p(d.OBS_TYPE,"EVENT"),p(d.OBS_LEVEL,"WARNING"),p(d.OBS_OUTPUT,E),p("skill.name",r.slashSkill||void 0),p("execution_status","prerequisite_required")),status:{code:1}}),a("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${r.slashSkill}`));let z=(()=>{if(!(!q||!r.prompt)){if(r.slashSkill){let f=r.prompt.replace(new RegExp(`^\\/${r.slashSkill}\\s*`,"i"),"").trim();return f?L(P(f),R.USER_INSTRUCTION):void 0}return L(P(r.prompt),R.USER_INSTRUCTION)||void 0}})(),lt=JSON.stringify({trace_type:it,...M!==null&&{execution_status:M},...r.slashSkill?{skill_name:r.slashSkill}:{},...r.skillArtifacts?.length&&{skill_artifacts:r.skillArtifacts},...z!==void 0&&{user_instruction:z},latency_ms:at,...y&&{tokens_input:y},...A&&{tokens_output:A},cost_usd:ct,...r.model?{model:r.model}:{},toolCount:S,errorCount:h,stopReason:n,sessionId:r.sessionId,tools:st.length?st:void 0}),N=P(L(r.prompt,R.TRACE_INPUT)),Be=D(p(d.TRACE_NAME,r.traceName),p(d.TRACE_INPUT,N),p(d.TRACE_OUTPUT,E),p(d.OBS_INPUT,N),p(d.OBS_OUTPUT,E),p(d.TRACE_METADATA,lt),p(d.SESSION_ID,r.sessionId),p(d.USER_ID,s.user),p(d.OBS_TYPE,"GENERATION"),p(d.MODEL,r.model),y?p(d.INPUT_TOKENS,y):null,A?p(d.OUTPUT_TOKENS,A):null,p("claude.stop_reason",n),p("claude.tool_count",String(S)),p("claude.error_count",String(h)),p("claude.session_id",r.sessionId),p("flow.trace_type",it),{key:d.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:it}]}}}),He={traceId:r.traceId,spanId:r.spanId,name:r.traceName,kind:1,startTimeUnixNano:r.startNs,endTimeUnixNano:o,attributes:Be,status:{code:h>0?2:1}},We=D(p("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),p("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Wt=[...l,He];a("Stop",`sid=${e}`,`totalTools=${S}`,`errorTools=${h}`,`spans=${Wt.length}`,`inputTokens=${y}`,`outputTokens=${A}`,`traceOutput="${ht(E,80)}"`);let Ve=await Ce(we(We,Wt));a("Stop",`POST status=${Ve}`,`traceId=${r.traceId}`),$("TRACE_SENT",{latencyMs:at,totalTools:S,errorTools:h,inputTokens:y,outputTokens:A,costUsd:ct}),Dt(e),k(t);}var x=class t{static passthroughStdin(){let e=[];process.stdin.on("data",n=>e.push(n)),process.stdin.on("end",()=>process.stdout.write(Buffer.concat(e)));}static async userPromptSubmit(){let e=await et(),n;try{n=await C();}catch{process.stdout.write(JSON.stringify(e));return}n.authError?await Mt(e,true):n.length>0?await Mt(e):process.stdout.write(JSON.stringify(e));}static async preToolUse(){if(!await Et()){t.passthroughStdin();return}let e=await et();await Oe(e);}static async postToolUse(){if(!await Et()){t.passthroughStdin();return}let e=await et();await $e(e);}static async stop(){if(!await Et()){t.passthroughStdin();return}let e=await et();await Me(e);}};async function ur(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await x.userPromptSubmit();break;case "PreToolUse":await x.preToolUse();break;case "PostToolUse":await x.postToolUse();break;case "Stop":await x.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
16
+ `),process.stdin.on("data",e=>process.stdout.write(e));}}ur().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
17
17
  `),process.exit(0);});
package/dist/setup.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),f=require('path'),p=require('os'),ft=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var i__namespace=/*#__PURE__*/_interopNamespace(i);var f__namespace=/*#__PURE__*/_interopNamespace(f);var p__namespace=/*#__PURE__*/_interopNamespace(p);var ft__default=/*#__PURE__*/_interopDefault(ft);var I=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var Re=Object.getOwnPropertyNames;var Pe=Object.prototype.hasOwnProperty;var A=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var L=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var ke=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},R=(e,t)=>{for(var r in t)I(e,r,{get:t[r],enumerable:true});},Ie=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Re(t))!Pe.call(e,s)&&s!==r&&I(e,s,{get:()=>t[s],enumerable:!(n=Le(t,s))||n.enumerable});return e};var Ce=e=>Ie(I({},"__esModule",{value:true}),e);var J={};R(J,{BUFFER:()=>$e,CONFIG_DIR_NAME:()=>y,CONFIG_FILE_NAME:()=>_,DEBUG_LOG_FILENAME:()=>b,ENV:()=>u,FEATURES:()=>De,FLOW_URLS:()=>Ue,HOOK_TIMEOUTS:()=>U,INSTALLER:()=>N,NATIVE_OTEL:()=>C,OTLP:()=>be,STATE_FILE_PREFIX:()=>He,TRACE_LIMITS:()=>xe,VAULT:()=>E,getFlowBaseUrl:()=>h,getFlowUrls:()=>P,getLlmProxy:()=>Fe,getMetrics:()=>Me});function h(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ne}function P(){let e=h();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function Fe(){let e=h();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${e}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function Me(){let e=h();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ne,Ue,E,y,_,be,C,u,De,N,U,$e,b,xe,He,l=L(()=>{"use strict";Ne="https://flow.ciandt.com";Ue=P(),E={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},y="FLOW-nodejs",_="config.json",be={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};C={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},u={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL",OTEL_EXPORTER_OTLP_HEADERS:"OTEL_EXPORTER_OTLP_HEADERS"},De={KEYCHAIN_ENABLED:!1},N={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},U={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},$e={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},b="flow-ai-obs-debug.log",xe={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};He="flow-obs-";});var X={};R(X,{MacOsKeyVaultProvider:()=>x});var $,x,q=L(()=>{"use strict";$=util.promisify(child_process.execFile),x=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(t,r){try{let{stdout:n}=await $("security",["find-generic-password","-w","-a",r,"-s",t]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await $("security",["add-generic-password","-U","-a",r,"-s",t,"-w",n]);}async deleteSecret(t,r){try{return await $("security",["delete-generic-password","-a",r,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Z={};R(Z,{LinuxKeyVaultProvider:()=>M});var z,M,Q=L(()=>{"use strict";z=util.promisify(child_process.execFile),M=class{static async isAvailable(){let t=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of t)try{return i.accessSync(r,i.constants.X_OK),!0}catch{}return !1}async getSecret(t,r){try{let{stdout:n}=await z("secret-tool",["lookup","service",t,"account",r]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await new Promise((s,o)=>{let a=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",r]);a.on("error",o),a.on("close",g=>{g===0?s():o(new Error(`secret-tool exited with code ${g}`));}),a.stdin.write(n),a.stdin.end();});}async deleteSecret(t,r){try{return await z("secret-tool",["clear","service",t,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var ee={};R(ee,{WindowsKeyVaultProvider:()=>H});var H,te=L(()=>{"use strict";H=class{static async isAvailable(){try{return await A("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,r){return A("keytar").getPassword(t,r)}async setSecret(t,r,n){await A("keytar").setPassword(t,r,n);}async deleteSecret(t,r){return A("keytar").deletePassword(t,r)}getStoragePath(){return "Windows Credential Manager"}};});var ge=ke((Or,pt)=>{pt.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.9.3-beta.750",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});l();l();var F={credentials:"credentials","token-cache":"tokenCache"};function T(){let e=p__namespace.default.homedir();if(process.platform==="darwin")return f__namespace.default.join(e,"Library","Preferences",y,_);if(process.platform==="win32"){let r=process.env.APPDATA??f__namespace.default.join(e,"AppData","Roaming");return f__namespace.default.join(r,y,_)}let t=process.env.XDG_CONFIG_HOME??f__namespace.default.join(e,".config");return f__namespace.default.join(t,y,_)}function D(){try{let e=i__namespace.default.readFileSync(T(),"utf8");return JSON.parse(e)}catch{return {}}}function K(e){let t=T();i__namespace.default.mkdirSync(f__namespace.default.dirname(t),{recursive:true}),i__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var w=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(T()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(T(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,r){let n=D(),s=F[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,r,n){let s=D(),o=F[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;K(s);}async deleteSecret(t,r){let n=D(),s=F[r]??r;return s in n?(delete n[s],K(n),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${T()}`}};async function re(){return process.env[u.FLOW_OBS_USE_JSON_VAULT]==="1"?new w:await ze()??new w}async function ze(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(q(),X));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(Q(),Z));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(te(),ee));return await e.isAvailable()?new e:null}default:return null}}l();var Ze=E.SERVICE,Qe=E.ACCOUNT_CREDS;E.ACCOUNT_TOKEN;var V=null;function et(){return V||(V=re()),V}async function ne(){let t=await(await et()).getSecret(Ze,Qe);if(!t)return null;try{return JSON.parse(t)}catch{return null}}l();l();l();f.join(p.tmpdir(),b);!process.env.NO_COLOR&&process.stdout.isTTY;function j(){return process.platform==="win32"?false:process.getuid?.()===0}function se(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return {home:t,username:process.env.SUDO_USER}}return {home:p__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||p__namespace.userInfo().username}}function k(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(e=r);}if(e){let t=e.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return f__namespace.join(t,".claude","settings.json")}return f__namespace.join(p__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||p__namespace.homedir();return f__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return f__namespace.join(t,".claude","settings.json")}return f__namespace.join(p__namespace.homedir(),".claude","settings.json")}var oe="flow-ai-obs",ie="config.json";function ce(){if(process.platform==="win32"){let r=process.env.APPDATA||f__namespace.join(p__namespace.homedir(),"AppData","Roaming");return f__namespace.join(r,oe,ie)}let e=se(),t=process.env.XDG_CONFIG_HOME||f__namespace.join(e.home,".config");return f__namespace.join(t,oe,ie)}var ct=N.LOCK_STALE_MS;function le(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>ct&&i__namespace.unlinkSync(e);}catch{}try{i__namespace.writeFileSync(e,String(process.pid),{flag:"wx"});}catch(t){throw t.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+e):t}}function ue(e){try{i__namespace.unlinkSync(e);}catch{}}function lt(e,t){let n=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(a=>!a.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [t,...n]}function pe(e,t){let r=k(),n=r+".lock",s=[];i__namespace.mkdirSync(f__namespace.dirname(r),{recursive:true}),le(n);try{if(i__namespace.existsSync(r)){i__namespace.copyFileSync(r,r+".bkp");try{i__namespace.chmodSync(r+".bkp",384);}catch{}}let o=ce();if(i__namespace.existsSync(o)){let c=o+".bkp";i__namespace.copyFileSync(o,c);try{i__namespace.chmodSync(c,384);}catch{}}let a={};try{a=JSON.parse(i__namespace.readFileSync(r,"utf8"));}catch{}let g=a.env&&typeof a.env=="object"?a.env:{};delete g.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:Se}=(l(),Ce(J)),we=Se().OTEL_ENDPOINT,ve={...C,OTEL_EXPORTER_OTLP_ENDPOINT:e??we};a.env={...g,...ve,...t??{}},a.otelHeadersHelper="flow-ai-obs otel-headers",(!a.hooks||typeof a.hooks!="object"||Array.isArray(a.hooks))&&(a.hooks={});let Oe=(c,O)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:O}]}),Ae=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],B=a.hooks;for(let c of Ae){let O=lt(B[c],Oe(c,U[c]));O.length>1&&s.push(c),B[c]=O;}i__namespace.writeFileSync(r,JSON.stringify(a,null,2)+`
3
- `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(r,384);}catch{}}finally{ue(n);}return {settingsPath:r,preserved:s}}function fe(e){let t=k(),r=t+".lock";i__namespace.mkdirSync(f__namespace.dirname(t),{recursive:true}),le(r);try{let n={};try{n=JSON.parse(i__namespace.readFileSync(t,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,e),i__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
4
- `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}}finally{ue(r);}}l();function de(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:s,tenant:o}=r;return !n||!s||!o?null:{clientId:n,clientSecret:s,tenant:o}}catch{return null}}function me(e){let t=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant})).toString("base64url");return `${t}.${r}.`}l();var G;function Ee(){return G||(G=ge()),G}var ye=f__namespace.default.join(p__namespace.default.tmpdir(),"flow-obs-update-cache.json"),gt=1440*60*1e3,ht=3e3;function Et(e,t){let r=o=>{let a=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[3]]:null},n=r(e),s=r(t);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function yt(){try{let e=JSON.parse(i__namespace.default.readFileSync(ye,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=gt?null:e}catch{return null}}function _t(e,t,r=Date.now()){try{i__namespace.default.writeFileSync(ye,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function Tt(e){let t=Ee().name,r=ft__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:ht},n=>{if(n.statusCode!==200)return n.resume(),e(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");e(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){e(o);}});});r.on("error",e),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function _e(){try{if(yt())return;setImmediate(()=>{Tt((e,t)=>{e||!t||Et(Ee().version,t.version)&&_t(t.version,t.updatePriority,0);});});}catch{}}var St=f__namespace.default.resolve(__dirname,".."),wt=process.env.INIT_CWD?f__namespace.default.resolve(process.env.INIT_CWD):null;wt===St&&process.exit(0);j()&&(process.stderr.write(`
2
+ 'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),f=require('path'),p=require('os'),ft=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var i__namespace=/*#__PURE__*/_interopNamespace(i);var f__namespace=/*#__PURE__*/_interopNamespace(f);var p__namespace=/*#__PURE__*/_interopNamespace(p);var ft__default=/*#__PURE__*/_interopDefault(ft);var I=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var Re=Object.getOwnPropertyNames;var ke=Object.prototype.hasOwnProperty;var A=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var L=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Pe=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}},R=(e,t)=>{for(var n in t)I(e,n,{get:t[n],enumerable:true});},Ie=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Re(t))!ke.call(e,s)&&s!==n&&I(e,s,{get:()=>t[s],enumerable:!(r=Le(t,s))||r.enumerable});return e};var Ce=e=>Ie(I({},"__esModule",{value:true}),e);var J={};R(J,{BUFFER:()=>De,CONFIG_DIR_NAME:()=>y,CONFIG_FILE_NAME:()=>_,DEBUG_LOG_FILENAME:()=>b,ENV:()=>u,FEATURES:()=>$e,FLOW_URLS:()=>Ue,HOOK_TIMEOUTS:()=>U,INSTALLER:()=>N,NATIVE_OTEL:()=>C,OTLP:()=>be,STATE_FILE_PREFIX:()=>He,TRACE_LIMITS:()=>xe,VAULT:()=>E,getFlowBaseUrl:()=>h,getFlowUrls:()=>k,getLlmProxy:()=>Fe,getMetrics:()=>Me});function h(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ne}function k(){let e=h();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function Fe(){let e=h();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${e}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-haiku",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function Me(){let e=h();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ne,Ue,E,y,_,be,C,u,$e,N,U,De,b,xe,He,l=L(()=>{"use strict";Ne="https://flow.ciandt.com";Ue=k(),E={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},y="FLOW-nodejs",_="config.json",be={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};C={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},u={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_USE_JSON_VAULT:"FLOW_TELEMETRY_USE_JSON_VAULT",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL",FLOW_API_KEY:"FLOW_API_KEY"},$e={KEYCHAIN_ENABLED:!1},N={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},U={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},De={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},b="flow-ai-obs-debug.log",xe={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};He="flow-obs-";});var X={};R(X,{MacOsKeyVaultProvider:()=>x});var D,x,q=L(()=>{"use strict";D=util.promisify(child_process.execFile),x=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(t,n){try{let{stdout:r}=await D("security",["find-generic-password","-w","-a",n,"-s",t]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await D("security",["add-generic-password","-U","-a",n,"-s",t,"-w",r]);}async deleteSecret(t,n){try{return await D("security",["delete-generic-password","-a",n,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Z={};R(Z,{LinuxKeyVaultProvider:()=>M});var z,M,Q=L(()=>{"use strict";z=util.promisify(child_process.execFile),M=class{static async isAvailable(){let t=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of t)try{return i.accessSync(n,i.constants.X_OK),!0}catch{}return !1}async getSecret(t,n){try{let{stdout:r}=await z("secret-tool",["lookup","service",t,"account",n]);return r.trim()||null}catch{return null}}async setSecret(t,n,r){await new Promise((s,o)=>{let a=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",n]);a.on("error",o),a.on("close",g=>{g===0?s():o(new Error(`secret-tool exited with code ${g}`));}),a.stdin.write(r),a.stdin.end();});}async deleteSecret(t,n){try{return await z("secret-tool",["clear","service",t,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var ee={};R(ee,{WindowsKeyVaultProvider:()=>H});var H,te=L(()=>{"use strict";H=class{static async isAvailable(){try{return await A("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,n){return A("keytar").getPassword(t,n)}async setSecret(t,n,r){await A("keytar").setPassword(t,n,r);}async deleteSecret(t,n){return A("keytar").deletePassword(t,n)}getStoragePath(){return "Windows Credential Manager"}};});var ge=Pe((An,pt)=>{pt.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.9.3-beta.756",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});l();l();var F={credentials:"credentials","token-cache":"tokenCache"};function S(){let e=p__namespace.default.homedir();if(process.platform==="darwin")return f__namespace.default.join(e,"Library","Preferences",y,_);if(process.platform==="win32"){let n=process.env.APPDATA??f__namespace.default.join(e,"AppData","Roaming");return f__namespace.default.join(n,y,_)}let t=process.env.XDG_CONFIG_HOME??f__namespace.default.join(e,".config");return f__namespace.default.join(t,y,_)}function $(){try{let e=i__namespace.default.readFileSync(S(),"utf8");return JSON.parse(e)}catch{return {}}}function K(e){let t=S();i__namespace.default.mkdirSync(f__namespace.default.dirname(t),{recursive:true}),i__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var w=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(S()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(S(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,n){let r=$(),s=F[n]??n,o=r[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,n,r){let s=$(),o=F[n]??n;if(n==="token-cache")try{s[o]=JSON.parse(r);}catch{s[o]=r;}else s[o]=r;K(s);}async deleteSecret(t,n){let r=$(),s=F[n]??n;return s in r?(delete r[s],K(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${S()}`}};async function ne(){return process.env[u.FLOW_OBS_USE_JSON_VAULT]==="1"?new w:await ze()??new w}async function ze(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(q(),X));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(Q(),Z));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(te(),ee));return await e.isAvailable()?new e:null}default:return null}}l();var Ze=E.SERVICE,Qe=E.ACCOUNT_CREDS;E.ACCOUNT_TOKEN;var V=null;function et(){return V||(V=ne()),V}async function re(){let t=await(await et()).getSecret(Ze,Qe);if(!t)return null;try{return JSON.parse(t)}catch{return null}}l();l();l();f.join(p.tmpdir(),b);!process.env.NO_COLOR&&process.stdout.isTTY;function W(){return process.platform==="win32"?false:process.getuid?.()===0}function se(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return {home:t,username:process.env.SUDO_USER}}return {home:p__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||p__namespace.userInfo().username}}function P(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(e=n);}if(e){let t=e.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return f__namespace.join(t,".claude","settings.json")}return f__namespace.join(p__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||p__namespace.homedir();return f__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return f__namespace.join(t,".claude","settings.json")}return f__namespace.join(p__namespace.homedir(),".claude","settings.json")}var oe="flow-ai-obs",ie="config.json";function ce(){if(process.platform==="win32"){let n=process.env.APPDATA||f__namespace.join(p__namespace.homedir(),"AppData","Roaming");return f__namespace.join(n,oe,ie)}let e=se(),t=process.env.XDG_CONFIG_HOME||f__namespace.join(e.home,".config");return f__namespace.join(t,oe,ie)}var ct=N.LOCK_STALE_MS;function le(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>ct&&i__namespace.unlinkSync(e);}catch{}try{i__namespace.writeFileSync(e,String(process.pid),{flag:"wx"});}catch(t){throw t.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+e):t}}function ue(e){try{i__namespace.unlinkSync(e);}catch{}}function lt(e,t){let r=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(a=>!a.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [t,...r]}function pe(e,t){let n=P(),r=n+".lock",s=[];i__namespace.mkdirSync(f__namespace.dirname(n),{recursive:true}),le(r);try{if(i__namespace.existsSync(n)){i__namespace.copyFileSync(n,n+".bkp");try{i__namespace.chmodSync(n+".bkp",384);}catch{}}let o=ce();if(i__namespace.existsSync(o)){let c=o+".bkp";i__namespace.copyFileSync(o,c);try{i__namespace.chmodSync(c,384);}catch{}}let a={};try{a=JSON.parse(i__namespace.readFileSync(n,"utf8"));}catch{}let g=a.env&&typeof a.env=="object"?a.env:{};delete g.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:Te}=(l(),Ce(J)),we=Te().OTEL_ENDPOINT,ve={...C,OTEL_EXPORTER_OTLP_ENDPOINT:e??we};a.env={...g,...ve,...t??{}},a.otelHeadersHelper="flow-ai-obs otel-headers",(!a.hooks||typeof a.hooks!="object"||Array.isArray(a.hooks))&&(a.hooks={});let Oe=(c,O)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:O}]}),Ae=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],B=a.hooks;for(let c of Ae){let O=lt(B[c],Oe(c,U[c]));O.length>1&&s.push(c),B[c]=O;}i__namespace.writeFileSync(n,JSON.stringify(a,null,2)+`
3
+ `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(n,384);}catch{}}finally{ue(r);}return {settingsPath:n,preserved:s}}function fe(e){let t=P(),n=t+".lock";i__namespace.mkdirSync(f__namespace.dirname(t),{recursive:true}),le(n);try{let r={};try{r=JSON.parse(i__namespace.readFileSync(t,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,e),i__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
4
+ `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}}finally{ue(n);}}l();function de(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let n=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:s,tenant:o}=n;return !r||!s||!o?null:{clientId:r,clientSecret:s,tenant:o}}catch{return null}}function me(e){let t=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),n=Buffer.from(JSON.stringify({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant})).toString("base64url");return `${t}.${n}.`}l();var G;function Ee(){return G||(G=ge()),G}var ye=f__namespace.default.join(p__namespace.default.tmpdir(),"flow-obs-update-cache.json"),gt=1440*60*1e3,ht=3e3;function Et(e,t){let n=o=>{let a=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[3]]:null},r=n(e),s=n(t);return !r||!s?false:s[0]!==r[0]?s[0]>r[0]:s[1]!==r[1]?s[1]>r[1]:s[2]>r[2]}function yt(){try{let e=JSON.parse(i__namespace.default.readFileSync(ye,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=gt?null:e}catch{return null}}function _t(e,t,n=Date.now()){try{i__namespace.default.writeFileSync(ye,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:n}),{mode:384});}catch{}}function St(e){let t=Ee().name,n=ft__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:ht},r=>{if(r.statusCode!==200)return r.resume(),e(new Error(`HTTP ${r.statusCode}`));let s="";r.setEncoding("utf8"),r.on("data",o=>{s+=o;}),r.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");e(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){e(o);}});});n.on("error",e),n.on("timeout",()=>{n.destroy(new Error("timeout"));});}function _e(){try{if(yt())return;setImmediate(()=>{St((e,t)=>{e||!t||Et(Ee().version,t.version)&&_t(t.version,t.updatePriority,0);});});}catch{}}var Tt=f__namespace.default.resolve(__dirname,".."),wt=process.env.INIT_CWD?f__namespace.default.resolve(process.env.INIT_CWD):null;wt===Tt&&process.exit(0);W()&&(process.stderr.write(`
5
5
  [flow-ai-obs] \u2717 Do not install with sudo.
6
6
  Run without sudo: npm install -g @ciandt-flow/flow-ai-obs
7
7
 
8
- `),process.exit(1));async function vt(){try{pe();}catch{}let e=await ne();if(!e){process.stderr.write(`
8
+ `),process.exit(1));async function vt(){try{pe();}catch{}let e=await re();if(!e){process.stderr.write(`
9
9
  [flow-ai-obs] No credentials found.
10
10
  Run \`flow-ai-obs auth login\` to authenticate and enable telemetry.
11
11
 
12
- `);return}let t=de(process.env[u.ANTHROPIC_AUTH_TOKEN]);if(!t||t.clientId!==e.clientId||t.clientSecret!==e.clientSecret||t.tenant!==e.tenant)try{let n=me(e);fe({[u.ANTHROPIC_AUTH_TOKEN]:n});}catch{}}vt().catch(()=>{}).finally(()=>_e());
12
+ `);return}let t=de(process.env[u.ANTHROPIC_AUTH_TOKEN]);if(!t||t.clientId!==e.clientId||t.clientSecret!==e.clientSecret||t.tenant!==e.tenant)try{let r=me(e);fe({[u.ANTHROPIC_AUTH_TOKEN]:r});}catch{}}vt().catch(()=>{}).finally(()=>_e());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.9.3-beta.750",
3
+ "version": "0.9.3-beta.756",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {