@ciandt-flow/flow-ai-obs 1.0.0-beta.149 → 1.0.1-beta.158
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 +37 -37
- 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
|
|
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 Wn=Object.prototype.hasOwnProperty;var Mn=(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});},Yn=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of xn(e))!Wn.call(t,s)&&s!==r&&Ee(t,s,{get:()=>e[s],enumerable:!(n=Fn(e,s))||n.enumerable});return t};var F=t=>Yn(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 Bn?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var Bn,v,N,C,j,b,S,ut=E(()=>{"use strict";Bn=!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.1-beta.158",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(`
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
`);}function Te(t){let e=x().name;process.stderr.write(`
|
|
12
12
|
[${e}] Critical update detected \u2014 auto-updating to ${t}...
|
|
13
13
|
|
|
14
|
-
`);let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});r.on("error",()=>{}),r.unref();}async function zn(t,e=1e4){let r=
|
|
14
|
+
`);let r=child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});r.on("error",()=>{}),r.unref();}async function zn(t,e=1e4){let r=Mn("readline"),n=x().name,o=` Update available: ${x().version} \u2192 ${t}`,i=` Run: npm install -g ${n}`,a=" Install now? [y/N]: ",c=Math.max(o.length,i.length,a.length-2)+2,u="\u2500".repeat(c);return process.stderr.write(`
|
|
15
15
|
\u256D${u}\u256E
|
|
16
16
|
\u2502${o.padEnd(c)}\u2502
|
|
17
17
|
\u2502${i.padEnd(c)}\u2502
|
|
@@ -23,24 +23,24 @@
|
|
|
23
23
|
|
|
24
24
|
`);else {let c=a?` (${a})`:"";process.stderr.write(` \u2717 Update failed${c} \u2014 continuing with current version.
|
|
25
25
|
|
|
26
|
-
`);}r();}}n.on("close",(i,a)=>o(i===0,a??void 0)),n.on("error",i=>o(false,i.code));})}function ir(){return new Promise(t=>{Le((e,r)=>t(e||!r?null:r));})}function Zn(){try{let t=Oe();if(t){Tt(x().version,t.latestVersion)&&(t.updatePriority==="auto"?Te(t.latestVersion):ye(t.latestVersion));return}setImmediate(()=>{Le((e,r)=>{e||!r||(we(r.version,r.updatePriority),Tt(x().version,r.version)&&(r.updatePriority==="auto"?Te(r.version):ye(r.version)));});});}catch{}}async function Qn(t={}){try{let e=Oe();if(e){if(!Tt(x().version,e.latestVersion))return}else {let n=await ir();if(!n||(we(n.version,n.updatePriority),!Tt(x().version,n.version)))return;e={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Te(e.latestVersion);return}if(!tt()){ye(e.latestVersion);return}await zn(e.latestVersion,t.timeoutMs)&&await or(e.latestVersion);}catch{}}function ts(){try{if(Oe())return;setImmediate(()=>{Le((t,e)=>{t||!e||Tt(x().version,e.version)&&we(e.version,e.updatePriority,0);});});}catch{}}var Se,sr,Xn,qn,Dt=E(()=>{"use strict";zt();sr=w__namespace.default.join(At__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Xn=1440*60*1e3,qn=3e3;});var cr={};z(cr,{BUFFER:()=>
|
|
26
|
+
`);}r();}}n.on("close",(i,a)=>o(i===0,a??void 0)),n.on("error",i=>o(false,i.code));})}function ir(){return new Promise(t=>{Le((e,r)=>t(e||!r?null:r));})}function Zn(){try{let t=Oe();if(t){Tt(x().version,t.latestVersion)&&(t.updatePriority==="auto"?Te(t.latestVersion):ye(t.latestVersion));return}setImmediate(()=>{Le((e,r)=>{e||!r||(we(r.version,r.updatePriority),Tt(x().version,r.version)&&(r.updatePriority==="auto"?Te(r.version):ye(r.version)));});});}catch{}}async function Qn(t={}){try{let e=Oe();if(e){if(!Tt(x().version,e.latestVersion))return}else {let n=await ir();if(!n||(we(n.version,n.updatePriority),!Tt(x().version,n.version)))return;e={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Te(e.latestVersion);return}if(!tt()){ye(e.latestVersion);return}await zn(e.latestVersion,t.timeoutMs)&&await or(e.latestVersion);}catch{}}function ts(){try{if(Oe())return;setImmediate(()=>{Le((t,e)=>{t||!e||Tt(x().version,e.version)&&we(e.version,e.updatePriority,0);});});}catch{}}var Se,sr,Xn,qn,Dt=E(()=>{"use strict";zt();sr=w__namespace.default.join(At__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Xn=1440*60*1e3,qn=3e3;});var cr={};z(cr,{BUFFER:()=>W,CLAUDE_DESKTOP:()=>R,COPILOT_OTEL:()=>g,DEBUG_LOG_FILENAME:()=>Ae,ENV:()=>d,FLOW_URLS:()=>rs,INSTALLER:()=>Qt,NATIVE_OTEL:()=>et,OTLP:()=>Zt,STATE_FILE_PREFIX:()=>ns,TRACE_LIMITS:()=>V,VALIDATION:()=>H,getFlowBaseUrl:()=>ar,getFlowUrls:()=>Z});function ar(){let t=process.env.FLOW_BASE_URL;return t&&t.trim()?t.trim():es}function Z(){let t=ar();return {GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}var es,rs,Zt,et,d,Qt,W,H,Ae,V,R,g,ns,U=E(()=>{"use strict";es="https://flow.ciandt.com";rs=Z(),Zt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},et={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},d={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_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"},Qt={LOCK_STALE_MS:3e4,CLI:"flow-ai-obs "},W={FILE_PREFIX:"flow-obs-buffer-",DEFAULT_TTL_DAYS:4,MIN_TTL_DAYS:1,MAX_TTL_DAYS:30,DEFAULT_MAX_FILES:50,MIN_MAX_FILES:1,MAX_MAX_FILES:500,REPLAY_BATCH_SIZE:10},H={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},Ae="flow-ai-obs-debug.log",V={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60},R={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"},g={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"},ns="flow-obs-";});function l(...t){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
|
|
27
27
|
`;try{m.writeFileSync(as,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
|
|
28
|
-
`);}}var as,
|
|
28
|
+
`);}}var as,M=E(()=>{"use strict";U();as=w.join(At.tmpdir(),Ae);});function lr(){return process.platform==="win32"?false:process.getuid?.()===0}function ur(){if(lr())return process.stderr.write(`
|
|
29
29
|
`+N(` \u2717 flow-ai-obs is not supported in a sudo context.
|
|
30
30
|
|
|
31
31
|
`)+j(` npm install -g @ciandt-flow/flow-ai-obs
|
|
32
32
|
`)+`
|
|
33
|
-
`),1}var Re=E(()=>{"use strict";ut();});function rt(t={}){let e=t.env??process.env,r=t.platform??process.platform;return !!(e.WSL_DISTRO_NAME&&r==="linux")}function xt(t,e={}){let r=e.env??process.env,n=e.spawnSync??child_process.spawnSync;if(!rt({env:r,platform:e.platform}))return;let s=r[t];if(!s)try{let i=n("cmd.exe",["/c","echo",`%${t}%`],{encoding:"utf8",timeout:5e3}).stdout?.trim();i&&/^[A-Za-z]:\\/.test(i)&&(s=i);}catch(o){l("resolveWslWindowsPath",`cmd.exe ${t} lookup failed: ${o.message}`);}if(s)return s.replace(/^([A-Za-z]):/,(o,i)=>`/mnt/${i.toLowerCase()}`).replace(/\\/g,"/")}function nt(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER)try{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}}catch(t){l("getActualUser",`getent passwd lookup failed: ${t.message}`);}return {home:At__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||At__namespace.userInfo().username}}function G(){if(rt()){let t=xt("USERPROFILE");return t?w__namespace.join(t,".claude","settings.json"):w__namespace.join(At__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||At__namespace.homedir();return w__namespace.join(t,".claude","settings.json")}return w__namespace.join(nt().home,".claude","settings.json")}var
|
|
33
|
+
`),1}var Re=E(()=>{"use strict";ut();});function rt(t={}){let e=t.env??process.env,r=t.platform??process.platform;return !!(e.WSL_DISTRO_NAME&&r==="linux")}function xt(t,e={}){let r=e.env??process.env,n=e.spawnSync??child_process.spawnSync;if(!rt({env:r,platform:e.platform}))return;let s=r[t];if(!s)try{let i=n("cmd.exe",["/c","echo",`%${t}%`],{encoding:"utf8",timeout:5e3}).stdout?.trim();i&&/^[A-Za-z]:\\/.test(i)&&(s=i);}catch(o){l("resolveWslWindowsPath",`cmd.exe ${t} lookup failed: ${o.message}`);}if(s)return s.replace(/^([A-Za-z]):/,(o,i)=>`/mnt/${i.toLowerCase()}`).replace(/\\/g,"/")}function nt(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER)try{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}}catch(t){l("getActualUser",`getent passwd lookup failed: ${t.message}`);}return {home:At__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||At__namespace.userInfo().username}}function G(){if(rt()){let t=xt("USERPROFILE");return t?w__namespace.join(t,".claude","settings.json"):w__namespace.join(At__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||At__namespace.homedir();return w__namespace.join(t,".claude","settings.json")}return w__namespace.join(nt().home,".claude","settings.json")}var Wt=E(()=>{"use strict";M();Re();});function te(){if(process.platform==="win32"){let r=process.env.APPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Roaming");return w__namespace.join(r,dr,fr)}let t=nt(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t.home,".config");return w__namespace.join(e,dr,fr)}function Pe(){let{getPersistedFlowBaseUrl:t}=(wt(),F(gr));return t()??null}var dr,fr,ke=E(()=>{"use strict";Wt();dr="flow-ai-obs",fr="config.json";});var gr={};z(gr,{addEnvToClaudeSettings:()=>Ue,getClaudeSettingsPath:()=>G,getEffectiveEnv:()=>Ce,getEnvFromClaudeSettings:()=>pt,getPersistedFlowBaseUrl:()=>Er,removeEnvFromClaudeSettings:()=>us,resolveFlowBaseUrl:()=>Ne,writeClaudeSettings:()=>be});function Ie(t){try{let e=m__namespace.statSync(t);Date.now()-e.mtimeMs>cs&&m__namespace.unlinkSync(t);}catch{}try{m__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 ve(t){try{m__namespace.unlinkSync(t);}catch{}}function ls(t){let e=[];if(!t.hooks||typeof t.hooks!="object"||Array.isArray(t.hooks))return delete t.hooks,e;let r=t.hooks,n={};for(let[s,o]of Object.entries(r)){if(!Array.isArray(o))continue;let i=o.map(a=>{if(!Array.isArray(a?.hooks))return null;let c=a.hooks.filter(u=>!u.command?.startsWith?.(Qt.CLI));return c.length>0?{...a,hooks:c}:null}).filter(a=>a!=null);i.length>0&&(n[s]=i,e.push(s));}return Object.keys(n).length>0?t.hooks=n:delete t.hooks,e}function be(t,e){let r=G(),n=r+".lock";m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:true}),Ie(n);try{if(m__namespace.existsSync(r)){m__namespace.copyFileSync(r,r+".bkp");try{m__namespace.chmodSync(r+".bkp",384);}catch{}}let s=te();if(m__namespace.existsSync(s)){let L=s+".bkp";m__namespace.copyFileSync(s,L);try{m__namespace.chmodSync(L,384);}catch{}}let o={};try{o=JSON.parse(m__namespace.readFileSync(r,"utf8"));}catch{}let i=o.env&&typeof o.env=="object"?o.env:{};delete i.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:a}=(U(),F(cr)),c=a().OTEL_ENDPOINT,u={...et,OTEL_EXPORTER_OTLP_ENDPOINT:t??c};o.env={...i,...u,...e??{}},o.otelHeadersHelper="flow-ai-obs otel-headers";let h=ls(o);m__namespace.writeFileSync(r,JSON.stringify(o,null,2)+`
|
|
34
34
|
`,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(r,384);}catch{}return st=void 0,{settingsPath:r,preserved:h}}finally{ve(n);}}function pt(t){if(st===void 0)try{let r=m__namespace.readFileSync(G(),"utf8");st=JSON.parse(r).env??null;}catch{st=null;}if(!st)return null;let e=st[t];return typeof e=="string"?e:null}function Ue(t){let e=G(),r=e+".lock";m__namespace.mkdirSync(w__namespace.dirname(e),{recursive:true}),Ie(r);try{let n={};try{n=JSON.parse(m__namespace.readFileSync(e,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,t),m__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
|
|
35
35
|
`,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(e,384);}catch{}st=void 0;}finally{ve(r);}}function us(t){let e=G(),r=e+".lock";m__namespace.mkdirSync(w__namespace.dirname(e),{recursive:true}),Ie(r);try{let n={};try{n=JSON.parse(m__namespace.readFileSync(e,"utf8"));}catch{return}if(!n.env||typeof n.env!="object")return;for(let s of t)delete n.env[s];m__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
|
|
36
|
-
`,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(e,384);}catch{}st=void 0;}finally{ve(r);}}function Ce(t){let e=process.env[t];return e!==void 0?e!==""?e:void 0:pt(t)??void 0}function Er(){let t=pt(d.FLOW_BASE_URL);return t&&t.trim()?t.trim():void 0}function Ne(){let t=process.env[d.FLOW_BASE_URL];return t&&t.trim()?t.trim():Er()}var cs,st,wt=E(()=>{"use strict";U();
|
|
36
|
+
`,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(e,384);}catch{}st=void 0;}finally{ve(r);}}function Ce(t){let e=process.env[t];return e!==void 0?e!==""?e:void 0:pt(t)??void 0}function Er(){let t=pt(d.FLOW_BASE_URL);return t&&t.trim()?t.trim():void 0}function Ne(){let t=process.env[d.FLOW_BASE_URL];return t&&t.trim()?t.trim():Er()}var cs,st,wt=E(()=>{"use strict";U();Wt();ke();cs=Qt.LOCK_STALE_MS;});function fs(t){return ds.some(e=>e.test(t))}function re(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[d.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&fs(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}function ms(t){let e=process.env[d.OTEL_EXPORTER_OTLP_HEADERS];if(!e)return null;let r=t.toLowerCase();for(let n of e.split(",")){let s=n.indexOf("=");if(!(s<=0)&&n.slice(0,s).trim().toLowerCase()===r){let o=n.slice(s+1),i=o.search(/[\r\n]/);return (i===-1?o:o.slice(0,i)).trim()||null}}return null}function K(){let t=Ce(d.FLOW_USER_EMAIL);if(t!==void 0){let r=t.replace(/[\r\n]/g,"").trim();if(r)if(r.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(r))l("resolveUserEmail","FLOW_USER_EMAIL contains non-printable or control characters \u2014 skipping");else return l("resolveUserEmail","using FLOW_USER_EMAIL override: [REDACTED]"),r}let e=ms("x-flow-user");if(e){let r=e.replace(/[\r\n]/g,"").trim();if(r.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(r))l("resolveUserEmail","x-flow-user from OTEL_EXPORTER_OTLP_HEADERS is empty or contains non-printable characters \u2014 skipping");else return l("resolveUserEmail","using x-flow-user from OTEL_EXPORTER_OTLP_HEADERS: [REDACTED]"),r}try{let r=At__namespace.default.userInfo().username||process.env.USERNAME||process.env.USER||"",n=r.lastIndexOf("\\");if(n!==-1&&(r=r.slice(n+1)),r=r.trim().replace(/[^a-zA-Z0-9._%+\-]/g,"").replace(/^\.+/,""),!r)return l("resolveUserEmail","Could not derive x-flow-user: username is empty. Run: flow-ai-obs init"),null;let s=`${r}@ciandt.com`;return l("resolveUserEmail","derived email: [REDACTED]"),s}catch(r){return l("resolveUserEmail",`Could not derive x-flow-user from OS username: ${r.message}. Run: flow-ai-obs init`),null}}function X(t){if(!t)return null;let e=t.replace(/[\r\n]/g,"").trim();return e?e.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(e)?e:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function $(){let t=process.env[d.FLOW_API_KEY];return X(t)}function gs(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function Lt(){let t=[],e=process.env[d.FLOW_TELEMETRY]==="true",r=process.env[d.LANGFUSE_BASE_URL],n=process.env[d.LANGFUSE_PUBLIC_KEY],s=process.env[d.LANGFUSE_SECRET_KEY];if(e&&r&&n&&s){let o={user:K()??"",tenant:"",team:"",project:""};t.push({mode:"direct",...gs(re(r),n,s),...o}),l("resolveCredentials","direct mode active",`user=${o.user}`);}return t}var ds,J=E(()=>{"use strict";U();M();wt();ds=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i,/(?:^|\.)localtest\.me\.?$/i,/(?:^|\.)lvh\.me\.?$/i,/(?:^|\.)vcap\.me\.?$/i];});function se(){return process.platform==="win32"||rt()}function Es(t){let e=t.match(/^\/mnt\/([a-z])\/(.*)$/);if(!e)return t;let r=e[1].toUpperCase(),n=e[2].replace(/\//g,"\\");return `${r}:\\${n}`}function _r(){if(rt()){let n=xt("LOCALAPPDATA");if(n){let s=w__namespace.join(n,R.DIR_3P);return ne(s)}}if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),s=w__namespace.join(n,R.DIR_3P);return ne(s)}if(process.platform==="darwin"){let n=w__namespace.join(At__namespace.homedir(),"Library","Application Support",R.DIR_3P);return ne(n)}let t=nt(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t.home,".config"),r=w__namespace.join(e,R.DIR_3P);return ne(r)}function ne(t){return {configDir:t,configLibraryDir:w__namespace.join(t,R.CONFIG_LIBRARY_DIR),desktopConfigPath:w__namespace.join(t,R.DESKTOP_CONFIG_FILE),metaPath:w__namespace.join(t,R.CONFIG_LIBRARY_DIR,R.META_FILE)}}function oe(){let t=G(),e=w__namespace.dirname(t),r=se()?R.WRAPPER_SCRIPT_WIN:R.WRAPPER_SCRIPT_UNIX;return w__namespace.join(e,r)}function ie(){if(process.env[d.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let t=_r();if(m__namespace.existsSync(t.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",w__namespace.join(At__namespace.homedir(),"Applications","Claude.app")].some(r=>m__namespace.existsSync(r));if(process.platform==="win32"){let e=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files";return [w__namespace.join(e,"AnthropicClaude","Claude.exe"),w__namespace.join(r,"Claude","Claude.exe")].some(s=>m__namespace.existsSync(s))}if(process.platform==="linux"){let e=nt(),r=process.env.XDG_CONFIG_HOME||w__namespace.join(e.home,".config"),n=w__namespace.join(r,"Claude");return m__namespace.existsSync(n)}return false}function hs(t){let e=t??oe();try{if(!m__namespace.existsSync(e))return null;let r=m__namespace.readFileSync(e,"utf8"),n=r.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(n&&n[1])return X(n[1]);let s=r.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(s&&s[1])return X(s[1])}catch{}return null}function Sr(t,e,r=448){let n=w__namespace.dirname(t);m__namespace.mkdirSync(n,{recursive:true});let s=se(),o=s?420:r,i=true;try{m__namespace.readFileSync(t,"utf8")===e&&(i=!1);}catch{}if(!i){if(!s)try{m__namespace.chmodSync(t,r);}catch{}return {written:false}}if(m__namespace.existsSync(t)&&(m__namespace.copyFileSync(t,t+".bkp"),!s))try{m__namespace.chmodSync(t+".bkp",448);}catch{}if(m__namespace.writeFileSync(t,e,{encoding:"utf8",mode:o}),!s)try{m__namespace.chmodSync(t,r);}catch{}return {written:true}}function _s(t){let e=oe(),r=t?X(t):null,n=se()?Tr(r):yr(r);return Sr(e,n,!!r?448:493),e}function yr(t){let e=t?X(t):null,r=["#!/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 e&&r.push(`export FLOW_API_KEY="${e}"`),r.push("exec flow-ai-obs otel-headers",""),r.join(`
|
|
37
37
|
`)}function Tr(t){let e=t?X(t):null,r=["@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 e&&r.push(`set FLOW_API_KEY=${e}`),r.push("flow-ai-obs otel-headers",""),r.join(`\r
|
|
38
38
|
`)}function Or(t){if(!ie())return {status:"skipped",reason:"Claude Desktop is not installed"};let e=X(t);if(!e)return {status:"skipped",reason:"Invalid API key provided"};try{let r=oe(),n=se()?Tr(e):yr(e),{written:s}=Sr(r,n,448);return {status:s?"configured":"already_configured",wrapperScriptPath:r}}catch(r){return {status:"skipped",reason:r.message}}}function ys(t){try{let e=m__namespace.readFileSync(t,"utf8");try{let r=JSON.parse(e);if(r.appliedId&&typeof r.appliedId=="string"&&Ss.test(r.appliedId))return r.appliedId;r.appliedId&&l("getOrCreateConfigUuid","appliedId is not a valid UUID \u2014 generating new UUID");}catch{l("getOrCreateConfigUuid",`corrupted JSON in ${t} \u2014 generating new UUID`);}}catch(e){e.code!=="ENOENT"&&l("getOrCreateConfigUuid",`read error: ${e.message}`);}return hr__namespace.randomUUID()}function Ts(t,e){let r=w__namespace.dirname(t);m__namespace.mkdirSync(r,{recursive:true});let n;try{let o=m__namespace.readFileSync(t,"utf8");try{n=JSON.parse(o),(!n.appliedId||typeof n.appliedId!="string")&&(n.appliedId=e),Array.isArray(n.entries)||(n.entries=[]);}catch{l("writeMetaJson",`corrupted JSON in ${t} \u2014 starting fresh`),n={appliedId:e,entries:[]};}}catch(o){o.code!=="ENOENT"&&l("writeMetaJson",`read error: ${o.message}`),n={appliedId:e,entries:[]};}n.entries.some(o=>o.id===e)||n.entries.push({id:e,name:R.CONFIG_NAME});let s=JSON.stringify(n,null,2)+`
|
|
39
39
|
`;try{if(m__namespace.readFileSync(t,"utf8")===s)return}catch{}if(m__namespace.existsSync(t)){m__namespace.copyFileSync(t,t+".bkp");try{m__namespace.chmodSync(t+".bkp",384);}catch{}}m__namespace.writeFileSync(t,s,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(t,384);}catch{}}function Os(t,e,r,n){m__namespace.mkdirSync(t,{recursive:true});let s=w__namespace.resolve(t),o=w__namespace.resolve(t,`${e}.json`);if(!o.startsWith(s+w__namespace.sep))throw new Error(`Security error: invalid config path ${o}`);let i={};try{let c=m__namespace.readFileSync(o,"utf8");try{i=JSON.parse(c);}catch{l("writeConfigLibraryFile",`corrupted JSON in ${o} \u2014 starting fresh`);}}catch(c){c.code!=="ENOENT"&&l("writeConfigLibraryFile",`read error: ${c.message}`);}i[R.KEYS.OTLP_ENDPOINT]=r,i[R.KEYS.OTLP_PROTOCOL]=R.OTLP_PROTOCOL,i[R.KEYS.OTLP_HEADERS_HELPER]=rt()?Es(n):n,i[R.KEYS.OTLP_RESOURCE_ATTRIBUTES]={[R.CUSTOM_PROVIDER_KEY]:R.CUSTOM_PROVIDER_VALUE};let a=JSON.stringify(i,null,2)+`
|
|
40
40
|
`;try{if(m__namespace.readFileSync(o,"utf8")===a)return o}catch{}if(m__namespace.existsSync(o)){m__namespace.copyFileSync(o,o+".bkp");try{m__namespace.chmodSync(o+".bkp",384);}catch{}}m__namespace.writeFileSync(o,a,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(o,384);}catch{}return o}function ws(t){let e=w__namespace.dirname(t);m__namespace.mkdirSync(e,{recursive:true});let r={};try{let n=m__namespace.readFileSync(t,"utf8");try{r=JSON.parse(n);}catch{l("mergeClaudeDesktopConfig",`corrupted JSON in ${t} \u2014 starting fresh (original backed up to .bkp)`);}}catch(n){n.code!=="ENOENT"&&l("mergeClaudeDesktopConfig",`read error: ${n.message}`);}if(r.deploymentMode!==R.DEPLOYMENT_MODE){if(m__namespace.existsSync(t)){m__namespace.copyFileSync(t,t+".bkp");try{m__namespace.chmodSync(t+".bkp",384);}catch{}}r.deploymentMode=R.DEPLOYMENT_MODE,m__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
|
|
41
|
-
`,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(t,384);}catch{}}}function wr(t,e){if(!ie())return {configured:false};let r=_r(),n=t??Z().OTEL_ENDPOINT,s=e!==void 0?e:$()??hs(oe()),o=_s(s),i=ys(r.metaPath),a=Os(r.configLibraryDir,i,n,o);return Ts(r.metaPath,i),ws(r.desktopConfigPath),{configured:true,configDir:r.configDir,configLibraryPath:a,uuid:i,wrapperScriptPath:o}}var Ss,$e=E(()=>{"use strict";U();
|
|
41
|
+
`,{encoding:"utf8",mode:384});try{m__namespace.chmodSync(t,384);}catch{}}}function wr(t,e){if(!ie())return {configured:false};let r=_r(),n=t??Z().OTEL_ENDPOINT,s=e!==void 0?e:$()??hs(oe()),o=_s(s),i=ys(r.metaPath),a=Os(r.configLibraryDir,i,n,o);return Ts(r.metaPath,i),ws(r.desktopConfigPath),{configured:true,configDir:r.configDir,configLibraryPath:a,uuid:i,wrapperScriptPath:o}}var Ss,$e=E(()=>{"use strict";U();Wt();J();M();Ss=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;});function De(){if(rt()){let r=xt("APPDATA");return r?w__namespace.join(r,"Code","User","settings.json"):null}if(process.platform==="win32"){let r=process.env.APPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Roaming");return w__namespace.join(r,"Code","User","settings.json")}if(process.platform==="darwin")return w__namespace.join(At__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let t=process.platform==="linux"&&process.getuid?.()===0?nt().home:process.env.HOME||At__namespace.homedir(),e=process.env.XDG_CONFIG_HOME||w__namespace.join(t,".config");return w__namespace.join(e,"Code","User","settings.json")}function Lr(t){let e=false,r=false,n="";for(let s=0;s<t.length;s++){let o=t[s];if(e){n+=o,r?r=false:o==="\\"?r=true:o==='"'&&(e=false);continue}if(o==='"'){e=true,n+=o;continue}if(o===","){let i=s+1;for(;i<t.length&&/\s/.test(t[i]);)i++;if(i<t.length&&(t[i]==="}"||t[i]==="]"))continue}n+=o;}return n}function ae(t){if(process.env[d.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(t&&m__namespace.existsSync(t));if(t&&(m__namespace.existsSync(t)||m__namespace.existsSync(w__namespace.dirname(t))||m__namespace.existsSync(w__namespace.dirname(w__namespace.dirname(t)))))return true;let e=De();if(e&&(m__namespace.existsSync(e)||m__namespace.existsSync(w__namespace.dirname(e))||m__namespace.existsSync(w__namespace.dirname(w__namespace.dirname(e))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",w__namespace.join(At__namespace.homedir(),"Applications","Visual Studio Code.app")].some(n=>m__namespace.existsSync(n)))return true;if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||w__namespace.join(At__namespace.homedir(),"AppData","Local"),n=process.env.PROGRAMFILES||"C:\\Program Files",s=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([w__namespace.join(r,"Programs","Microsoft VS Code","Code.exe"),w__namespace.join(n,"Microsoft VS Code","Code.exe"),w__namespace.join(s,"Microsoft VS Code","Code.exe")].some(i=>m__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(n=>m__namespace.existsSync(n)))}function Ar(t,e={}){let r;try{r=e.customSettingsPath||De();}catch(n){return {status:"skipped",reason:`VS Code path resolution failed: ${n.message}`}}if(!r)return {status:"skipped",reason:"VS Code path not found"};if(!ae(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(m__namespace.existsSync(r))try{let p=Lr(m__namespace.readFileSync(r,"utf8"));n=JSON.parse(p);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=t||Z().OTEL_ENDPOINT,o=e.apiKey!==void 0?e.apiKey:$(),i=e.userEmail!==void 0?e.userEmail:K(),a=typeof n[g.HEADERS_KEY]=="object"&&n[g.HEADERS_KEY]!==null&&!Array.isArray(n[g.HEADERS_KEY])?n[g.HEADERS_KEY]:{},c={...a};o&&(c[g.HEADER_API_KEY]=o),i&&(c[g.HEADER_USER]=i);let u=Object.keys(c),h=Object.keys(a),L=u.length===0&&(n[g.HEADERS_KEY]===void 0||h.length===0)||u.length===h.length&&u.every(p=>a[p]===c[p]);if(n[g.ENABLED_KEY]===g.ENABLED_VALUE&&n[g.EXPORTER_TYPE_KEY]===g.EXPORTER_TYPE_VALUE&&n[g.PROTOCOL_KEY]===g.PROTOCOL_VALUE&&n[g.ENDPOINT_KEY]===s&&L)return {status:"already_configured",settingsPath:r};m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:!0});let A={...n,[g.ENABLED_KEY]:g.ENABLED_VALUE,[g.EXPORTER_TYPE_KEY]:g.EXPORTER_TYPE_VALUE,[g.PROTOCOL_KEY]:g.PROTOCOL_VALUE,[g.ENDPOINT_KEY]:s};return u.length>0&&(A[g.HEADERS_KEY]=c),m__namespace.writeFileSync(r,JSON.stringify(A,null,2)+`
|
|
42
42
|
`,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}function Rr(t,e={}){let r;try{r=e.customSettingsPath||De();}catch(n){return {status:"skipped",reason:`VS Code path resolution failed: ${n.message}`}}if(!r)return {status:"skipped",reason:"VS Code path not found"};if(!ae(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(m__namespace.existsSync(r))try{let a=Lr(m__namespace.readFileSync(r,"utf8"));n=JSON.parse(a);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=typeof n[g.HEADERS_KEY]=="object"&&n[g.HEADERS_KEY]!==null&&!Array.isArray(n[g.HEADERS_KEY])?n[g.HEADERS_KEY]:{};if(s[g.HEADER_API_KEY]===t)return {status:"already_configured",settingsPath:r};let o={...s,[g.HEADER_API_KEY]:t};m__namespace.mkdirSync(w__namespace.dirname(r),{recursive:!0});let i={...n,[g.ENABLED_KEY]:n[g.ENABLED_KEY]??g.ENABLED_VALUE,[g.EXPORTER_TYPE_KEY]:n[g.EXPORTER_TYPE_KEY]??g.EXPORTER_TYPE_VALUE,[g.PROTOCOL_KEY]:n[g.PROTOCOL_KEY]??g.PROTOCOL_VALUE,[g.ENDPOINT_KEY]:n[g.ENDPOINT_KEY]??Z().OTEL_ENDPOINT,[g.HEADERS_KEY]:o};return m__namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
|
|
43
|
-
`,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}var Fe=E(()=>{"use strict";U();J();
|
|
43
|
+
`,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}var Fe=E(()=>{"use strict";U();J();Wt();});var Ir={};z(Ir,{normalizeCustomUrl:()=>kr,runInit:()=>Rs,validateCustomUrl:()=>Ke,validateEmail:()=>Me});function xe(t,e,r){process.stdout.write(b(j(`
|
|
44
44
|
[${t}/${e}] ${r}
|
|
45
45
|
`)));}function dt(t){process.stdout.write(` ${v("\u2713")} ${t}
|
|
46
46
|
`);}function ft(t){process.stdout.write(` ${C("\u26A0")} ${t}
|
|
@@ -54,14 +54,14 @@
|
|
|
54
54
|
Received: ${t}
|
|
55
55
|
Expected: https://tenant.example.com`);if(i.username||i.password)throw new Error(`Custom URL must not contain embedded credentials.
|
|
56
56
|
Received: ${t}
|
|
57
|
-
Expected: https://tenant.example.com`);if(!i.hostname.includes("."))throw new Error(`Invalid domain: ${i.hostname}. Expected format: tenant.example.com`);let a=`${i.protocol}//${i.host}`,c=process.env[d.FLOW_OBS_ALLOW_HTTP];try{delete process.env[d.FLOW_OBS_ALLOW_HTTP],re(a);}finally{c!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=c);}return a}let r=kr(t),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${t}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!n.hostname.includes("."))throw new Error(`Invalid domain: ${n.hostname}. Expected format: tenant.example.com`);let s=process.env[d.FLOW_OBS_ALLOW_HTTP];try{delete process.env[d.FLOW_OBS_ALLOW_HTTP],re(r);}finally{s!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function
|
|
57
|
+
Expected: https://tenant.example.com`);if(!i.hostname.includes("."))throw new Error(`Invalid domain: ${i.hostname}. Expected format: tenant.example.com`);let a=`${i.protocol}//${i.host}`,c=process.env[d.FLOW_OBS_ALLOW_HTTP];try{delete process.env[d.FLOW_OBS_ALLOW_HTTP],re(a);}finally{c!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=c);}return a}let r=kr(t),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${t}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);if(!n.hostname.includes("."))throw new Error(`Invalid domain: ${n.hostname}. Expected format: tenant.example.com`);let s=process.env[d.FLOW_OBS_ALLOW_HTTP];try{delete process.env[d.FLOW_OBS_ALLOW_HTTP],re(r);}finally{s!==void 0&&(process.env[d.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function We(){for(let t=1;t<=3;t++)try{let e=await qt(" Enter your Flow domain (e.g., tenant.ciandt.com)");return Ke(e)}catch(e){if(process.stderr.write(C(` \u2717 ${e.message}
|
|
58
58
|
|
|
59
59
|
`)),t===3)throw process.stderr.write(N(` Too many invalid attempts.
|
|
60
60
|
|
|
61
|
-
`)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function Pr(t){return t.replace(/[\r\n]/g,"").trim()}function
|
|
61
|
+
`)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function Pr(t){return t.replace(/[\r\n]/g,"").trim()}function Me(t){if(t.length>254)return "Email must not exceed 254 characters";if(/\s/.test(t))return "Email must not contain spaces";if((t.match(/@/g)??[]).length!==1)return "Email must contain exactly one @";let e=t.indexOf("@");if(e<=0)return "Email must contain a local part before @";let r=t.slice(e+1);if(!r)return "Email must contain a domain after @";if(r.startsWith("."))return `Invalid email domain: ${r}`;if(/^\d{1,3}(\.\d{1,3}){3}$/.test(r))return "Email domain cannot be an IP address";try{let n=new URL(`https://${r}`);if(!n.hostname.includes("."))return "Email domain must contain at least one dot";if(n.pathname!=="/"||n.search||n.hash||n.port)return `Invalid email domain: ${r}`}catch(n){return l("validateEmail",`URL parse error for domain ${r}: ${n.message}`),`Invalid email domain: ${r}`}return null}async function As(t,e,r){let n=pt(d.FLOW_USER_EMAIL),s=K(),o=s??"(could not be derived)";if(!t||!tt()){if(r){let c=Pr(r);if(!c)throw new Error("--custom-email: value is empty after normalization");let u=Me(c);if(u)throw new Error(`--custom-email: ${u}`);return dt(`Email: ${b(c)}`),c}return n??s?dt(`Email: ${b(n??s)}`):ft(`Email not configured \u2014 telemetry will not include user identity.
|
|
62
62
|
To set it: flow-ai-obs init --custom-email <you@company.com>`),null}r&&ft("--custom-email is ignored in interactive mode. Use --no-interactive to apply it.");async function i(){for(let c=1;c<=3;c++){let u;try{u=await qt(" Enter your corporate email (e.g., user@company.com)");}catch(I){throw process.stderr.write(N(` \u2717 Input error: ${I.message}
|
|
63
63
|
|
|
64
|
-
`)),I}let h=Pr(u),L=
|
|
64
|
+
`)),I}let h=Pr(u),L=Me(h);if(!L)return h;process.stderr.write(C(` \u2717 ${L}
|
|
65
65
|
|
|
66
66
|
`));}throw process.stderr.write(N(` Too many invalid attempts.
|
|
67
67
|
|
|
@@ -88,10 +88,10 @@
|
|
|
88
88
|
`)+C(" on Windows too: ")+j(`npm install -g @ciandt-flow/flow-ai-obs
|
|
89
89
|
`)+C(` Without the Windows install, observability will not work for the Windows-side code assistant.
|
|
90
90
|
|
|
91
|
-
`)),Ls(),!r&&!t.noInteractive&&tt()){let p=ce();o?r=await
|
|
91
|
+
`)),Ls(),!r&&!t.noInteractive&&tt()){let p=ce();o?r=await We():p?(process.stdout.write(`
|
|
92
92
|
Current base URL: ${b(p)}
|
|
93
|
-
`),await yt(" Keep this URL?",true)||(r=await
|
|
94
|
-
`),await yt(" Does your organization use a custom Flow URL?",false)?r=await
|
|
93
|
+
`),await yt(" Keep this URL?",true)||(r=await We())):(process.stdout.write(`
|
|
94
|
+
`),await yt(" Does your organization use a custom Flow URL?",false)?r=await We():dt("Using default Flow Base URL: https://flow.ciandt.com")),process.stdout.write(`
|
|
95
95
|
`);}if(!r&&!t.noInteractive&&!tt()){let p=ce();if(p)process.stdout.write(C(` \u26A0 Non-interactive environment detected.
|
|
96
96
|
`)+S(` Using URL: ${p}
|
|
97
97
|
|
|
@@ -132,12 +132,12 @@
|
|
|
132
132
|
|
|
133
133
|
`)+S(` Start your code assistant and begin working.
|
|
134
134
|
|
|
135
|
-
`))),0}var vr=E(()=>{"use strict";wt();U();ut();Re();ke();J();zt();
|
|
135
|
+
`))),0}var vr=E(()=>{"use strict";wt();U();ut();Re();ke();J();zt();M();$e();Fe();});function Ps(){return Ne()??null}async function br(){let t=Ps();if(!t)return {ok:false,baseUrl:"",user:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let n=new URL(t);if(n.protocol!=="https:"&&n.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:t,user:"",notConfigured:true,error:"NOT_CONFIGURED"}}if(!$()){let n=!!process.env[d.FLOW_API_KEY];return {ok:false,baseUrl:t,user:"",error:n?"FLOW_API_KEY is set but invalid":"No credentials found"}}let r=K();return r?{ok:true,baseUrl:t,user:r}:{ok:false,baseUrl:t,user:"",error:"FLOW_API_KEY is set but x-flow-user could not be resolved"}}var Ur=E(()=>{"use strict";J();wt();U();});var Mr={};z(Mr,{runStatus:()=>Is});function Cr(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function ks(t){process.stdout.write(` ${v("\u2713")} ${t}
|
|
136
136
|
`);}function Nr(t){process.stdout.write(` ${C("\u26A0")} ${t}
|
|
137
|
-
`);}function
|
|
137
|
+
`);}function Ye(t){process.stdout.write(` ${v("\u2713")} ${t}
|
|
138
138
|
`);}function $r(t){process.stdout.write(` ${C("\u26A0")} ${t}
|
|
139
139
|
`);}function le(t){process.stdout.write(` ${N("\u2717")} ${t}
|
|
140
|
-
`);}function
|
|
140
|
+
`);}function Yt(t){process.stdout.write(` ${S(t)}
|
|
141
141
|
`);}function Dr(t){process.stdout.write(b(j(`
|
|
142
142
|
${t}
|
|
143
143
|
`)));}function Fr(t,e=false){let r=e?`${C("\u26A0")} ${b(C(t))}`:b(t);process.stdout.write(`
|
|
@@ -149,11 +149,11 @@
|
|
|
149
149
|
`),process.stdout.write(` ${S("User: ")}${t.user}
|
|
150
150
|
`),process.stdout.write(` ${S("Storage: FLOW_API_KEY (environment)")}
|
|
151
151
|
`);else {let c=t.error==="FLOW_API_KEY is set but x-flow-user could not be resolved"?"Run `flow-ai-obs init --custom-email <EMAIL>`.":"Set FLOW_API_KEY and run `flow-ai-obs init`.";Nr(`${t.error}. ${c}`),process.stdout.write(` ${S("URL: ")}${t.baseUrl}
|
|
152
|
-
`);}let e={},r={};try{let c=m__namespace.readFileSync(G(),"utf8");r=JSON.parse(c),e=r.env||{};}catch{}Dr("Observability configuration (OpenTelemetry)");let n=Object.keys(et).filter(c=>!e[c]);Fr("Metrics and Logs",n.length>0),n.length===0?(
|
|
152
|
+
`);}let e={},r={};try{let c=m__namespace.readFileSync(G(),"utf8");r=JSON.parse(c),e=r.env||{};}catch{}Dr("Observability configuration (OpenTelemetry)");let n=Object.keys(et).filter(c=>!e[c]);Fr("Metrics and Logs",n.length>0),n.length===0?(Ye("All OTEL env vars present in settings.json"),Yt(`Endpoint: ${e.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
|
|
153
153
|
`),process.stdout.write(` ${S("Run: flow-ai-obs init (restores missing vars automatically)")}
|
|
154
154
|
`),process.stdout.write(`
|
|
155
155
|
`),$r(`${n.length} OTEL var(s) missing from settings.json`),n.forEach(c=>le(`Missing: ${c}`))),xr();for(let c of Object.keys(et)){let u=e[c]??N("(missing)");process.stdout.write(S(` ${c.padEnd(36)}`)+u+`
|
|
156
|
-
`);}Fr("Trace Destination");let s=process.env[d.FLOW_TELEMETRY]==="true",o=process.env[d.LANGFUSE_BASE_URL],i=process.env[d.LANGFUSE_PUBLIC_KEY],a=process.env[d.LANGFUSE_SECRET_KEY];if(s)if(o&&i&&a){let c=await Lt();for(let u of c)u.mode==="direct"&&(
|
|
156
|
+
`);}Fr("Trace Destination");let s=process.env[d.FLOW_TELEMETRY]==="true",o=process.env[d.LANGFUSE_BASE_URL],i=process.env[d.LANGFUSE_PUBLIC_KEY],a=process.env[d.LANGFUSE_SECRET_KEY];if(s)if(o&&i&&a){let c=await Lt();for(let u of c)u.mode==="direct"&&(Ye("FLOW_TELEMETRY=true (direct mode enabled)"),Ye("Mode: direct"),Yt(`Endpoint: ${u.endpoint}`),Yt(`PK: ${Cr(i)}`),Yt(`SK: ${Cr(a)}`));}else $r("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),o||le("LANGFUSE_BASE_URL not set"),i||le("LANGFUSE_PUBLIC_KEY not set"),a||le("LANGFUSE_SECRET_KEY not set");else Yt("No active tracing destination configured.");return xr(),0}var Kr=E(()=>{"use strict";J();wt();U();ut();Ur();});var Yr={};z(Yr,{runUpdateApiKey:()=>vs});async function vs(t={}){let e=t.key!==void 0?X(t.key):$();if(!e)return t.key!==void 0?process.stderr.write(N(` \u2717 Provided API key is invalid.
|
|
157
157
|
`)+S(` Ensure the key contains valid characters and does not exceed 1024 characters.
|
|
158
158
|
|
|
159
159
|
`)):process.stderr.write(N(` \u2717 FLOW_API_KEY environment variable is not set or is invalid.
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
`)):s.status==="already_configured"?process.stdout.write(v(` \u2713 Claude Desktop API key is already up to date in ${s.wrapperScriptPath}
|
|
168
168
|
`)):s.reason?.includes("not installed")?process.stdout.write(S(` \u2139 Claude Desktop is not installed \u2014 skipping Desktop API key update.
|
|
169
169
|
`)):(process.stderr.write(N(` \u2717 Claude Desktop API key update failed: ${s.reason}
|
|
170
|
-
`)),r=true),r?1:0}var
|
|
170
|
+
`)),r=true),r?1:0}var Br=E(()=>{"use strict";J();Fe();$e();ut();});var jr={};z(jr,{runOtelHeaders:()=>bs});async function bs(){let t=$();if(!t)return process.stderr.write(process.env[d.FLOW_API_KEY]?`[flow-ai-obs otel-headers] FLOW_API_KEY is set but its value was rejected (invalid characters or length).
|
|
171
171
|
Set a valid FLOW_API_KEY in the environment used by your code assistant, then restart it.
|
|
172
172
|
`:`[flow-ai-obs otel-headers] FLOW_API_KEY is not set.
|
|
173
173
|
Set FLOW_API_KEY in the environment used by your code assistant, then restart it.
|
|
@@ -175,43 +175,43 @@
|
|
|
175
175
|
Run: flow-ai-obs init --custom-email <EMAIL>
|
|
176
176
|
`),1;let r=s=>s.replace(/[\r\n]/g,""),n={"x-flow-api-key":r(t),"x-flow-user":r(e)};return process.stdout.write(JSON.stringify(n)+`
|
|
177
177
|
`),0}var Hr=E(()=>{"use strict";J();U();});function q(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function ue(t,e=100){return String(t??"").split(`
|
|
178
|
-
`)[0].slice(0,e).trim()}function
|
|
178
|
+
`)[0].slice(0,e).trim()}function Bt(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function D(t){process.stdout.write(JSON.stringify(t));}var kt=E(()=>{"use strict";});function ot(){return String(BigInt(Date.now())*1000000n)}var Be,mt,jt=E(()=>{"use strict";Be=()=>hr.randomBytes(16).toString("hex"),mt=()=>hr.randomBytes(8).toString("hex");});function Ys(t,e){let r=w.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function je(t){if(!Ms.test(t))throw new Error(`Invalid session ID: ${t}`);return Ys(w.join(At.tmpdir(),`flow-obs-${t}.json`),Ks)}function It(t){let e;try{e=je(t);}catch{return null}if(!m.existsSync(e))return null;try{return JSON.parse(m.readFileSync(e,"utf8"))}catch{return null}}function vt(t,e){m.writeFileSync(je(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function He(t){try{m.unlinkSync(je(t));}catch{}}var Ms,Ks,Ht=E(()=>{"use strict";Ms=/^[0-9a-f-]{1,64}$/i,Ks=w.normalize(At.tmpdir())+w.sep;});function qr(t){if(!t||!m.existsSync(t))return null;try{let e=m.readFileSync(t,"utf8").trimEnd().split(`
|
|
179
179
|
`);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function Ve(t){if(!t||!m.existsSync(t))return null;try{let e=m.readFileSync(t,"utf8").trimEnd().split(`
|
|
180
180
|
`),r=[],n=0,s=0,o;for(let i=e.length-1;i>=0;i--)try{let a=JSON.parse(e[i]);if(a.type==="user")break;if(a.type==="assistant"){!o&&a.message?.model&&(o=a.message.model);let u=(a.message?.content??[]).filter(L=>L.type==="text").map(L=>L.text??"").join("");u&&r.unshift(u);let h=a.message?.usage??{};n+=(h.input_tokens??0)+(h.cache_read_input_tokens??0)+(h.cache_creation_input_tokens??0),s+=h.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
|
|
181
181
|
|
|
182
182
|
`),inputTokens:n,outputTokens:s,model:o}}catch{}return null}var Ge=E(()=>{"use strict";});function Qr(t){return t.replace(":","/")}function pe(t,e){if(!t)return null;let r=Qr(t),n=[w.join(At.homedir(),".claude","skills",r,"SKILL.md"),w.join(e??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(m.existsSync(s))try{return m.readFileSync(s,"utf8")}catch{}return null}function tn(t){return t.split(`
|
|
183
|
-
`)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function en(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Xs.has(n.tool))?"complete":"prerequisite_required":null}function de(t,e){if(!t)return null;let r=Qr(t),n=[w.join(At.homedir(),".claude","skills",r),w.join(e??"",".claude","skills",r)],s=null;for(let a of n)if(m.existsSync(w.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let u of m.readdirSync(a,{withFileTypes:true})){if(Vs.has(u.name)||Js.has(u.name)||Gs.has(w.extname(u.name)))continue;let h=c?`${c}/${u.name}`:u.name;u.isDirectory()?i(w.join(a,u.name),h):o.push(h);}}return i(s,""),o.length>0?o:null}var Vs,Gs,Js,Xs,fe=E(()=>{"use strict";Vs=new Set([".venv","__pycache__",".git","node_modules"]),Gs=new Set([".pyc",".pyo"]),Js=new Set(["SKILL.md",".DS_Store",".gitignore"]);Xs=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});async function rn(t){let e=t.session_id||"unknown",r=t.prompt||"",n=t.cwd||"",s=qr(t.transcript_path)||
|
|
184
|
-
`,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${ln}`);}catch(i){l("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function ro(t){let e=new URL(t),r=new URL(Z().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function pn(t,e){return new Promise((r,n)=>{let s=t._isSSL?Vn__default.default:Zs__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=s.request(t,i=>{let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>r({statusCode:i.statusCode??0,body:a.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}async function dn(t,e){let r;try{r=ro(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let o=await pn({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:s,_isSSL:n},null);return l("checkHealth",`url=${r.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function me(t,e,r){let n=JSON.stringify(t),s=new URL(e),o=s.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};l("sendTraces:request",`POST ${e}`),l("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:i.slice(0,20)+"\u2026"})}`),l("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let c=await pn({hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname,method:"POST",headers:a,_isSSL:o},n);return l("sendTraces:response",`status=${c.statusCode}`),un(e,a,n,c.statusCode,c.body),c.statusCode}catch(c){return l("sendTraces:error",c.message),un(e,a,n,0,c.message),0}}var ln,fn=E(()=>{"use strict";U();
|
|
185
|
-
${
|
|
186
|
-
${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${
|
|
187
|
-
`)),p=u?.inputTokens??0,O=u?.outputTokens??0,ct=i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""} (${y.durationMs}ms)`),Ut=!!(n.slashSkill||i.some(y=>y.tool==="Skill")),Gt=i.some(y=>y.tool==="Agent");if(!Ut&&!Gt){l("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),He(e),D(t);return}let Jt=Ut?"skill":"agent",Xt=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),ht=u?.model||"",ge=Rn(ht,p,O),Q=en(n);Q==="prerequisite_required"&&u?.text&&(Q="complete"),Q==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:mt(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:gt(f(T.OBS_NAME,"prerequisite-check"),f(T.OBS_TYPE,"EVENT"),f(T.OBS_LEVEL,"WARNING"),f(T.OBS_OUTPUT,A),f("skill.name",n.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),l("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let Ct=(()=>{if(!(!Ut||!n.prompt)){if(n.slashSkill){let y=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return y?q(at(y),V.USER_INSTRUCTION):void 0}return q(at(n.prompt),V.USER_INSTRUCTION)||void 0}})(),_t=JSON.stringify({trace_type:Jt,...Q!==null&&{execution_status:Q},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Ct!==void 0&&{user_instruction:Ct},latency_ms:Xt,...p&&{tokens_input:p},...O&&{tokens_output:O},cost_usd:ge,...ht?{model:ht}:{},toolCount:L,errorCount:I,stopReason:r,sessionId:n.sessionId,tools:ct.length?ct:void 0}),Qe=at(q(n.prompt,V.TRACE_INPUT)),Cn=gt(f(T.TRACE_NAME,n.traceName),f(T.TRACE_INPUT,Qe),f(T.TRACE_OUTPUT,A),f(T.OBS_INPUT,Qe),f(T.OBS_OUTPUT,A),f(T.TRACE_METADATA,_t),f(T.SESSION_ID,n.sessionId),f(T.USER_ID,o),f(T.OBS_TYPE,"GENERATION"),f(T.MODEL,ht),p?f(T.INPUT_TOKENS,p):null,O?f(T.OUTPUT_TOKENS,O):null,f("claude.stop_reason",r),f("claude.tool_count",String(L)),f("claude.error_count",String(I)),f("claude.session_id",n.sessionId),f("flow.trace_type",Jt),{key:T.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Jt}]}}}),Nn={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Cn,status:{code:I>0?2:1}},$n=gt(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),tr=[...a,Nn];l("Stop",`sid=${e}`,`totalTools=${L}`,`errorTools=${I}`,`spans=${tr.length}`,`inputTokens=${p}`,`outputTokens=${O}`,`traceOutput="${ue(A,80)}"`);let Dn=await yn(an($n,tr));l("Stop",`POST status=${Dn}`,`traceId=${n.traceId}`,`latencyMs=${Xt}`,`costUsd=${ge}`),He(e),D(t);}var In=E(()=>{"use strict";jt();Ht();qe();J();Pn();Ge();kt();
|
|
183
|
+
`)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function en(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||Xs.has(n.tool))?"complete":"prerequisite_required":null}function de(t,e){if(!t)return null;let r=Qr(t),n=[w.join(At.homedir(),".claude","skills",r),w.join(e??"",".claude","skills",r)],s=null;for(let a of n)if(m.existsSync(w.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let u of m.readdirSync(a,{withFileTypes:true})){if(Vs.has(u.name)||Js.has(u.name)||Gs.has(w.extname(u.name)))continue;let h=c?`${c}/${u.name}`:u.name;u.isDirectory()?i(w.join(a,u.name),h):o.push(h);}}return i(s,""),o.length>0?o:null}var Vs,Gs,Js,Xs,fe=E(()=>{"use strict";Vs=new Set([".venv","__pycache__",".git","node_modules"]),Gs=new Set([".pyc",".pyo"]),Js=new Set(["SKILL.md",".DS_Store",".gitignore"]);Xs=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});async function rn(t){let e=t.session_id||"unknown",r=t.prompt||"",n=t.cwd||"",s=qr(t.transcript_path)||Be(),o=tn(r),i=o?pe(o,n):null,a=o?de(o,n):null;vt(e,{traceId:Be(),spanId:mt(),startNs:ot(),sessionId:e,prompt:r,cwd:n,traceName:s,transcriptPath:t.transcript_path||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:o,skillContent:i,skillArtifacts:a}),l("UserPromptSubmit",`sid=${e}`,`traceName=${s}`,`slashSkill=${o}`),D(t);}var nn=E(()=>{"use strict";jt();Ht();Ge();fe();kt();M();});async function sn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=It(e);s&&(s.pendingTool={name:r,inputStr:q(n,V.TOOL_INPUT),startNs:ot()},vt(e,s)),l("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!s}`),D(t);}var on=E(()=>{"use strict";jt();Ht();kt();M();U();});function f(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function gt(...t){return t.filter(e=>e!==null)}function an(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:qs,spans:Array.isArray(e)?e:[e]}]}]}}var qs,T,cn=E(()=>{"use strict";U();qs={name:Zt.SCOPE_NAME,version:Zt.SCOPE_VERSION},T={TRACE_NAME:"langfuse.trace.name",TRACE_INPUT:"langfuse.trace.input",TRACE_OUTPUT:"langfuse.trace.output",TRACE_METADATA:"langfuse.trace.metadata",TRACE_TAGS:"langfuse.trace.tags",USER_ID:"langfuse.user.id",SESSION_ID:"langfuse.session.id",OBS_NAME:"langfuse.observation.name",OBS_INPUT:"langfuse.observation.input",OBS_OUTPUT:"langfuse.observation.output",OBS_LEVEL:"langfuse.observation.level",OBS_TYPE:"langfuse.observation.type",MODEL:"gen_ai.request.model",INPUT_TOKENS:"gen_ai.usage.input_tokens",OUTPUT_TOKENS:"gen_ai.usage.output_tokens"};});function un(t,e,r,n,s){if(process.env[d.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:s}});try{m.writeFileSync(ln,o+`
|
|
184
|
+
`,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${ln}`);}catch(i){l("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function ro(t){let e=new URL(t),r=new URL(Z().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function pn(t,e){return new Promise((r,n)=>{let s=t._isSSL?Vn__default.default:Zs__default.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=s.request(t,i=>{let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>r({statusCode:i.statusCode??0,body:a.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}async function dn(t,e){let r;try{r=ro(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let o=await pn({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:s,_isSSL:n},null);return l("checkHealth",`url=${r.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function me(t,e,r){let n=JSON.stringify(t),s=new URL(e),o=s.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};l("sendTraces:request",`POST ${e}`),l("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:i.slice(0,20)+"\u2026"})}`),l("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let c=await pn({hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname,method:"POST",headers:a,_isSSL:o},n);return l("sendTraces:response",`status=${c.statusCode}`),un(e,a,n,c.statusCode,c.body),c.statusCode}catch(c){return l("sendTraces:error",c.message),un(e,a,n,0,c.message),0}}var ln,fn=E(()=>{"use strict";U();M();ln=w.join(At.tmpdir(),"flow-obs-requests.ndjson");});function no(){let t=parseInt(process.env[d.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max(W.MIN_TTL_DAYS,Math.min(W.MAX_TTL_DAYS,t)):W.DEFAULT_TTL_DAYS)*24*60*60*1e3}function so(){let t=parseInt(process.env[d.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max(W.MIN_MAX_FILES,Math.min(W.MAX_MAX_FILES,t)):W.DEFAULT_MAX_FILES}function gn(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return w__namespace.default.join(At__namespace.default.tmpdir(),`${W.FILE_PREFIX}${t}.json`)}function Xe(){let t=At__namespace.default.tmpdir(),e;try{e=m__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith(W.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=w__namespace.default.join(t,r),s=0;try{s=m__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function Vt(t){try{let e=so(),r=Xe();if(r.length>=e){let o=r.slice(0,r.length-e+1);for(let i of o)try{m__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:t};return m__namespace.default.writeFileSync(gn(n),JSON.stringify(s),{encoding:"utf8",mode:384}),l("buffer",`saved fileId=${n}`),n}catch(e){return l("buffer",`saveToBuffer failed: ${e.message}`),null}}function En(t){let e=Xe(),r=t!=null&&t>0?t:e.length,n=[];for(let s of e){if(n.length>=r)break;try{let o=m__namespace.default.readFileSync(s,"utf8"),i=JSON.parse(o);i&&i.fileId&&i.payload&&n.push(i);}catch{l("buffer",`skipping malformed file: ${s}`);}}return n}function hn(t){try{m__namespace.default.unlinkSync(gn(t)),l("buffer",`deleted fileId=${t}`);}catch{}}function _n(){let t=Date.now()-no();for(let e of Xe())try{let{mtimeMs:r}=m__namespace.default.statSync(e);r<t&&(m__namespace.default.unlinkSync(e),l("buffer",`evicted stale: ${w__namespace.default.basename(e)}`));}catch{}}var Sn=E(()=>{"use strict";U();M();});async function oo(t){_n();let e=En(W.REPLAY_BATCH_SIZE);e.length&&(l("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await me(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(hn(r.fileId),l("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):l("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){l("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function yn(t){let e=await Lt();if(!e.length)return e.authError&&(l("postToLangfuse","auth refresh failed \u2014 buffering trace"),Vt(t)),0;let r=await Promise.all(e.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await dn(o.endpoint,o.authHeader);return {creds:o,healthy:i}})),n=r.find(o=>o.creds.mode==="gateway"&&o.healthy)?.creds??r.find(o=>o.creds.mode==="direct")?.creds;return n&&await oo(n),(await Promise.all(r.map(async({creds:o,healthy:i})=>{if(o.mode==="gateway"){if(!i)return l("postToLangfuse","gateway health check failed \u2014 buffering trace"),Vt(t),0;let c=await me(t,o.endpoint,o.authHeader);return (c===0||c>=500)&&(l("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),Vt(t)),c}let a=await me(t,o.endpoint,o.authHeader);return (a===0||a>=500)&&(l("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),Vt(t)),a}))).find(o=>o!==0)??0}var Tn=E(()=>{"use strict";J();M();fn();Sn();U();});var qe=E(()=>{"use strict";cn();Tn();});function at(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return lo.reduce((r,{re:n,replace:s})=>r.replace(n,s),e)}var Y,io,ao,co,On,lo,ze=E(()=>{"use strict";Y="[REDACTED]",io="[REDACTED-EMAIL]",ao="[REDACTED-CPF]",co="[REDACTED-CNPJ]",On="[REDACTED-PHONE]",lo=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${Y}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${Y}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${Y}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${Y}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
|
|
185
|
+
${Y}
|
|
186
|
+
${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${Y}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${Y}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${Y}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${Y}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${Y}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${Y}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${Y}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>io},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>ao},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>co},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>On},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>On}];});async function wn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=t.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=It(e);if(!i){D(t);return}let a=ot(),c=i.pendingTool,u=c?.name===r,h=u?c.startNs:String(BigInt(a)-200000000n),L=u?c.inputStr:q(n,V.TOOL_INPUT),I=L,A=null;if(r==="Skill"){let Ct=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);A=Ct?String(Ct).trim():null;let _t=A?pe(A,i.cwd):null;_t&&(I=_t,i.skillContent||(i.skillContent=_t),i.skillArtifacts||(i.skillArtifacts=de(A,i.cwd))),A&&!i.slashSkill&&(i.slashSkill=A),l("PostToolUse","Skill tool detected",`skillName=${A}`,`contentFound=${!!_t}`);}let p=at(q(o,V.TOOL_OUTPUT)),O=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(p.slice(0,500)),ct=O?"ERROR":"DEFAULT",Ut=mt(),Gt=Math.round(Number(BigInt(a)-BigInt(h))/1e6),Xt={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",ht=r==="Skill"&&A?A:ue(L,60);i.toolCalls.push({tool:r,brief:ht,error:O,durationMs:Gt});let Q=i.spans;Q.push({traceId:i.traceId,spanId:Ut,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:h,endTimeUnixNano:a,attributes:gt(f(T.OBS_NAME,r),f(T.OBS_TYPE,Xt),f(T.OBS_LEVEL,ct),f(T.OBS_INPUT,at(I)),f(T.OBS_OUTPUT,p),f("tool.name",r),f("tool.error",String(O)),r==="Skill"&&A?f("skill.name",A):null,r==="Skill"?f("skill.invocation","slash-command"):null),status:{code:O?2:1}}),i.pendingTool=null,vt(e,i),l("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${O}`,`durationMs=${Gt}`,`totalSpans=${Q.length}`),D(t);}var Ln=E(()=>{"use strict";jt();Ht();qe();kt();fe();M();U();ze();});function Rn(t,e,r){let n=Object.keys(An).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let s=An[n],o=(e*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var An,Pn=E(()=>{"use strict";An={"claude-opus-5":{input:5,output:25},"claude-sonnet-5":{input:2,output:10},"claude-fable-5":{input:10,output:50},"claude-opus-4-6":{input:5,output:25},"claude-opus-4-5":{input:5,output:25},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:1,output:5},"claude-4-6-opus":{input:5,output:25},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:5,output:25},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:1,output:5},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};});async function kn(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=It(e);if(!n){D(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(l("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=ot(),o=K()??"",i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(y=>y.tool==="Skill")){let y=mt(),lt=n.skillContent?n.skillContent:JSON.stringify({skill:n.slashSkill});i.push({tool:"Skill",brief:n.slashSkill,error:false,durationMs:0,synthetic:true}),a.push({traceId:n.traceId,spanId:y,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:gt(f(T.OBS_NAME,"Skill"),f(T.OBS_TYPE,"TOOL"),f(T.OBS_LEVEL,"DEFAULT"),f(T.OBS_INPUT,lt),f(T.OBS_OUTPUT,"loaded via slash command"),f("tool.name","Skill"),f("tool.error","false"),f("skill.name",n.slashSkill),f("skill.invocation","slash-command")),status:{code:1}}),l("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||n.transcriptPath||"",u=Ve(c);if(c&&(i.some(y=>y.tool==="Skill"&&!y.synthetic)||!!n.slashSkill)&&!u?.text){await new Promise(lt=>setTimeout(lt,500));let y=Ve(c);y?.text&&(u=y);}l("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${u?`text=${u.text.length}chars`:"null"}`);let L=i.length,I=i.filter(y=>y.error).length,A=at(u?.text?q(u.text,V.TRACE_OUTPUT):L===0?"No tools used":i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""}`).join(`
|
|
187
|
+
`)),p=u?.inputTokens??0,O=u?.outputTokens??0,ct=i.map((y,lt)=>`${lt+1}. ${y.tool}${y.brief?` \u2192 ${y.brief}`:""}${y.error?" [ERROR]":""} (${y.durationMs}ms)`),Ut=!!(n.slashSkill||i.some(y=>y.tool==="Skill")),Gt=i.some(y=>y.tool==="Agent");if(!Ut&&!Gt){l("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),He(e),D(t);return}let Jt=Ut?"skill":"agent",Xt=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),ht=u?.model||"",ge=Rn(ht,p,O),Q=en(n);Q==="prerequisite_required"&&u?.text&&(Q="complete"),Q==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:mt(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:gt(f(T.OBS_NAME,"prerequisite-check"),f(T.OBS_TYPE,"EVENT"),f(T.OBS_LEVEL,"WARNING"),f(T.OBS_OUTPUT,A),f("skill.name",n.slashSkill||void 0),f("execution_status","prerequisite_required")),status:{code:1}}),l("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let Ct=(()=>{if(!(!Ut||!n.prompt)){if(n.slashSkill){let y=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return y?q(at(y),V.USER_INSTRUCTION):void 0}return q(at(n.prompt),V.USER_INSTRUCTION)||void 0}})(),_t=JSON.stringify({trace_type:Jt,...Q!==null&&{execution_status:Q},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Ct!==void 0&&{user_instruction:Ct},latency_ms:Xt,...p&&{tokens_input:p},...O&&{tokens_output:O},cost_usd:ge,...ht?{model:ht}:{},toolCount:L,errorCount:I,stopReason:r,sessionId:n.sessionId,tools:ct.length?ct:void 0}),Qe=at(q(n.prompt,V.TRACE_INPUT)),Cn=gt(f(T.TRACE_NAME,n.traceName),f(T.TRACE_INPUT,Qe),f(T.TRACE_OUTPUT,A),f(T.OBS_INPUT,Qe),f(T.OBS_OUTPUT,A),f(T.TRACE_METADATA,_t),f(T.SESSION_ID,n.sessionId),f(T.USER_ID,o),f(T.OBS_TYPE,"GENERATION"),f(T.MODEL,ht),p?f(T.INPUT_TOKENS,p):null,O?f(T.OUTPUT_TOKENS,O):null,f("claude.stop_reason",r),f("claude.tool_count",String(L)),f("claude.error_count",String(I)),f("claude.session_id",n.sessionId),f("flow.trace_type",Jt),{key:T.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Jt}]}}}),Nn={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Cn,status:{code:I>0?2:1}},$n=gt(f("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),f("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),tr=[...a,Nn];l("Stop",`sid=${e}`,`totalTools=${L}`,`errorTools=${I}`,`spans=${tr.length}`,`inputTokens=${p}`,`outputTokens=${O}`,`traceOutput="${ue(A,80)}"`);let Dn=await yn(an($n,tr));l("Stop",`POST status=${Dn}`,`traceId=${n.traceId}`,`latencyMs=${Xt}`,`costUsd=${ge}`),He(e),D(t);}var In=E(()=>{"use strict";jt();Ht();qe();J();Pn();Ge();kt();M();fe();ze();U();});var Et,vn=E(()=>{"use strict";J();kt();nn();on();Ln();In();Et=class{static async userPromptSubmit(){let e=await Bt(),r;try{r=(await Lt()).length>0;}catch{D(e);return}r?await rn(e):D(e);}static async preToolUse(){let e=await Bt();await sn(e);}static async postToolUse(){let e=await Bt();await wn(e);}static async stop(){let e=await Bt();await kn(e);}};});var po={};async function uo(){let t=process.argv[2];switch(t){case "UserPromptSubmit":await Et.userPromptSubmit();break;case "PreToolUse":await Et.preToolUse();break;case "PostToolUse":await Et.postToolUse();break;case "Stop":await Et.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
|
|
188
188
|
`),process.stdin.on("data",e=>process.stdout.write(e));}}var bn=E(()=>{"use strict";vn();uo().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
|
|
189
|
-
`),process.exit(0);});});var fo=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,
|
|
189
|
+
`),process.exit(0);});});var fo=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,B]=process.argv;function Ze(t,e){let r=t.indexOf(e);return r!==-1?t[r+1]:void 0}function Un(){let{bold:t,cyan:e,dim:r,green:n}=(ut(),F(he)),{version:s}=Nt();process.stdout.write(`
|
|
190
190
|
`+t(" flow-ai-obs")+r(" v"+s)+`
|
|
191
191
|
|
|
192
|
-
`),process.stdout.write(e(" init")+r(` Configure
|
|
192
|
+
`),process.stdout.write(e(" init")+r(` Configure native OTEL for Code Assistants.
|
|
193
193
|
`)),process.stdout.write(r(` --custom-url <URL> Set a custom Flow base URL
|
|
194
194
|
`)),process.stdout.write(r(` --no-interactive Suppress interactive prompts (CI/CD)
|
|
195
195
|
`)),process.stdout.write(r(` --custom-email <EMAIL> Set user email (used with --no-interactive)
|
|
196
196
|
`)),process.stdout.write(e(" status")+r(` Show current observability configuration
|
|
197
|
+
`)),process.stdout.write(e(" update-api-key")+r(` Update FLOW_API_KEY in VS Code/Copilot and Claude Desktop
|
|
198
|
+
`)),process.stdout.write(r(` --key <KEY> API key to set (defaults to FLOW_API_KEY)
|
|
197
199
|
`)),process.stdout.write(n(" update")+r(` Update to the latest version
|
|
198
200
|
|
|
199
201
|
`)),process.stdout.write(r(` Flags: --version -v Show version
|
|
200
202
|
`)),process.stdout.write(r(` --help -h Show this help
|
|
201
203
|
|
|
202
|
-
`))
|
|
203
|
-
|
|
204
|
-
`));}if(Y==="--version"||Y==="-v")(async()=>{let{version:t}=Nt();process.stdout.write(t+`
|
|
204
|
+
`));}if(B==="--version"||B==="-v")(async()=>{let{version:t}=Nt();process.stdout.write(t+`
|
|
205
205
|
`);let e=(Dt(),F($t)),r=await e.fetchLatestVersionAsync().catch(()=>null);if(r&&e.isNewer(t,r.version)){let{dim:n,yellow:s}=(ut(),F(he));process.stdout.write(s(`
|
|
206
206
|
Update available: ${t} \u2192 ${r.version}
|
|
207
207
|
`)+n(` Run: flow-ai-obs update
|
|
208
208
|
|
|
209
|
-
`));}process.exit(0);})().catch(()=>process.exit(0));else if(
|
|
209
|
+
`));}process.exit(0);})().catch(()=>process.exit(0));else if(B==="--help"||B==="-h")Un(),process.exit(0);else if(B==="init"||B==="install")(async()=>{B==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
|
|
210
210
|
`),await(Dt(),F($t)).checkForUpdateInteractive();let{runInit:t}=(vr(),F(Ir)),e=process.argv.slice(3);process.exit(await t({url:Ze(e,"--custom-url"),noInteractive:e.includes("--no-interactive"),email:Ze(e,"--custom-email")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
|
|
211
|
-
`),process.exit(1);});else if(
|
|
212
|
-
`),process.exit(1);});else if(
|
|
213
|
-
`),process.exit(1);});else if(
|
|
211
|
+
`),process.exit(1);});else if(B==="status")(async()=>{await(Dt(),F($t)).checkForUpdateInteractive();let{runStatus:t}=(Kr(),F(Mr));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
|
|
212
|
+
`),process.exit(1);});else if(B==="update-api-key")(async()=>{let{runUpdateApiKey:t}=(Br(),F(Yr)),e=process.argv.slice(3);process.exit(await t({key:Ze(e,"--key")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
|
|
213
|
+
`),process.exit(1);});else if(B==="update")(async()=>{let t=(Dt(),F($t)),{version:e}=Nt(),r=await t.fetchLatestVersionAsync();r||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
|
|
214
214
|
`),process.exit(1)),t.isNewer(e,r.version)||(process.stdout.write(` \u2713 Already up to date (v${e})
|
|
215
215
|
`),process.exit(0)),await t.runUpdate(r.version),process.exit(0);})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
|
|
216
|
-
`),process.exit(1);});else if(
|
|
217
|
-
`),process.exit(1);});}else fo.has(
|
|
216
|
+
`),process.exit(1);});else if(B==="otel-headers"){let{runOtelHeaders:t}=(Hr(),F(jr));t().then(e=>process.exit(e)).catch(e=>{process.stderr.write(`[flow-ai-obs otel-headers] Unexpected error: ${e.message}
|
|
217
|
+
`),process.exit(1);});}else fo.has(B)?(bn(),F(po)):(Un(),process.exit(0));
|
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.
|
|
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.1-beta.158",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)+`
|