@ciandt-flow/flow-ai-obs 0.13.0-beta.15 → 0.13.0-beta.23

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