@ciandt-flow/flow-ai-obs 0.15.0-beta.87 → 0.15.0

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 er=require('readline/promises'),Ms=require('https'),_=require('fs'),ke=require('os'),k=require('path'),child_process=require('child_process'),ro=require('http'),En=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 er__namespace=/*#__PURE__*/_interopNamespace(er);var Ms__default=/*#__PURE__*/_interopDefault(Ms);var ___namespace=/*#__PURE__*/_interopNamespace(_);var ke__namespace=/*#__PURE__*/_interopNamespace(ke);var k__namespace=/*#__PURE__*/_interopNamespace(k);var ro__default=/*#__PURE__*/_interopDefault(ro);var En__namespace=/*#__PURE__*/_interopNamespace(En);var Zt=Object.defineProperty;var bs=Object.getOwnPropertyDescriptor;var Us=Object.getOwnPropertyNames;var Cs=Object.prototype.hasOwnProperty;var Ns=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var T=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var $s=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},ne=(e,t)=>{for(var r in t)Zt(e,r,{get:t[r],enumerable:true});},Fs=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Us(t))!Cs.call(e,s)&&s!==r&&Zt(e,s,{get:()=>t[s],enumerable:!(n=bs(t,s))||n.enumerable});return e};var M=e=>Fs(Zt({},"__esModule",{value:true}),e);var Qt={};ne(Qt,{bold:()=>b,cyan:()=>D,dim:()=>m,green:()=>P,red:()=>U,yellow:()=>v});function He(e,t){return Ds?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var Ds,P,U,v,D,b,m,ue=T(()=>{"use strict";Ds=!process.env.NO_COLOR&&process.stdout.isTTY;P=He("32","39"),U=He("31","39"),v=He("33","39"),D=He("36","39"),b=He("1","22"),m=He("2","22");});var ot=$s(($i,xs)=>{xs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.15.0-beta.87",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'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},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",lefthook:"^2.1.10",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 pe(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function it(e,t){let r=er__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${e} ${t===true?"(Y/n)":t===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&t!==void 0)return r.close(),t;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
2
+ 'use strict';var er=require('readline/promises'),Ms=require('https'),_=require('fs'),ke=require('os'),k=require('path'),child_process=require('child_process'),ro=require('http'),En=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 er__namespace=/*#__PURE__*/_interopNamespace(er);var Ms__default=/*#__PURE__*/_interopDefault(Ms);var ___namespace=/*#__PURE__*/_interopNamespace(_);var ke__namespace=/*#__PURE__*/_interopNamespace(ke);var k__namespace=/*#__PURE__*/_interopNamespace(k);var ro__default=/*#__PURE__*/_interopDefault(ro);var En__namespace=/*#__PURE__*/_interopNamespace(En);var Zt=Object.defineProperty;var bs=Object.getOwnPropertyDescriptor;var Us=Object.getOwnPropertyNames;var Cs=Object.prototype.hasOwnProperty;var Ns=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var T=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var $s=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},ne=(e,t)=>{for(var r in t)Zt(e,r,{get:t[r],enumerable:true});},Fs=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Us(t))!Cs.call(e,s)&&s!==r&&Zt(e,s,{get:()=>t[s],enumerable:!(n=bs(t,s))||n.enumerable});return e};var M=e=>Fs(Zt({},"__esModule",{value:true}),e);var Qt={};ne(Qt,{bold:()=>b,cyan:()=>D,dim:()=>m,green:()=>P,red:()=>U,yellow:()=>v});function He(e,t){return Ds?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var Ds,P,U,v,D,b,m,ue=T(()=>{"use strict";Ds=!process.env.NO_COLOR&&process.stdout.isTTY;P=He("32","39"),U=He("31","39"),v=He("33","39"),D=He("36","39"),b=He("1","22"),m=He("2","22");});var ot=$s(($i,xs)=>{xs.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.15.0",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'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},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",lefthook:"^2.1.10",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 pe(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function it(e,t){let r=er__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${e} ${t===true?"(Y/n)":t===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&t!==void 0)return r.close(),t;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
3
3
  `);}catch(i){throw r.close(),i}if(r.close(),t!==void 0)return t;throw new Error("Too many invalid attempts for yes/no prompt")}async function tr(e,t){let r=er__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${e}: `)).trim();if(t);return n}catch(n){throw n}finally{r.close();}}var rr=T(()=>{"use strict";});var We={};ne(We,{checkForUpdate:()=>js,checkForUpdateInteractive:()=>Vs,fetchLatestVersionAsync:()=>Jr,isNewer:()=>Be,primeUpdateCache:()=>Gs,runUpdate:()=>Gr});function J(){return nr||(nr=ot()),nr}function Be(e,t){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(e),s=r(t);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function ir(){try{let e=JSON.parse(___namespace.default.readFileSync(Vr,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=Ws?null:e}catch{return null}}function ar(e,t,r=Date.now()){try{___namespace.default.writeFileSync(Vr,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function cr(e){let t=J().name,r=Ms__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Ks},n=>{if(n.statusCode!==200)return n.resume(),e(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");e(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){e(o);}});});r.on("error",e),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function sr(e){let t=J().name,n=` Update available: ${J().version} \u2192 ${e}`,s=` Run: npm install -g ${t}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
4
4
  \u256D${i}\u256E
5
5
  \u2502${n.padEnd(o)}\u2502
package/dist/setup.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var u=require('path'),a=require('fs'),O=require('os'),child_process=require('child_process'),Ie=require('crypto'),Dt=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 u__namespace=/*#__PURE__*/_interopNamespace(u);var a__namespace=/*#__PURE__*/_interopNamespace(a);var O__namespace=/*#__PURE__*/_interopNamespace(O);var Ie__namespace=/*#__PURE__*/_interopNamespace(Ie);var Dt__default=/*#__PURE__*/_interopDefault(Dt);var B=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var $e=Object.getOwnPropertyNames;var He=Object.prototype.hasOwnProperty;var Ye=(e,n,t)=>()=>{if(t)throw t[0];try{return e&&(n=e(e=0)),n}catch(r){throw t=[r],r}};var Ke=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(t){throw n=0,t}},je=(e,n)=>{for(var t in n)B(e,t,{get:n[t],enumerable:true});},We=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of $e(n))!He.call(e,s)&&s!==t&&B(e,s,{get:()=>n[s],enumerable:!(r=Me(n,s))||r.enumerable});return e};var Ve=e=>We(B({},"__esModule",{value:true}),e);var ue={};je(ue,{AUTH_ENGINE:()=>X,BUFFER:()=>Xe,CLAUDE_DESKTOP:()=>f,CONFIG_DIR_NAME:()=>U,CONFIG_FILE_NAME:()=>D,COPILOT_OTEL:()=>p,DEBUG_LOG_FILENAME:()=>Z,ENV:()=>h,FLOW_URLS:()=>Be,HOOK_TIMEOUTS:()=>q,INSTALLER:()=>z,NATIVE_OTEL:()=>J,OTLP:()=>Je,STATE_FILE_PREFIX:()=>Ze,TRACE_LIMITS:()=>ze,VALIDATION:()=>T,VAULT:()=>N,getFlowBaseUrl:()=>K,getFlowUrls:()=>S,getMetrics:()=>qe});function K(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ge}function S(){let e=K();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function qe(){let e=K();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ge,Be,N,U,D,Je,J,h,X,z,q,Xe,T,Z,ze,f,p,Ze,y=Ye(()=>{"use strict";Ge="https://flow.ciandt.com";Be=S(),N={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},U="FLOW-nodejs",D="config.json",Je={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},J={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},h={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_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_SKIP_DESKTOP_DETECTION:"FLOW_OBS_SKIP_DESKTOP_DETECTION",FLOW_OBS_SKIP_COPILOT_DETECTION:"FLOW_OBS_SKIP_COPILOT_DETECTION",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL",FLOW_API_KEY:"FLOW_API_KEY",OTEL_EXPORTER_OTLP_HEADERS:"OTEL_EXPORTER_OTLP_HEADERS",FLOW_BASE_URL:"FLOW_BASE_URL"},X={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},z={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},q={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},Xe={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},T={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},Z="flow-ai-obs-debug.log",ze={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};f={DIR_3P:"Claude-3p",CONFIG_LIBRARY_DIR:"configLibrary",DESKTOP_CONFIG_FILE:"claude_desktop_config.json",META_FILE:"_meta.json",DEPLOYMENT_MODE:"3p",CONFIG_NAME:"Flow AI Obs",WRAPPER_SCRIPT_UNIX:"otel-headers-helper.sh",WRAPPER_SCRIPT_WIN:"otel-headers-helper.cmd",OTLP_PROTOCOL:"http/json",KEYS:{OTLP_ENDPOINT:"otlpEndpoint",OTLP_PROTOCOL:"otlpProtocol",OTLP_HEADERS_HELPER:"otlpHeadersHelper",OTLP_RESOURCE_ATTRIBUTES:"otlpResourceAttributes"},CUSTOM_PROVIDER_KEY:"custom.provider",CUSTOM_PROVIDER_VALUE:"claude-code-desktop"},p={ENABLED_KEY:"github.copilot.chat.otel.enabled",ENABLED_VALUE:!0,EXPORTER_TYPE_KEY:"github.copilot.chat.otel.exporterType",EXPORTER_TYPE_VALUE:"otlp-http",PROTOCOL_KEY:"github.copilot.chat.otel.protocol",PROTOCOL_VALUE:"http/json",ENDPOINT_KEY:"github.copilot.chat.otel.otlpEndpoint",HEADERS_KEY:"github.copilot.chat.otel.headers",HEADER_API_KEY:"x-flow-api-key",HEADER_USER:"x-flow-user"},Ze="flow-obs-";});var Ne=Ke((ar,Ut)=>{Ut.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.15.0-beta.87",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'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},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",lefthook:"^2.1.10",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"}};});y();var Q={credentials:"credentials","token-cache":"tokenCache"};function F(){let e=O__namespace.default.homedir();if(process.platform==="darwin")return u__namespace.default.join(e,"Library","Preferences",U,D);if(process.platform==="win32"){let t=process.env.APPDATA??u__namespace.default.join(e,"AppData","Roaming");return u__namespace.default.join(t,U,D)}let n=process.env.XDG_CONFIG_HOME??u__namespace.default.join(e,".config");return u__namespace.default.join(n,U,D)}function ee(){try{let e=a__namespace.default.readFileSync(F(),"utf8");return JSON.parse(e)}catch{return {}}}function pe(e){let n=F();a__namespace.default.mkdirSync(u__namespace.default.dirname(n),{recursive:true}),a__namespace.default.writeFileSync(n,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var j=class{static isAvailable(){return true}static hasExistingData(){try{if(!a__namespace.default.existsSync(F()))return !1;let n=JSON.parse(a__namespace.default.readFileSync(F(),"utf8"));return !!(n&&n.credentials)}catch{return false}}async getSecret(n,t){let r=ee(),s=Q[t]??t,o=r[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(n,t,r){let s=ee(),o=Q[t]??t;if(t==="token-cache")try{s[o]=JSON.parse(r);}catch{s[o]=r;}else s[o]=r;pe(s);}async deleteSecret(n,t){let r=ee(),s=Q[t]??t;return s in r?(delete r[s],pe(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${F()}`}};async function fe(){return new j}y();var et=N.SERVICE,tt=N.ACCOUNT_CREDS;N.ACCOUNT_TOKEN;var te=null;function nt(){return te||(te=fe()),te}async function de(){let n=await(await nt()).getSecret(et,tt);if(!n)return null;try{return JSON.parse(n)}catch{return null}}y();y();y();var it=u.join(O.tmpdir(),Z);function c(...e){if(process.env[h.FLOW_OBS_DEBUG]!=="1")return;let n=`[${new Date().toISOString()}] ${e.join(" ")}
2
+ 'use strict';var u=require('path'),a=require('fs'),O=require('os'),child_process=require('child_process'),Ie=require('crypto'),Dt=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 u__namespace=/*#__PURE__*/_interopNamespace(u);var a__namespace=/*#__PURE__*/_interopNamespace(a);var O__namespace=/*#__PURE__*/_interopNamespace(O);var Ie__namespace=/*#__PURE__*/_interopNamespace(Ie);var Dt__default=/*#__PURE__*/_interopDefault(Dt);var B=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var $e=Object.getOwnPropertyNames;var He=Object.prototype.hasOwnProperty;var Ye=(e,n,t)=>()=>{if(t)throw t[0];try{return e&&(n=e(e=0)),n}catch(r){throw t=[r],r}};var Ke=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(t){throw n=0,t}},je=(e,n)=>{for(var t in n)B(e,t,{get:n[t],enumerable:true});},We=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of $e(n))!He.call(e,s)&&s!==t&&B(e,s,{get:()=>n[s],enumerable:!(r=Me(n,s))||r.enumerable});return e};var Ve=e=>We(B({},"__esModule",{value:true}),e);var ue={};je(ue,{AUTH_ENGINE:()=>X,BUFFER:()=>Xe,CLAUDE_DESKTOP:()=>f,CONFIG_DIR_NAME:()=>U,CONFIG_FILE_NAME:()=>D,COPILOT_OTEL:()=>p,DEBUG_LOG_FILENAME:()=>Z,ENV:()=>h,FLOW_URLS:()=>Be,HOOK_TIMEOUTS:()=>q,INSTALLER:()=>z,NATIVE_OTEL:()=>J,OTLP:()=>Je,STATE_FILE_PREFIX:()=>Ze,TRACE_LIMITS:()=>ze,VALIDATION:()=>T,VAULT:()=>N,getFlowBaseUrl:()=>K,getFlowUrls:()=>S,getMetrics:()=>qe});function K(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ge}function S(){let e=K();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function qe(){let e=K();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ge,Be,N,U,D,Je,J,h,X,z,q,Xe,T,Z,ze,f,p,Ze,y=Ye(()=>{"use strict";Ge="https://flow.ciandt.com";Be=S(),N={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},U="FLOW-nodejs",D="config.json",Je={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},J={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},h={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_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",FLOW_OBS_SKIP_DESKTOP_DETECTION:"FLOW_OBS_SKIP_DESKTOP_DETECTION",FLOW_OBS_SKIP_COPILOT_DETECTION:"FLOW_OBS_SKIP_COPILOT_DETECTION",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES",FLOW_USER_EMAIL:"FLOW_USER_EMAIL",FLOW_API_KEY:"FLOW_API_KEY",OTEL_EXPORTER_OTLP_HEADERS:"OTEL_EXPORTER_OTLP_HEADERS",FLOW_BASE_URL:"FLOW_BASE_URL"},X={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},z={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},q={UserPromptSubmit:30,PreToolUse:3,PostToolUse:10,Stop:15},Xe={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},T={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},Z="flow-ai-obs-debug.log",ze={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};f={DIR_3P:"Claude-3p",CONFIG_LIBRARY_DIR:"configLibrary",DESKTOP_CONFIG_FILE:"claude_desktop_config.json",META_FILE:"_meta.json",DEPLOYMENT_MODE:"3p",CONFIG_NAME:"Flow AI Obs",WRAPPER_SCRIPT_UNIX:"otel-headers-helper.sh",WRAPPER_SCRIPT_WIN:"otel-headers-helper.cmd",OTLP_PROTOCOL:"http/json",KEYS:{OTLP_ENDPOINT:"otlpEndpoint",OTLP_PROTOCOL:"otlpProtocol",OTLP_HEADERS_HELPER:"otlpHeadersHelper",OTLP_RESOURCE_ATTRIBUTES:"otlpResourceAttributes"},CUSTOM_PROVIDER_KEY:"custom.provider",CUSTOM_PROVIDER_VALUE:"claude-code-desktop"},p={ENABLED_KEY:"github.copilot.chat.otel.enabled",ENABLED_VALUE:!0,EXPORTER_TYPE_KEY:"github.copilot.chat.otel.exporterType",EXPORTER_TYPE_VALUE:"otlp-http",PROTOCOL_KEY:"github.copilot.chat.otel.protocol",PROTOCOL_VALUE:"http/json",ENDPOINT_KEY:"github.copilot.chat.otel.otlpEndpoint",HEADERS_KEY:"github.copilot.chat.otel.headers",HEADER_API_KEY:"x-flow-api-key",HEADER_USER:"x-flow-user"},Ze="flow-obs-";});var Ne=Ke((ar,Ut)=>{Ut.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.15.0",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'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},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",lefthook:"^2.1.10",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"}};});y();var Q={credentials:"credentials","token-cache":"tokenCache"};function F(){let e=O__namespace.default.homedir();if(process.platform==="darwin")return u__namespace.default.join(e,"Library","Preferences",U,D);if(process.platform==="win32"){let t=process.env.APPDATA??u__namespace.default.join(e,"AppData","Roaming");return u__namespace.default.join(t,U,D)}let n=process.env.XDG_CONFIG_HOME??u__namespace.default.join(e,".config");return u__namespace.default.join(n,U,D)}function ee(){try{let e=a__namespace.default.readFileSync(F(),"utf8");return JSON.parse(e)}catch{return {}}}function pe(e){let n=F();a__namespace.default.mkdirSync(u__namespace.default.dirname(n),{recursive:true}),a__namespace.default.writeFileSync(n,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var j=class{static isAvailable(){return true}static hasExistingData(){try{if(!a__namespace.default.existsSync(F()))return !1;let n=JSON.parse(a__namespace.default.readFileSync(F(),"utf8"));return !!(n&&n.credentials)}catch{return false}}async getSecret(n,t){let r=ee(),s=Q[t]??t,o=r[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(n,t,r){let s=ee(),o=Q[t]??t;if(t==="token-cache")try{s[o]=JSON.parse(r);}catch{s[o]=r;}else s[o]=r;pe(s);}async deleteSecret(n,t){let r=ee(),s=Q[t]??t;return s in r?(delete r[s],pe(r),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${F()}`}};async function fe(){return new j}y();var et=N.SERVICE,tt=N.ACCOUNT_CREDS;N.ACCOUNT_TOKEN;var te=null;function nt(){return te||(te=fe()),te}async function de(){let n=await(await nt()).getSecret(et,tt);if(!n)return null;try{return JSON.parse(n)}catch{return null}}y();y();y();var it=u.join(O.tmpdir(),Z);function c(...e){if(process.env[h.FLOW_OBS_DEBUG]!=="1")return;let n=`[${new Date().toISOString()}] ${e.join(" ")}
3
3
  `;try{a.writeFileSync(it,n,{flag:"a"});}catch(t){process.stderr.write(`[flow-obs debug ERROR] ${t.message}
4
4
  `);}}!process.env.NO_COLOR&&process.stdout.isTTY;function ne(){return process.platform==="win32"?false:process.getuid?.()===0}function A(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let n=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(n)return {home:n,username:process.env.SUDO_USER}}return {home:O__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||O__namespace.userInfo().username}}function R(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let t=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();t&&/^[A-Za-z]:\\/.test(t)&&(e=t);}if(e){let n=e.replace(/^([A-Za-z]):/,(t,r)=>`/mnt/${r.toLowerCase()}`).replace(/\\/g,"/");return u__namespace.join(n,".claude","settings.json")}return u__namespace.join(O__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||O__namespace.homedir();return u__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let n=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(n)return u__namespace.join(n,".claude","settings.json")}return u__namespace.join(O__namespace.homedir(),".claude","settings.json")}var Ee="flow-ai-obs",ge="config.json";function he(){if(process.platform==="win32"){let t=process.env.APPDATA||u__namespace.join(O__namespace.homedir(),"AppData","Roaming");return u__namespace.join(t,Ee,ge)}let e=A(),n=process.env.XDG_CONFIG_HOME||u__namespace.join(e.home,".config");return u__namespace.join(n,Ee,ge)}var pt=z.LOCK_STALE_MS;function _e(e){try{let n=a__namespace.statSync(e);Date.now()-n.mtimeMs>pt&&a__namespace.unlinkSync(e);}catch{}try{a__namespace.writeFileSync(e,String(process.pid),{flag:"wx"});}catch(n){throw n.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+e):n}}function Te(e){try{a__namespace.unlinkSync(e);}catch{}}function ft(e,n){let r=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [n,...r]}function ye(e,n){let t=R(),r=t+".lock",s=[];a__namespace.mkdirSync(u__namespace.dirname(t),{recursive:true}),_e(r);try{if(a__namespace.existsSync(t)){a__namespace.copyFileSync(t,t+".bkp");try{a__namespace.chmodSync(t+".bkp",384);}catch{}}let o=he();if(a__namespace.existsSync(o)){let m=o+".bkp";a__namespace.copyFileSync(o,m);try{a__namespace.chmodSync(m,384);}catch{}}let i={};try{i=JSON.parse(a__namespace.readFileSync(t,"utf8"));}catch{}let g=i.env&&typeof i.env=="object"?i.env:{};delete g.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:_}=(y(),Ve(ue)),P=_().OTEL_ENDPOINT,H={...J,OTEL_EXPORTER_OTLP_ENDPOINT:e??P};i.env={...g,...H,...n??{}},i.otelHeadersHelper="flow-ai-obs otel-headers",(!i.hooks||typeof i.hooks!="object"||Array.isArray(i.hooks))&&(i.hooks={});let G=(m,Y)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${m}`,timeout:Y}]}),le=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],k=i.hooks;for(let m of le){let Y=ft(k[m],G(m,q[m]));Y.length>1&&s.push(m),k[m]=Y;}a__namespace.writeFileSync(t,JSON.stringify(i,null,2)+`
5
5
  `,{encoding:"utf8",mode:384});try{a__namespace.chmodSync(t,384);}catch{}}finally{Te(r);}return {settingsPath:t,preserved:s}}var M;function Se(e){if(M===void 0)try{let t=a__namespace.readFileSync(R(),"utf8");M=JSON.parse(t).env??null;}catch{M=null;}if(!M)return null;let n=M[e];return typeof n=="string"?n:null}function oe(e){let n=R(),t=n+".lock";a__namespace.mkdirSync(u__namespace.dirname(n),{recursive:true}),_e(t);try{let r={};try{r=JSON.parse(a__namespace.readFileSync(n,"utf8"));}catch{}(!r.env||typeof r.env!="object")&&(r.env={}),Object.assign(r.env,e),a__namespace.writeFileSync(n,JSON.stringify(r,null,2)+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciandt-flow/flow-ai-obs",
3
- "version": "0.15.0-beta.87",
3
+ "version": "0.15.0",
4
4
  "description": "Claude Code hooks for Langfuse OTLP tracing — cross-platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {