@ciandt-flow/flow-ai-obs 0.8.4-beta.620 → 0.8.4

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,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var Le=require('readline/promises'),ss=require('https'),T=require('fs'),ct=require('os'),Ot=require('path'),child_process=require('child_process'),ws=require('http'),util=require('util'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Le__namespace=/*#__PURE__*/_interopNamespace(Le);var ss__default=/*#__PURE__*/_interopDefault(ss);var T__namespace=/*#__PURE__*/_interopNamespace(T);var ct__namespace=/*#__PURE__*/_interopNamespace(ct);var Ot__namespace=/*#__PURE__*/_interopNamespace(Ot);var ws__default=/*#__PURE__*/_interopDefault(ws);var ve=Object.defineProperty;var zr=Object.getOwnPropertyDescriptor;var Zr=Object.getOwnPropertyNames;var Qr=Object.prototype.hasOwnProperty;var Ct=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var h=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var ts=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}},J=(t,e)=>{for(var n in e)ve(t,n,{get:e[n],enumerable:true});},es=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Zr(e))!Qr.call(t,i)&&i!==n&&ve(t,i,{get:()=>e[i],enumerable:!(r=zr(e,i))||r.enumerable});return t};var K=t=>es(ve({},"__esModule",{value:true}),t);var gn={};J(gn,{bold:()=>b,cyan:()=>I,dim:()=>k,green:()=>B,red:()=>P,yellow:()=>v});function St(t,e){return ns?n=>`\x1B[${t}m${n}\x1B[${e}m`:n=>n}var ns,B,P,v,I,b,k,Et=h(()=>{"use strict";ns=!process.env.NO_COLOR&&process.stdout.isTTY;B=St("32","39"),P=St("31","39"),v=St("33","39"),I=St("36","39"),b=St("1","22"),k=St("2","22");});var Kt=ts((Jo,rs)=>{rs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.8.4-beta.620",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 ot(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function Re(t,e){let n=Le__namespace.createInterface({input:process.stdin,output:process.stdout}),i=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let s=(await n.question(i)).trim().toLowerCase();if(s===""&&e!==void 0)return n.close(),e;if(s==="y"||s==="yes")return n.close(),!0;if(s==="n"||s==="no")return n.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
2
+ 'use strict';var Le=require('readline/promises'),ss=require('https'),T=require('fs'),ct=require('os'),Ot=require('path'),child_process=require('child_process'),ws=require('http'),util=require('util'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Le__namespace=/*#__PURE__*/_interopNamespace(Le);var ss__default=/*#__PURE__*/_interopDefault(ss);var T__namespace=/*#__PURE__*/_interopNamespace(T);var ct__namespace=/*#__PURE__*/_interopNamespace(ct);var Ot__namespace=/*#__PURE__*/_interopNamespace(Ot);var ws__default=/*#__PURE__*/_interopDefault(ws);var ve=Object.defineProperty;var zr=Object.getOwnPropertyDescriptor;var Zr=Object.getOwnPropertyNames;var Qr=Object.prototype.hasOwnProperty;var Ct=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var h=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var ts=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}},J=(t,e)=>{for(var n in e)ve(t,n,{get:e[n],enumerable:true});},es=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Zr(e))!Qr.call(t,i)&&i!==n&&ve(t,i,{get:()=>e[i],enumerable:!(r=zr(e,i))||r.enumerable});return t};var K=t=>es(ve({},"__esModule",{value:true}),t);var gn={};J(gn,{bold:()=>b,cyan:()=>I,dim:()=>k,green:()=>B,red:()=>P,yellow:()=>v});function St(t,e){return ns?n=>`\x1B[${t}m${n}\x1B[${e}m`:n=>n}var ns,B,P,v,I,b,k,Et=h(()=>{"use strict";ns=!process.env.NO_COLOR&&process.stdout.isTTY;B=St("32","39"),P=St("31","39"),v=St("33","39"),I=St("36","39"),b=St("1","22"),k=St("2","22");});var Kt=ts((Jo,rs)=>{rs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.8.4",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 ot(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function Re(t,e){let n=Le__namespace.createInterface({input:process.stdin,output:process.stdout}),i=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let s=(await n.question(i)).trim().toLowerCase();if(s===""&&e!==void 0)return n.close(),e;if(s==="y"||s==="yes")return n.close(),!0;if(s==="n"||s==="no")return n.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
3
  `);}catch(s){throw n.close(),s}if(n.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function hn(t,e){let n=Le__namespace.createInterface({input:process.stdin,output:process.stdout});try{let r=(await n.question(`${t}: `)).trim();if(e);return r}catch(r){throw r}finally{n.close();}}var Pe=h(()=>{"use strict";});var qt={};J(qt,{checkForUpdate:()=>ds,checkForUpdateInteractive:()=>ps,fetchLatestVersionAsync:()=>wn,isNewer:()=>Tt,primeUpdateCache:()=>fs});function N(){return Ie||(Ie=Kt()),Ie}function Tt(t,e){let n=o=>{let s=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return s?[+s[1],+s[2],+s[3]]:null},r=n(t),i=n(e);return !r||!i?false:i[0]!==r[0]?i[0]>r[0]:i[1]!==r[1]?i[1]>r[1]:i[2]>r[2]}function Ue(){try{let t=JSON.parse(T__namespace.default.readFileSync(Tn,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=as?null:t}catch{return null}}function Ce(t,e,n=Date.now()){try{T__namespace.default.writeFileSync(Tn,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:n}),{mode:384});}catch{}}function $e(t){let e=N().name,n=ss__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:cs},r=>{if(r.statusCode!==200)return r.resume(),t(new Error(`HTTP ${r.statusCode}`));let i="";r.setEncoding("utf8"),r.on("data",o=>{i+=o;}),r.on("end",()=>{try{let o=JSON.parse(i);if(typeof o.version!="string")throw new Error("no version field");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});n.on("error",t),n.on("timeout",()=>{n.destroy(new Error("timeout"));});}function be(t){let e=N().name,r=` Update available: ${N().version} \u2192 ${t}`,i=` Run: npm install -g ${e}`,o=Math.max(r.length,i.length)+2,s="\u2500".repeat(o);process.stderr.write(`
4
4
  \u256D${s}\u256E
5
5
  \u2502${r.padEnd(o)}\u2502
package/dist/setup.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),u=require('path'),l=require('os'),Xe=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var i__namespace=/*#__PURE__*/_interopNamespace(i);var u__namespace=/*#__PURE__*/_interopNamespace(u);var l__namespace=/*#__PURE__*/_interopNamespace(l);var Xe__default=/*#__PURE__*/_interopDefault(Xe);var _e=Object.defineProperty;var T=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var A=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var Se=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}},L=(t,e)=>{for(var n in e)_e(t,n,{get:e[n],enumerable:true});};var B={};L(B,{MacOsKeyVaultProvider:()=>N});var C,N,J=A(()=>{"use strict";C=util.promisify(child_process.execFile),N=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(e,n){try{let{stdout:r}=await C("security",["find-generic-password","-w","-a",n,"-s",e]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await C("security",["add-generic-password","-U","-a",n,"-s",e,"-w",r]);}async deleteSecret(e,n){try{return await C("security",["delete-generic-password","-a",n,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var X={};L(X,{LinuxKeyVaultProvider:()=>b});var K,b,q=A(()=>{"use strict";K=util.promisify(child_process.execFile),b=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of e)try{return i.accessSync(n,i.constants.X_OK),!0}catch{}return !1}async getSecret(e,n){try{let{stdout:r}=await K("secret-tool",["lookup","service",e,"account",n]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await new Promise((o,s)=>{let a=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",n]);a.on("error",s),a.on("close",y=>{y===0?o():s(new Error(`secret-tool exited with code ${y}`));}),a.stdin.write(r),a.stdin.end();});}async deleteSecret(e,n){try{return await K("secret-tool",["clear","service",e,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var z={};L(z,{WindowsKeyVaultProvider:()=>U});var U,Z=A(()=>{"use strict";U=class{static async isAvailable(){try{return await T("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,n){return T("keytar").getPassword(e,n)}async setSecret(e,n,r){await T("keytar").setPassword(e,n,r);}async deleteSecret(e,n){return T("keytar").deletePassword(e,n)}getStoragePath(){return "Windows Credential Manager"}};});var de=Se((cn,Ke)=>{Ke.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.8.4-beta.620",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 we="https://flow.ciandt.com";function V(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():we}function R(){let t=V();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}var ve=R(),_={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials"},S="FLOW-nodejs",w="config.json";var k={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:ve.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},f={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var j={LOCK_STALE_MS:3e4},Y={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15};var G="flow-ai-obs-debug.log";var P={credentials:"credentials","token-cache":"tokenCache"};function m(){let t=l__namespace.default.homedir();if(process.platform==="darwin")return u__namespace.default.join(t,"Library","Preferences",S,w);if(process.platform==="win32"){let n=process.env.APPDATA??u__namespace.default.join(t,"AppData","Roaming");return u__namespace.default.join(n,S,w)}let e=process.env.XDG_CONFIG_HOME??u__namespace.default.join(t,".config");return u__namespace.default.join(e,S,w)}function I(){try{let t=i__namespace.default.readFileSync(m(),"utf8");return JSON.parse(t)}catch{return {}}}function W(t){let e=m();i__namespace.default.mkdirSync(u__namespace.default.dirname(e),{recursive:true}),i__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var v=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(m()))return !1;let e=JSON.parse(i__namespace.default.readFileSync(m(),"utf8"));return !!(e&&e.credentials)}catch{return false}}async getSecret(e,n){let r=I(),o=P[n]??n,s=r[o];return s?typeof s=="string"?s:JSON.stringify(s):null}async setSecret(e,n,r){let o=I(),s=P[n]??n;if(n==="token-cache")try{o[s]=JSON.parse(r);}catch{o[s]=r;}else o[s]=r;W(o);}async deleteSecret(e,n){let r=I(),o=P[n]??n;return o in r?(delete r[o],W(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${m()}`}};async function Q(){return await Ue()??new v}async function Ue(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(J(),B));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(q(),X));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Z(),z));return await t.isAvailable()?new t:null}default:return null}}var Fe=_.SERVICE,$e=_.ACCOUNT_CREDS,F=null;function De(){return F||(F=Q()),F}async function ee(){let e=await(await De()).getSecret(Fe,$e);if(!e)return null;try{return JSON.parse(e)}catch{return null}}u.join(l.tmpdir(),G);!process.env.NO_COLOR&&process.stdout.isTTY;function $(){return process.platform==="win32"?false:process.getuid?.()===0}function te(){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:l__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||l__namespace.userInfo().username}}function O(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(t=n);}if(t){let e=t.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return u__namespace.join(e,".claude","settings.json")}return u__namespace.join(l__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||l__namespace.homedir();return u__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 u__namespace.join(e,".claude","settings.json")}return u__namespace.join(l__namespace.homedir(),".claude","settings.json")}var ne="flow-ai-obs",re="config.json";function oe(){if(process.platform==="win32"){let n=process.env.APPDATA||u__namespace.join(l__namespace.homedir(),"AppData","Roaming");return u__namespace.join(n,ne,re)}let t=te(),e=process.env.XDG_CONFIG_HOME||u__namespace.join(t.home,".config");return u__namespace.join(e,ne,re)}var We=j.LOCK_STALE_MS;function ie(t){try{let e=i__namespace.statSync(t);Date.now()-e.mtimeMs>We&&i__namespace.unlinkSync(t);}catch{}try{i__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function ae(t){try{i__namespace.unlinkSync(t);}catch{}}function Be(t,e){let r=(Array.isArray(t)?t:[]).map(o=>{if(!Array.isArray(o?.hooks))return null;let s=o.hooks.filter(a=>!a.command?.startsWith?.("flow-ai-obs "));return s.length>0?{...o,hooks:s}:null}).filter(o=>o!=null);return [e,...r]}function ce(t){let e=O(),n=e+".lock",r=[];i__namespace.mkdirSync(u__namespace.dirname(e),{recursive:true}),ie(n);try{if(i__namespace.existsSync(e)){i__namespace.copyFileSync(e,e+".bkp");try{i__namespace.chmodSync(e+".bkp",384);}catch{}}let o=oe();if(i__namespace.existsSync(o)){let c=o+".bkp";i__namespace.copyFileSync(o,c);try{i__namespace.chmodSync(c,384);}catch{}}let s={};try{s=JSON.parse(i__namespace.readFileSync(e,"utf8"));}catch{}let a=s.env&&typeof s.env=="object"?s.env:{};delete a.OTEL_EXPORTER_OTLP_HEADERS;let y=t?{...k,OTEL_EXPORTER_OTLP_ENDPOINT:t}:k;s.env={...a,...y},s.otelHeadersHelper="flow-ai-obs otel-headers",(!s.hooks||typeof s.hooks!="object"||Array.isArray(s.hooks))&&(s.hooks={});let Ee=(c,E)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:E}]}),Te=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],M=s.hooks;for(let c of Te){let E=Be(M[c],Ee(c,Y[c]));E.length>1&&r.push(c),M[c]=E;}i__namespace.writeFileSync(e,JSON.stringify(s,null,2)+`
2
+ 'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),u=require('path'),l=require('os'),Xe=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var i__namespace=/*#__PURE__*/_interopNamespace(i);var u__namespace=/*#__PURE__*/_interopNamespace(u);var l__namespace=/*#__PURE__*/_interopNamespace(l);var Xe__default=/*#__PURE__*/_interopDefault(Xe);var _e=Object.defineProperty;var T=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var A=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var Se=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}},L=(t,e)=>{for(var n in e)_e(t,n,{get:e[n],enumerable:true});};var B={};L(B,{MacOsKeyVaultProvider:()=>N});var C,N,J=A(()=>{"use strict";C=util.promisify(child_process.execFile),N=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(e,n){try{let{stdout:r}=await C("security",["find-generic-password","-w","-a",n,"-s",e]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await C("security",["add-generic-password","-U","-a",n,"-s",e,"-w",r]);}async deleteSecret(e,n){try{return await C("security",["delete-generic-password","-a",n,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var X={};L(X,{LinuxKeyVaultProvider:()=>b});var K,b,q=A(()=>{"use strict";K=util.promisify(child_process.execFile),b=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let n of e)try{return i.accessSync(n,i.constants.X_OK),!0}catch{}return !1}async getSecret(e,n){try{let{stdout:r}=await K("secret-tool",["lookup","service",e,"account",n]);return r.trim()||null}catch{return null}}async setSecret(e,n,r){await new Promise((o,s)=>{let a=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",n]);a.on("error",s),a.on("close",y=>{y===0?o():s(new Error(`secret-tool exited with code ${y}`));}),a.stdin.write(r),a.stdin.end();});}async deleteSecret(e,n){try{return await K("secret-tool",["clear","service",e,"account",n]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var z={};L(z,{WindowsKeyVaultProvider:()=>U});var U,Z=A(()=>{"use strict";U=class{static async isAvailable(){try{return await T("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,n){return T("keytar").getPassword(e,n)}async setSecret(e,n,r){await T("keytar").setPassword(e,n,r);}async deleteSecret(e,n){return T("keytar").deletePassword(e,n)}getStoragePath(){return "Windows Credential Manager"}};});var de=Se((cn,Ke)=>{Ke.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.8.4",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 we="https://flow.ciandt.com";function V(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():we}function R(){let t=V();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}var ve=R(),_={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials"},S="FLOW-nodejs",w="config.json";var k={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:ve.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},f={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var j={LOCK_STALE_MS:3e4},Y={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15};var G="flow-ai-obs-debug.log";var P={credentials:"credentials","token-cache":"tokenCache"};function m(){let t=l__namespace.default.homedir();if(process.platform==="darwin")return u__namespace.default.join(t,"Library","Preferences",S,w);if(process.platform==="win32"){let n=process.env.APPDATA??u__namespace.default.join(t,"AppData","Roaming");return u__namespace.default.join(n,S,w)}let e=process.env.XDG_CONFIG_HOME??u__namespace.default.join(t,".config");return u__namespace.default.join(e,S,w)}function I(){try{let t=i__namespace.default.readFileSync(m(),"utf8");return JSON.parse(t)}catch{return {}}}function W(t){let e=m();i__namespace.default.mkdirSync(u__namespace.default.dirname(e),{recursive:true}),i__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var v=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(m()))return !1;let e=JSON.parse(i__namespace.default.readFileSync(m(),"utf8"));return !!(e&&e.credentials)}catch{return false}}async getSecret(e,n){let r=I(),o=P[n]??n,s=r[o];return s?typeof s=="string"?s:JSON.stringify(s):null}async setSecret(e,n,r){let o=I(),s=P[n]??n;if(n==="token-cache")try{o[s]=JSON.parse(r);}catch{o[s]=r;}else o[s]=r;W(o);}async deleteSecret(e,n){let r=I(),o=P[n]??n;return o in r?(delete r[o],W(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${m()}`}};async function Q(){return await Ue()??new v}async function Ue(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(J(),B));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(q(),X));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Z(),z));return await t.isAvailable()?new t:null}default:return null}}var Fe=_.SERVICE,$e=_.ACCOUNT_CREDS,F=null;function De(){return F||(F=Q()),F}async function ee(){let e=await(await De()).getSecret(Fe,$e);if(!e)return null;try{return JSON.parse(e)}catch{return null}}u.join(l.tmpdir(),G);!process.env.NO_COLOR&&process.stdout.isTTY;function $(){return process.platform==="win32"?false:process.getuid?.()===0}function te(){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:l__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||l__namespace.userInfo().username}}function O(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let n=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();n&&/^[A-Za-z]:\\/.test(n)&&(t=n);}if(t){let e=t.replace(/^([A-Za-z]):/,(n,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return u__namespace.join(e,".claude","settings.json")}return u__namespace.join(l__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||l__namespace.homedir();return u__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 u__namespace.join(e,".claude","settings.json")}return u__namespace.join(l__namespace.homedir(),".claude","settings.json")}var ne="flow-ai-obs",re="config.json";function oe(){if(process.platform==="win32"){let n=process.env.APPDATA||u__namespace.join(l__namespace.homedir(),"AppData","Roaming");return u__namespace.join(n,ne,re)}let t=te(),e=process.env.XDG_CONFIG_HOME||u__namespace.join(t.home,".config");return u__namespace.join(e,ne,re)}var We=j.LOCK_STALE_MS;function ie(t){try{let e=i__namespace.statSync(t);Date.now()-e.mtimeMs>We&&i__namespace.unlinkSync(t);}catch{}try{i__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function ae(t){try{i__namespace.unlinkSync(t);}catch{}}function Be(t,e){let r=(Array.isArray(t)?t:[]).map(o=>{if(!Array.isArray(o?.hooks))return null;let s=o.hooks.filter(a=>!a.command?.startsWith?.("flow-ai-obs "));return s.length>0?{...o,hooks:s}:null}).filter(o=>o!=null);return [e,...r]}function ce(t){let e=O(),n=e+".lock",r=[];i__namespace.mkdirSync(u__namespace.dirname(e),{recursive:true}),ie(n);try{if(i__namespace.existsSync(e)){i__namespace.copyFileSync(e,e+".bkp");try{i__namespace.chmodSync(e+".bkp",384);}catch{}}let o=oe();if(i__namespace.existsSync(o)){let c=o+".bkp";i__namespace.copyFileSync(o,c);try{i__namespace.chmodSync(c,384);}catch{}}let s={};try{s=JSON.parse(i__namespace.readFileSync(e,"utf8"));}catch{}let a=s.env&&typeof s.env=="object"?s.env:{};delete a.OTEL_EXPORTER_OTLP_HEADERS;let y=t?{...k,OTEL_EXPORTER_OTLP_ENDPOINT:t}:k;s.env={...a,...y},s.otelHeadersHelper="flow-ai-obs otel-headers",(!s.hooks||typeof s.hooks!="object"||Array.isArray(s.hooks))&&(s.hooks={});let Ee=(c,E)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:E}]}),Te=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],M=s.hooks;for(let c of Te){let E=Be(M[c],Ee(c,Y[c]));E.length>1&&r.push(c),M[c]=E;}i__namespace.writeFileSync(e,JSON.stringify(s,null,2)+`
3
3
  `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(e,384);}catch{}}finally{ae(n);}return {settingsPath:e,preserved:r}}function le(t){let e=O(),n=e+".lock";i__namespace.mkdirSync(u__namespace.dirname(e),{recursive:true}),ie(n);try{let r={};try{r=JSON.parse(i__namespace.readFileSync(e,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,t),i__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
4
4
  `,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(e,384);}catch{}}finally{ae(n);}}function ue(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let n=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:r,clientSecret:o,tenant:s}=n;return !r||!o||!s?null:{clientId:r,clientSecret:o,tenant:s}}catch{return null}}function pe(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),n=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${n}.`}var H;function me(){return H||(H=de()),H}var ge=u__namespace.default.join(l__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Ze=1440*60*1e3,Qe=3e3;function et(t,e){let n=s=>{let a=String(s).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[3]]:null},r=n(t),o=n(e);return !r||!o?false:o[0]!==r[0]?o[0]>r[0]:o[1]!==r[1]?o[1]>r[1]:o[2]>r[2]}function tt(){try{let t=JSON.parse(i__namespace.default.readFileSync(ge,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=Ze?null:t}catch{return null}}function nt(t,e,n=Date.now()){try{i__namespace.default.writeFileSync(ge,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:n}),{mode:384});}catch{}}function rt(t){let e=me().name,n=Xe__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:Qe},r=>{if(r.statusCode!==200)return r.resume(),t(new Error(`HTTP ${r.statusCode}`));let o="";r.setEncoding("utf8"),r.on("data",s=>{o+=s;}),r.on("end",()=>{try{let s=JSON.parse(o);if(typeof s.version!="string")throw new Error("no version field");t(null,{version:s.version,updatePriority:typeof s.updatePriority=="string"?s.updatePriority:null});}catch(s){t(s);}});});n.on("error",t),n.on("timeout",()=>{n.destroy(new Error("timeout"));});}function he(){try{if(tt())return;setImmediate(()=>{rt((t,e)=>{t||!e||et(me().version,e.version)&&nt(e.version,e.updatePriority,0);});});}catch{}}var st=u__namespace.default.resolve(__dirname,".."),ot=process.env.INIT_CWD?u__namespace.default.resolve(process.env.INIT_CWD):null;ot===st&&process.exit(0);$()&&(process.stderr.write(`
5
5
  [flow-ai-obs] \u2717 Do not install with sudo.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.8.4-beta.620",
3
+ "version": "0.8.4",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {