@ciandt-flow/flow-ai-obs 0.7.0-beta.479 → 0.7.0-beta.484

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,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var Gt=require('readline/promises'),qs=require('https'),h=require('fs'),j=require('os'),rt=require('path'),child_process=require('child_process'),crypto=require('crypto'),Dr=require('http');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 Gt__namespace=/*#__PURE__*/_interopNamespace(Gt);var qs__default=/*#__PURE__*/_interopDefault(qs);var h__namespace=/*#__PURE__*/_interopNamespace(h);var j__namespace=/*#__PURE__*/_interopNamespace(j);var rt__namespace=/*#__PURE__*/_interopNamespace(rt);var Dr__default=/*#__PURE__*/_interopDefault(Dr);var jt=Object.defineProperty;var Ms=Object.getOwnPropertyDescriptor;var Bs=Object.getOwnPropertyNames;var Hs=Object.prototype.hasOwnProperty;var Ws=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,s)=>(typeof require<"u"?require:e)[s]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var f=(t,e,s)=>()=>{if(s)throw s[0];try{return t&&(e=t(t=0)),e}catch(r){throw s=[r],r}};var js=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(s){throw e=0,s}},ft=(t,e)=>{for(var s in e)jt(t,s,{get:e[s],enumerable:true});},Ys=(t,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Bs(e))!Hs.call(t,n)&&n!==s&&jt(t,n,{get:()=>e[n],enumerable:!(r=Ms(e,n))||r.enumerable});return t};var C=t=>Ys(jt({},"__esModule",{value:true}),t);var At=js((on,Gs)=>{Gs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.0-beta.479",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});var Yt={};ft(Yt,{bold:()=>F,cyan:()=>bt,dim:()=>S,green:()=>$,red:()=>vt,yellow:()=>y});function et(t,e){return Xs?s=>`\x1B[${t}m${s}\x1B[${e}m`:s=>s}var Xs,$,vt,y,bt,F,S,mt=f(()=>{"use strict";Xs=!process.env.NO_COLOR&&process.stdout.isTTY;$=et("32","39"),vt=et("31","39"),y=et("33","39"),bt=et("36","39"),F=et("1","22"),S=et("2","22");});function st(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function kt(t,e){let s=Gt__namespace.createInterface({input:process.stdin,output:process.stdout}),n=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await s.question(n)).trim().toLowerCase();if(i===""&&e!==void 0)return s.close(),e;if(i==="y"||i==="yes")return s.close(),!0;if(i==="n"||i==="no")return s.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
- `);}catch(i){throw s.close(),i}if(s.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function Ut(t,e){let s=Gt__namespace.createInterface({input:process.stdin,output:process.stdout});try{let r=(await s.question(`${t}: `)).trim();if(e){let n=e(r);if(n)throw new Error(n)}return r}catch(r){throw r}finally{s.close();}}var Xt=f(()=>{"use strict";});var Pt={};ft(Pt,{checkForUpdate:()=>tr,checkForUpdateInteractive:()=>er,isNewer:()=>gt,primeUpdateCache:()=>sr});function A(){return qt||(qt=At()),qt}function gt(t,e){let s=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},r=s(t),n=s(e);return !r||!n?false:n[0]!==r[0]?n[0]>r[0]:n[1]!==r[1]?n[1]>r[1]:n[2]>r[2]}function zt(){try{let t=JSON.parse(h__namespace.default.readFileSync(we,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=zs?null:t}catch{return null}}function Oe(t,e,s=Date.now()){try{h__namespace.default.writeFileSync(we,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:s}),{mode:384});}catch{}}function Le(t){let e=A().name,s=qs__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:Ks},r=>{if(r.statusCode!==200)return r.resume(),t(new Error(`HTTP ${r.statusCode}`));let n="";r.setEncoding("utf8"),r.on("data",o=>{n+=o;}),r.on("end",()=>{try{let o=JSON.parse(n);if(typeof o.version!="string")throw new Error("no version field");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});s.on("error",t),s.on("timeout",()=>{s.destroy(new Error("timeout"));});}function Vt(t){let e=A().name,r=` Update available: ${A().version} \u2192 ${t}`,n=` Run: npm install -g ${e}`,o=Math.max(r.length,n.length)+2,i="\u2500".repeat(o);process.stderr.write(`
2
+ 'use strict';var Gt=require('readline/promises'),qs=require('https'),_=require('fs'),j=require('os'),rt=require('path'),child_process=require('child_process'),crypto=require('crypto'),Dr=require('http');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 Gt__namespace=/*#__PURE__*/_interopNamespace(Gt);var qs__default=/*#__PURE__*/_interopDefault(qs);var ___namespace=/*#__PURE__*/_interopNamespace(_);var j__namespace=/*#__PURE__*/_interopNamespace(j);var rt__namespace=/*#__PURE__*/_interopNamespace(rt);var Dr__default=/*#__PURE__*/_interopDefault(Dr);var jt=Object.defineProperty;var Ms=Object.getOwnPropertyDescriptor;var Bs=Object.getOwnPropertyNames;var Hs=Object.prototype.hasOwnProperty;var Ws=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,s)=>(typeof require<"u"?require:e)[s]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var f=(t,e,s)=>()=>{if(s)throw s[0];try{return t&&(e=t(t=0)),e}catch(r){throw s=[r],r}};var js=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(s){throw e=0,s}},ft=(t,e)=>{for(var s in e)jt(t,s,{get:e[s],enumerable:true});},Ys=(t,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Bs(e))!Hs.call(t,n)&&n!==s&&jt(t,n,{get:()=>e[n],enumerable:!(r=Ms(e,n))||r.enumerable});return t};var $=t=>Ys(jt({},"__esModule",{value:true}),t);var At=js((on,Gs)=>{Gs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.0-beta.484",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0","eslint-config-prettier":"^10.1.5",jest:"^30.4.2",prettier:"^3.5.3","ts-jest":"^29.4.9",tsup:"^8.5.1",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});var Yt={};ft(Yt,{bold:()=>F,cyan:()=>bt,dim:()=>S,green:()=>U,red:()=>vt,yellow:()=>y});function et(t,e){return Xs?s=>`\x1B[${t}m${s}\x1B[${e}m`:s=>s}var Xs,U,vt,y,bt,F,S,mt=f(()=>{"use strict";Xs=!process.env.NO_COLOR&&process.stdout.isTTY;U=et("32","39"),vt=et("31","39"),y=et("33","39"),bt=et("36","39"),F=et("1","22"),S=et("2","22");});function st(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function kt(t,e){let s=Gt__namespace.createInterface({input:process.stdin,output:process.stdout}),n=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let l=(await s.question(n)).toLowerCase().replace(/[^a-z]/g,"");if(l===""&&e!==void 0)return s.close(),e;if(l==="y"||l==="yes")return s.close(),!0;if(l==="n"||l==="no")return s.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
+ `);}catch(i){throw s.close(),i}if(s.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function Ut(t,e){let s=Gt__namespace.createInterface({input:process.stdin,output:process.stdout});try{let r=(await s.question(`${t}: `)).trim();if(e){let n=e(r);if(n)throw new Error(n)}return r}catch(r){throw r}finally{s.close();}}var Xt=f(()=>{"use strict";});var Pt={};ft(Pt,{checkForUpdate:()=>tr,checkForUpdateInteractive:()=>er,isNewer:()=>gt,primeUpdateCache:()=>sr});function A(){return qt||(qt=At()),qt}function gt(t,e){let s=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},r=s(t),n=s(e);return !r||!n?false:n[0]!==r[0]?n[0]>r[0]:n[1]!==r[1]?n[1]>r[1]:n[2]>r[2]}function zt(){try{let t=JSON.parse(___namespace.default.readFileSync(we,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=zs?null:t}catch{return null}}function Oe(t,e,s=Date.now()){try{___namespace.default.writeFileSync(we,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:s}),{mode:384});}catch{}}function Le(t){let e=A().name,s=qs__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:Ks},r=>{if(r.statusCode!==200)return r.resume(),t(new Error(`HTTP ${r.statusCode}`));let n="";r.setEncoding("utf8"),r.on("data",o=>{n+=o;}),r.on("end",()=>{try{let o=JSON.parse(n);if(typeof o.version!="string")throw new Error("no version field");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});s.on("error",t),s.on("timeout",()=>{s.destroy(new Error("timeout"));});}function Vt(t){let e=A().name,r=` Update available: ${A().version} \u2192 ${t}`,n=` Run: npm install -g ${e}`,o=Math.max(r.length,n.length)+2,i="\u2500".repeat(o);process.stderr.write(`
4
4
  \u256D${i}\u256E
5
5
  \u2502${r.padEnd(o)}\u2502
6
6
  \u2502${n.padEnd(o)}\u2502
@@ -12,7 +12,7 @@
12
12
  `),child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",windowsHide:true}).unref();}async function Zs(t,e=1e4){let s=Ws("readline"),r=A().name,n=A().version;return process.stderr.write(`
13
13
  Update available: ${n} \u2192 ${t}
14
14
  Run: npm install -g ${r}@${t}
15
- Install now? [y/N]: `),new Promise(o=>{let i=s.createInterface({input:process.stdin,output:void 0,terminal:false}),u=false;function p(d){u||(u=true,clearTimeout(a),i.close(),process.stderr.write(`
15
+ Install now? [y/N]: `),new Promise(o=>{let i=s.createInterface({input:process.stdin,output:void 0,terminal:false}),l=false;function p(d){l||(l=true,clearTimeout(a),i.close(),process.stderr.write(`
16
16
  `),o(d));}let a=setTimeout(()=>p(false),e);i.once("line",d=>p(d.trim().toLowerCase()==="y")),i.once("close",()=>p(false));})}async function Qs(t){let e=A().name;return process.stderr.write(` Installing ${e}@${t}...
17
17
  `),new Promise(s=>{let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit"});r.on("close",n=>{n!==0?process.stderr.write(` \u2717 Update failed \u2014 continuing with current version.
18
18
 
@@ -23,12 +23,12 @@
23
23
  `),s();});})}function tr(){try{let t=zt();if(t){gt(A().version,t.latestVersion)&&(t.updatePriority==="auto"?Jt(t.latestVersion):Vt(t.latestVersion));return}setImmediate(()=>{Le((e,s)=>{e||!s||(Oe(s.version,s.updatePriority),gt(A().version,s.version)&&(s.updatePriority==="auto"?Jt(s.version):Vt(s.version)));});});}catch{}}async function er(t={}){try{let e=zt();if(!e||!gt(A().version,e.latestVersion))return;if(e.updatePriority==="auto"){Jt(e.latestVersion);return}if(!st()){Vt(e.latestVersion);return}await Zs(e.latestVersion,t.timeoutMs)&&await Qs(e.latestVersion);}catch{}}function sr(){try{if(zt())return;setImmediate(()=>{Le((t,e)=>{t||!e||gt(A().version,e.version)&&Oe(e.version,e.updatePriority,0);});});}catch{}}var qt,we,zs,Ks,It=f(()=>{"use strict";Xt();we=rt__namespace.default.join(j__namespace.default.tmpdir(),"flow-obs-update-cache.json"),zs=1440*60*1e3,Ks=3e3;});function ye(){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:j__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||j__namespace.userInfo().username}}function Y(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let s=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();s&&/^[A-Za-z]:\\/.test(s)&&(t=s);}if(t){let e=t.replace(/^([A-Za-z]):/,(s,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return rt__namespace.join(e,".claude","settings.json")}return rt__namespace.join(j__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||j__namespace.homedir();return rt__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return rt__namespace.join(e,".claude","settings.json")}return rt__namespace.join(j__namespace.homedir(),".claude","settings.json")}function Re(){return process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER?`Running as root via sudo is not recommended.
24
24
  Configure npm to install globals without sudo:
25
25
  npm config set prefix '~/.npm-global'
26
- export PATH=~/.npm-global/bin:$PATH`:null}var Nt=f(()=>{"use strict";});function ke(){if(process.platform==="win32"){let s=process.env.APPDATA||rt__namespace.join(j__namespace.homedir(),"AppData","Roaming");return rt__namespace.join(s,Ae,ve)}let t=ye(),e=process.env.XDG_CONFIG_HOME||rt__namespace.join(t.home,".config");return rt__namespace.join(e,Ae,ve)}function Ue(){try{let t=h__namespace.readFileSync(ke(),"utf8");return JSON.parse(t)}catch{return {}}}function X(){let{baseUrl:t}=Ue();return typeof t!="string"||t.trim()===""?null:t.trim().replace(/\/$/,"")}function Pe(t){let e=ke();h__namespace.mkdirSync(rt__namespace.dirname(e),{recursive:true});let r={...Ue(),baseUrl:t};h__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
27
- `,{encoding:"utf8",mode:384});}var Ae,ve,Zt=f(()=>{"use strict";Nt();Ae="flow-ai-obs",ve="config.json";});function Qt(){return X()??process.env.FLOW_BASE_URL??rr}function te(){let t=Qt();return {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 Et(){let t=Qt();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function se(){let t=Qt();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var rr,nr,ee,q,E,Ie,Ne,v,Ce,U,w=f(()=>{"use strict";Zt();rr="https://flow.ciandt.com";nr=te(),ee={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};q={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:nr.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},E={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",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL"},Ie={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3},Ne={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15},v={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},Ce="flow-ai-obs-debug.log",U={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};});function $e(t){try{let e=h__namespace.statSync(t);Date.now()-e.mtimeMs>or&&h__namespace.unlinkSync(t);}catch{}try{h__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function Fe(t){try{h__namespace.unlinkSync(t);}catch{}}function ir(t,e){let r=(Array.isArray(t)?t:[]).map(n=>{if(!Array.isArray(n?.hooks))return null;let o=n.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...n,hooks:o}:null}).filter(n=>n!=null);return [e,...r]}function xe(){let t=Y(),e=t+".lock",s=[];h__namespace.mkdirSync(rt__namespace.dirname(t),{recursive:true}),$e(e);try{if(h__namespace.existsSync(t)){h__namespace.copyFileSync(t,t+".bkp");try{h__namespace.chmodSync(t+".bkp",384);}catch{}}let r={};if(h__namespace.existsSync(t)){try{r=JSON.parse(h__namespace.readFileSync(t,"utf8"));}catch{}"otelHeadersHelper"in r&&delete r.otelHeadersHelper;}let n=r.env&&typeof r.env=="object"?r.env:{};r.env={...q,...Et(),...n},(!r.hooks||typeof r.hooks!="object"||Array.isArray(r.hooks))&&(r.hooks={});let o=(p,a)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${p}`,timeout:a}]}),i=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],u=r.hooks;for(let p of i){let a=ir(u[p],o(p,Ne[p]));a.length>1&&s.push(p),u[p]=a;}h__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
28
- `,{encoding:"utf8",mode:384});try{h__namespace.chmodSync(t,384);}catch{}}finally{Fe(e);}return {settingsPath:t,preserved:s}}function ot(t){let e=Y(),s=e+".lock";h__namespace.mkdirSync(rt__namespace.dirname(e),{recursive:true}),$e(s);try{let r={};try{r=JSON.parse(h__namespace.readFileSync(e,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,t),h__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
29
- `,{encoding:"utf8",mode:384});try{h__namespace.chmodSync(e,384);}catch{}}finally{Fe(s);}}var or,Ct=f(()=>{"use strict";w();Nt();or=Ie.LOCK_STALE_MS;});function c(...t){if(process.env[E.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
30
- `;try{h.writeFileSync(ur,e,{flag:"a"});}catch(s){process.stderr.write(`[flow-obs debug ERROR] ${s.message}
31
- `);}}var ur,P=f(()=>{"use strict";w();ur=rt.join(j.tmpdir(),Ce);});function dr(t){return pr.some(e=>e.test(t))}function V(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let s=process.env[E.FLOW_OBS_ALLOW_HTTP]==="true";if(!s&&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(!s&&dr(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}function fr(t){if(!t||!t.trim())return [];let e=[];for(let s of t.split(",")){let r=s.indexOf("=");if(r===-1)continue;let n=s.slice(0,r).trim(),o=s.slice(r+1).trim();n&&e.push([n,o]);}return e}function mr(t,e,s){let r=Buffer.from(`${e}:${s}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",headers:[["Authorization",`Basic ${r}`]]}}async function ht(){let t=[],e=process.env[E.ANTHROPIC_MODEL]??"",s=process.env.OTEL_EXPORTER_OTLP_HEADERS??"",r=fr(s);s.trim()?c("resolveCredentials",`parsed ${r.length} header(s) from OTEL_EXPORTER_OTLP_HEADERS`):(c("resolveCredentials","OTEL_EXPORTER_OTLP_HEADERS not set \u2014 no extra headers will be forwarded"),console.warn("[flow-ai-obs] OTEL_EXPORTER_OTLP_HEADERS is not set. No extra headers will be forwarded to the OTLP gateway."));let n=process.env[E.FLOW_TELEMETRY]==="true",o=process.env[E.LANGFUSE_BASE_URL],i=process.env[E.LANGFUSE_PUBLIC_KEY],u=process.env[E.LANGFUSE_SECRET_KEY];if(n&&o&&i&&u){let{endpoint:d,headers:_}=mr(V(o),i,u);return t.push({mode:"direct",endpoint:d,headers:_,user:"",tenant:"",team:"",project:"",model:e}),c("resolveCredentials","direct mode active",`endpoint=${d}`),t}let p=process.env[E.FLOW_TELEMETRY_GATEWAY];if(p)return t.push({mode:"gateway",endpoint:V(p).replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",headers:r,user:"",tenant:"",team:"",project:"",model:e}),c("resolveCredentials","gateway mode active via FLOW_TELEMETRY_GATEWAY_URL"),t;let a=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;return a?(t.push({mode:"otel",endpoint:V(a),headers:r,user:"",tenant:"",team:"",project:"",model:e}),c("resolveCredentials","otel mode active",`endpoint=${a}`),t):(c("resolveCredentials","no destination configured \u2014 returning empty"),t)}async function ne(){return (await ht()).length>0}function x(){let t=process.env[E.FLOW_USER_EMAIL];if(t)return c("resolveUserEmail",`using FLOW_USER_EMAIL override: ${t}`),t;try{let e=j__namespace.userInfo().username||process.env.USERNAME||process.env.USER||"",s=e.lastIndexOf("\\");if(s!==-1&&(e=e.slice(s+1)),e=e.trim().replace(/[^a-zA-Z0-9._%+\-]/g,""),!e)return c("resolveUserEmail","username empty after sanitisation \u2014 omitting x-flow-user"),console.warn("[flow-ai-obs] Could not derive x-flow-user: username is empty. Set FLOW_USER_EMAIL to fix this."),null;let r=`${e}@ciandt.com`;return c("resolveUserEmail",`derived email: ${r}`),r}catch(e){return c("resolveUserEmail",`os.userInfo() threw: ${e.message} \u2014 omitting x-flow-user`),console.warn("[flow-ai-obs] Could not derive x-flow-user from OS username. Set FLOW_USER_EMAIL to fix this."),null}}var pr,J=f(()=>{"use strict";w();P();pr=[/^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 je={};ft(je,{runInit:()=>oe});function gr(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux")return child_process.spawnSync("cmd.exe",["/c","where","claude"],{encoding:"utf8",timeout:5e3}).status===0;let t=process.platform==="win32"?"where":"which";return child_process.spawnSync(t,["claude"],{encoding:"utf8",timeout:5e3}).status===0}function We(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}if(e.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);let s=process.env[E.FLOW_OBS_ALLOW_HTTP];try{delete process.env[E.FLOW_OBS_ALLOW_HTTP],V(t);}finally{s!==void 0&&(process.env[E.FLOW_OBS_ALLOW_HTTP]=s);}if(e.pathname!=="/"&&e.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
26
+ export PATH=~/.npm-global/bin:$PATH`:null}var Nt=f(()=>{"use strict";});function ke(){if(process.platform==="win32"){let s=process.env.APPDATA||rt__namespace.join(j__namespace.homedir(),"AppData","Roaming");return rt__namespace.join(s,Ae,ve)}let t=ye(),e=process.env.XDG_CONFIG_HOME||rt__namespace.join(t.home,".config");return rt__namespace.join(e,Ae,ve)}function Ue(){try{let t=___namespace.readFileSync(ke(),"utf8");return JSON.parse(t)}catch{return {}}}function X(){let{baseUrl:t}=Ue();return typeof t!="string"||t.trim()===""?null:t.trim().replace(/\/$/,"")}function Pe(t){let e=ke();___namespace.mkdirSync(rt__namespace.dirname(e),{recursive:true});let r={...Ue(),baseUrl:t};___namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
27
+ `,{encoding:"utf8",mode:384});}var Ae,ve,Zt=f(()=>{"use strict";Nt();Ae="flow-ai-obs",ve="config.json";});function Qt(){return X()??process.env.FLOW_BASE_URL??rr}function te(){let t=Qt();return {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 Et(){let t=Qt();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function se(){let t=Qt();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var rr,nr,ee,q,E,Ie,Ne,v,Ce,P,w=f(()=>{"use strict";Zt();rr="https://flow.ciandt.com";nr=te(),ee={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};q={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:nr.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},E={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",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL"},Ie={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3},Ne={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15},v={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},Ce="flow-ai-obs-debug.log",P={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};});function $e(t){try{let e=___namespace.statSync(t);Date.now()-e.mtimeMs>or&&___namespace.unlinkSync(t);}catch{}try{___namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function Fe(t){try{___namespace.unlinkSync(t);}catch{}}function ir(t,e){let r=(Array.isArray(t)?t:[]).map(n=>{if(!Array.isArray(n?.hooks))return null;let o=n.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...n,hooks:o}:null}).filter(n=>n!=null);return [e,...r]}function xe(){let t=Y(),e=t+".lock",s=[];___namespace.mkdirSync(rt__namespace.dirname(t),{recursive:true}),$e(e);try{if(___namespace.existsSync(t)){___namespace.copyFileSync(t,t+".bkp");try{___namespace.chmodSync(t+".bkp",384);}catch{}}let r={};if(___namespace.existsSync(t)){try{r=JSON.parse(___namespace.readFileSync(t,"utf8"));}catch{}"otelHeadersHelper"in r&&delete r.otelHeadersHelper;}let n=r.env&&typeof r.env=="object"?r.env:{};r.env={...q,...Et(),...n},(!r.hooks||typeof r.hooks!="object"||Array.isArray(r.hooks))&&(r.hooks={});let o=(p,a)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${p}`,timeout:a}]}),i=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],l=r.hooks;for(let p of i){let a=ir(l[p],o(p,Ne[p]));a.length>1&&s.push(p),l[p]=a;}___namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
28
+ `,{encoding:"utf8",mode:384});try{___namespace.chmodSync(t,384);}catch{}}finally{Fe(e);}return {settingsPath:t,preserved:s}}function ot(t){let e=Y(),s=e+".lock";___namespace.mkdirSync(rt__namespace.dirname(e),{recursive:true}),$e(s);try{let r={};try{r=JSON.parse(___namespace.readFileSync(e,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,t),___namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
29
+ `,{encoding:"utf8",mode:384});try{___namespace.chmodSync(e,384);}catch{}}finally{Fe(s);}}var or,Ct=f(()=>{"use strict";w();Nt();or=Ie.LOCK_STALE_MS;});function c(...t){if(process.env[E.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
30
+ `;try{_.writeFileSync(ur,e,{flag:"a"});}catch(s){process.stderr.write(`[flow-obs debug ERROR] ${s.message}
31
+ `);}}var ur,I=f(()=>{"use strict";w();ur=rt.join(j.tmpdir(),Ce);});function dr(t){return pr.some(e=>e.test(t))}function V(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let s=process.env[E.FLOW_OBS_ALLOW_HTTP]==="true";if(!s&&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(!s&&dr(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}function fr(t){if(!t||!t.trim())return [];let e=[];for(let s of t.split(",")){let r=s.indexOf("=");if(r===-1)continue;let n=s.slice(0,r).trim(),o=s.slice(r+1).trim();n&&e.push([n,o]);}return e}function mr(t,e,s){let r=Buffer.from(`${e}:${s}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",headers:[["Authorization",`Basic ${r}`]]}}async function _t(){let t=[],e=process.env[E.ANTHROPIC_MODEL]??"",s=process.env.OTEL_EXPORTER_OTLP_HEADERS??"",r=fr(s);s.trim()?c("resolveCredentials",`parsed ${r.length} header(s) from OTEL_EXPORTER_OTLP_HEADERS`):(c("resolveCredentials","OTEL_EXPORTER_OTLP_HEADERS not set \u2014 no extra headers will be forwarded"),console.warn("[flow-ai-obs] OTEL_EXPORTER_OTLP_HEADERS is not set. No extra headers will be forwarded to the OTLP gateway."));let n=process.env[E.FLOW_TELEMETRY]==="true",o=process.env[E.LANGFUSE_BASE_URL],i=process.env[E.LANGFUSE_PUBLIC_KEY],l=process.env[E.LANGFUSE_SECRET_KEY];if(n&&o&&i&&l){let{endpoint:d,headers:h}=mr(V(o),i,l);return t.push({mode:"direct",endpoint:d,headers:h,user:"",tenant:"",team:"",project:"",model:e}),c("resolveCredentials","direct mode active",`endpoint=${d}`),t}let p=process.env[E.FLOW_TELEMETRY_GATEWAY];if(p)return t.push({mode:"gateway",endpoint:V(p).replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",headers:r,user:"",tenant:"",team:"",project:"",model:e}),c("resolveCredentials","gateway mode active via FLOW_TELEMETRY_GATEWAY_URL"),t;let a=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;return a?(t.push({mode:"otel",endpoint:V(a),headers:r,user:"",tenant:"",team:"",project:"",model:e}),c("resolveCredentials","otel mode active",`endpoint=${a}`),t):(c("resolveCredentials","no destination configured \u2014 returning empty"),t)}async function ne(){return (await _t()).length>0}function x(){let t=process.env[E.FLOW_USER_EMAIL];if(t)return c("resolveUserEmail",`using FLOW_USER_EMAIL override: ${t}`),t;try{let e=j__namespace.userInfo().username||process.env.USERNAME||process.env.USER||"",s=e.lastIndexOf("\\");if(s!==-1&&(e=e.slice(s+1)),e=e.trim().replace(/[^a-zA-Z0-9._%+\-]/g,""),!e)return c("resolveUserEmail","username empty after sanitisation \u2014 omitting x-flow-user"),console.warn("[flow-ai-obs] Could not derive x-flow-user: username is empty. Set FLOW_USER_EMAIL to fix this."),null;let r=`${e}@ciandt.com`;return c("resolveUserEmail",`derived email: ${r}`),r}catch(e){return c("resolveUserEmail",`os.userInfo() threw: ${e.message} \u2014 omitting x-flow-user`),console.warn("[flow-ai-obs] Could not derive x-flow-user from OS username. Set FLOW_USER_EMAIL to fix this."),null}}var pr,J=f(()=>{"use strict";w();I();pr=[/^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 je={};ft(je,{runInit:()=>oe});function gr(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux")return child_process.spawnSync("cmd.exe",["/c","where","claude"],{encoding:"utf8",timeout:5e3}).status===0;let t=process.platform==="win32"?"where":"which";return child_process.spawnSync(t,["claude"],{encoding:"utf8",timeout:5e3}).status===0}function We(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}if(e.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);let s=process.env[E.FLOW_OBS_ALLOW_HTTP];try{delete process.env[E.FLOW_OBS_ALLOW_HTTP],V(t);}finally{s!==void 0&&(process.env[E.FLOW_OBS_ALLOW_HTTP]=s);}if(e.pathname!=="/"&&e.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
32
32
  Received: ${t}
33
33
  Expected: https://tenant.example.com`);if(e.search)throw new Error(`Custom URL must not contain query parameters.
34
34
  Received: ${t}
@@ -41,14 +41,15 @@
41
41
  `)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}async function Er(t){let e=x(),s=e??"(could not be derived)";if(!t||!st()){process.stdout.write(S(` x-flow-user: ${s}
42
42
  `)+(e?S(` To use a different email, set FLOW_USER_EMAIL in ~/.claude/settings.json env block.
43
43
  `):y(` Could not derive your email. Set FLOW_USER_EMAIL before running hooks.
44
- `)));return}if(process.stdout.write(`
45
- x-flow-user email that will be sent with every trace:
46
- `),process.stdout.write(` ${F(s)}
47
- `),e){if(!await kt(" Is this correct?",true)){let n=await Ut(" Enter your email",o=>o.includes("@")?null:"Email must contain @");ot({[E.FLOW_USER_EMAIL]:n}),process.stdout.write($(` \u2713 Email saved: ${n}
48
- `));}}else {process.stdout.write(y(` \u26A0 Could not derive email from OS username.
49
- `));let r=await Ut(" Enter your email",n=>n.includes("@")?null:"Email must contain @");ot({[E.FLOW_USER_EMAIL]:r}),process.stdout.write($(` \u2713 Email saved: ${r}
50
- `));}process.stdout.write(`
51
- `);}async function oe(t={}){let e=t.url;if(!gr()){let a=Be[process.platform]||Be.linux;return process.stderr.write(`
44
+ `)));return}if(!e){process.stdout.write(y(`
45
+ \u26A0 Could not derive email from OS username.
46
+ `));let n=await Ut(" Enter your corporate email",o=>o.includes("@")?null:"Email must contain @");ot({[E.FLOW_USER_EMAIL]:n}),process.stdout.write(U(` \u2713 Email saved: ${n}
47
+
48
+ `));return}if(await kt(" Is your corporate email @ciandt.com?",true))process.stdout.write(U(` \u2713 Email: ${F(s)}
49
+
50
+ `));else {let n=await Ut(" Enter your corporate email",o=>o.includes("@")?null:"Email must contain @");ot({[E.FLOW_USER_EMAIL]:n}),process.stdout.write(U(` \u2713 Email saved: ${n}
51
+
52
+ `));}}async function oe(t={}){let e=t.url;if(!gr()){let a=Be[process.platform]||Be.linux;return process.stderr.write(`
52
53
  `+vt(` \u2717 Claude Code is not installed or not found in PATH.
53
54
 
54
55
  `)+` flow-ai-obs requires Claude Code to function.
@@ -64,21 +65,21 @@
64
65
  Current base URL: ${F(a)}
65
66
  `),await kt(" Keep this URL?",!0)||(e=await He())):(process.stdout.write(`
66
67
  `),await kt(" Does your organization use a custom Flow URL?",!1)&&(e=await He()));}catch{return 1}process.stdout.write(`
67
- `);}if(!e&&!t.noInteractive&&!st()){let a=X(),d=process.env.FLOW_BASE_URL,_=a??d??"https://flow.ciandt.com",O=!!(a??d);process.stdout.write(y(` \u26A0 Non-interactive environment detected.
68
- `)+S(` Using URL: ${_}
68
+ `);}if(!e&&!t.noInteractive&&!st()){let a=X(),d=process.env.FLOW_BASE_URL,h=a??d??"https://flow.ciandt.com",O=!!(a??d);process.stdout.write(y(` \u26A0 Non-interactive environment detected.
69
+ `)+S(` Using URL: ${h}
69
70
  `)+(O?"":S(` Run with --custom-url to configure a custom domain.
70
71
  `))+`
71
- `);}let s=null,r=null;if(e){let a;try{a=We(e);}catch(_){return process.stderr.write(`
72
- \u2717 Invalid --custom-url: ${_.message}
72
+ `);}let s=null,r=null;if(e){let a;try{a=We(e);}catch(h){return process.stderr.write(`
73
+ \u2717 Invalid --custom-url: ${h.message}
73
74
 
74
- `),1}let d=X();try{Pe(a);}catch(_){return process.stderr.write(`
75
- \u2717 Failed to persist custom URL: ${_.message}
75
+ `),1}let d=X();try{Pe(a);}catch(h){return process.stderr.write(`
76
+ \u2717 Failed to persist custom URL: ${h.message}
76
77
 
77
78
  `),1}s=a,r={OTEL_EXPORTER_OTLP_ENDPOINT:`${a}/otel`,ANTHROPIC_BASE_URL:`${a}/flow-llm-proxy/`},d&&d!==a?process.stdout.write(y(` \u26A0 Base URL updated.
78
79
  `)+S(` Previous: ${d}
79
80
  `)+S(` New: ${a}
80
81
 
81
- `)):process.stdout.write($(` \u2713 Base URL configured: ${a}
82
+ `)):process.stdout.write(U(` \u2713 Base URL configured: ${a}
82
83
 
83
84
  `));}await Er(!t.noInteractive);let n,o;try{(({settingsPath:n,preserved:o}=xe())),r&&ot(r);}catch(a){return process.stderr.write(` \u2717 Failed to write settings: ${a.message}
84
85
  `),1}process.stdout.write(`
@@ -96,14 +97,14 @@
96
97
  `))),process.stdout.write(`
97
98
  `),process.stdout.write(S(" Settings: ")+n+`
98
99
  `),process.stdout.write(S(" Backup: ")+n+`.bkp
99
- `);let u=s??X()??process.env.FLOW_BASE_URL??"https://flow.ciandt.com";process.stdout.write(S(" Base URL: ")+u+`
100
+ `);let l=s??X()??process.env.FLOW_BASE_URL??"https://flow.ciandt.com";process.stdout.write(S(" Base URL: ")+l+`
100
101
  `),process.stdout.write(`
101
- `),process.stdout.write($(` \u2713 Ready. Native OTEL + Langfuse trace capture active.
102
+ `),process.stdout.write(U(` \u2713 Ready. Native OTEL + Langfuse trace capture active.
102
103
  `)),process.stdout.write(S(" Run `flow-ai-obs setup` to also configure the Flow LLM Proxy.\n\n"));let p=Re();return p&&process.stdout.write(y(` \u26A0 ${p}
103
104
 
104
105
  `)),0}var Be,ie=f(()=>{"use strict";Ct();w();mt();Nt();Zt();J();Xt();Be={darwin:`npm install -g @anthropic-ai/claude-code
105
106
  or visit: https://claude.ai/download`,linux:"npm install -g @anthropic-ai/claude-code",win32:`npm install -g @anthropic-ai/claude-code
106
- or visit: https://claude.ai/download`};});var Ye={};ft(Ye,{runSetup:()=>hr});async function hr(){process.stdout.write(`
107
+ or visit: https://claude.ai/download`};});var Ye={};ft(Ye,{runSetup:()=>_r});async function _r(){process.stdout.write(`
107
108
  \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
108
109
  `),process.stdout.write(`\u2551 flow-ai-obs \u2014 setup \u2551
109
110
  `),process.stdout.write(`\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
@@ -112,39 +113,39 @@
112
113
  `);}process.stdout.write(F(" Flow LLM Proxy configured")+` (model provider)
113
114
  `);for(let[e,s]of Object.entries(Et()))process.stdout.write(S(` ${e.padEnd(36)}`)+s+`
114
115
  `);return process.stdout.write(`
115
- `),process.env.OTEL_EXPORTER_OTLP_HEADERS?process.stdout.write($(` \u2713 OTEL_EXPORTER_OTLP_HEADERS is configured.
116
+ `),process.env.OTEL_EXPORTER_OTLP_HEADERS?process.stdout.write(U(` \u2713 OTEL_EXPORTER_OTLP_HEADERS is configured.
116
117
 
117
118
  `)):process.stdout.write(y(` \u26A0 OTEL_EXPORTER_OTLP_HEADERS is not set.
118
119
  Set it with your API key to authenticate traces:
119
120
  export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic <base64>"
120
121
 
121
- `)),process.stdout.write($(` \u2713 Setup complete!
122
+ `)),process.stdout.write(U(` \u2713 Setup complete!
122
123
  `)),process.stdout.write(S(` Settings: ${Y()}
123
124
 
124
- `)),0}var Ge=f(()=>{"use strict";w();mt();ie();Ct();});var Ve={};ft(Ve,{runCheck:()=>_r});function $t(t){process.stdout.write(` \u2713 ${t}
125
+ `)),0}var Ge=f(()=>{"use strict";w();mt();ie();Ct();});var Ve={};ft(Ve,{runCheck:()=>hr});function $t(t){process.stdout.write(` \u2713 ${t}
125
126
  `);}function Xe(t){process.stdout.write(` \u26A0 ${t}
126
127
  `);}function ae(t){process.stdout.write(` \u2717 ${t}
127
128
  `);}function it(t){process.stdout.write(` ${t}
128
129
  `);}function z(){process.stdout.write(`
129
- `);}async function _r(){z(),process.stdout.write(` flow-claude-observability \u2014 configuration check
130
+ `);}async function hr(){z(),process.stdout.write(` flow-claude-observability \u2014 configuration check
130
131
  `),z(),process.stdout.write(` Auth
131
132
  `);let t=process.env.OTEL_EXPORTER_OTLP_HEADERS??"";t.trim()?($t("OTEL_EXPORTER_OTLP_HEADERS is set"),it(`Headers: ${t.slice(0,60)}${t.length>60?"\u2026":""}`)):Xe("OTEL_EXPORTER_OTLP_HEADERS is not set \u2014 traces will be sent without extra auth headers");let e=x();e?$t(`x-flow-user: ${e}`):ae("x-flow-user could not be derived \u2014 set FLOW_USER_EMAIL to fix this"),z(),process.stdout.write(` Native OTEL
132
- `);let s={};try{let o=h__namespace.readFileSync(Y(),"utf8");s=JSON.parse(o).env||{};}catch{}let r=Object.keys(q).filter(o=>!s[o]);r.length===0?($t("All OTEL env vars present in settings.json"),it(`Endpoint: ${s.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(Xe(`${r.length} OTEL var(s) missing from settings.json \u2014 native metrics/logs disabled`),r.forEach(o=>ae(`Missing: ${o}`)),it("Run: flow-ai-obs init (restores missing vars automatically)")),z(),process.stdout.write(` Tracing
133
- `);let n=await ht();if(!n||n.length===0)return ae("No active destinations \u2014 no traces will be sent"),it("Set OTEL_EXPORTER_OTLP_ENDPOINT or FLOW_TELEMETRY_GATEWAY_URL"),z(),1;for(let o of n)$t(`Mode: ${o.mode}`),it(`Endpoint: ${o.endpoint}`),it(`Headers: ${o.headers.map(([i])=>i).join(", ")||"(none)"}`);return z(),process.stdout.write(` All checks passed \u2014 observability is active.
134
- `),z(),0}var Je=f(()=>{"use strict";J();Ct();w();});function I(t,e){let s=typeof t=="object"?JSON.stringify(t):String(t??"");return s.length>e?s.slice(0,e)+" \u2026[truncated]":s}function Ft(t,e=100){return String(t??"").split(`
135
- `)[0].slice(0,e).trim()}function ce(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",s=>{e+=s;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function b(t){process.stdout.write(JSON.stringify(t));}var at=f(()=>{"use strict";});function D(){return String(BigInt(Date.now())*1000000n)}var le,K,_t=f(()=>{"use strict";le=()=>crypto.randomBytes(16).toString("hex"),K=()=>crypto.randomBytes(8).toString("hex");});function kr(t,e){let s=rt.resolve(t);if(!s.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return s}function ue(t){if(!vr.test(t))throw new Error(`Invalid session ID: ${t}`);return kr(rt.join(j.tmpdir(),`flow-obs-${t}.json`),br)}function ct(t){let e=ue(t);if(!h.existsSync(e))return null;try{return JSON.parse(h.readFileSync(e,"utf8"))}catch{return null}}function lt(t,e){h.writeFileSync(ue(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function pe(t){try{h.unlinkSync(ue(t));}catch{}}var vr,br,St=f(()=>{"use strict";vr=/^[0-9a-f-]{1,64}$/i,br=rt.normalize(j.tmpdir())+rt.sep;});function ts(t){if(!t||!h.existsSync(t))return null;try{let e=h.readFileSync(t,"utf8").trimEnd().split(`
136
- `);for(let s=e.length-1;s>=0;s--)try{let r=JSON.parse(e[s]);if(r.type==="user"&&r.uuid)return r.uuid}catch{}}catch{}return null}function de(t){if(!t||!h.existsSync(t))return null;try{let e=h.readFileSync(t,"utf8").trimEnd().split(`
133
+ `);let s={};try{let o=___namespace.readFileSync(Y(),"utf8");s=JSON.parse(o).env||{};}catch{}let r=Object.keys(q).filter(o=>!s[o]);r.length===0?($t("All OTEL env vars present in settings.json"),it(`Endpoint: ${s.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(Xe(`${r.length} OTEL var(s) missing from settings.json \u2014 native metrics/logs disabled`),r.forEach(o=>ae(`Missing: ${o}`)),it("Run: flow-ai-obs init (restores missing vars automatically)")),z(),process.stdout.write(` Tracing
134
+ `);let n=await _t();if(!n||n.length===0)return ae("No active destinations \u2014 no traces will be sent"),it("Set OTEL_EXPORTER_OTLP_ENDPOINT or FLOW_TELEMETRY_GATEWAY_URL"),z(),1;for(let o of n)$t(`Mode: ${o.mode}`),it(`Endpoint: ${o.endpoint}`),it(`Headers: ${o.headers.map(([i])=>i).join(", ")||"(none)"}`);return z(),process.stdout.write(` All checks passed \u2014 observability is active.
135
+ `),z(),0}var Je=f(()=>{"use strict";J();Ct();w();});function N(t,e){let s=typeof t=="object"?JSON.stringify(t):String(t??"");return s.length>e?s.slice(0,e)+" \u2026[truncated]":s}function Ft(t,e=100){return String(t??"").split(`
136
+ `)[0].slice(0,e).trim()}function ce(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",s=>{e+=s;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function b(t){process.stdout.write(JSON.stringify(t));}var at=f(()=>{"use strict";});function D(){return String(BigInt(Date.now())*1000000n)}var le,K,ht=f(()=>{"use strict";le=()=>crypto.randomBytes(16).toString("hex"),K=()=>crypto.randomBytes(8).toString("hex");});function kr(t,e){let s=rt.resolve(t);if(!s.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return s}function ue(t){if(!vr.test(t))throw new Error(`Invalid session ID: ${t}`);return kr(rt.join(j.tmpdir(),`flow-obs-${t}.json`),br)}function ct(t){let e=ue(t);if(!_.existsSync(e))return null;try{return JSON.parse(_.readFileSync(e,"utf8"))}catch{return null}}function lt(t,e){_.writeFileSync(ue(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function pe(t){try{_.unlinkSync(ue(t));}catch{}}var vr,br,St=f(()=>{"use strict";vr=/^[0-9a-f-]{1,64}$/i,br=rt.normalize(j.tmpdir())+rt.sep;});function ts(t){if(!t||!_.existsSync(t))return null;try{let e=_.readFileSync(t,"utf8").trimEnd().split(`
137
+ `);for(let s=e.length-1;s>=0;s--)try{let r=JSON.parse(e[s]);if(r.type==="user"&&r.uuid)return r.uuid}catch{}}catch{}return null}function de(t){if(!t||!_.existsSync(t))return null;try{let e=_.readFileSync(t,"utf8").trimEnd().split(`
137
138
  `),s=[],r=0,n=0;for(let o=e.length-1;o>=0;o--)try{let i=JSON.parse(e[o]);if(i.type==="user")break;if(i.type==="assistant"){let p=(i.message?.content??[]).filter(d=>d.type==="text").map(d=>d.text??"").join("");p&&s.unshift(p);let a=i.message?.usage??{};r+=(a.input_tokens??0)+(a.cache_read_input_tokens??0)+(a.cache_creation_input_tokens??0),n+=a.output_tokens??0;}}catch{}return !s.length&&r===0?null:{text:s.join(`
138
139
 
139
- `),inputTokens:r,outputTokens:n}}catch{}return null}var fe=f(()=>{"use strict";});function rs(t){return t.replace(":","/")}function xt(t,e){if(!t)return null;let s=rs(t),r=[rt.join(j.homedir(),".claude","skills",s,"SKILL.md"),rt.join(e??"",".claude","skills",s,"SKILL.md")];for(let n of r)if(h.existsSync(n))try{return h.readFileSync(n,"utf8")}catch{}return null}function ns(t){return t.split(`
140
- `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function os(t){return !!t.slashSkill||t.toolCalls.some(r=>r.tool==="Skill")?t.toolCalls.some(r=>r.tool==="Skill"&&!r.synthetic||Fr.has(r.tool))?"complete":"prerequisite_required":null}function Dt(t,e){if(!t)return null;let s=rs(t),r=[rt.join(j.homedir(),".claude","skills",s),rt.join(e??"",".claude","skills",s)],n=null;for(let u of r)if(h.existsSync(rt.join(u,"SKILL.md"))){n=u;break}if(!n)return null;let o=[];function i(u,p){for(let a of h.readdirSync(u,{withFileTypes:true})){if(Nr.has(a.name)||$r.has(a.name)||Cr.has(rt.extname(a.name)))continue;let d=p?`${p}/${a.name}`:a.name;a.isDirectory()?i(rt.join(u,a.name),d):o.push(d);}}return i(n,""),o.length>0?o:null}var Nr,Cr,$r,Fr,Mt=f(()=>{"use strict";Nr=new Set([".venv","__pycache__",".git","node_modules"]),Cr=new Set([".pyc",".pyo"]),$r=new Set(["SKILL.md",".DS_Store",".gitignore"]);Fr=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function Mr(t,e){return new Promise(s=>{let r=new URL(t),n=r.protocol==="https:",o=(n?qs__default.default:Dr__default.default).request({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname+r.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e)}},i=>{i.resume(),s(i.statusCode??0);});o.on("error",()=>s(0)),o.setTimeout(5e3,()=>{o.destroy(),s(0);}),o.write(e),o.end();})}async function Z(t,e={}){try{let s=JSON.stringify({action:t,booster:se().BOOSTER,metadata:e,success:!0,timestamp:new Date().toISOString(),os:process.platform,user:{email:process.env[E.FLOW_USER_EMAIL]||"",id:"",name:""}}),r=V(se().API_URL),n=await Mr(r,s);c("metrics.logEvent",`action=${t} status=${n}`);}catch(s){c("metrics.logEvent",`silenced error: ${s.message}`);}}var Bt=f(()=>{"use strict";w();J();P();});async function is(t){let e=t.cwd||"",s=t.session_id||"unknown",r=t.prompt||"",n=ts(t.transcript_path)||le(),o=ns(r),i=o?xt(o,e):null,u=o?Dt(o,e):null;lt(s,{traceId:le(),spanId:K(),startNs:D(),sessionId:s,prompt:r,cwd:e,traceName:n,transcriptPath:t.transcript_path||"",model:process.env[E.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:o,skillContent:i,skillArtifacts:u}),Z("SESSION_STARTED",{traceType:o?"skill":"prompt",slashSkill:o}),c("UserPromptSubmit",`sid=${s}`,`traceName=${n}`,`slashSkill=${o}`),b(t);}var as=f(()=>{"use strict";_t();St();fe();Mt();at();P();w();Bt();});async function cs(t){let e=t.session_id||"unknown",s=t.tool_name||"unknown",r=t.tool_input||{},n=ct(e);n&&(n.pendingTool={name:s,inputStr:I(r,U.TOOL_INPUT),startNs:D()},lt(e,n)),c("PreToolUse",`sid=${e}`,`tool=${s}`,`stateFound=${!!n}`),b(t);}var ls=f(()=>{"use strict";_t();St();at();P();w();});function l(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function Q(...t){return t.filter(e=>e!==null)}function us(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Br,spans:Array.isArray(e)?e:[e]}]}]}}var Br,g,ps=f(()=>{"use strict";w();Br={name:ee.SCOPE_NAME,version:ee.SCOPE_VERSION},g={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 fs(t,e,s,r,n){if(process.env[E.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(s)},response:{status:r,body:n}});try{h.writeFileSync(ds,o+`
141
- `,{flag:"a",encoding:"utf8",mode:384}),c("sendTraces:dump",`request appendada em ${ds}`);}catch(i){c("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Xr(t){let e=new URL(t),s=new URL(te().GATEWAY_HEALTH);return s.hostname=e.hostname,s.port=e.port,s.protocol=e.protocol,s}function ms(t,e){return new Promise((s,r)=>{let n=t._isSSL?qs__default.default:Dr__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=n.request(t,i=>{let u=[];i.on("data",p=>u.push(p)),i.on("end",()=>s({statusCode:i.statusCode??0,body:u.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>r(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}function gs(t){let e={};for(let[s,r]of t){let n=String(r).replace(/[\r\n]/g,""),o=e[s];o===void 0?e[s]=n:Array.isArray(o)?o.push(n):e[s]=[o,n];}return e}async function Es(t,e){let s;try{s=Xr(t);}catch{return false}let r=s.protocol==="https:";try{let n=gs(e??[]),o=await ms({hostname:s.hostname,port:s.port||(r?443:80),path:s.pathname,method:"GET",headers:n,_isSSL:r},null);return c("checkHealth",`url=${s.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function Ht(t,e,s){let r=JSON.stringify(t),n=new URL(e),o=n.protocol==="https:",i={...gs(s??[]),"Content-Type":"application/json","Content-Length":Buffer.byteLength(r)};c("sendTraces:request",`POST ${e}`),c("sendTraces:request",`headers=${JSON.stringify(Object.keys(i))}`),c("sendTraces:request",`body=${r.slice(0,500)}${r.length>500?"\u2026":""}`);try{let u=await ms({hostname:n.hostname,port:n.port||(o?443:80),path:n.pathname,method:"POST",headers:i,_isSSL:o},r);return c("sendTraces:response",`status=${u.statusCode}`),fs(e,i,r,u.statusCode,u.body),u.statusCode}catch(u){return c("sendTraces:error",u.message),fs(e,i,r,0,u.message),0}}var ds,hs=f(()=>{"use strict";w();P();ds=rt.join(j.tmpdir(),"flow-obs-requests.ndjson");});function qr(){let t=parseInt(process.env[E.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(v.MIN_TTL_DAYS,Math.min(v.MAX_TTL_DAYS,t)):v.DEFAULT_TTL_DAYS)*24*60*60*1e3}function Vr(){let t=parseInt(process.env[E.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(v.MIN_MAX_FILES,Math.min(v.MAX_MAX_FILES,t)):v.DEFAULT_MAX_FILES}function Ss(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return rt__namespace.default.join(j__namespace.default.tmpdir(),`${v.FILE_PREFIX}${t}.json`)}function ge(){let t=j__namespace.default.tmpdir(),e;try{e=h__namespace.default.readdirSync(t);}catch{return []}return e.filter(s=>s.startsWith(v.FILE_PREFIX)&&s.endsWith(".json")).map(s=>{let r=rt__namespace.default.join(t,s),n=0;try{n=h__namespace.default.statSync(r).mtimeMs;}catch{}return {full:r,mtime:n}}).sort((s,r)=>s.mtime-r.mtime).map(s=>s.full)}function Wt(t){try{let e=Vr(),s=ge();if(s.length>=e){let o=s.slice(0,s.length-e+1);for(let i of o)try{h__namespace.default.unlinkSync(i);}catch{}}let r=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,n={fileId:r,bufferedAt:Date.now(),payload:t};return h__namespace.default.writeFileSync(Ss(r),JSON.stringify(n),{encoding:"utf8",mode:384}),c("buffer",`saved fileId=${r}`),r}catch(e){return c("buffer",`saveToBuffer failed: ${e.message}`),null}}function Ts(t){let e=ge(),s=t!=null&&t>0?t:e.length,r=[];for(let n of e){if(r.length>=s)break;try{let o=h__namespace.default.readFileSync(n,"utf8"),i=JSON.parse(o);i&&i.fileId&&i.payload&&r.push(i);}catch{c("buffer",`skipping malformed file: ${n}`);}}return r}function ws(t){try{h__namespace.default.unlinkSync(Ss(t)),c("buffer",`deleted fileId=${t}`);}catch{}}function Os(){let t=Date.now()-qr();for(let e of ge())try{let{mtimeMs:s}=h__namespace.default.statSync(e);s<t&&(h__namespace.default.unlinkSync(e),c("buffer",`evicted stale: ${rt__namespace.default.basename(e)}`));}catch{}}var Ls=f(()=>{"use strict";w();P();});async function Jr(t,e=[]){Os();let s=Ts(v.REPLAY_BATCH_SIZE);s.length&&(c("replayBufferedTraces",`replaying ${s.length} buffered trace(s)`),await Promise.allSettled(s.map(async r=>{try{let n=await Ht(r.payload,t.endpoint,[...t.headers,...e]);n>=200&&n<300?(ws(r.fileId),c("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):c("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){c("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function ys(t){let e=await ht();if(!e.length)return 0;let s=x(),n=(process.env.OTEL_EXPORTER_OTLP_HEADERS??"").split(",").some(a=>a.trim().toLowerCase().replace(/\s*=\s*/,"=").startsWith("x-flow-user=")),o=s&&!n?[["x-flow-user",s]]:[],i=await Promise.all(e.map(async a=>{if(a.mode!=="gateway")return {creds:a,healthy:true};let d=await Es(a.endpoint,[...a.headers,...o]);return {creds:a,healthy:d}})),u=i.find(a=>a.creds.mode==="gateway"&&a.healthy)?.creds??i.find(a=>a.creds.mode!=="gateway")?.creds;return u&&await Jr(u,o),(await Promise.all(i.map(async({creds:a,healthy:d})=>{if(a.mode==="gateway"){if(!d)return c("postToLangfuse","gateway health check failed \u2014 buffering trace"),Wt(t),0;let O=await Ht(t,a.endpoint,[...a.headers,...o]);return (O===0||O>=500)&&(c("postToLangfuse",`gateway send failed (status ${O}) \u2014 buffering trace`),Wt(t)),O}let _=await Ht(t,a.endpoint,[...a.headers,...o]);return (_===0||_>=500)&&(c("postToLangfuse",`endpoint unavailable (status ${_}) \u2014 buffering trace`),Wt(t)),_}))).find(a=>a!==0)??0}var Rs=f(()=>{"use strict";J();P();hs();Ls();w();});var Ee=f(()=>{"use strict";ps();Rs();});function B(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Qr.reduce((s,{re:r,replace:n})=>s.replace(r,n),e)}var R,zr,Kr,Zr,As,Qr,he=f(()=>{"use strict";R="[REDACTED]",zr="[REDACTED-EMAIL]",Kr="[REDACTED-CPF]",Zr="[REDACTED-CNPJ]",As="[REDACTED-PHONE]",Qr=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${R}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${R}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${R}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${R}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,s)=>`${e}
140
+ `),inputTokens:r,outputTokens:n}}catch{}return null}var fe=f(()=>{"use strict";});function rs(t){return t.replace(":","/")}function xt(t,e){if(!t)return null;let s=rs(t),r=[rt.join(j.homedir(),".claude","skills",s,"SKILL.md"),rt.join(e??"",".claude","skills",s,"SKILL.md")];for(let n of r)if(_.existsSync(n))try{return _.readFileSync(n,"utf8")}catch{}return null}function ns(t){return t.split(`
141
+ `)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function os(t){return !!t.slashSkill||t.toolCalls.some(r=>r.tool==="Skill")?t.toolCalls.some(r=>r.tool==="Skill"&&!r.synthetic||Fr.has(r.tool))?"complete":"prerequisite_required":null}function Dt(t,e){if(!t)return null;let s=rs(t),r=[rt.join(j.homedir(),".claude","skills",s),rt.join(e??"",".claude","skills",s)],n=null;for(let l of r)if(_.existsSync(rt.join(l,"SKILL.md"))){n=l;break}if(!n)return null;let o=[];function i(l,p){for(let a of _.readdirSync(l,{withFileTypes:true})){if(Nr.has(a.name)||$r.has(a.name)||Cr.has(rt.extname(a.name)))continue;let d=p?`${p}/${a.name}`:a.name;a.isDirectory()?i(rt.join(l,a.name),d):o.push(d);}}return i(n,""),o.length>0?o:null}var Nr,Cr,$r,Fr,Mt=f(()=>{"use strict";Nr=new Set([".venv","__pycache__",".git","node_modules"]),Cr=new Set([".pyc",".pyo"]),$r=new Set(["SKILL.md",".DS_Store",".gitignore"]);Fr=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function Mr(t,e){return new Promise(s=>{let r=new URL(t),n=r.protocol==="https:",o=(n?qs__default.default:Dr__default.default).request({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname+r.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(e)}},i=>{i.resume(),s(i.statusCode??0);});o.on("error",()=>s(0)),o.setTimeout(5e3,()=>{o.destroy(),s(0);}),o.write(e),o.end();})}async function Z(t,e={}){try{let s=JSON.stringify({action:t,booster:se().BOOSTER,metadata:e,success:!0,timestamp:new Date().toISOString(),os:process.platform,user:{email:process.env[E.FLOW_USER_EMAIL]||"",id:"",name:""}}),r=V(se().API_URL),n=await Mr(r,s);c("metrics.logEvent",`action=${t} status=${n}`);}catch(s){c("metrics.logEvent",`silenced error: ${s.message}`);}}var Bt=f(()=>{"use strict";w();J();I();});async function is(t){let e=t.cwd||"",s=t.session_id||"unknown",r=t.prompt||"",n=ts(t.transcript_path)||le(),o=ns(r),i=o?xt(o,e):null,l=o?Dt(o,e):null;lt(s,{traceId:le(),spanId:K(),startNs:D(),sessionId:s,prompt:r,cwd:e,traceName:n,transcriptPath:t.transcript_path||"",model:process.env[E.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:o,skillContent:i,skillArtifacts:l}),Z("SESSION_STARTED",{traceType:o?"skill":"prompt",slashSkill:o}),c("UserPromptSubmit",`sid=${s}`,`traceName=${n}`,`slashSkill=${o}`),b(t);}var as=f(()=>{"use strict";ht();St();fe();Mt();at();I();w();Bt();});async function cs(t){let e=t.session_id||"unknown",s=t.tool_name||"unknown",r=t.tool_input||{},n=ct(e);n&&(n.pendingTool={name:s,inputStr:N(r,P.TOOL_INPUT),startNs:D()},lt(e,n)),c("PreToolUse",`sid=${e}`,`tool=${s}`,`stateFound=${!!n}`),b(t);}var ls=f(()=>{"use strict";ht();St();at();I();w();});function u(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function Q(...t){return t.filter(e=>e!==null)}function us(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:Br,spans:Array.isArray(e)?e:[e]}]}]}}var Br,g,ps=f(()=>{"use strict";w();Br={name:ee.SCOPE_NAME,version:ee.SCOPE_VERSION},g={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 fs(t,e,s,r,n){if(process.env[E.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(s)},response:{status:r,body:n}});try{_.writeFileSync(ds,o+`
142
+ `,{flag:"a",encoding:"utf8",mode:384}),c("sendTraces:dump",`request appendada em ${ds}`);}catch(i){c("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Xr(t){let e=new URL(t),s=new URL(te().GATEWAY_HEALTH);return s.hostname=e.hostname,s.port=e.port,s.protocol=e.protocol,s}function ms(t,e){return new Promise((s,r)=>{let n=t._isSSL?qs__default.default:Dr__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=n.request(t,i=>{let l=[];i.on("data",p=>l.push(p)),i.on("end",()=>s({statusCode:i.statusCode??0,body:l.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>r(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}function gs(t){let e={};for(let[s,r]of t){let n=String(r).replace(/[\r\n]/g,""),o=e[s];o===void 0?e[s]=n:Array.isArray(o)?o.push(n):e[s]=[o,n];}return e}async function Es(t,e){let s;try{s=Xr(t);}catch{return false}let r=s.protocol==="https:";try{let n=gs(e??[]),o=await ms({hostname:s.hostname,port:s.port||(r?443:80),path:s.pathname,method:"GET",headers:n,_isSSL:r},null);return c("checkHealth",`url=${s.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function Ht(t,e,s){let r=JSON.stringify(t),n=new URL(e),o=n.protocol==="https:",i={...gs(s??[]),"Content-Type":"application/json","Content-Length":Buffer.byteLength(r)};c("sendTraces:request",`POST ${e}`),c("sendTraces:request",`headers=${JSON.stringify(Object.keys(i))}`),c("sendTraces:request",`body=${r.slice(0,500)}${r.length>500?"\u2026":""}`);try{let l=await ms({hostname:n.hostname,port:n.port||(o?443:80),path:n.pathname,method:"POST",headers:i,_isSSL:o},r);return c("sendTraces:response",`status=${l.statusCode}`),fs(e,i,r,l.statusCode,l.body),l.statusCode}catch(l){return c("sendTraces:error",l.message),fs(e,i,r,0,l.message),0}}var ds,_s=f(()=>{"use strict";w();I();ds=rt.join(j.tmpdir(),"flow-obs-requests.ndjson");});function qr(){let t=parseInt(process.env[E.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(v.MIN_TTL_DAYS,Math.min(v.MAX_TTL_DAYS,t)):v.DEFAULT_TTL_DAYS)*24*60*60*1e3}function Vr(){let t=parseInt(process.env[E.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(v.MIN_MAX_FILES,Math.min(v.MAX_MAX_FILES,t)):v.DEFAULT_MAX_FILES}function Ss(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return rt__namespace.default.join(j__namespace.default.tmpdir(),`${v.FILE_PREFIX}${t}.json`)}function ge(){let t=j__namespace.default.tmpdir(),e;try{e=___namespace.default.readdirSync(t);}catch{return []}return e.filter(s=>s.startsWith(v.FILE_PREFIX)&&s.endsWith(".json")).map(s=>{let r=rt__namespace.default.join(t,s),n=0;try{n=___namespace.default.statSync(r).mtimeMs;}catch{}return {full:r,mtime:n}}).sort((s,r)=>s.mtime-r.mtime).map(s=>s.full)}function Wt(t){try{let e=Vr(),s=ge();if(s.length>=e){let o=s.slice(0,s.length-e+1);for(let i of o)try{___namespace.default.unlinkSync(i);}catch{}}let r=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,n={fileId:r,bufferedAt:Date.now(),payload:t};return ___namespace.default.writeFileSync(Ss(r),JSON.stringify(n),{encoding:"utf8",mode:384}),c("buffer",`saved fileId=${r}`),r}catch(e){return c("buffer",`saveToBuffer failed: ${e.message}`),null}}function Ts(t){let e=ge(),s=t!=null&&t>0?t:e.length,r=[];for(let n of e){if(r.length>=s)break;try{let o=___namespace.default.readFileSync(n,"utf8"),i=JSON.parse(o);i&&i.fileId&&i.payload&&r.push(i);}catch{c("buffer",`skipping malformed file: ${n}`);}}return r}function ws(t){try{___namespace.default.unlinkSync(Ss(t)),c("buffer",`deleted fileId=${t}`);}catch{}}function Os(){let t=Date.now()-qr();for(let e of ge())try{let{mtimeMs:s}=___namespace.default.statSync(e);s<t&&(___namespace.default.unlinkSync(e),c("buffer",`evicted stale: ${rt__namespace.default.basename(e)}`));}catch{}}var Ls=f(()=>{"use strict";w();I();});async function Jr(t,e=[]){Os();let s=Ts(v.REPLAY_BATCH_SIZE);s.length&&(c("replayBufferedTraces",`replaying ${s.length} buffered trace(s)`),await Promise.allSettled(s.map(async r=>{try{let n=await Ht(r.payload,t.endpoint,[...t.headers,...e]);n>=200&&n<300?(ws(r.fileId),c("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):c("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){c("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function ys(t){let e=await _t();if(!e.length)return 0;let s=x(),n=(process.env.OTEL_EXPORTER_OTLP_HEADERS??"").split(",").some(a=>a.trim().toLowerCase().replace(/\s*=\s*/,"=").startsWith("x-flow-user=")),o=s&&!n?[["x-flow-user",s]]:[],i=await Promise.all(e.map(async a=>{if(a.mode!=="gateway")return {creds:a,healthy:true};let d=await Es(a.endpoint,[...a.headers,...o]);return {creds:a,healthy:d}})),l=i.find(a=>a.creds.mode==="gateway"&&a.healthy)?.creds??i.find(a=>a.creds.mode!=="gateway")?.creds;return l&&await Jr(l,o),(await Promise.all(i.map(async({creds:a,healthy:d})=>{if(a.mode==="gateway"){if(!d)return c("postToLangfuse","gateway health check failed \u2014 buffering trace"),Wt(t),0;let O=await Ht(t,a.endpoint,[...a.headers,...o]);return (O===0||O>=500)&&(c("postToLangfuse",`gateway send failed (status ${O}) \u2014 buffering trace`),Wt(t)),O}let h=await Ht(t,a.endpoint,[...a.headers,...o]);return (h===0||h>=500)&&(c("postToLangfuse",`endpoint unavailable (status ${h}) \u2014 buffering trace`),Wt(t)),h}))).find(a=>a!==0)??0}var Rs=f(()=>{"use strict";J();I();_s();Ls();w();});var Ee=f(()=>{"use strict";ps();Rs();});function B(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Qr.reduce((s,{re:r,replace:n})=>s.replace(r,n),e)}var R,zr,Kr,Zr,As,Qr,_e=f(()=>{"use strict";R="[REDACTED]",zr="[REDACTED-EMAIL]",Kr="[REDACTED-CPF]",Zr="[REDACTED-CNPJ]",As="[REDACTED-PHONE]",Qr=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${R}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${R}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${R}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${R}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,s)=>`${e}
142
143
  ${R}
143
- ${s}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${R}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${R}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${R}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${R}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${R}`},{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,s)=>`${e}${s}${R}${s}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${R}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>zr},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Kr},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Zr},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>As},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>As}];});async function vs(t){let e=t.session_id||"unknown",s=t.tool_name||"unknown",r=t.tool_input||{},n=t.tool_response,o=n!==null&&typeof n=="object"?n.output??JSON.stringify(n):n??"",i=ct(e);if(!i){b(t);return}let u=D(),p=i.pendingTool,a=p?.name===s,d=a?p.startNs:String(BigInt(u)-200000000n),_=a?p.inputStr:I(r,U.TOOL_INPUT),O=_,T=null;if(s==="Skill"){let Rt=typeof r=="object"&&r!==null?r.skill||r.name||r.skillName||r.commandName||String(Object.values(r)[0]??""):String(r);T=Rt?String(Rt).trim():null;let H=T?xt(T,i.cwd):null;H&&(O=H,i.skillContent||(i.skillContent=H),i.skillArtifacts||(i.skillArtifacts=Dt(T,i.cwd))),T&&!i.slashSkill&&(i.slashSkill=T),c("PostToolUse","Skill tool detected",`skillName=${T}`,`contentFound=${!!H}`);}let k=B(I(o,U.TOOL_OUTPUT)),L=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(k.slice(0,500)),Tt=L?"ERROR":"DEFAULT",pt=K(),wt=Math.round(Number(BigInt(u)-BigInt(d))/1e6),Lt={Agent:"AGENT",Task:"AGENT"}[s]??"TOOL",yt=s==="Skill"&&T?T:Ft(_,60);i.toolCalls.push({tool:s,brief:yt,error:L,durationMs:wt});let dt=i.spans;dt.push({traceId:i.traceId,spanId:pt,parentSpanId:i.spanId,name:s,kind:3,startTimeUnixNano:d,endTimeUnixNano:u,attributes:Q(l(g.OBS_NAME,s),l(g.OBS_TYPE,Lt),l(g.OBS_LEVEL,Tt),l(g.OBS_INPUT,B(O)),l(g.OBS_OUTPUT,k),l("tool.name",s),l("tool.error",String(L)),s==="Skill"&&T?l("skill.name",T):null,s==="Skill"?l("skill.invocation","slash-command"):null),status:{code:L?2:1}}),i.pendingTool=null,lt(e,i),L&&Z("TOOL_ERROR",{toolName:s}),c("PostToolUse",`sid=${e}`,`tool=${s}`,`error=${L}`,`durationMs=${wt}`,`totalSpans=${dt.length}`),b(t);}var bs=f(()=>{"use strict";_t();St();Ee();at();Mt();P();w();he();Bt();});function Us(t,e,s){let r=Object.keys(ks).find(i=>(t??"").toLowerCase().includes(i));if(!r)return;let n=ks[r],o=(e*n.input+s*n.output)/1e6;return Math.round(o*1e6)/1e6}var ks,Ps=f(()=>{"use strict";ks={"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",s=t.stop_reason||"end_turn",r=ct(e);if(!r){b(t);return}r.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(r.slashSkill)&&(c("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${r.slashSkill}"`),r.slashSkill=null);let n=D(),o=x()??"",i=r.toolCalls,u=r.spans;if(r.slashSkill&&!i.some(m=>m.tool==="Skill")){let m=K(),W=r.skillContent?r.skillContent:JSON.stringify({skill:r.slashSkill});i.push({tool:"Skill",brief:r.slashSkill,error:false,durationMs:0,synthetic:true}),u.push({traceId:r.traceId,spanId:m,parentSpanId:r.spanId,name:"Skill",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:r.startNs,attributes:Q(l(g.OBS_NAME,"Skill"),l(g.OBS_TYPE,"TOOL"),l(g.OBS_LEVEL,"DEFAULT"),l(g.OBS_INPUT,W),l(g.OBS_OUTPUT,"loaded via slash command"),l("tool.name","Skill"),l("tool.error","false"),l("skill.name",r.slashSkill),l("skill.invocation","slash-command")),status:{code:1}}),c("Stop",`slashSkill=${r.slashSkill}`,"synthetic span injected");}let p=t.transcript_path||r.transcriptPath||"",a=de(p);if(p&&(i.some(m=>m.tool==="Skill"&&!m.synthetic)||!!r.slashSkill)&&!a?.text){await new Promise(W=>setTimeout(W,500));let m=de(p);m?.text&&(a=m);}c("Stop",`transcriptPath=${p||"(empty)"}`,`assistantOut=${a?`text=${a.text.length}chars`:"null"}`);let _=i.length,O=i.filter(m=>m.error).length,T=B(a?.text?I(a.text,U.TRACE_OUTPUT):_===0?"No tools used":i.map((m,W)=>`${W+1}. ${m.tool}${m.brief?` \u2192 ${m.brief}`:""}${m.error?" [ERROR]":""}`).join(`
144
- `)),k=a?.inputTokens??0,L=a?.outputTokens??0,Tt=i.map((m,W)=>`${W+1}. ${m.tool}${m.brief?` \u2192 ${m.brief}`:""}${m.error?" [ERROR]":""} (${m.durationMs}ms)`),pt=!!(r.slashSkill||i.some(m=>m.tool==="Skill")),wt=i.some(m=>m.tool==="Agent");if(!pt&&!wt){c("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),Z("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),pe(e),b(t);return}let Ot=pt?"skill":"agent",Lt=Math.round(Number(BigInt(n)-BigInt(r.startNs))/1e6),yt=Us(r.model,k,L),tt=os(r);tt==="prerequisite_required"&&a?.text&&(tt="complete"),tt==="prerequisite_required"&&(u.push({traceId:r.traceId,spanId:K(),parentSpanId:r.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:n,attributes:Q(l(g.OBS_NAME,"prerequisite-check"),l(g.OBS_TYPE,"EVENT"),l(g.OBS_LEVEL,"WARNING"),l(g.OBS_OUTPUT,T),l("skill.name",r.slashSkill||void 0),l("execution_status","prerequisite_required")),status:{code:1}}),c("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${r.slashSkill}`));let dt=(()=>{if(!(!pt||!r.prompt)){if(r.slashSkill){let m=r.prompt.replace(new RegExp(`^\\/${r.slashSkill}\\s*`,"i"),"").trim();return m?I(B(m),U.USER_INSTRUCTION):void 0}return I(B(r.prompt),U.USER_INSTRUCTION)||void 0}})(),Rt=JSON.stringify({trace_type:Ot,...tt!==null&&{execution_status:tt},...r.slashSkill?{skill_name:r.slashSkill}:{},...r.skillArtifacts?.length&&{skill_artifacts:r.skillArtifacts},...dt!==void 0&&{user_instruction:dt},latency_ms:Lt,...k&&{tokens_input:k},...L&&{tokens_output:L},cost_usd:yt,...r.model?{model:r.model}:{},toolCount:_,errorCount:O,stopReason:s,sessionId:r.sessionId,tools:Tt.length?Tt:void 0}),H=B(I(r.prompt,U.TRACE_INPUT)),$s=Q(l(g.TRACE_NAME,r.traceName),l(g.TRACE_INPUT,H),l(g.TRACE_OUTPUT,T),l(g.OBS_INPUT,H),l(g.OBS_OUTPUT,T),l(g.TRACE_METADATA,Rt),l(g.SESSION_ID,r.sessionId),l(g.USER_ID,o),l(g.OBS_TYPE,"GENERATION"),l(g.MODEL,r.model),k?l(g.INPUT_TOKENS,k):null,L?l(g.OUTPUT_TOKENS,L):null,l("claude.stop_reason",s),l("claude.tool_count",String(_)),l("claude.error_count",String(O)),l("claude.session_id",r.sessionId),l("flow.trace_type",Ot),{key:g.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Ot}]}}}),Fs={traceId:r.traceId,spanId:r.spanId,name:r.traceName,kind:1,startTimeUnixNano:r.startNs,endTimeUnixNano:n,attributes:$s,status:{code:O>0?2:1}},xs=Q(l("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),l("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),_e=[...u,Fs];c("Stop",`sid=${e}`,`totalTools=${_}`,`errorTools=${O}`,`spans=${_e.length}`,`inputTokens=${k}`,`outputTokens=${L}`,`traceOutput="${Ft(T,80)}"`);let Ds=await ys(us(xs,_e));c("Stop",`POST status=${Ds}`,`traceId=${r.traceId}`),Z("TRACE_SENT",{latencyMs:Lt,totalTools:_,errorTools:O,inputTokens:k,outputTokens:L,costUsd:yt}),pe(e),b(t);}var Ns=f(()=>{"use strict";_t();St();Ee();Ps();fe();at();P();Mt();he();w();Bt();J();});async function tn(){let t=process.argv[2];if(t==="UserPromptSubmit"){let s=await ce(),r=false;try{r=await ne();}catch{process.stdout.write(JSON.stringify(s));return}r?await is(s):process.stdout.write(JSON.stringify(s));return}if(!await ne()){let s=[];process.stdin.on("data",r=>s.push(r)),process.stdin.on("end",()=>process.stdout.write(s.join("")));return}let e=await ce();switch(t){case "PreToolUse":await cs(e);break;case "PostToolUse":await vs(e);break;case "Stop":await Is(e);break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
144
+ ${s}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${R}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${R}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${R}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${R}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${R}`},{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,s)=>`${e}${s}${R}${s}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${R}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>zr},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Kr},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Zr},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>As},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>As}];});async function vs(t){let e=t.session_id||"unknown",s=t.tool_name||"unknown",r=t.tool_input||{},n=t.tool_response,o=n!==null&&typeof n=="object"?n.output??JSON.stringify(n):n??"",i=ct(e);if(!i){b(t);return}let l=D(),p=i.pendingTool,a=p?.name===s,d=a?p.startNs:String(BigInt(l)-200000000n),h=a?p.inputStr:N(r,P.TOOL_INPUT),O=h,T=null;if(s==="Skill"){let Rt=typeof r=="object"&&r!==null?r.skill||r.name||r.skillName||r.commandName||String(Object.values(r)[0]??""):String(r);T=Rt?String(Rt).trim():null;let H=T?xt(T,i.cwd):null;H&&(O=H,i.skillContent||(i.skillContent=H),i.skillArtifacts||(i.skillArtifacts=Dt(T,i.cwd))),T&&!i.slashSkill&&(i.slashSkill=T),c("PostToolUse","Skill tool detected",`skillName=${T}`,`contentFound=${!!H}`);}let k=B(N(o,P.TOOL_OUTPUT)),L=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(k.slice(0,500)),Tt=L?"ERROR":"DEFAULT",pt=K(),wt=Math.round(Number(BigInt(l)-BigInt(d))/1e6),Lt={Agent:"AGENT",Task:"AGENT"}[s]??"TOOL",yt=s==="Skill"&&T?T:Ft(h,60);i.toolCalls.push({tool:s,brief:yt,error:L,durationMs:wt});let dt=i.spans;dt.push({traceId:i.traceId,spanId:pt,parentSpanId:i.spanId,name:s,kind:3,startTimeUnixNano:d,endTimeUnixNano:l,attributes:Q(u(g.OBS_NAME,s),u(g.OBS_TYPE,Lt),u(g.OBS_LEVEL,Tt),u(g.OBS_INPUT,B(O)),u(g.OBS_OUTPUT,k),u("tool.name",s),u("tool.error",String(L)),s==="Skill"&&T?u("skill.name",T):null,s==="Skill"?u("skill.invocation","slash-command"):null),status:{code:L?2:1}}),i.pendingTool=null,lt(e,i),L&&Z("TOOL_ERROR",{toolName:s}),c("PostToolUse",`sid=${e}`,`tool=${s}`,`error=${L}`,`durationMs=${wt}`,`totalSpans=${dt.length}`),b(t);}var bs=f(()=>{"use strict";ht();St();Ee();at();Mt();I();w();_e();Bt();});function Us(t,e,s){let r=Object.keys(ks).find(i=>(t??"").toLowerCase().includes(i));if(!r)return;let n=ks[r],o=(e*n.input+s*n.output)/1e6;return Math.round(o*1e6)/1e6}var ks,Ps=f(()=>{"use strict";ks={"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",s=t.stop_reason||"end_turn",r=ct(e);if(!r){b(t);return}r.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(r.slashSkill)&&(c("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${r.slashSkill}"`),r.slashSkill=null);let n=D(),o=x()??"",i=r.toolCalls,l=r.spans;if(r.slashSkill&&!i.some(m=>m.tool==="Skill")){let m=K(),W=r.skillContent?r.skillContent:JSON.stringify({skill:r.slashSkill});i.push({tool:"Skill",brief:r.slashSkill,error:false,durationMs:0,synthetic:true}),l.push({traceId:r.traceId,spanId:m,parentSpanId:r.spanId,name:"Skill",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:r.startNs,attributes:Q(u(g.OBS_NAME,"Skill"),u(g.OBS_TYPE,"TOOL"),u(g.OBS_LEVEL,"DEFAULT"),u(g.OBS_INPUT,W),u(g.OBS_OUTPUT,"loaded via slash command"),u("tool.name","Skill"),u("tool.error","false"),u("skill.name",r.slashSkill),u("skill.invocation","slash-command")),status:{code:1}}),c("Stop",`slashSkill=${r.slashSkill}`,"synthetic span injected");}let p=t.transcript_path||r.transcriptPath||"",a=de(p);if(p&&(i.some(m=>m.tool==="Skill"&&!m.synthetic)||!!r.slashSkill)&&!a?.text){await new Promise(W=>setTimeout(W,500));let m=de(p);m?.text&&(a=m);}c("Stop",`transcriptPath=${p||"(empty)"}`,`assistantOut=${a?`text=${a.text.length}chars`:"null"}`);let h=i.length,O=i.filter(m=>m.error).length,T=B(a?.text?N(a.text,P.TRACE_OUTPUT):h===0?"No tools used":i.map((m,W)=>`${W+1}. ${m.tool}${m.brief?` \u2192 ${m.brief}`:""}${m.error?" [ERROR]":""}`).join(`
145
+ `)),k=a?.inputTokens??0,L=a?.outputTokens??0,Tt=i.map((m,W)=>`${W+1}. ${m.tool}${m.brief?` \u2192 ${m.brief}`:""}${m.error?" [ERROR]":""} (${m.durationMs}ms)`),pt=!!(r.slashSkill||i.some(m=>m.tool==="Skill")),wt=i.some(m=>m.tool==="Agent");if(!pt&&!wt){c("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),Z("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),pe(e),b(t);return}let Ot=pt?"skill":"agent",Lt=Math.round(Number(BigInt(n)-BigInt(r.startNs))/1e6),yt=Us(r.model,k,L),tt=os(r);tt==="prerequisite_required"&&a?.text&&(tt="complete"),tt==="prerequisite_required"&&(l.push({traceId:r.traceId,spanId:K(),parentSpanId:r.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:r.startNs,endTimeUnixNano:n,attributes:Q(u(g.OBS_NAME,"prerequisite-check"),u(g.OBS_TYPE,"EVENT"),u(g.OBS_LEVEL,"WARNING"),u(g.OBS_OUTPUT,T),u("skill.name",r.slashSkill||void 0),u("execution_status","prerequisite_required")),status:{code:1}}),c("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${r.slashSkill}`));let dt=(()=>{if(!(!pt||!r.prompt)){if(r.slashSkill){let m=r.prompt.replace(new RegExp(`^\\/${r.slashSkill}\\s*`,"i"),"").trim();return m?N(B(m),P.USER_INSTRUCTION):void 0}return N(B(r.prompt),P.USER_INSTRUCTION)||void 0}})(),Rt=JSON.stringify({trace_type:Ot,...tt!==null&&{execution_status:tt},...r.slashSkill?{skill_name:r.slashSkill}:{},...r.skillArtifacts?.length&&{skill_artifacts:r.skillArtifacts},...dt!==void 0&&{user_instruction:dt},latency_ms:Lt,...k&&{tokens_input:k},...L&&{tokens_output:L},cost_usd:yt,...r.model?{model:r.model}:{},toolCount:h,errorCount:O,stopReason:s,sessionId:r.sessionId,tools:Tt.length?Tt:void 0}),H=B(N(r.prompt,P.TRACE_INPUT)),$s=Q(u(g.TRACE_NAME,r.traceName),u(g.TRACE_INPUT,H),u(g.TRACE_OUTPUT,T),u(g.OBS_INPUT,H),u(g.OBS_OUTPUT,T),u(g.TRACE_METADATA,Rt),u(g.SESSION_ID,r.sessionId),u(g.USER_ID,o),u(g.OBS_TYPE,"GENERATION"),u(g.MODEL,r.model),k?u(g.INPUT_TOKENS,k):null,L?u(g.OUTPUT_TOKENS,L):null,u("claude.stop_reason",s),u("claude.tool_count",String(h)),u("claude.error_count",String(O)),u("claude.session_id",r.sessionId),u("flow.trace_type",Ot),{key:g.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Ot}]}}}),Fs={traceId:r.traceId,spanId:r.spanId,name:r.traceName,kind:1,startTimeUnixNano:r.startNs,endTimeUnixNano:n,attributes:$s,status:{code:O>0?2:1}},xs=Q(u("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),u("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),he=[...l,Fs];c("Stop",`sid=${e}`,`totalTools=${h}`,`errorTools=${O}`,`spans=${he.length}`,`inputTokens=${k}`,`outputTokens=${L}`,`traceOutput="${Ft(T,80)}"`);let Ds=await ys(us(xs,he));c("Stop",`POST status=${Ds}`,`traceId=${r.traceId}`),Z("TRACE_SENT",{latencyMs:Lt,totalTools:h,errorTools:O,inputTokens:k,outputTokens:L,costUsd:yt}),pe(e),b(t);}var Ns=f(()=>{"use strict";ht();St();Ee();Ps();fe();at();I();Mt();_e();w();Bt();J();});async function tn(){let t=process.argv[2];if(t==="UserPromptSubmit"){let s=await ce(),r=false;try{r=await ne();}catch{process.stdout.write(JSON.stringify(s));return}r?await is(s):process.stdout.write(JSON.stringify(s));return}if(!await ne()){let s=[];process.stdin.on("data",r=>s.push(r)),process.stdin.on("end",()=>process.stdout.write(s.join("")));return}let e=await ce();switch(t){case "PreToolUse":await cs(e);break;case "PostToolUse":await vs(e);break;case "Stop":await Is(e);break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
145
146
  `),process.stdout.write(JSON.stringify(e));}}var Cs=f(()=>{"use strict";J();at();as();ls();bs();Ns();tn().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
146
- `),process.exit(0);});});var sn=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,N]=process.argv;function rn(t,e){let s=t.indexOf(e);return s!==-1?t[s+1]:void 0}if(N==="--version"||N==="-v"){let{version:t}=At();process.stdout.write(t+`
147
- `),process.exit(0);}else if(N==="--help"||N==="-h"){let{bold:t,cyan:e,dim:s}=(mt(),C(Yt)),{version:r}=At();process.stdout.write(`
147
+ `),process.exit(0);});});var sn=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,C]=process.argv;function rn(t,e){let s=t.indexOf(e);return s!==-1?t[s+1]:void 0}if(C==="--version"||C==="-v"){let{version:t}=At();process.stdout.write(t+`
148
+ `),process.exit(0);}else if(C==="--help"||C==="-h"){let{bold:t,cyan:e,dim:s}=(mt(),$(Yt)),{version:r}=At();process.stdout.write(`
148
149
  `+t(" flow-ai-obs")+s(" v"+r)+`
149
150
 
150
151
  `),process.stdout.write(e(" init")+s(` Install hooks + native OTEL
@@ -160,11 +161,11 @@ ${s}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${R}`},{re:/(aws_secret_ac
160
161
 
161
162
  `)),process.stdout.write(s(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
162
163
 
163
- `)),process.exit(0);}else if(N==="init"||N==="install")(async()=>{N==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
164
- `),await(It(),C(Pt)).checkForUpdateInteractive();let{runInit:t}=(ie(),C(je)),e=process.argv.slice(3);process.exit(await t({url:rn(e,"--custom-url"),noInteractive:e.includes("--no-interactive")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
165
- `),process.exit(1);});else if(N==="setup")(async()=>{await(It(),C(Pt)).checkForUpdateInteractive();let{runSetup:t}=(Ge(),C(Ye));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
166
- `),process.exit(1);});else if(N==="check")(async()=>{await(It(),C(Pt)).checkForUpdateInteractive();let{runCheck:t}=(Je(),C(Ve));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
167
- `),process.exit(1);});else if(sn.has(N))Cs();else {let{bold:t,cyan:e,dim:s}=(mt(),C(Yt));process.stdout.write(`
164
+ `)),process.exit(0);}else if(C==="init"||C==="install")(async()=>{C==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
165
+ `),await(It(),$(Pt)).checkForUpdateInteractive();let{runInit:t}=(ie(),$(je)),e=process.argv.slice(3);process.exit(await t({url:rn(e,"--custom-url"),noInteractive:e.includes("--no-interactive")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
166
+ `),process.exit(1);});else if(C==="setup")(async()=>{await(It(),$(Pt)).checkForUpdateInteractive();let{runSetup:t}=(Ge(),$(Ye));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
167
+ `),process.exit(1);});else if(C==="check")(async()=>{await(It(),$(Pt)).checkForUpdateInteractive();let{runCheck:t}=(Je(),$(Ve));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
168
+ `),process.exit(1);});else if(sn.has(C))Cs();else {let{bold:t,cyan:e,dim:s}=(mt(),$(Yt));process.stdout.write(`
168
169
  `+t(" flow-ai-obs")+`
169
170
 
170
171
  `),process.stdout.write(e(" init")+s(` Install hooks + native OTEL
package/dist/setup.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var l=require('path'),o=require('fs'),u=require('os'),child_process=require('child_process'),J=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 l__namespace=/*#__PURE__*/_interopNamespace(l);var o__namespace=/*#__PURE__*/_interopNamespace(o);var u__namespace=/*#__PURE__*/_interopNamespace(u);var J__default=/*#__PURE__*/_interopDefault(J);var M=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(s){throw e=0,s}};var P=M((_t,V)=>{V.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.0-beta.479",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function _(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:u__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||u__namespace.userInfo().username}}function h(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let s=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();s&&/^[A-Za-z]:\\/.test(s)&&(t=s);}if(t){let e=t.replace(/^([A-Za-z]):/,(s,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return l__namespace.join(e,".claude","settings.json")}return l__namespace.join(u__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||u__namespace.homedir();return l__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 l__namespace.join(e,".claude","settings.json")}return l__namespace.join(u__namespace.homedir(),".claude","settings.json")}var L="flow-ai-obs",T="config.json";function D(){if(process.platform==="win32"){let s=process.env.APPDATA||l__namespace.join(u__namespace.homedir(),"AppData","Roaming");return l__namespace.join(s,L,T)}let t=_(),e=process.env.XDG_CONFIG_HOME||l__namespace.join(t.home,".config");return l__namespace.join(e,L,T)}function j(){try{let t=o__namespace.readFileSync(D(),"utf8");return JSON.parse(t)}catch{return {}}}function O(){let{baseUrl:t}=j();return typeof t!="string"||t.trim()===""?null:t.trim().replace(/\/$/,"")}var H="https://flow.ciandt.com";function y(){return O()??process.env.FLOW_BASE_URL??H}function W(){let t=y();return {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`}}var Y=W();function R(){let t=y();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}var v={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:Y.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"};var U={LOCK_STALE_MS:3e4},A={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15};var $=U.LOCK_STALE_MS;function G(t){try{let e=o__namespace.statSync(t);Date.now()-e.mtimeMs>$&&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 x(t){try{o__namespace.unlinkSync(t);}catch{}}function B(t,e){let n=(Array.isArray(t)?t:[]).map(r=>{if(!Array.isArray(r?.hooks))return null;let i=r.hooks.filter(c=>!c.command?.startsWith?.("flow-ai-obs "));return i.length>0?{...r,hooks:i}:null}).filter(r=>r!=null);return [e,...n]}function I(){let t=h(),e=t+".lock",s=[];o__namespace.mkdirSync(l__namespace.dirname(t),{recursive:true}),G(e);try{if(o__namespace.existsSync(t)){o__namespace.copyFileSync(t,t+".bkp");try{o__namespace.chmodSync(t+".bkp",384);}catch{}}let n={};if(o__namespace.existsSync(t)){try{n=JSON.parse(o__namespace.readFileSync(t,"utf8"));}catch{}"otelHeadersHelper"in n&&delete n.otelHeadersHelper;}let r=n.env&&typeof n.env=="object"?n.env:{};n.env={...v,...R(),...r},(!n.hooks||typeof n.hooks!="object"||Array.isArray(n.hooks))&&(n.hooks={});let i=(a,d)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${a}`,timeout:d}]}),c=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],g=n.hooks;for(let a of c){let d=B(g[a],i(a,A[a]));d.length>1&&s.push(a),g[a]=d;}o__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
3
- `,{encoding:"utf8",mode:384});try{o__namespace.chmodSync(t,384);}catch{}}finally{x(e);}return {settingsPath:t,preserved:s}}var E;function F(){return E||(E=P()),E}var b=l__namespace.default.join(u__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Z=1440*60*1e3,z=3e3;function Q(t,e){let s=i=>{let c=String(i).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return c?[+c[1],+c[2],+c[3]]:null},n=s(t),r=s(e);return !n||!r?false:r[0]!==n[0]?r[0]>n[0]:r[1]!==n[1]?r[1]>n[1]:r[2]>n[2]}function tt(){try{let t=JSON.parse(o__namespace.default.readFileSync(b,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=Z?null:t}catch{return null}}function et(t,e,s=Date.now()){try{o__namespace.default.writeFileSync(b,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:s}),{mode:384});}catch{}}function nt(t){let e=F().name,s=J__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:z},n=>{if(n.statusCode!==200)return n.resume(),t(new Error(`HTTP ${n.statusCode}`));let r="";n.setEncoding("utf8"),n.on("data",i=>{r+=i;}),n.on("end",()=>{try{let i=JSON.parse(r);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);}});});s.on("error",t),s.on("timeout",()=>{s.destroy(new Error("timeout"));});}function N(){try{if(tt())return;setImmediate(()=>{nt((t,e)=>{t||!e||Q(F().version,e.version)&&et(e.version,e.updatePriority,0);});});}catch{}}var st=l__namespace.default.resolve(__dirname,".."),ot=process.env.INIT_CWD?l__namespace.default.resolve(process.env.INIT_CWD):null;ot===st&&process.exit(0);async function rt(){try{I();}catch{}}rt().catch(()=>{}).finally(()=>N());
2
+ 'use strict';var l=require('path'),o=require('fs'),u=require('os'),child_process=require('child_process'),J=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 l__namespace=/*#__PURE__*/_interopNamespace(l);var o__namespace=/*#__PURE__*/_interopNamespace(o);var u__namespace=/*#__PURE__*/_interopNamespace(u);var J__default=/*#__PURE__*/_interopDefault(J);var M=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(s){throw e=0,s}};var P=M((_t,V)=>{V.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.0-beta.484",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0","eslint-config-prettier":"^10.1.5",jest:"^30.4.2",prettier:"^3.5.3","ts-jest":"^29.4.9",tsup:"^8.5.1",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 _(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:u__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||u__namespace.userInfo().username}}function h(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let s=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();s&&/^[A-Za-z]:\\/.test(s)&&(t=s);}if(t){let e=t.replace(/^([A-Za-z]):/,(s,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return l__namespace.join(e,".claude","settings.json")}return l__namespace.join(u__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||u__namespace.homedir();return l__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 l__namespace.join(e,".claude","settings.json")}return l__namespace.join(u__namespace.homedir(),".claude","settings.json")}var L="flow-ai-obs",T="config.json";function D(){if(process.platform==="win32"){let s=process.env.APPDATA||l__namespace.join(u__namespace.homedir(),"AppData","Roaming");return l__namespace.join(s,L,T)}let t=_(),e=process.env.XDG_CONFIG_HOME||l__namespace.join(t.home,".config");return l__namespace.join(e,L,T)}function j(){try{let t=o__namespace.readFileSync(D(),"utf8");return JSON.parse(t)}catch{return {}}}function O(){let{baseUrl:t}=j();return typeof t!="string"||t.trim()===""?null:t.trim().replace(/\/$/,"")}var H="https://flow.ciandt.com";function y(){return O()??process.env.FLOW_BASE_URL??H}function W(){let t=y();return {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`}}var Y=W();function R(){let t=y();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}var v={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:Y.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"};var U={LOCK_STALE_MS:3e4},w={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15};var $=U.LOCK_STALE_MS;function G(t){try{let e=o__namespace.statSync(t);Date.now()-e.mtimeMs>$&&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 x(t){try{o__namespace.unlinkSync(t);}catch{}}function B(t,e){let n=(Array.isArray(t)?t:[]).map(r=>{if(!Array.isArray(r?.hooks))return null;let i=r.hooks.filter(c=>!c.command?.startsWith?.("flow-ai-obs "));return i.length>0?{...r,hooks:i}:null}).filter(r=>r!=null);return [e,...n]}function I(){let t=h(),e=t+".lock",s=[];o__namespace.mkdirSync(l__namespace.dirname(t),{recursive:true}),G(e);try{if(o__namespace.existsSync(t)){o__namespace.copyFileSync(t,t+".bkp");try{o__namespace.chmodSync(t+".bkp",384);}catch{}}let n={};if(o__namespace.existsSync(t)){try{n=JSON.parse(o__namespace.readFileSync(t,"utf8"));}catch{}"otelHeadersHelper"in n&&delete n.otelHeadersHelper;}let r=n.env&&typeof n.env=="object"?n.env:{};n.env={...v,...R(),...r},(!n.hooks||typeof n.hooks!="object"||Array.isArray(n.hooks))&&(n.hooks={});let i=(a,d)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${a}`,timeout:d}]}),c=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],g=n.hooks;for(let a of c){let d=B(g[a],i(a,w[a]));d.length>1&&s.push(a),g[a]=d;}o__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
3
+ `,{encoding:"utf8",mode:384});try{o__namespace.chmodSync(t,384);}catch{}}finally{x(e);}return {settingsPath:t,preserved:s}}var E;function F(){return E||(E=P()),E}var b=l__namespace.default.join(u__namespace.default.tmpdir(),"flow-obs-update-cache.json"),z=1440*60*1e3,Z=3e3;function Q(t,e){let s=i=>{let c=String(i).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return c?[+c[1],+c[2],+c[3]]:null},n=s(t),r=s(e);return !n||!r?false:r[0]!==n[0]?r[0]>n[0]:r[1]!==n[1]?r[1]>n[1]:r[2]>n[2]}function tt(){try{let t=JSON.parse(o__namespace.default.readFileSync(b,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=z?null:t}catch{return null}}function et(t,e,s=Date.now()){try{o__namespace.default.writeFileSync(b,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:s}),{mode:384});}catch{}}function nt(t){let e=F().name,s=J__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:Z},n=>{if(n.statusCode!==200)return n.resume(),t(new Error(`HTTP ${n.statusCode}`));let r="";n.setEncoding("utf8"),n.on("data",i=>{r+=i;}),n.on("end",()=>{try{let i=JSON.parse(r);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);}});});s.on("error",t),s.on("timeout",()=>{s.destroy(new Error("timeout"));});}function N(){try{if(tt())return;setImmediate(()=>{nt((t,e)=>{t||!e||Q(F().version,e.version)&&et(e.version,e.updatePriority,0);});});}catch{}}var st=l__namespace.default.resolve(__dirname,".."),ot=process.env.INIT_CWD?l__namespace.default.resolve(process.env.INIT_CWD):null;ot===st&&process.exit(0);async function rt(){try{I();}catch{}}rt().catch(()=>{}).finally(()=>N());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.7.0-beta.479",
3
+ "version": "0.7.0-beta.484",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -54,11 +54,11 @@
54
54
  "@changesets/cli": "^2.30.0",
55
55
  "@types/jest": "^30.0.0",
56
56
  "@types/node": "^25.8.0",
57
+ "eslint-config-prettier": "^10.1.5",
57
58
  "jest": "^30.4.2",
59
+ "prettier": "^3.5.3",
58
60
  "ts-jest": "^29.4.9",
59
61
  "tsup": "^8.5.1",
60
- "eslint-config-prettier": "^10.1.5",
61
- "prettier": "^3.5.3",
62
62
  "typescript": "^6.0.3",
63
63
  "typescript-eslint": "^8.33.0"
64
64
  },