@ciandt-flow/flow-ai-obs 1.0.0-beta.149 → 1.0.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 +1 -1
- package/dist/setup.js +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';var _e=require('readline/promises'),Vn=require('https'),m=require('fs'),At=require('os'),w=require('path'),child_process=require('child_process'),hr=require('crypto'),Zs=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 _e__namespace=/*#__PURE__*/_interopNamespace(_e);var Vn__default=/*#__PURE__*/_interopDefault(Vn);var m__namespace=/*#__PURE__*/_interopNamespace(m);var At__namespace=/*#__PURE__*/_interopNamespace(At);var w__namespace=/*#__PURE__*/_interopNamespace(w);var hr__namespace=/*#__PURE__*/_interopNamespace(hr);var Zs__default=/*#__PURE__*/_interopDefault(Zs);var Ee=Object.defineProperty;var Fn=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var Mn=Object.prototype.hasOwnProperty;var Wn=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var E=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var Kn=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},z=(t,e)=>{for(var r in e)Ee(t,r,{get:e[r],enumerable:true});},Bn=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of xn(e))!Mn.call(t,s)&&s!==r&&Ee(t,s,{get:()=>e[s],enumerable:!(n=Fn(e,s))||n.enumerable});return t};var F=t=>Bn(Ee({},"__esModule",{value:true}),t);var he={};z(he,{bold:()=>b,cyan:()=>j,dim:()=>S,green:()=>v,red:()=>N,yellow:()=>C});function St(t,e){return Yn?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var Yn,v,N,C,j,b,S,ut=E(()=>{"use strict";Yn=!process.env.NO_COLOR&&process.stdout.isTTY;v=St("32","39"),N=St("31","39"),C=St("33","39"),j=St("36","39"),b=St("1","22"),S=St("2","22");});var Nt=Kn((go,jn)=>{jn.exports={name:"@ciandt-flow/flow-ai-obs",version:"1.0.0
|
|
2
|
+
'use strict';var _e=require('readline/promises'),Vn=require('https'),m=require('fs'),At=require('os'),w=require('path'),child_process=require('child_process'),hr=require('crypto'),Zs=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 _e__namespace=/*#__PURE__*/_interopNamespace(_e);var Vn__default=/*#__PURE__*/_interopDefault(Vn);var m__namespace=/*#__PURE__*/_interopNamespace(m);var At__namespace=/*#__PURE__*/_interopNamespace(At);var w__namespace=/*#__PURE__*/_interopNamespace(w);var hr__namespace=/*#__PURE__*/_interopNamespace(hr);var Zs__default=/*#__PURE__*/_interopDefault(Zs);var Ee=Object.defineProperty;var Fn=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var Mn=Object.prototype.hasOwnProperty;var Wn=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var E=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var Kn=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},z=(t,e)=>{for(var r in e)Ee(t,r,{get:e[r],enumerable:true});},Bn=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of xn(e))!Mn.call(t,s)&&s!==r&&Ee(t,s,{get:()=>e[s],enumerable:!(n=Fn(e,s))||n.enumerable});return t};var F=t=>Bn(Ee({},"__esModule",{value:true}),t);var he={};z(he,{bold:()=>b,cyan:()=>j,dim:()=>S,green:()=>v,red:()=>N,yellow:()=>C});function St(t,e){return Yn?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var Yn,v,N,C,j,b,S,ut=E(()=>{"use strict";Yn=!process.env.NO_COLOR&&process.stdout.isTTY;v=St("32","39"),N=St("31","39"),C=St("33","39"),j=St("36","39"),b=St("1","22"),S=St("2","22");});var Nt=Kn((go,jn)=>{jn.exports={name:"@ciandt-flow/flow-ai-obs",version:"1.0.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",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"}};});var er={};z(er,{isTTY:()=>tt,promptRaw:()=>Hn,promptText:()=>qt,promptYesNo:()=>yt});function tt(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function yt(t,e){let r=_e__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&e!==void 0)return r.close(),e;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
|
|
3
3
|
`);}catch(i){throw r.close(),i}if(r.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function qt(t,e){let r=_e__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${t}: `)).trim();if(e){let s=e(n);if(s)throw new Error(s)}return n}catch(n){throw n}finally{r.close();}}function Hn(t,e={}){return new Promise((r,n)=>{if(typeof process.stdin.setRawMode!="function"){n(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:o=""}=e;process.stdout.write(t+o);let i=o;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=h=>{if(h===""){u(),n(new Error("SIGINT"));return}if(h==="\r"||h===`
|
|
4
4
|
`){u(),process.stdout.write(`
|
|
5
5
|
`),r(i);return}if(h==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}h.startsWith("\x1B")||(i+=h,process.stdout.write(s?"*".repeat(h.length):h));};function u(){process.stdin.setRawMode(false),process.stdin.removeListener("data",c),process.removeListener("uncaughtException",a),process.removeListener("unhandledRejection",a);}process.stdin.setRawMode(true),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",c);})}var zt=E(()=>{"use strict";});var $t={};z($t,{checkForUpdate:()=>Zn,checkForUpdateInteractive:()=>Qn,fetchLatestVersionAsync:()=>ir,isNewer:()=>Tt,primeUpdateCache:()=>ts,runUpdate:()=>or});function x(){return Se||(Se=Nt()),Se}function Tt(t,e){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(t),s=r(e);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function Oe(){try{let t=JSON.parse(m__namespace.default.readFileSync(sr,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=Xn?null:t}catch{return null}}function we(t,e,r=Date.now()){try{m__namespace.default.writeFileSync(sr,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:r}),{mode:384});}catch{}}function Le(t){let e=x().name,r=Vn__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:qn},n=>{if(n.statusCode!==200)return n.resume(),t(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});r.on("error",t),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function ye(t){let e=x().name,n=` Update available: ${x().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
|
package/dist/setup.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
'use strict';var a=require('fs'),N=require('os'),c=require('path'),child_process=require('child_process'),me=require('crypto'),Et=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var a__namespace=/*#__PURE__*/_interopNamespace(a);var N__namespace=/*#__PURE__*/_interopNamespace(N);var c__namespace=/*#__PURE__*/_interopNamespace(c);var me__namespace=/*#__PURE__*/_interopNamespace(me);var Et__default=/*#__PURE__*/_interopDefault(Et);var H=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var Pe=Object.getOwnPropertyNames;var we=Object.prototype.hasOwnProperty;var L=(e,n,t)=>()=>{if(t)throw t[0];try{return e&&(n=e(e=0)),n}catch(r){throw t=[r],r}};var ve=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(t){throw n=0,t}},Ie=(e,n)=>{for(var t in n)H(e,t,{get:n[t],enumerable:true});},Ce=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Pe(n))!we.call(e,o)&&o!==t&&H(e,o,{get:()=>n[o],enumerable:!(r=Re(n,o))||r.enumerable});return e};var De=e=>Ce(H({},"__esModule",{value:true}),e);var Q={};Ie(Q,{BUFFER:()=>ke,CLAUDE_DESKTOP:()=>f,COPILOT_OTEL:()=>u,DEBUG_LOG_FILENAME:()=>V,ENV:()=>_,FLOW_URLS:()=>Ue,INSTALLER:()=>M,NATIVE_OTEL:()=>$,OTLP:()=>Fe,STATE_FILE_PREFIX:()=>xe,TRACE_LIMITS:()=>be,VALIDATION:()=>h,getFlowBaseUrl:()=>Z,getFlowUrls:()=>R});function Z(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ne}function R(){let e=Z();return {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`}}var Ne,Ue,Fe,$,_,M,ke,h,V,be,f,u,xe,T=L(()=>{"use strict";Ne="https://flow.ciandt.com";Ue=R(),Fe={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},$={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"},_={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"},M={LOCK_STALE_MS:3e4,CLI:"flow-ai-obs "},ke={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},h={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},V="flow-ai-obs-debug.log",be={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"},u={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"},xe="flow-obs-";});function l(...e){if(process.env[_.FLOW_OBS_DEBUG]!=="1")return;let n=`[${new Date().toISOString()}] ${e.join(" ")}
|
|
3
3
|
`;try{a.writeFileSync(Ke,n,{flag:"a"});}catch(t){process.stderr.write(`[flow-obs debug ERROR] ${t.message}
|
|
4
4
|
`);}}var Ke,K=L(()=>{"use strict";T();Ke=c.join(N.tmpdir(),V);});function P(e,n){return je?t=>`\x1B[${e}m${t}\x1B[${n}m`:t=>t}var je,Ft,He,kt,$e,bt,xt,ee=L(()=>{"use strict";je=!process.env.NO_COLOR&&process.stdout.isTTY;Ft=P("32","39"),He=P("31","39"),kt=P("33","39"),$e=P("36","39"),bt=P("1","22"),xt=P("2","22");});function B(){return process.platform==="win32"?false:process.getuid?.()===0}var te=L(()=>{"use strict";ee();});function y(e={}){let n=e.env??process.env,t=e.platform??process.platform;return !!(n.WSL_DISTRO_NAME&&t==="linux")}function F(e,n={}){let t=n.env??process.env,r=n.spawnSync??child_process.spawnSync;if(!y({env:t,platform:n.platform}))return;let o=t[e];if(!o)try{let i=r("cmd.exe",["/c","echo",`%${e}%`],{encoding:"utf8",timeout:5e3}).stdout?.trim();i&&/^[A-Za-z]:\\/.test(i)&&(o=i);}catch(s){l("resolveWslWindowsPath",`cmd.exe ${e} lookup failed: ${s.message}`);}if(o)return o.replace(/^([A-Za-z]):/,(s,i)=>`/mnt/${i.toLowerCase()}`).replace(/\\/g,"/")}function S(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER)try{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}}catch(e){l("getActualUser",`getent passwd lookup failed: ${e.message}`);}return {home:N__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||N__namespace.userInfo().username}}function v(){if(y()){let e=F("USERPROFILE");return e?c__namespace.join(e,".claude","settings.json"):c__namespace.join(N__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||N__namespace.homedir();return c__namespace.join(e,".claude","settings.json")}return c__namespace.join(S().home,".claude","settings.json")}var I=L(()=>{"use strict";K();te();});function ie(){if(process.platform==="win32"){let t=process.env.APPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Roaming");return c__namespace.join(t,re,se)}let e=S(),n=process.env.XDG_CONFIG_HOME||c__namespace.join(e.home,".config");return c__namespace.join(n,re,se)}var re,se,ae=L(()=>{"use strict";I();re="flow-ai-obs",se="config.json";});function Be(e){try{let n=a__namespace.statSync(e);Date.now()-n.mtimeMs>Ve&&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 Ge(e){try{a__namespace.unlinkSync(e);}catch{}}function Xe(e){let n=[];if(!e.hooks||typeof e.hooks!="object"||Array.isArray(e.hooks))return delete e.hooks,n;let t=e.hooks,r={};for(let[o,s]of Object.entries(t)){if(!Array.isArray(s))continue;let i=s.map(E=>{if(!Array.isArray(E?.hooks))return null;let m=E.hooks.filter(O=>!O.command?.startsWith?.(M.CLI));return m.length>0?{...E,hooks:m}:null}).filter(E=>E!=null);i.length>0&&(r[o]=i,n.push(o));}return Object.keys(r).length>0?e.hooks=r:delete e.hooks,n}function le(e,n){let t=v(),r=t+".lock";a__namespace.mkdirSync(c__namespace.dirname(t),{recursive:true}),Be(r);try{if(a__namespace.existsSync(t)){a__namespace.copyFileSync(t,t+".bkp");try{a__namespace.chmodSync(t+".bkp",384);}catch{}}let o=ie();if(a__namespace.existsSync(o)){let Y=o+".bkp";a__namespace.copyFileSync(o,Y);try{a__namespace.chmodSync(Y,384);}catch{}}let s={};try{s=JSON.parse(a__namespace.readFileSync(t,"utf8"));}catch{}let i=s.env&&typeof s.env=="object"?s.env:{};delete i.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:E}=(T(),De(Q)),m=E().OTEL_ENDPOINT,O={...$,OTEL_EXPORTER_OTLP_ENDPOINT:e??m};s.env={...i,...O,...n??{}},s.otelHeadersHelper="flow-ai-obs otel-headers";let x=Xe(s);a__namespace.writeFileSync(t,JSON.stringify(s,null,2)+`
|
|
5
|
-
`,{encoding:"utf8",mode:384});try{a__namespace.chmodSync(t,384);}catch{}return C=void 0,{settingsPath:t,preserved:x}}finally{Ge(r);}}function ue(e){if(C===void 0)try{let t=a__namespace.readFileSync(v(),"utf8");C=JSON.parse(t).env??null;}catch{C=null;}if(!C)return null;let n=C[e];return typeof n=="string"?n:null}function pe(e){let n=process.env[e];return n!==void 0?n!==""?n:void 0:ue(e)??void 0}function Je(){let e=ue(_.FLOW_BASE_URL);return e&&e.trim()?e.trim():void 0}function fe(){let e=process.env[_.FLOW_BASE_URL];return e&&e.trim()?e.trim():Je()}var Ve,C,G=L(()=>{"use strict";T();I();ae();Ve=M.LOCK_STALE_MS;});var Oe=ve((dn,dt)=>{dt.exports={name:"@ciandt-flow/flow-ai-obs",version:"1.0.0
|
|
5
|
+
`,{encoding:"utf8",mode:384});try{a__namespace.chmodSync(t,384);}catch{}return C=void 0,{settingsPath:t,preserved:x}}finally{Ge(r);}}function ue(e){if(C===void 0)try{let t=a__namespace.readFileSync(v(),"utf8");C=JSON.parse(t).env??null;}catch{C=null;}if(!C)return null;let n=C[e];return typeof n=="string"?n:null}function pe(e){let n=process.env[e];return n!==void 0?n!==""?n:void 0:ue(e)??void 0}function Je(){let e=ue(_.FLOW_BASE_URL);return e&&e.trim()?e.trim():void 0}function fe(){let e=process.env[_.FLOW_BASE_URL];return e&&e.trim()?e.trim():Je()}var Ve,C,G=L(()=>{"use strict";T();I();ae();Ve=M.LOCK_STALE_MS;});var Oe=ve((dn,dt)=>{dt.exports={name:"@ciandt-flow/flow-ai-obs",version:"1.0.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",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"}};});G();T();T();K();G();function ze(e){let n=process.env[_.OTEL_EXPORTER_OTLP_HEADERS];if(!n)return null;let t=e.toLowerCase();for(let r of n.split(",")){let o=r.indexOf("=");if(!(o<=0)&&r.slice(0,o).trim().toLowerCase()===t){let s=r.slice(o+1),i=s.search(/[\r\n]/);return (i===-1?s:s.slice(0,i)).trim()||null}}return null}function de(){let e=pe(_.FLOW_USER_EMAIL);if(e!==void 0){let t=e.replace(/[\r\n]/g,"").trim();if(t)if(t.length>h.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${h.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!h.EMAIL_HEADER_PATTERN.test(t))l("resolveUserEmail","FLOW_USER_EMAIL contains non-printable or control characters \u2014 skipping");else return l("resolveUserEmail","using FLOW_USER_EMAIL override: [REDACTED]"),t}let n=ze("x-flow-user");if(n){let t=n.replace(/[\r\n]/g,"").trim();if(t.length>h.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${h.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!h.EMAIL_HEADER_PATTERN.test(t))l("resolveUserEmail","x-flow-user from OTEL_EXPORTER_OTLP_HEADERS is empty or contains non-printable characters \u2014 skipping");else return l("resolveUserEmail","using x-flow-user from OTEL_EXPORTER_OTLP_HEADERS: [REDACTED]"),t}try{let t=N__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",r=t.lastIndexOf("\\");if(r!==-1&&(t=t.slice(r+1)),t=t.trim().replace(/[^a-zA-Z0-9._%+\-]/g,"").replace(/^\.+/,""),!t)return l("resolveUserEmail","Could not derive x-flow-user: username is empty. Run: flow-ai-obs init"),null;let o=`${t}@ciandt.com`;return l("resolveUserEmail","derived email: [REDACTED]"),o}catch(t){return l("resolveUserEmail",`Could not derive x-flow-user from OS username: ${t.message}. Run: flow-ai-obs init`),null}}function A(e){if(!e)return null;let n=e.replace(/[\r\n]/g,"").trim();return n?n.length>h.API_KEY_MAX_LENGTH?(l("validateApiKey",`API key exceeds ${h.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):h.API_KEY_PATTERN.test(n)?n:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function D(){let e=process.env[_.FLOW_API_KEY];return A(e)}I();function Ee(){if(y()){let t=F("APPDATA");return t?c__namespace.join(t,"Code","User","settings.json"):null}if(process.platform==="win32"){let t=process.env.APPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Roaming");return c__namespace.join(t,"Code","User","settings.json")}if(process.platform==="darwin")return c__namespace.join(N__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let e=process.platform==="linux"&&process.getuid?.()===0?S().home:process.env.HOME||N__namespace.homedir(),n=process.env.XDG_CONFIG_HOME||c__namespace.join(e,".config");return c__namespace.join(n,"Code","User","settings.json")}function Ze(e){let n=false,t=false,r="";for(let o=0;o<e.length;o++){let s=e[o];if(n){r+=s,t?t=false:s==="\\"?t=true:s==='"'&&(n=false);continue}if(s==='"'){n=true,r+=s;continue}if(s===","){let i=o+1;for(;i<e.length&&/\s/.test(e[i]);)i++;if(i<e.length&&(e[i]==="}"||e[i]==="]"))continue}r+=s;}return r}function Qe(e){if(process.env[_.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(e&&a__namespace.existsSync(e));if(e&&(a__namespace.existsSync(e)||a__namespace.existsSync(c__namespace.dirname(e))||a__namespace.existsSync(c__namespace.dirname(c__namespace.dirname(e)))))return true;let n=Ee();if(n&&(a__namespace.existsSync(n)||a__namespace.existsSync(c__namespace.dirname(n))||a__namespace.existsSync(c__namespace.dirname(c__namespace.dirname(n))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",c__namespace.join(N__namespace.homedir(),"Applications","Visual Studio Code.app")].some(r=>a__namespace.existsSync(r)))return true;if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files",o=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([c__namespace.join(t,"Programs","Microsoft VS Code","Code.exe"),c__namespace.join(r,"Microsoft VS Code","Code.exe"),c__namespace.join(o,"Microsoft VS Code","Code.exe")].some(i=>a__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(r=>a__namespace.existsSync(r)))}function ge(e,n={}){let t;try{t=n.customSettingsPath||Ee();}catch(r){return {status:"skipped",reason:`VS Code path resolution failed: ${r.message}`}}if(!t)return {status:"skipped",reason:"VS Code path not found"};if(!Qe(t))return {status:"skipped",settingsPath:t,reason:"VS Code is not installed"};try{let r={};if(a__namespace.existsSync(t))try{let W=Ze(a__namespace.readFileSync(t,"utf8"));r=JSON.parse(W);}catch{return {status:"skipped",settingsPath:t,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let o=e||R().OTEL_ENDPOINT,s=n.apiKey!==void 0?n.apiKey:D(),i=n.userEmail!==void 0?n.userEmail:de(),E=typeof r[u.HEADERS_KEY]=="object"&&r[u.HEADERS_KEY]!==null&&!Array.isArray(r[u.HEADERS_KEY])?r[u.HEADERS_KEY]:{},m={...E};s&&(m[u.HEADER_API_KEY]=s),i&&(m[u.HEADER_USER]=i);let O=Object.keys(m),x=Object.keys(E),Y=O.length===0&&(r[u.HEADERS_KEY]===void 0||x.length===0)||O.length===x.length&&O.every(W=>E[W]===m[W]);if(r[u.ENABLED_KEY]===u.ENABLED_VALUE&&r[u.EXPORTER_TYPE_KEY]===u.EXPORTER_TYPE_VALUE&&r[u.PROTOCOL_KEY]===u.PROTOCOL_VALUE&&r[u.ENDPOINT_KEY]===o&&Y)return {status:"already_configured",settingsPath:t};a__namespace.mkdirSync(c__namespace.dirname(t),{recursive:!0});let z={...r,[u.ENABLED_KEY]:u.ENABLED_VALUE,[u.EXPORTER_TYPE_KEY]:u.EXPORTER_TYPE_VALUE,[u.PROTOCOL_KEY]:u.PROTOCOL_VALUE,[u.ENDPOINT_KEY]:o};return O.length>0&&(z[u.HEADERS_KEY]=m),a__namespace.writeFileSync(t,JSON.stringify(z,null,2)+`
|
|
6
6
|
`,{encoding:"utf8"}),{status:"configured",settingsPath:t}}catch(r){return {status:"skipped",settingsPath:t,reason:r.message}}}T();I();K();function X(){return process.platform==="win32"||y()}function et(e){let n=e.match(/^\/mnt\/([a-z])\/(.*)$/);if(!n)return e;let t=n[1].toUpperCase(),r=n[2].replace(/\//g,"\\");return `${t}:\\${r}`}function _e(){if(y()){let r=F("LOCALAPPDATA");if(r){let o=c__namespace.join(r,f.DIR_3P);return j(o)}}if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Local"),o=c__namespace.join(r,f.DIR_3P);return j(o)}if(process.platform==="darwin"){let r=c__namespace.join(N__namespace.homedir(),"Library","Application Support",f.DIR_3P);return j(r)}let e=S(),n=process.env.XDG_CONFIG_HOME||c__namespace.join(e.home,".config"),t=c__namespace.join(n,f.DIR_3P);return j(t)}function j(e){return {configDir:e,configLibraryDir:c__namespace.join(e,f.CONFIG_LIBRARY_DIR),desktopConfigPath:c__namespace.join(e,f.DESKTOP_CONFIG_FILE),metaPath:c__namespace.join(e,f.CONFIG_LIBRARY_DIR,f.META_FILE)}}function J(){let e=v(),n=c__namespace.dirname(e),t=X()?f.WRAPPER_SCRIPT_WIN:f.WRAPPER_SCRIPT_UNIX;return c__namespace.join(n,t)}function tt(){if(process.env[_.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=_e();if(a__namespace.existsSync(e.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",c__namespace.join(N__namespace.homedir(),"Applications","Claude.app")].some(t=>a__namespace.existsSync(t));if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||c__namespace.join(N__namespace.homedir(),"AppData","Local"),t=process.env.PROGRAMFILES||"C:\\Program Files";return [c__namespace.join(n,"AnthropicClaude","Claude.exe"),c__namespace.join(t,"Claude","Claude.exe")].some(o=>a__namespace.existsSync(o))}if(process.platform==="linux"){let n=S(),t=process.env.XDG_CONFIG_HOME||c__namespace.join(n.home,".config"),r=c__namespace.join(t,"Claude");return a__namespace.existsSync(r)}return false}function nt(e){let n=e??J();try{if(!a__namespace.existsSync(n))return null;let t=a__namespace.readFileSync(n,"utf8"),r=t.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(r&&r[1])return A(r[1]);let o=t.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(o&&o[1])return A(o[1])}catch{}return null}function rt(e,n,t=448){let r=c__namespace.dirname(e);a__namespace.mkdirSync(r,{recursive:true});let o=X(),s=o?420:t,i=true;try{a__namespace.readFileSync(e,"utf8")===n&&(i=!1);}catch{}if(!i){if(!o)try{a__namespace.chmodSync(e,t);}catch{}return {written:false}}if(a__namespace.existsSync(e)&&(a__namespace.copyFileSync(e,e+".bkp"),!o))try{a__namespace.chmodSync(e+".bkp",448);}catch{}if(a__namespace.writeFileSync(e,n,{encoding:"utf8",mode:s}),!o)try{a__namespace.chmodSync(e,t);}catch{}return {written:true}}function st(e){let n=J(),t=e?A(e):null,r=X()?it(t):ot(t);return rt(n,r,!!t?448:493),n}function ot(e){let n=e?A(e):null,t=["#!/usr/bin/env bash","# Auto-generated by flow-ai-obs \u2014 do not edit manually.","# Wrapper script for Claude Desktop otelHeadersHelper.","# Invokes flow-ai-obs otel-headers to produce fresh OTLP headers at runtime.","set -euo pipefail"];return n&&t.push(`export FLOW_API_KEY="${n}"`),t.push("exec flow-ai-obs otel-headers",""),t.join(`
|
|
7
7
|
`)}function it(e){let n=e?A(e):null,t=["@echo off","REM Auto-generated by flow-ai-obs \u2014 do not edit manually.","REM Wrapper script for Claude Desktop otelHeadersHelper.","REM Invokes flow-ai-obs otel-headers to produce fresh OTLP headers at runtime."];return n&&t.push(`set FLOW_API_KEY=${n}`),t.push("flow-ai-obs otel-headers",""),t.join(`\r
|
|
8
8
|
`)}var at=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function ct(e){try{let n=a__namespace.readFileSync(e,"utf8");try{let t=JSON.parse(n);if(t.appliedId&&typeof t.appliedId=="string"&&at.test(t.appliedId))return t.appliedId;t.appliedId&&l("getOrCreateConfigUuid","appliedId is not a valid UUID \u2014 generating new UUID");}catch{l("getOrCreateConfigUuid",`corrupted JSON in ${e} \u2014 generating new UUID`);}}catch(n){n.code!=="ENOENT"&&l("getOrCreateConfigUuid",`read error: ${n.message}`);}return me__namespace.randomUUID()}function lt(e,n){let t=c__namespace.dirname(e);a__namespace.mkdirSync(t,{recursive:true});let r;try{let s=a__namespace.readFileSync(e,"utf8");try{r=JSON.parse(s),(!r.appliedId||typeof r.appliedId!="string")&&(r.appliedId=n),Array.isArray(r.entries)||(r.entries=[]);}catch{l("writeMetaJson",`corrupted JSON in ${e} \u2014 starting fresh`),r={appliedId:n,entries:[]};}}catch(s){s.code!=="ENOENT"&&l("writeMetaJson",`read error: ${s.message}`),r={appliedId:n,entries:[]};}r.entries.some(s=>s.id===n)||r.entries.push({id:n,name:f.CONFIG_NAME});let o=JSON.stringify(r,null,2)+`
|