@ciandt-flow/flow-ai-obs 0.16.0-beta.127 → 0.16.1-beta.136
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 +111 -110
- package/dist/index.js +13 -13
- package/dist/setup.js +12 -12
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,86 +1,87 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';var
|
|
3
|
-
`);}catch(i){throw r.close(),i}if(r.close(),t!==void 0)return t;throw new Error("Too many invalid attempts for yes/no prompt")}async function
|
|
2
|
+
'use strict';var Jt=require('readline/promises'),Is=require('https'),E=require('fs'),ke=require('os'),L=require('path'),child_process=require('child_process'),js=require('http'),nn=require('crypto');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 Jt__namespace=/*#__PURE__*/_interopNamespace(Jt);var Is__namespace=/*#__PURE__*/_interopNamespace(Is);var E__namespace=/*#__PURE__*/_interopNamespace(E);var ke__namespace=/*#__PURE__*/_interopNamespace(ke);var L__namespace=/*#__PURE__*/_interopNamespace(L);var js__namespace=/*#__PURE__*/_interopNamespace(js);var nn__namespace=/*#__PURE__*/_interopNamespace(nn);var Vt=Object.defineProperty;var ys=Object.getOwnPropertyDescriptor;var Ss=Object.getOwnPropertyNames;var ws=Object.prototype.hasOwnProperty;var As=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var T=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Os=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},Z=(e,t)=>{for(var r in t)Vt(e,r,{get:t[r],enumerable:true});},Ls=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ss(t))!ws.call(e,s)&&s!==r&&Vt(e,s,{get:()=>t[s],enumerable:!(n=ys(t,s))||n.enumerable});return e};var D=e=>Ls(Vt({},"__esModule",{value:true}),e);var Gt={};Z(Gt,{bold:()=>v,cyan:()=>M,dim:()=>m,green:()=>R,red:()=>k,yellow:()=>I});function Be(e,t){return Rs?r=>`\x1B[${e}m${r}\x1B[${t}m`:r=>r}var Rs,R,k,I,M,v,m,de=T(()=>{"use strict";Rs=!process.env.NO_COLOR&&process.stdout.isTTY;R=Be("32","39"),k=Be("31","39"),I=Be("33","39"),M=Be("36","39"),v=Be("1","22"),m=Be("2","22");});var nt=Os((Li,ks)=>{ks.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.16.1-beta.136",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepare:"lefthook install || echo '[WARNING] lefthook install failed - git hooks not installed'",prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug",regression:"jest --config jest.regression.config.js --forceExit","regression:update":"UPDATE_GOLDEN=1 jest --config jest.regression.config.js --forceExit"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0","eslint-config-prettier":"^10.1.5",jest:"^30.4.2",lefthook:"^2.1.10",prettier:"^3.5.3","ts-jest":"^29.4.9",tsup:"^8.5.1",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function fe(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function st(e,t){let r=Jt__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${e} ${t===true?"(Y/n)":t===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&t!==void 0)return r.close(),t;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
|
|
3
|
+
`);}catch(i){throw r.close(),i}if(r.close(),t!==void 0)return t;throw new Error("Too many invalid attempts for yes/no prompt")}async function Xt(e,t){let r=Jt__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${e}: `)).trim();if(t);return n}catch(n){throw n}finally{r.close();}}var qt=T(()=>{"use strict";});var He={};Z(He,{checkForUpdate:()=>Ns,checkForUpdateInteractive:()=>$s,fetchLatestVersionAsync:()=>Hr,isNewer:()=>We,primeUpdateCache:()=>Fs,runUpdate:()=>Wr});function X(){return zt||(zt=nt()),zt}function We(e,t){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(e),s=r(t);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function er(){try{let e=JSON.parse(E__namespace.default.readFileSync(Br,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=bs?null:e}catch{return null}}function tr(e,t,r=Date.now()){try{E__namespace.default.writeFileSync(Br,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function rr(e){let t=X().name,r=Is__namespace.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Us},n=>{if(n.statusCode!==200)return n.resume(),e(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");e(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){e(o);}});});r.on("error",e),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function Zt(e){let t=X().name,n=` Update available: ${X().version} \u2192 ${e}`,s=` Run: npm install -g ${t}`,o=Math.max(n.length,s.length)+2,i="\u2500".repeat(o);process.stderr.write(`
|
|
4
4
|
\u256D${i}\u256E
|
|
5
5
|
\u2502${n.padEnd(o)}\u2502
|
|
6
6
|
\u2502${s.padEnd(o)}\u2502
|
|
7
7
|
\u2570${i}\u256F
|
|
8
8
|
|
|
9
|
-
`);}function
|
|
9
|
+
`);}function Qt(e){let t=X().name;process.stderr.write(`
|
|
10
10
|
[${t}] Critical update detected \u2014 auto-updating to ${e}...
|
|
11
11
|
|
|
12
|
-
`);let r=child_process.spawn("npm",["install","-g",`${t}@${e}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});r.on("error",()=>{}),r.unref();}async function
|
|
12
|
+
`);let r=child_process.spawn("npm",["install","-g",`${t}@${e}`],{detached:true,stdio:"ignore",shell:process.platform==="win32",windowsHide:true});r.on("error",()=>{}),r.unref();}async function Cs(e,t=1e4){let r=As("readline"),n=X().name,o=` Update available: ${X().version} \u2192 ${e}`,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(`
|
|
13
13
|
\u256D${u}\u256E
|
|
14
14
|
\u2502${o.padEnd(c)}\u2502
|
|
15
15
|
\u2502${i.padEnd(c)}\u2502
|
|
16
16
|
\u2502${a.padEnd(c)}\u2502
|
|
17
17
|
\u2570${u}\u256F
|
|
18
18
|
`),new Promise(h=>{let d=r.createInterface({input:process.stdin,output:void 0,terminal:false}),y=false;function S(b){y||(y=true,clearTimeout($),d.close(),process.stderr.write(`
|
|
19
|
-
`),h(b));}let $=setTimeout(()=>S(false),t);d.once("line",b=>S(b.trim().toLowerCase()==="y")),d.once("close",()=>S(false));})}async function
|
|
19
|
+
`),h(b));}let $=setTimeout(()=>S(false),t);d.once("line",b=>S(b.trim().toLowerCase()==="y")),d.once("close",()=>S(false));})}async function Wr(e){let t=X().name;return process.stderr.write(` Installing ${t}@${e}...
|
|
20
20
|
`),new Promise(r=>{let n=child_process.spawn("npm",["install","-g",`${t}@${e}`],{stdio:"inherit",shell:process.platform==="win32"}),s=false;function o(i,a){if(!s){if(s=true,i)process.stderr.write(` \u2713 Updated to ${e}. Please restart the command.
|
|
21
21
|
|
|
22
22
|
`);else {let c=a?` (${a})`:"";process.stderr.write(` \u2717 Update failed${c} \u2014 continuing with current version.
|
|
23
23
|
|
|
24
|
-
`);}r();}}n.on("close",(i,a)=>o(i===0,a??void 0)),n.on("error",i=>o(false,i.code));})}function
|
|
25
|
-
`;try{E.writeFileSync(
|
|
26
|
-
`);}}var
|
|
24
|
+
`);}r();}}n.on("close",(i,a)=>o(i===0,a??void 0)),n.on("error",i=>o(false,i.code));})}function Hr(){return new Promise(e=>{rr((t,r)=>e(t||!r?null:r));})}function Ns(){try{let e=er();if(e){We(X().version,e.latestVersion)&&(e.updatePriority==="auto"?Qt(e.latestVersion):Zt(e.latestVersion));return}setImmediate(()=>{rr((t,r)=>{t||!r||(tr(r.version,r.updatePriority),We(X().version,r.version)&&(r.updatePriority==="auto"?Qt(r.version):Zt(r.version)));});});}catch{}}async function $s(e={}){try{let t=er();if(t){if(!We(X().version,t.latestVersion))return}else {let n=await Hr();if(!n||(tr(n.version,n.updatePriority),!We(X().version,n.version)))return;t={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(t.updatePriority==="auto"){Qt(t.latestVersion);return}if(!fe()){Zt(t.latestVersion);return}await Cs(t.latestVersion,e.timeoutMs)&&await Wr(t.latestVersion);}catch{}}function Fs(){try{if(er())return;setImmediate(()=>{rr((e,t)=>{e||!t||We(X().version,t.version)&&tr(t.version,t.updatePriority,0);});});}catch{}}var zt,Br,bs,Us,Ke=T(()=>{"use strict";qt();Br=L__namespace.default.join(ke__namespace.default.tmpdir(),"flow-obs-update-cache.json"),bs=1440*60*1e3,Us=3e3;});var Kr={};Z(Kr,{AUTH_ENGINE:()=>Ye,BUFFER:()=>q,CLAUDE_DESKTOP:()=>U,CONFIG_DIR_NAME:()=>ot,CONFIG_FILE_NAME:()=>it,COPILOT_OTEL:()=>_,DEBUG_LOG_FILENAME:()=>nr,ENV:()=>p,FLOW_URLS:()=>xs,INSTALLER:()=>ge,NATIVE_OTEL:()=>me,OTLP:()=>wt,STATE_FILE_PREFIX:()=>Ms,TOKEN_CACHE_KEY:()=>St,TRACE_LIMITS:()=>Q,VALIDATION:()=>K,getFlowBaseUrl:()=>Oe,getFlowUrls:()=>H,getMetrics:()=>At});function Oe(){let e=process.env.FLOW_BASE_URL;return e&&e.trim()?e.trim():Ds}function H(){let e=Oe();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${e}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${e}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${e}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${e}/otel`}}function At(){let e=Oe();return {API_URL:process.env.FLOW_METRICS_URL||`${e}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var Ds,xs,ot,it,St,wt,me,p,Ye,ge,q,K,nr,Q,U,_,Ms,P=T(()=>{"use strict";Ds="https://flow.ciandt.com";xs=H(),ot="FLOW-nodejs",it="config.json",St="tokenCache",wt={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"},me={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"},p={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"},Ye={REQUEST_TIMEOUT_MS:1e4,MAX_RETRY_ATTEMPTS:3,RETRY_DELAY_MS:1e3},ge={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3,CLI:"flow-ai-obs "},q={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},K={API_KEY_MAX_LENGTH:1024,API_KEY_PATTERN:/^[A-Za-z0-9_.\-:=+/]+$/,EMAIL_MAX_LENGTH:254,EMAIL_HEADER_PATTERN:/^[\x21-\x7E]+$/},nr="flow-ai-obs-debug.log",Q={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};U={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"},_={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"},Ms="flow-obs-";});function l(...e){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let t=`[${new Date().toISOString()}] ${e.join(" ")}
|
|
25
|
+
`;try{E.writeFileSync(Ks,t,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
|
|
26
|
+
`);}}var Ks,x=T(()=>{"use strict";P();Ks=L.join(ke.tmpdir(),nr);});function Gs(e){if(!Vs.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Js(e,t){let r=t.length>400?t.slice(0,400)+"\u2026":t;l("toAuthError",`status=${e} body=${r}`);try{let n=JSON.parse(t);if(typeof n.error=="string"&&(l("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),Yr[n.error]))return new Le(Yr[n.error],e)}catch{}return e===401||e===403||e===500?new Le("Invalid credentials",e):e>=400&&e<500?new Le("Authentication request was rejected",e):new Error("Authentication service unavailable, please try again later")}function Y(e){return new Promise((t,r)=>{try{Gs(e.tenant);}catch(u){return r(u)}let n=JSON.stringify({clientSecret:e.clientSecret}),s=new URL(H().AUTH_ENGINE),o=s.protocol==="https:",i={hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),FlowTenant:e.tenant}};l("getToken",`requesting token tenant=${e.tenant} host=${i.hostname} path=${i.path}`);let c=(o?Is__namespace.default:js__namespace.default).request(i,u=>{let h=[];u.on("data",d=>h.push(d)),u.on("end",()=>{let d=h.join("");if((u.statusCode??0)>=400)return r(Js(u.statusCode??0,d));let y;try{y=JSON.parse(d);}catch{return r(new Error("Invalid response from auth engine"))}let S=y.expires_at??new Date(Date.now()+(y.expires_in??3600)*1e3).toISOString();if(!y.access_token)return r(new Error("Auth engine returned an empty access token. Check FLOW_BASE_URL and credentials."));t({accessToken:y.access_token,expiresAt:S});});});c.on("error",u=>r(new Error(`Network error: ${u.message}`))),c.setTimeout(Ye.REQUEST_TIMEOUT_MS,()=>{c.destroy(new Error("Request timeout"));}),c.write(n),c.end();})}var Le,Vs,Yr,Re=T(()=>{"use strict";P();x();Le=class extends Error{statusCode;constructor(t,r=0){super(t),this.name="AuthError",this.statusCode=r;}},Vs=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;Yr={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};});function jr(){return process.platform==="win32"?false:process.getuid?.()===0}function Ot(){if(jr())return process.stderr.write(`
|
|
27
27
|
`+k(` \u2717 flow-ai-obs is not supported in a sudo context.
|
|
28
28
|
|
|
29
29
|
`)+M(` npm install -g @ciandt-flow/flow-ai-obs
|
|
30
30
|
`)+`
|
|
31
|
-
`),1}var
|
|
32
|
-
`,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(r,384);}catch{}return {settingsPath:r,preserved:h}}finally{
|
|
33
|
-
`,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(t,384);}catch{}}finally{
|
|
31
|
+
`),1}var Lt=T(()=>{"use strict";de();});function Ie(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return {home:t,username:process.env.SUDO_USER}}return {home:ke__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||ke__namespace.userInfo().username}}function ee(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let e=process.env.USERPROFILE;if(!e){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(e=r);}if(e){let t=e.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return L__namespace.join(t,".claude","settings.json")}return L__namespace.join(ke__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||ke__namespace.homedir();return L__namespace.join(e,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let t=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(t)return L__namespace.join(t,".claude","settings.json")}return L__namespace.join(ke__namespace.homedir(),".claude","settings.json")}var at=T(()=>{"use strict";Lt();});function Rt(){if(process.platform==="win32"){let r=process.env.APPDATA||L__namespace.join(ke__namespace.homedir(),"AppData","Roaming");return L__namespace.join(r,Vr,Gr)}let e=Ie(),t=process.env.XDG_CONFIG_HOME||L__namespace.join(e.home,".config");return L__namespace.join(t,Vr,Gr)}function or(){let{getPersistedFlowBaseUrl:e}=(le(),D(Xr));return e()??null}var Vr,Gr,ir=T(()=>{"use strict";at();Vr="flow-ai-obs",Gr="config.json";});var Xr={};Z(Xr,{addEnvToClaudeSettings:()=>Pe,getClaudeSettingsPath:()=>ee,getEffectiveEnv:()=>lt,getEnvFromClaudeSettings:()=>j,getPersistedFlowBaseUrl:()=>qr,removeEnvFromClaudeSettings:()=>eo,resolveFlowBaseUrl:()=>ut,validateConnectivity:()=>Qs,writeClaudeSettings:()=>ur});function cr(e){try{let t=E__namespace.statSync(e);Date.now()-t.mtimeMs>zs&&E__namespace.unlinkSync(e);}catch{}try{E__namespace.writeFileSync(e,String(process.pid),{flag:"wx"});}catch(t){throw t.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+e):t}}function lr(e){try{E__namespace.unlinkSync(e);}catch{}}function Zs(e){let t=[];if(!e.hooks||typeof e.hooks!="object"||Array.isArray(e.hooks))return delete e.hooks,t;let r=e.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?.(ge.CLI));return c.length>0?{...a,hooks:c}:null}).filter(a=>a!=null);i.length>0&&(n[s]=i,t.push(s));}return Object.keys(n).length>0?e.hooks=n:delete e.hooks,t}function ur(e,t){let r=ee(),n=r+".lock";E__namespace.mkdirSync(L__namespace.dirname(r),{recursive:true}),cr(n);try{if(E__namespace.existsSync(r)){E__namespace.copyFileSync(r,r+".bkp");try{E__namespace.chmodSync(r+".bkp",384);}catch{}}let s=Rt();if(E__namespace.existsSync(s)){let d=s+".bkp";E__namespace.copyFileSync(s,d);try{E__namespace.chmodSync(d,384);}catch{}}let o={};try{o=JSON.parse(E__namespace.readFileSync(r,"utf8"));}catch{}let i=o.env&&typeof o.env=="object"?o.env:{};delete i.OTEL_EXPORTER_OTLP_HEADERS;let{getFlowUrls:a}=(P(),D(Kr)),c=a().OTEL_ENDPOINT,u={...me,OTEL_EXPORTER_OTLP_ENDPOINT:e??c};o.env={...i,...u,...t??{}},o.otelHeadersHelper="flow-ai-obs otel-headers";let h=Zs(o);E__namespace.writeFileSync(r,JSON.stringify(o,null,2)+`
|
|
32
|
+
`,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(r,384);}catch{}return Ee=void 0,{settingsPath:r,preserved:h}}finally{lr(n);}}async function Qs(e){let t;try{t=(await Y(e)).accessToken;}catch{return false}return t?new Promise(r=>{ar(`Bearer ${t}`,r,1);}):false}function ar(e,t,r){let n=new URL(H().GATEWAY_TRACES),s=JSON.stringify({resourceSpans:[],validation_run:true}),o=n.protocol==="https:",i={hostname:n.hostname,port:n.port||(o?443:80),path:n.pathname,method:"POST",headers:{"Content-Type":"application/json",Authorization:e,"Content-Length":Buffer.byteLength(s)}},c=(o?Is__namespace:js__namespace).request(i,u=>{u.resume(),u.statusCode===200||u.statusCode===204?t(true):r<ge.CONNECTIVITY_MAX_RETRY?setTimeout(()=>ar(e,t,r+1),ge.CONNECTIVITY_RETRY_MS):t(false);});c.on("error",()=>{r<ge.CONNECTIVITY_MAX_RETRY?setTimeout(()=>ar(e,t,r+1),ge.CONNECTIVITY_RETRY_MS):t(false);}),c.write(s),c.end();}function j(e){if(Ee===void 0)try{let r=E__namespace.readFileSync(ee(),"utf8");Ee=JSON.parse(r).env??null;}catch{Ee=null;}if(!Ee)return null;let t=Ee[e];return typeof t=="string"?t:null}function Pe(e){let t=ee(),r=t+".lock";E__namespace.mkdirSync(L__namespace.dirname(t),{recursive:true}),cr(r);try{let n={};try{n=JSON.parse(E__namespace.readFileSync(t,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,e),E__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
|
|
33
|
+
`,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(t,384);}catch{}Ee=void 0;}finally{lr(r);}}function eo(e){let t=ee(),r=t+".lock";E__namespace.mkdirSync(L__namespace.dirname(t),{recursive:true}),cr(r);try{let n={};try{n=JSON.parse(E__namespace.readFileSync(t,"utf8"));}catch{return}if(!n.env||typeof n.env!="object")return;for(let s of e)delete n.env[s];E__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
|
|
34
|
+
`,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(t,384);}catch{}Ee=void 0;}finally{lr(r);}}function lt(e){let t=process.env[e];return t!==void 0?t!==""?t:void 0:j(e)??void 0}function qr(){let e=j(p.FLOW_BASE_URL);return e&&e.trim()?e.trim():void 0}function ut(){let e=process.env[p.FLOW_BASE_URL];return e&&e.trim()?e.trim():qr()}var zs,Ee,le=T(()=>{"use strict";P();Re();at();ir();zs=ge.LOCK_STALE_MS;});var Qr={};Z(Qr,{getEmailFromToken:()=>Ge,getTokenCache:()=>pt,isTokenValid:()=>no,saveTokenCache:()=>he});function zr(){let e=ke__namespace.default.homedir();if(process.platform==="darwin")return L__namespace.default.join(e,"Library","Preferences",ot,it);if(process.platform==="win32"){let r=process.env.APPDATA??L__namespace.default.join(e,"AppData","Roaming");return L__namespace.default.join(r,ot,it)}let t=process.env.XDG_CONFIG_HOME??L__namespace.default.join(e,".config");return L__namespace.default.join(t,ot,it)}function Zr(){try{let e=E__namespace.default.readFileSync(zr(),"utf8");return JSON.parse(e)}catch{return {}}}function ro(e){let t=zr();E__namespace.default.mkdirSync(L__namespace.default.dirname(t),{recursive:true}),E__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}async function he(e){let t=Zr();t[St]={accessToken:e.accessToken,expiresAt:e.expiresAt,lastAuthCheckAt:e.lastAuthCheckAt},ro(t);}async function pt(){let t=Zr()[St];return t?{accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}:null}async function no(){let e=await pt();return e?new Date(e.expiresAt)>new Date:false}async function Ge(){let e=await pt();if(!e||!e.accessToken)return null;try{let t=e.accessToken.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}var Je=T(()=>{"use strict";P();});function en(){return !!process.env[p.FLOW_USER_EMAIL]||!!j(p.FLOW_USER_EMAIL)}function dr(e){l("maybePersistUserEmail",`${e}: starting`);let t=e==="api-key"?`\u26A0\uFE0F flow-ai-obs: FLOW_USER_EMAIL is not set. Configure it with:
|
|
34
35
|
flow-ai-obs init --custom-email <EMAIL>
|
|
35
36
|
`:`\u26A0\uFE0F flow-ai-obs: FLOW_USER_EMAIL is not set and could not be derived from token.
|
|
36
37
|
Run: flow-ai-obs init
|
|
37
|
-
`;return Ge().then(r=>{if(r){let n=r.split(/[\r\n]/)[0].replace(/[\x00-\x1F\x7F]/g,"").trim();if(!n)return;let s=n.indexOf("@"),o=n.slice(s+1);if(!(n.length<=254&&
|
|
38
|
+
`;return Ge().then(r=>{if(r){let n=r.split(/[\r\n]/)[0].replace(/[\x00-\x1F\x7F]/g,"").trim();if(!n)return;let s=n.indexOf("@"),o=n.slice(s+1);if(!(n.length<=254&&K.EMAIL_HEADER_PATTERN.test(n)&&(n.match(/@/g)??[]).length===1&&s>0&&s<n.length-1&&o.includes("."))){l("maybePersistUserEmail",`${e}: email from token failed basic validation \u2014 skipping persist`);return}try{Pe({[p.FLOW_USER_EMAIL]:n}),l("maybePersistUserEmail",`${e}: persisted FLOW_USER_EMAIL from OAuth token`);}catch(a){l("maybePersistUserEmail",`${e}: FLOW_USER_EMAIL write failed: ${a.message}`),process.stderr.write(`\u26A0\uFE0F flow-ai-obs: could not persist FLOW_USER_EMAIL to settings.json.
|
|
38
39
|
Run: flow-ai-obs init
|
|
39
|
-
`);}}else process.stderr.write(t);}).catch(r=>{l("maybePersistUserEmail",`${e}: getEmailFromToken failed: ${r.message}`);})}var pn=_(()=>{"use strict";Je();me();D();P();});function go(e){return mo.some(t=>t.test(e))}function Eo(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function Q(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:s,tenant:o}=r;return !n||!s||!o?null:{clientId:n,clientSecret:s,tenant:o}}catch{return null}}function ke(e){let t;try{t=new URL(e);}catch{throw new Error(`Invalid URL: ${e}`)}let r=process.env[p.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&t.protocol!=="https:")throw new Error(`URL must use HTTPS: ${e}`);if(t.username||t.password)throw new Error(`URL must not contain embedded credentials: ${e}`);if(!r&&go(t.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${t.hostname}`);return e}async function dn(){let e=Q(process.env[p.ANTHROPIC_AUTH_TOKEN]);return e?{user:await Ge().catch(()=>null)??e.clientId,tenant:e.tenant}:{user:"",tenant:""}}function ho(e){let t=process.env[p.OTEL_EXPORTER_OTLP_HEADERS];if(!t)return null;let r=e.toLowerCase();for(let n of t.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 Pe(){let e=pt(p.FLOW_USER_EMAIL);if(e!==void 0){let r=e.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 t=ho("x-flow-user");if(t){let r=t.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=Le__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 ie(e){if(!e)return null;let t=e.replace(/[\r\n]/g,"").trim();return t?t.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(t)?t:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function K(){let e=process.env[p.FLOW_API_KEY];return ie(e)}function _o(){return new Date().toISOString().slice(0,10)}async function To(e){let t=_o(),r=await mt();if(r?.lastAuthCheckAt!==t){l("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);let o=Be.MAX_RETRY_ATTEMPTS;for(let i=1;i<=o;i++)try{let a=await X(e);try{await ge({...a,lastAuthCheckAt:t});}catch(u){l("getOrRefreshToken",`saveTokenCache failed (non-fatal): ${u.message}`);}return l("getOrRefreshToken",`daily check passed (attempt ${i}), expires=${a.expiresAt}`),K()?un()||await Er("api-key"):await Er("oauth"),a.accessToken}catch(a){if(a instanceof Ae){if(a.statusCode!==500)throw l("getOrRefreshToken",`daily check auth error (${a.statusCode}) \u2014 propagating immediately`),a;if(i<o){l("getOrRefreshToken",`daily check 500 error (attempt ${i}/${o}) \u2014 retrying in 1s`),await new Promise(c=>setTimeout(c,Be.RETRY_DELAY_MS));continue}throw l("getOrRefreshToken",`daily check failed after ${o} attempts \u2014 propagating`),a}l("getOrRefreshToken",`daily check network error \u2014 using cache: ${a.message}`);break}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(l("getOrRefreshToken",`cacheValid=${n}`),n)return l("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;l("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${e.tenant} clientId=${e.clientId})`);let s=await X(e);try{await ge({...s,lastAuthCheckAt:t});}catch(o){l("getOrRefreshToken",`token cache save failed (non-fatal): ${o.message}`);}return l("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function yo(e,t){let r=t&&t.accessToken?t.accessToken:"";return {endpoint:e.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function So(e,t,r){let n=Buffer.from(`${t}:${r}`).toString("base64");return {endpoint:e.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function le(){let e=[],t=Q(process.env[p.ANTHROPIC_AUTH_TOKEN]);l("resolveCredentials",t?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),t&&l("resolveCredentials",`clientId=${t.clientId}`,`tenant=${t.tenant}`);let r=t?t.tenant:"",n=process.env[p.FLOW_TELEMETRY]==="true",s=process.env[p.LANGFUSE_BASE_URL],o=process.env[p.LANGFUSE_PUBLIC_KEY],i=process.env[p.LANGFUSE_SECRET_KEY];if(n&&s&&o&&i){let d="",y=r;t&&(d=await Ge().catch(()=>null)??t.clientId);let S={user:d??"",tenant:y??"",team:"",project:""};e.push({mode:"direct",...So(ke(s),o,i),...S}),l("resolveCredentials","direct mode active",`user=${S.user}`,`tenant=${S.tenant}`);}if(!t){if(e.length===0){let d=[];return d.authError=false,d}return e}let a;try{a=await To(t);}catch(d){if(l("resolveCredentials",`token refresh failed: ${d.message}`,`(tenant=${t.tenant} clientId=${t.clientId})`),e.length>0)return e.authError=true,e;let y=[];return y.authError=true,y}let u={user:Eo(a)??t.clientId,tenant:r,team:"",project:""},h=process.env[p.FLOW_TELEMETRY_GATEWAY]??we();return e.push({mode:"gateway",...yo(ke(h),{accessToken:a}),...u}),e}var mo,W=_(()=>{"use strict";Je();Oe();P();D();pn();me();mo=[/^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 mn(){return !!(process.env.WSL_DISTRO_NAME&&process.platform==="linux")}function Ct(){return process.platform==="win32"||mn()}function Ao(e){let t=e.match(/^\/mnt\/([a-z])\/(.*)$/);if(!t)return e;let r=t[1].toUpperCase(),n=t[2].replace(/\//g,"\\");return `${r}:\\${n}`}function gn(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let n=process.env.LOCALAPPDATA;if(!n)try{let s=child_process.execSync("cmd.exe /c echo %LOCALAPPDATA%",{encoding:"utf8",timeout:5e3}).trim();s&&/^[A-Za-z]:\\/.test(s)&&(n=s);}catch(s){l("getDesktopPaths",`cmd.exe LOCALAPPDATA lookup failed: ${s.message}`);}if(n){let s=n.replace(/^([A-Za-z]):/,(i,a)=>`/mnt/${a.toLowerCase()}`).replace(/\\/g,"/"),o=L__namespace.join(s,C.DIR_3P);return bt(o)}}if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||L__namespace.join(Le__namespace.homedir(),"AppData","Local"),s=L__namespace.join(n,C.DIR_3P);return bt(s)}if(process.platform==="darwin"){let n=L__namespace.join(Le__namespace.homedir(),"Library","Application Support",C.DIR_3P);return bt(n)}let e=Re(),t=process.env.XDG_CONFIG_HOME||L__namespace.join(e.home,".config"),r=L__namespace.join(t,C.DIR_3P);return bt(r)}function bt(e){return {configDir:e,configLibraryDir:L__namespace.join(e,C.CONFIG_LIBRARY_DIR),desktopConfigPath:L__namespace.join(e,C.DESKTOP_CONFIG_FILE),metaPath:L__namespace.join(e,C.CONFIG_LIBRARY_DIR,C.META_FILE)}}function Ut(){let e=oe(),t=L__namespace.dirname(e),r=Ct()?C.WRAPPER_SCRIPT_WIN:C.WRAPPER_SCRIPT_UNIX;return L__namespace.join(t,r)}function Nt(){if(process.env[p.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=gn();if(E__namespace.existsSync(e.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",L__namespace.join(Le__namespace.homedir(),"Applications","Claude.app")].some(r=>E__namespace.existsSync(r));if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||L__namespace.join(Le__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files";return [L__namespace.join(t,"AnthropicClaude","Claude.exe"),L__namespace.join(r,"Claude","Claude.exe")].some(s=>E__namespace.existsSync(s))}if(process.platform==="linux"){let t=Re(),r=process.env.XDG_CONFIG_HOME||L__namespace.join(t.home,".config"),n=L__namespace.join(r,"Claude");return E__namespace.existsSync(n)}return false}function Oo(e){let t=e??Ut();try{if(!E__namespace.existsSync(t))return null;let r=E__namespace.readFileSync(t,"utf8"),n=r.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(n&&n[1])return ie(n[1]);let s=r.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(s&&s[1])return ie(s[1])}catch{}return null}function En(e,t,r=448){let n=L__namespace.dirname(e);E__namespace.mkdirSync(n,{recursive:true});let s=Ct(),o=s?420:r,i=true;try{E__namespace.readFileSync(e,"utf8")===t&&(i=!1);}catch{}if(!i){if(!s)try{E__namespace.chmodSync(e,r);}catch{}return {written:false}}if(E__namespace.existsSync(e)&&(E__namespace.copyFileSync(e,e+".bkp"),!s))try{E__namespace.chmodSync(e+".bkp",448);}catch{}if(E__namespace.writeFileSync(e,t,{encoding:"utf8",mode:o}),!s)try{E__namespace.chmodSync(e,r);}catch{}return {written:true}}function Lo(e){let t=Ut(),r=e?ie(e):null,n=Ct()?_n(r):hn(r);return En(t,n,!!r?448:493),t}function hn(e){let t=e?ie(e):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 t&&r.push(`export FLOW_API_KEY="${t}"`),r.push("exec flow-ai-obs otel-headers",""),r.join(`
|
|
40
|
-
`)}function
|
|
41
|
-
`)}function
|
|
42
|
-
`;try{if(E__namespace.readFileSync(e,"utf8")===s)return}catch{}if(E__namespace.existsSync(e)){E__namespace.copyFileSync(e,e+".bkp");try{E__namespace.chmodSync(e+".bkp",384);}catch{}}E__namespace.writeFileSync(e,s,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(e,384);}catch{}}function
|
|
43
|
-
`;try{if(E__namespace.readFileSync(o,"utf8")===a)return o}catch{}if(E__namespace.existsSync(o)){E__namespace.copyFileSync(o,o+".bkp");try{E__namespace.chmodSync(o+".bkp",384);}catch{}}E__namespace.writeFileSync(o,a,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(o,384);}catch{}return o}function
|
|
44
|
-
`,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(e,384);}catch{}}}function
|
|
45
|
-
`,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}function
|
|
46
|
-
`,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}var
|
|
40
|
+
`);}}else process.stderr.write(t);}).catch(r=>{l("maybePersistUserEmail",`${e}: getEmailFromToken failed: ${r.message}`);})}var tn=T(()=>{"use strict";Je();le();x();P();});function io(e){return oo.some(t=>t.test(e))}function ao(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function te(e){if(!e)return null;try{let t=e.split(".");if(t.length<2)return null;let r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),{clientId:n,clientSecret:s,tenant:o}=r;return !n||!s||!o?null:{clientId:n,clientSecret:s,tenant:o}}catch{return null}}function ve(e){let t;try{t=new URL(e);}catch{throw new Error(`Invalid URL: ${e}`)}let r=process.env[p.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&t.protocol!=="https:")throw new Error(`URL must use HTTPS: ${e}`);if(t.username||t.password)throw new Error(`URL must not contain embedded credentials: ${e}`);if(!r&&io(t.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${t.hostname}`);return e}async function rn(){let e=te(process.env[p.ANTHROPIC_AUTH_TOKEN]);return e?{user:await Ge().catch(()=>null)??e.clientId,tenant:e.tenant}:{user:"",tenant:""}}function co(e){let t=process.env[p.OTEL_EXPORTER_OTLP_HEADERS];if(!t)return null;let r=e.toLowerCase();for(let n of t.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 be(){let e=lt(p.FLOW_USER_EMAIL);if(e!==void 0){let r=e.replace(/[\r\n]/g,"").trim();if(r)if(r.length>K.EMAIL_MAX_LENGTH)l("resolveUserEmail",`FLOW_USER_EMAIL exceeds ${K.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!K.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 t=co("x-flow-user");if(t){let r=t.replace(/[\r\n]/g,"").trim();if(r.length>K.EMAIL_MAX_LENGTH)l("resolveUserEmail",`x-flow-user from OTEL_EXPORTER_OTLP_HEADERS exceeds ${K.EMAIL_MAX_LENGTH} chars \u2014 skipping`);else if(!K.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=ke__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 ie(e){if(!e)return null;let t=e.replace(/[\r\n]/g,"").trim();return t?t.length>K.API_KEY_MAX_LENGTH?(l("validateApiKey",`API key exceeds ${K.API_KEY_MAX_LENGTH} chars \u2014 rejected`),null):K.API_KEY_PATTERN.test(t)?t:(l("validateApiKey","API key contains invalid or unsafe characters \u2014 rejected"),null):null}function V(){let e=process.env[p.FLOW_API_KEY];return ie(e)}function lo(){return new Date().toISOString().slice(0,10)}async function uo(e){let t=lo(),r=await pt();if(r?.lastAuthCheckAt!==t){l("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);let o=Ye.MAX_RETRY_ATTEMPTS;for(let i=1;i<=o;i++)try{let a=await Y(e);try{await he({...a,lastAuthCheckAt:t});}catch(u){l("getOrRefreshToken",`saveTokenCache failed (non-fatal): ${u.message}`);}return l("getOrRefreshToken",`daily check passed (attempt ${i}), expires=${a.expiresAt}`),V()?en()||await dr("api-key"):await dr("oauth"),a.accessToken}catch(a){if(a instanceof Le){if(a.statusCode!==500)throw l("getOrRefreshToken",`daily check auth error (${a.statusCode}) \u2014 propagating immediately`),a;if(i<o){l("getOrRefreshToken",`daily check 500 error (attempt ${i}/${o}) \u2014 retrying in 1s`),await new Promise(c=>setTimeout(c,Ye.RETRY_DELAY_MS));continue}throw l("getOrRefreshToken",`daily check failed after ${o} attempts \u2014 propagating`),a}l("getOrRefreshToken",`daily check network error \u2014 using cache: ${a.message}`);break}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(l("getOrRefreshToken",`cacheValid=${n}`),n)return l("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;l("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${e.tenant} clientId=${e.clientId})`);let s=await Y(e);try{await he({...s,lastAuthCheckAt:t});}catch(o){l("getOrRefreshToken",`token cache save failed (non-fatal): ${o.message}`);}return l("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function po(e,t){let r=t&&t.accessToken?t.accessToken:"";return {endpoint:e.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function fo(e,t,r){let n=Buffer.from(`${t}:${r}`).toString("base64");return {endpoint:e.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function ue(){let e=[],t=te(process.env[p.ANTHROPIC_AUTH_TOKEN]);l("resolveCredentials",t?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),t&&l("resolveCredentials",`clientId=${t.clientId}`,`tenant=${t.tenant}`);let r=t?t.tenant:"",n=process.env[p.FLOW_TELEMETRY]==="true",s=process.env[p.LANGFUSE_BASE_URL],o=process.env[p.LANGFUSE_PUBLIC_KEY],i=process.env[p.LANGFUSE_SECRET_KEY];if(n&&s&&o&&i){let d="",y=r;t&&(d=await Ge().catch(()=>null)??t.clientId);let S={user:d??"",tenant:y??"",team:"",project:""};e.push({mode:"direct",...fo(ve(s),o,i),...S}),l("resolveCredentials","direct mode active",`user=${S.user}`,`tenant=${S.tenant}`);}if(!t){if(e.length===0){let d=[];return d.authError=false,d}return e}let a;try{a=await uo(t);}catch(d){if(l("resolveCredentials",`token refresh failed: ${d.message}`,`(tenant=${t.tenant} clientId=${t.clientId})`),e.length>0)return e.authError=true,e;let y=[];return y.authError=true,y}let u={user:ao(a)??t.clientId,tenant:r,team:"",project:""},h=process.env[p.FLOW_TELEMETRY_GATEWAY]??Oe();return e.push({mode:"gateway",...po(ve(h),{accessToken:a}),...u}),e}var oo,B=T(()=>{"use strict";Je();Re();P();x();tn();le();oo=[/^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 sn(){return !!(process.env.WSL_DISTRO_NAME&&process.platform==="linux")}function Pt(){return process.platform==="win32"||sn()}function go(e){let t=e.match(/^\/mnt\/([a-z])\/(.*)$/);if(!t)return e;let r=t[1].toUpperCase(),n=t[2].replace(/\//g,"\\");return `${r}:\\${n}`}function on(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let n=process.env.LOCALAPPDATA;if(!n)try{let s=child_process.execSync("cmd.exe /c echo %LOCALAPPDATA%",{encoding:"utf8",timeout:5e3}).trim();s&&/^[A-Za-z]:\\/.test(s)&&(n=s);}catch(s){l("getDesktopPaths",`cmd.exe LOCALAPPDATA lookup failed: ${s.message}`);}if(n){let s=n.replace(/^([A-Za-z]):/,(i,a)=>`/mnt/${a.toLowerCase()}`).replace(/\\/g,"/"),o=L__namespace.join(s,U.DIR_3P);return It(o)}}if(process.platform==="win32"){let n=process.env.LOCALAPPDATA||L__namespace.join(ke__namespace.homedir(),"AppData","Local"),s=L__namespace.join(n,U.DIR_3P);return It(s)}if(process.platform==="darwin"){let n=L__namespace.join(ke__namespace.homedir(),"Library","Application Support",U.DIR_3P);return It(n)}let e=Ie(),t=process.env.XDG_CONFIG_HOME||L__namespace.join(e.home,".config"),r=L__namespace.join(t,U.DIR_3P);return It(r)}function It(e){return {configDir:e,configLibraryDir:L__namespace.join(e,U.CONFIG_LIBRARY_DIR),desktopConfigPath:L__namespace.join(e,U.DESKTOP_CONFIG_FILE),metaPath:L__namespace.join(e,U.CONFIG_LIBRARY_DIR,U.META_FILE)}}function vt(){let e=ee(),t=L__namespace.dirname(e),r=Pt()?U.WRAPPER_SCRIPT_WIN:U.WRAPPER_SCRIPT_UNIX;return L__namespace.join(t,r)}function bt(){if(process.env[p.FLOW_OBS_SKIP_DESKTOP_DETECTION])return false;let e=on();if(E__namespace.existsSync(e.configDir))return true;if(process.platform==="darwin")return ["/Applications/Claude.app",L__namespace.join(ke__namespace.homedir(),"Applications","Claude.app")].some(r=>E__namespace.existsSync(r));if(process.platform==="win32"){let t=process.env.LOCALAPPDATA||L__namespace.join(ke__namespace.homedir(),"AppData","Local"),r=process.env.PROGRAMFILES||"C:\\Program Files";return [L__namespace.join(t,"AnthropicClaude","Claude.exe"),L__namespace.join(r,"Claude","Claude.exe")].some(s=>E__namespace.existsSync(s))}if(process.platform==="linux"){let t=Ie(),r=process.env.XDG_CONFIG_HOME||L__namespace.join(t.home,".config"),n=L__namespace.join(r,"Claude");return E__namespace.existsSync(n)}return false}function Eo(e){let t=e??vt();try{if(!E__namespace.existsSync(t))return null;let r=E__namespace.readFileSync(t,"utf8"),n=r.match(/^export FLOW_API_KEY=["']?([^"'\r\n]+)["']?$/m);if(n&&n[1])return ie(n[1]);let s=r.match(/^set FLOW_API_KEY=([^\r\n]+)$/m);if(s&&s[1])return ie(s[1])}catch{}return null}function an(e,t,r=448){let n=L__namespace.dirname(e);E__namespace.mkdirSync(n,{recursive:true});let s=Pt(),o=s?420:r,i=true;try{E__namespace.readFileSync(e,"utf8")===t&&(i=!1);}catch{}if(!i){if(!s)try{E__namespace.chmodSync(e,r);}catch{}return {written:false}}if(E__namespace.existsSync(e)&&(E__namespace.copyFileSync(e,e+".bkp"),!s))try{E__namespace.chmodSync(e+".bkp",448);}catch{}if(E__namespace.writeFileSync(e,t,{encoding:"utf8",mode:o}),!s)try{E__namespace.chmodSync(e,r);}catch{}return {written:true}}function ho(e){let t=vt(),r=e?ie(e):null,n=Pt()?ln(r):cn(r);return an(t,n,!!r?448:493),t}function cn(e){let t=e?ie(e):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 t&&r.push(`export FLOW_API_KEY="${t}"`),r.push("exec flow-ai-obs otel-headers",""),r.join(`
|
|
41
|
+
`)}function ln(e){let t=e?ie(e):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 t&&r.push(`set FLOW_API_KEY=${t}`),r.push("flow-ai-obs otel-headers",""),r.join(`\r
|
|
42
|
+
`)}function un(e){if(!bt())return {status:"skipped",reason:"Claude Desktop is not installed"};let t=ie(e);if(!t)return {status:"skipped",reason:"Invalid API key provided"};try{let r=vt(),n=Pt()?ln(t):cn(t),{written:s}=an(r,n,448);return {status:s?"configured":"already_configured",wrapperScriptPath:r}}catch(r){return {status:"skipped",reason:r.message}}}function To(e){try{let t=E__namespace.readFileSync(e,"utf8");try{let r=JSON.parse(t);if(r.appliedId&&typeof r.appliedId=="string"&&_o.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 ${e} \u2014 generating new UUID`);}}catch(t){t.code!=="ENOENT"&&l("getOrCreateConfigUuid",`read error: ${t.message}`);}return nn__namespace.randomUUID()}function yo(e,t){let r=L__namespace.dirname(e);E__namespace.mkdirSync(r,{recursive:true});let n;try{let o=E__namespace.readFileSync(e,"utf8");try{n=JSON.parse(o),(!n.appliedId||typeof n.appliedId!="string")&&(n.appliedId=t),Array.isArray(n.entries)||(n.entries=[]);}catch{l("writeMetaJson",`corrupted JSON in ${e} \u2014 starting fresh`),n={appliedId:t,entries:[]};}}catch(o){o.code!=="ENOENT"&&l("writeMetaJson",`read error: ${o.message}`),n={appliedId:t,entries:[]};}n.entries.some(o=>o.id===t)||n.entries.push({id:t,name:U.CONFIG_NAME});let s=JSON.stringify(n,null,2)+`
|
|
43
|
+
`;try{if(E__namespace.readFileSync(e,"utf8")===s)return}catch{}if(E__namespace.existsSync(e)){E__namespace.copyFileSync(e,e+".bkp");try{E__namespace.chmodSync(e+".bkp",384);}catch{}}E__namespace.writeFileSync(e,s,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(e,384);}catch{}}function So(e,t,r,n){E__namespace.mkdirSync(e,{recursive:true});let s=L__namespace.resolve(e),o=L__namespace.resolve(e,`${t}.json`);if(!o.startsWith(s+L__namespace.sep))throw new Error(`Security error: invalid config path ${o}`);let i={};try{let c=E__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[U.KEYS.OTLP_ENDPOINT]=r,i[U.KEYS.OTLP_PROTOCOL]=U.OTLP_PROTOCOL,i[U.KEYS.OTLP_HEADERS_HELPER]=sn()?go(n):n,i[U.KEYS.OTLP_RESOURCE_ATTRIBUTES]={[U.CUSTOM_PROVIDER_KEY]:U.CUSTOM_PROVIDER_VALUE};let a=JSON.stringify(i,null,2)+`
|
|
44
|
+
`;try{if(E__namespace.readFileSync(o,"utf8")===a)return o}catch{}if(E__namespace.existsSync(o)){E__namespace.copyFileSync(o,o+".bkp");try{E__namespace.chmodSync(o+".bkp",384);}catch{}}E__namespace.writeFileSync(o,a,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(o,384);}catch{}return o}function wo(e){let t=L__namespace.dirname(e);E__namespace.mkdirSync(t,{recursive:true});let r={};try{let n=E__namespace.readFileSync(e,"utf8");try{r=JSON.parse(n);}catch{l("mergeClaudeDesktopConfig",`corrupted JSON in ${e} \u2014 starting fresh (original backed up to .bkp)`);}}catch(n){n.code!=="ENOENT"&&l("mergeClaudeDesktopConfig",`read error: ${n.message}`);}if(r.deploymentMode!==U.DEPLOYMENT_MODE){if(E__namespace.existsSync(e)){E__namespace.copyFileSync(e,e+".bkp");try{E__namespace.chmodSync(e+".bkp",384);}catch{}}r.deploymentMode=U.DEPLOYMENT_MODE,E__namespace.writeFileSync(e,JSON.stringify(r,null,2)+`
|
|
45
|
+
`,{encoding:"utf8",mode:384});try{E__namespace.chmodSync(e,384);}catch{}}}function pn(e,t){if(!bt())return {configured:false};let r=on(),n=e??H().OTEL_ENDPOINT,s=t!==void 0?t:V()??Eo(vt()),o=ho(s),i=To(r.metaPath),a=So(r.configLibraryDir,i,n,o);return yo(r.metaPath,i),wo(r.desktopConfigPath),{configured:true,configDir:r.configDir,configLibraryPath:a,uuid:i,wrapperScriptPath:o}}var _o,fr=T(()=>{"use strict";P();at();B();x();_o=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;});function mr(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let r=process.env.APPDATA;if(!r)try{let o=child_process.spawnSync("cmd.exe",["/c","echo","%APPDATA%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();o&&/^[A-Za-z]:\\/.test(o)&&(r=o);}catch(s){l("getVsCodeSettingsPath",`cmd.exe APPDATA lookup failed: ${s.message}`);}if(!r)return null;let n=r.replace(/^([A-Za-z]):/,(s,o)=>`/mnt/${o.toLowerCase()}`).replace(/\\/g,"/");return L__namespace.join(n,"Code","User","settings.json")}if(process.platform==="win32"){let r=process.env.APPDATA||L__namespace.join(ke__namespace.homedir(),"AppData","Roaming");return L__namespace.join(r,"Code","User","settings.json")}if(process.platform==="darwin")return L__namespace.join(ke__namespace.homedir(),"Library","Application Support","Code","User","settings.json");let e=process.platform==="linux"&&process.getuid?.()===0?Ie().home:process.env.HOME||ke__namespace.homedir(),t=process.env.XDG_CONFIG_HOME||L__namespace.join(e,".config");return L__namespace.join(t,"Code","User","settings.json")}function dn(e){let t=false,r=false,n="";for(let s=0;s<e.length;s++){let o=e[s];if(t){n+=o,r?r=false:o==="\\"?r=true:o==='"'&&(t=false);continue}if(o==='"'){t=true,n+=o;continue}if(o===","){let i=s+1;for(;i<e.length&&/\s/.test(e[i]);)i++;if(i<e.length&&(e[i]==="}"||e[i]==="]"))continue}n+=o;}return n}function Ut(e){if(process.env[p.FLOW_OBS_SKIP_COPILOT_DETECTION])return !!(e&&E__namespace.existsSync(e));if(e&&(E__namespace.existsSync(e)||E__namespace.existsSync(L__namespace.dirname(e))||E__namespace.existsSync(L__namespace.dirname(L__namespace.dirname(e)))))return true;let t=mr();if(t&&(E__namespace.existsSync(t)||E__namespace.existsSync(L__namespace.dirname(t))||E__namespace.existsSync(L__namespace.dirname(L__namespace.dirname(t))))||process.platform==="darwin"&&["/Applications/Visual Studio Code.app",L__namespace.join(ke__namespace.homedir(),"Applications","Visual Studio Code.app")].some(n=>E__namespace.existsSync(n)))return true;if(process.platform==="win32"){let r=process.env.LOCALAPPDATA||L__namespace.join(ke__namespace.homedir(),"AppData","Local"),n=process.env.PROGRAMFILES||"C:\\Program Files",s=process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)";if([L__namespace.join(r,"Programs","Microsoft VS Code","Code.exe"),L__namespace.join(n,"Microsoft VS Code","Code.exe"),L__namespace.join(s,"Microsoft VS Code","Code.exe")].some(i=>E__namespace.existsSync(i)))return true}return !!(process.platform==="linux"&&["/usr/bin/code","/usr/share/code","/snap/bin/code"].some(n=>E__namespace.existsSync(n)))}function fn(e,t={}){let r;try{r=t.customSettingsPath||mr();}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(!Ut(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(E__namespace.existsSync(r))try{let $=dn(E__namespace.readFileSync(r,"utf8"));n=JSON.parse($);}catch{return {status:"skipped",settingsPath:r,reason:"VS Code settings.json could not be parsed (unsupported JSONC syntax such as comments)"}}let s=e||H().OTEL_ENDPOINT,o=t.apiKey!==void 0?t.apiKey:V(),i=t.userEmail!==void 0?t.userEmail:be(),a=typeof n[_.HEADERS_KEY]=="object"&&n[_.HEADERS_KEY]!==null&&!Array.isArray(n[_.HEADERS_KEY])?n[_.HEADERS_KEY]:{},c={...a};o&&(c[_.HEADER_API_KEY]=o),i&&(c[_.HEADER_USER]=i);let u=Object.keys(c),h=Object.keys(a),d=u.length===0&&(n[_.HEADERS_KEY]===void 0||h.length===0)||u.length===h.length&&u.every($=>a[$]===c[$]);if(n[_.ENABLED_KEY]===_.ENABLED_VALUE&&n[_.EXPORTER_TYPE_KEY]===_.EXPORTER_TYPE_VALUE&&n[_.PROTOCOL_KEY]===_.PROTOCOL_VALUE&&n[_.ENDPOINT_KEY]===s&&d)return {status:"already_configured",settingsPath:r};E__namespace.mkdirSync(L__namespace.dirname(r),{recursive:!0});let S={...n,[_.ENABLED_KEY]:_.ENABLED_VALUE,[_.EXPORTER_TYPE_KEY]:_.EXPORTER_TYPE_VALUE,[_.PROTOCOL_KEY]:_.PROTOCOL_VALUE,[_.ENDPOINT_KEY]:s};return u.length>0&&(S[_.HEADERS_KEY]=c),E__namespace.writeFileSync(r,JSON.stringify(S,null,2)+`
|
|
46
|
+
`,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}function mn(e,t={}){let r;try{r=t.customSettingsPath||mr();}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(!Ut(r))return {status:"skipped",settingsPath:r,reason:"VS Code is not installed"};try{let n={};if(E__namespace.existsSync(r))try{let a=dn(E__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[_.HEADERS_KEY]=="object"&&n[_.HEADERS_KEY]!==null&&!Array.isArray(n[_.HEADERS_KEY])?n[_.HEADERS_KEY]:{};if(s[_.HEADER_API_KEY]===e)return {status:"already_configured",settingsPath:r};let o={...s,[_.HEADER_API_KEY]:e};E__namespace.mkdirSync(L__namespace.dirname(r),{recursive:!0});let i={...n,[_.ENABLED_KEY]:n[_.ENABLED_KEY]??_.ENABLED_VALUE,[_.EXPORTER_TYPE_KEY]:n[_.EXPORTER_TYPE_KEY]??_.EXPORTER_TYPE_VALUE,[_.PROTOCOL_KEY]:n[_.PROTOCOL_KEY]??_.PROTOCOL_VALUE,[_.ENDPOINT_KEY]:n[_.ENDPOINT_KEY]??H().OTEL_ENDPOINT,[_.HEADERS_KEY]:o};return E__namespace.writeFileSync(r,JSON.stringify(i,null,2)+`
|
|
47
|
+
`,{encoding:"utf8"}),{status:"configured",settingsPath:r}}catch(n){return {status:"skipped",settingsPath:r,reason:n.message}}}var gr=T(()=>{"use strict";P();B();at();x();});var En={};Z(En,{clearLoggedOutMarker:()=>hr,isLoggedOut:()=>Ro,markLoggedOut:()=>Lo});function Er(){return L__namespace.default.join(ke__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function Lo(){try{let e=Er();E__namespace.default.mkdirSync(L__namespace.default.dirname(e),{recursive:!0}),E__namespace.default.writeFileSync(e,"",{mode:384});}catch{}}function hr(){try{E__namespace.default.unlinkSync(Er());}catch{}}function Ro(){try{return E__namespace.default.existsSync(Er())}catch{return false}}var _r=T(()=>{"use strict";});function Tr(){return ut()??null}function ko(){return j(p.ANTHROPIC_AUTH_TOKEN)??void 0}async function Nt(){let e=Tr();if(!e)return {ok:false,baseUrl:"",user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"};try{let s=new URL(e);if(s.protocol!=="https:"&&s.protocol!=="http:")throw new Error}catch{return {ok:false,baseUrl:e,user:"",tenant:"",notConfigured:true,error:"NOT_CONFIGURED"}}let t=ko(),r=te(t);if(!r)return {ok:false,baseUrl:e,user:"",tenant:"",error:"No credentials found"};let n=process.env.FLOW_BASE_URL;process.env.FLOW_BASE_URL=e;try{let s=await Y({clientId:r.clientId,clientSecret:r.clientSecret,tenant:r.tenant});await he({accessToken:s.accessToken,expiresAt:s.expiresAt});let o=r.clientId;try{let i=s.accessToken.split(".");if(i.length>=2){let a=JSON.parse(Buffer.from(i[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));o=a.email??a.preferred_username??a.upn??a.sub??o;}}catch{}return {ok:!0,baseUrl:e,user:o,tenant:r.tenant}}catch(s){return {ok:false,baseUrl:e,user:r.clientId,tenant:r.tenant,error:s.message}}finally{n===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=n;}}var yr=T(()=>{"use strict";Je();B();le();P();Re();});var ft={};Z(ft,{promptRaw:()=>Sr,runLogin:()=>vo});function re(e){return typeof e=="string"?e.replace(Io,""):e}function Sr(e,t={}){return new Promise((r,n)=>{if(typeof process.stdin.setRawMode!="function"){n(new Error("NOT_A_TTY"));return}let{masked:s=false,defaultValue:o=""}=t;process.stdout.write(e+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===`
|
|
47
48
|
`){u(),process.stdout.write(`
|
|
48
|
-
`),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);})}async function
|
|
49
|
-
`)),1;let r=
|
|
49
|
+
`),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);})}async function $t(e,t,r=false){let n=Tr(),s=process.env.FLOW_BASE_URL;n&&(process.env.FLOW_BASE_URL=n);try{let{accessToken:o,expiresAt:i}=await Y(e);if(r)return {jwt:t,accessToken:o,expiresAt:i};Pe({[p.ANTHROPIC_AUTH_TOKEN]:t}),hr(),await he({accessToken:o,expiresAt:i});}finally{s===void 0?delete process.env.FLOW_BASE_URL:process.env.FLOW_BASE_URL=s;}}async function Po(e=false){try{let t=(await Sr(M(" ? ")+"Flow API Token (JWT): ",{masked:!0})).trim();if(!t)return process.stderr.write(k(` \u2717 Token is required
|
|
50
|
+
`)),1;let r=te(t);if(!r)return process.stderr.write(k(` \u2717 Invalid Flow API Token
|
|
50
51
|
`)),1;if(process.stdout.write(m(` Authenticating...
|
|
51
|
-
`)),e){let n=await
|
|
52
|
+
`)),e){let n=await $t(r,t,!0);return process.stdout.write(`
|
|
52
53
|
${R("\u2713")} ${v("Authenticated")}
|
|
53
|
-
`+m(` Tenant: ${
|
|
54
|
+
`+m(` Tenant: ${re(r.tenant)}
|
|
54
55
|
`)+m(` Storage: pending (will be written at end of init)
|
|
55
56
|
|
|
56
|
-
`)),{code:0,result:n}}return await
|
|
57
|
+
`)),{code:0,result:n}}return await $t(r,t),process.stdout.write(`
|
|
57
58
|
${R("\u2713")} ${v("Authenticated")}
|
|
58
|
-
`+m(` Tenant: ${
|
|
59
|
+
`+m(` Tenant: ${re(r.tenant)}
|
|
59
60
|
`)+m(` Storage: ANTHROPIC_AUTH_TOKEN (settings.json)
|
|
60
61
|
|
|
61
62
|
`)),0}catch(t){if(t.message==="SIGINT"||t.message==="NOT_A_TTY")throw t;return process.stderr.write(`
|
|
62
63
|
${k("\u2717")} ${v("Authentication failed:")}
|
|
63
|
-
${
|
|
64
|
+
${re(t.message)}
|
|
64
65
|
|
|
65
|
-
`),1}}async function
|
|
66
|
-
`)),1;try{if(r){let a=await
|
|
66
|
+
`),1}}async function vo(e={}){let t=Ot();if(t)return t;let{deferPersist:r=false,skipAuthCheck:n=false}=e;if(e.token){let o=e.token.trim(),i=te(o);if(!i)return process.stderr.write(k(` \u2717 Invalid Flow API Token
|
|
67
|
+
`)),1;try{if(r){let a=await $t(i,o,!0);return process.stdout.write(R(` \u2713 Authenticated. Tenant: ${re(i.tenant)}
|
|
67
68
|
|
|
68
|
-
`)),{code:0,result:a}}return await
|
|
69
|
+
`)),{code:0,result:a}}return await $t(i,o),process.stdout.write(R(` \u2713 Authenticated. Tenant: ${re(i.tenant)}
|
|
69
70
|
|
|
70
|
-
`)),0}catch(a){return process.stderr.write(k(` \u2717 Authentication failed: ${
|
|
71
|
+
`)),0}catch(a){return process.stderr.write(k(` \u2717 Authentication failed: ${re(a.message)}
|
|
71
72
|
`)),1}}if(e.clientId||e.clientSecret||e.tenant)return process.stderr.write(k(` \u2717 Passing individual credential flags (--client-id, --client-secret, --tenant) is no longer supported.
|
|
72
73
|
`)+` LiteLLM requires a signed Flow API Token. Pass --token <JWT> instead.
|
|
73
74
|
|
|
74
|
-
`),1;let s=await
|
|
75
|
+
`),1;let s=await Nt();if(!n){if(process.stdout.write(`
|
|
75
76
|
`),process.stdout.write(v(` Auth
|
|
76
77
|
`)),s.notConfigured)return process.stdout.write(` ${I("\u26A0")} Not configured
|
|
77
78
|
`),process.stdout.write(m(" Run `flow-ai-obs init` to set up the environment first.\n")),process.stdout.write(`
|
|
78
79
|
`),1;if(s.ok){process.stdout.write(` ${R("\u2713")} Authenticated
|
|
79
|
-
`),process.stdout.write(m(" URL: ")+
|
|
80
|
-
`),process.stdout.write(m(" Tenant: ")+
|
|
81
|
-
`),process.stdout.write(m(" User: ")+
|
|
80
|
+
`),process.stdout.write(m(" URL: ")+re(s.baseUrl)+`
|
|
81
|
+
`),process.stdout.write(m(" Tenant: ")+re(s.tenant)+`
|
|
82
|
+
`),process.stdout.write(m(" User: ")+re(s.user)+`
|
|
82
83
|
`),process.stdout.write(`
|
|
83
|
-
`);let o;try{o=await
|
|
84
|
+
`);let o;try{o=await Sr(M(" ? ")+"Re-authenticate? (y/N): ");}catch(i){if(i.message==="SIGINT")return process.stdout.write(`
|
|
84
85
|
`),130;if(i.message==="NOT_A_TTY")return process.stdout.write(R(` \u2713 Using existing credentials.
|
|
85
86
|
|
|
86
87
|
`)),0;throw i}if(o.trim().toLowerCase()!=="y")return process.stdout.write(R(` \u2713 Using existing credentials.
|
|
@@ -89,21 +90,21 @@
|
|
|
89
90
|
`),process.stdout.write(m(` URL: ${s.baseUrl}
|
|
90
91
|
`)),process.stdout.write(`
|
|
91
92
|
`)):(process.stdout.write(` ${I("\u26A0")} Session not valid for current endpoint
|
|
92
|
-
`),process.stdout.write(m(" URL: ")+
|
|
93
|
-
`),process.stdout.write(m(" Tenant: ")+
|
|
93
|
+
`),process.stdout.write(m(" URL: ")+re(s.baseUrl)+`
|
|
94
|
+
`),process.stdout.write(m(" Tenant: ")+re(s.tenant)+`
|
|
94
95
|
`),process.stdout.write(m(" User: ")+m("(not authenticated)")+`
|
|
95
96
|
`),process.stdout.write(`
|
|
96
|
-
`));}try{return await
|
|
97
|
+
`));}try{return await Po(r)}catch(o){if(o.message==="SIGINT")return process.stdout.write(`
|
|
97
98
|
`),130;if(o.message==="NOT_A_TTY")return process.stderr.write(k(` \u2717 No TTY available for interactive login.
|
|
98
99
|
`)+` Pass --token <JWT> for non-interactive use.
|
|
99
100
|
|
|
100
|
-
`),1;throw o}}var
|
|
101
|
+
`),1;throw o}}var Io,mt=T(()=>{"use strict";Je();_r();Re();B();le();P();de();Lt();yr();Io=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var yn={};Z(yn,{normalizeCustomUrl:()=>Tn,runInit:()=>Co,validateCustomUrl:()=>Or,validateEmail:()=>Ar});function Ft(e,t,r){process.stdout.write(v(M(`
|
|
101
102
|
[${e}/${t}] ${r}
|
|
102
|
-
`)));}function
|
|
103
|
-
`);}function
|
|
104
|
-
`);}function
|
|
105
|
-
`);}function
|
|
106
|
-
`,{encoding:"utf8",mode:384});}catch{}return e}function
|
|
103
|
+
`)));}function _e(e){process.stdout.write(` ${R("\u2713")} ${e}
|
|
104
|
+
`);}function Ce(e){process.stdout.write(` ${I("\u26A0")} ${e}
|
|
105
|
+
`);}function Ue(e){process.stdout.write(` ${m(e)}
|
|
106
|
+
`);}function hn(){return !!j(p.ANTHROPIC_AUTH_TOKEN)}function bo(){let e=or();if(!e)return null;Pe({FLOW_BASE_URL:e});try{let t=Rt(),r={};try{r=JSON.parse(E__namespace.readFileSync(t,"utf8"));}catch{return e}delete r.baseUrl,Object.keys(r).length===0?E__namespace.unlinkSync(t):E__namespace.writeFileSync(t,JSON.stringify(r,null,2)+`
|
|
107
|
+
`,{encoding:"utf8",mode:384});}catch{}return e}function Tn(e){let t=e.trim().replace(/\\/g,"/");/^https?:\/\//i.test(t)||(t=`https://${t}`);try{let r=new URL(t);return `${r.protocol}//${r.host}`}catch{return t}}function Or(e,t=false){if(t){let o=/^https?:\/\//i.test(e.trim())?e.trim().replace(/\\/g,"/"):`https://${e.trim().replace(/\\/g,"/")}`,i;try{i=new URL(o);}catch{throw new Error(`Invalid URL: ${e}`)}if(i.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${e}`);if(i.pathname!=="/"&&i.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
|
|
107
108
|
Received: ${e}
|
|
108
109
|
Expected: https://tenant.example.com`);if(i.search)throw new Error(`Custom URL must not contain query parameters.
|
|
109
110
|
Received: ${e}
|
|
@@ -111,14 +112,14 @@
|
|
|
111
112
|
Received: ${e}
|
|
112
113
|
Expected: https://tenant.example.com`);if(i.username||i.password)throw new Error(`Custom URL must not contain embedded credentials.
|
|
113
114
|
Received: ${e}
|
|
114
|
-
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[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],
|
|
115
|
+
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[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],ve(a);}finally{c!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=c);}return a}let r=Tn(e),n;try{n=new URL(r);}catch{throw new Error(`Invalid URL: ${e}`)}if(n.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${e}`);if(!n.hostname.includes("."))throw new Error(`Invalid domain: ${n.hostname}. Expected format: tenant.example.com`);let s=process.env[p.FLOW_OBS_ALLOW_HTTP];try{delete process.env[p.FLOW_OBS_ALLOW_HTTP],ve(r);}finally{s!==void 0&&(process.env[p.FLOW_OBS_ALLOW_HTTP]=s);}return r.replace(/\/$/,"")}async function wr(){for(let e=1;e<=3;e++)try{let t=await Xt(" Enter your Flow domain (e.g., tenant.ciandt.com)");return Or(t)}catch(t){if(process.stderr.write(I(` \u2717 ${t.message}
|
|
115
116
|
|
|
116
117
|
`)),e===3)throw process.stderr.write(k(` Too many invalid attempts.
|
|
117
118
|
|
|
118
|
-
`)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function
|
|
119
|
-
To set it: flow-ai-obs init --custom-email <you@company.com>`),null}r&&
|
|
119
|
+
`)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}function _n(e){return e.replace(/[\r\n]/g,"").trim()}function Ar(e){if(e.length>254)return "Email must not exceed 254 characters";if(/\s/.test(e))return "Email must not contain spaces";if((e.match(/@/g)??[]).length!==1)return "Email must contain exactly one @";let t=e.indexOf("@");if(t<=0)return "Email must contain a local part before @";let r=e.slice(t+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 Uo(e,t,r){let n=j(p.FLOW_USER_EMAIL),s=be(),o=s??"(could not be derived)";if(!e||!fe()){if(r){let c=_n(r);if(!c)throw new Error("--custom-email: value is empty after normalization");let u=Ar(c);if(u)throw new Error(`--custom-email: ${u}`);return _e(`Email: ${v(c)}`),c}return n??s?_e(`Email: ${v(n??s)}`):Ce(`Email not configured \u2014 telemetry will not include user identity.
|
|
120
|
+
To set it: flow-ai-obs init --custom-email <you@company.com>`),null}r&&Ce("--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 Xt(" Enter your corporate email (e.g., user@company.com)");}catch(y){throw process.stderr.write(k(` \u2717 Input error: ${y.message}
|
|
120
121
|
|
|
121
|
-
`)),y}let h=
|
|
122
|
+
`)),y}let h=_n(u),d=Ar(h);if(!d)return h;process.stderr.write(I(` \u2717 ${d}
|
|
122
123
|
|
|
123
124
|
`));}throw process.stderr.write(k(` Too many invalid attempts.
|
|
124
125
|
|
|
@@ -132,7 +133,7 @@
|
|
|
132
133
|
|
|
133
134
|
`)),s):(process.stdout.write(I(`
|
|
134
135
|
\u26A0 Could not derive email from OS username.
|
|
135
|
-
`)),a())}function
|
|
136
|
+
`)),a())}function gt(){let e=j(p.FLOW_BASE_URL);return e&&e.trim()?e.trim():null}async function Co(e={}){let t=Ot();if(t)return t;let r=e.url,n=!!V();!n&&process.env[p.FLOW_API_KEY]&&Ce(`FLOW_API_KEY appears to be misconfigured \u2014 authentication with Flow is required.
|
|
136
137
|
To fix: unset FLOW_API_KEY && flow-ai-obs init`);let s=n?3:4;process.stdout.write(v(M(`
|
|
137
138
|
flow-ai-obs init
|
|
138
139
|
`))),process.stdout.write(m(` Configuring your development environment:
|
|
@@ -142,37 +143,37 @@
|
|
|
142
143
|
`)),n?process.stdout.write(m(` [3/${s}] Observability OpenTelemetry metrics, logs and traces
|
|
143
144
|
`)):(process.stdout.write(m(` [3/${s}] Authentication Authenticate with Flow
|
|
144
145
|
`)),process.stdout.write(m(` [4/${s}] Observability OpenTelemetry metrics, logs and traces
|
|
145
|
-
`))),
|
|
146
|
+
`))),Ft(1,s,"Flow Environment Setup");let o=false;{let f=j(p.FLOW_BASE_URL);if(f&&(Ce(`Base URL already configured (FLOW_BASE_URL=${f})`),!e.noInteractive&&fe()))try{let{promptRaw:F}=await Promise.resolve().then(()=>(mt(),ft));o=(await F(M(" ? ")+"Replace existing base URL configuration? [y/N]: ")).trim().toLowerCase()==="y",o||Ue("Keeping existing base URL configuration.");}catch{}}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(I(` \u26A0 WSL detected. If your code assistant is installed on Windows, install flow-ai-obs
|
|
146
147
|
`)+I(" on Windows too: ")+M(`npm install -g @ciandt-flow/flow-ai-obs
|
|
147
148
|
`)+I(` Without the Windows install, observability will not work for the Windows-side code assistant.
|
|
148
149
|
|
|
149
|
-
`)),
|
|
150
|
+
`)),bo(),!r&&!e.noInteractive&&fe()){let f=gt();o?r=await wr():f?(process.stdout.write(`
|
|
150
151
|
Current base URL: ${v(f)}
|
|
151
|
-
`),await st(" Keep this URL?",true)||(r=await
|
|
152
|
-
`),await st(" Does your organization use a custom Flow URL?",false)?r=await
|
|
153
|
-
`);}if(!r&&!e.noInteractive&&!
|
|
152
|
+
`),await st(" Keep this URL?",true)||(r=await wr())):(process.stdout.write(`
|
|
153
|
+
`),await st(" Does your organization use a custom Flow URL?",false)?r=await wr():_e("Using default Flow Base URL: https://flow.ciandt.com")),process.stdout.write(`
|
|
154
|
+
`);}if(!r&&!e.noInteractive&&!fe()){let f=gt();if(f)process.stdout.write(I(` \u26A0 Non-interactive environment detected.
|
|
154
155
|
`)+m(` Using URL: ${f}
|
|
155
156
|
|
|
156
157
|
`));else return process.stderr.write(` \u2717 No URL configured and no TTY available.
|
|
157
158
|
Run: flow-ai-obs init --custom-url <URL>
|
|
158
159
|
|
|
159
|
-
`),1}let i,a=false;if(r){let f;try{f=
|
|
160
|
-
\u2717 Invalid --custom-url: ${
|
|
160
|
+
`),1}let i,a=false;if(r){let f;try{f=Or(r,!0);}catch(se){return process.stderr.write(`
|
|
161
|
+
\u2717 Invalid --custom-url: ${se.message}
|
|
161
162
|
|
|
162
|
-
`),1}let F=
|
|
163
|
+
`),1}let F=gt();i=f,a=!!F&&F!==f,a?process.stdout.write(I(` \u26A0 Base URL changed \u2014 re-authentication required.
|
|
163
164
|
`)+m(` Previous: ${F}
|
|
164
165
|
`)+m(` New: ${f}
|
|
165
166
|
|
|
166
167
|
`)):process.stdout.write(R(` \u2713 Base URL configured: ${f}
|
|
167
168
|
|
|
168
|
-
`));}else i=
|
|
169
|
+
`));}else i=gt()??"https://flow.ciandt.com";let c={FLOW_BASE_URL:i,OTEL_EXPORTER_OTLP_ENDPOINT:`${i}/otel`};process.env.FLOW_BASE_URL=i,process.stdout.write(R(`
|
|
169
170
|
\u2713 Flow environment ready.
|
|
170
171
|
`));let u=36;for(let[f,F]of Object.entries(c))process.stdout.write(m(` ${f.padEnd(u)}`)+F+`
|
|
171
|
-
`);
|
|
172
|
+
`);Ft(2,s,"User Identity");let h=await Uo(!e.noInteractive,!!(r??or()),e.email),d=null;if(n)l("init","FLOW_API_KEY detected \u2014 skipping OAuth authentication step");else {Ft(3,s,"Authentication");let f=gt(),F=!!f&&f!==i;if(!hn()||a||F)if(e.noInteractive||!fe()){let{token:ce,clientId:J,clientSecret:rt,tenant:oe}=e,we=!!ce,pe=!!(J||rt||oe);if(we){let{runLogin:yt}=await Promise.resolve().then(()=>(mt(),ft)),Me;try{Me=await yt({deferPersist:!0,token:ce});}catch(jt){return process.stderr.write(`
|
|
172
173
|
${k("\u2717")} Authentication failed unexpectedly.
|
|
173
|
-
${
|
|
174
|
+
${jt.message}
|
|
174
175
|
|
|
175
|
-
`),1}if(typeof
|
|
176
|
+
`),1}if(typeof Me=="number")return Me;d=Me.result;}else return pe?(process.stderr.write(`
|
|
176
177
|
${k("\u2717")} Passing individual credential flags (--client-id, --client-secret, --tenant) is no longer supported.
|
|
177
178
|
LiteLLM requires a signed Flow API Token. Pass --token <JWT> instead.
|
|
178
179
|
|
|
@@ -187,22 +188,22 @@
|
|
|
187
188
|
`),process.stdout.write(`
|
|
188
189
|
${I("\u26A0")} Authentication required for the new endpoint.
|
|
189
190
|
|
|
190
|
-
`);let{runLogin:ce}=await Promise.resolve().then(()=>(
|
|
191
|
+
`);let{runLogin:ce}=await Promise.resolve().then(()=>(mt(),ft)),J=await ce({deferPersist:true,skipAuthCheck:a});if(typeof J=="number")return J;d=J.result;}else _e("Already authenticated \u2014 skipping."),Ue("ANTHROPIC_AUTH_TOKEN will be preserved in settings.json");}let y=hn()?j(p.ANTHROPIC_AUTH_TOKEN):null,S={...c,...h?{[p.FLOW_USER_EMAIL]:h}:{},...d?{[p.ANTHROPIC_AUTH_TOKEN]:d.jwt}:{},...y&&!d?{[p.ANTHROPIC_AUTH_TOKEN]:y}:{}},$,b;Ft(n?3:4,s,"Observability (OpenTelemetry)"),process.stdout.write(`
|
|
191
192
|
${v("Metrics and Logs")}
|
|
192
|
-
`);let
|
|
193
|
+
`);let xe={...me,OTEL_EXPORTER_OTLP_ENDPOINT:c.OTEL_EXPORTER_OTLP_ENDPOINT};for(let[f,F]of Object.entries(xe))process.stdout.write(m(` ${f.padEnd(36)}`)+F+`
|
|
193
194
|
`);process.stdout.write(`
|
|
194
|
-
`);try{({settingsPath:$,preserved:b}=
|
|
195
|
-
`),1}if(d){let{saveTokenCache:f}=await Promise.resolve().then(()=>(Je(),
|
|
195
|
+
`);try{({settingsPath:$,preserved:b}=ur(c.OTEL_EXPORTER_OTLP_ENDPOINT,S));}catch(f){return process.stderr.write(` \u2717 Failed to write settings: ${f.message}
|
|
196
|
+
`),1}if(d){let{saveTokenCache:f}=await Promise.resolve().then(()=>(Je(),Qr));try{await f({accessToken:d.accessToken,expiresAt:d.expiresAt});}catch(se){process.stderr.write(` ${I("\u26A0")} Token cache could not be saved: ${se.message}
|
|
196
197
|
Credentials will be re-resolved on first use.
|
|
197
|
-
`);}let{clearLoggedOutMarker:F}=await Promise.resolve().then(()=>(
|
|
198
|
+
`);}let{clearLoggedOutMarker:F}=await Promise.resolve().then(()=>(_r(),En));F();}if(_e(`Settings written: ${$}`),b.length>0&&(process.stdout.write(`
|
|
198
199
|
`),process.stdout.write(I(` \u26A0 Third-party hooks preserved on: ${b.join(", ")}
|
|
199
200
|
`)),process.stdout.write(m(` flow-ai-obs no longer manages lifecycle hooks \u2014 those third-party entries were left untouched.
|
|
200
201
|
`))),process.stdout.write(`
|
|
201
|
-
`),
|
|
202
|
-
`);try{let f=
|
|
203
|
-
`)));}catch(f){
|
|
204
|
-
`);}if(
|
|
205
|
-
`);try{let f=
|
|
202
|
+
`),bt()){process.stdout.write(` ${v("Claude Desktop")}
|
|
203
|
+
`);try{let f=pn(c.OTEL_EXPORTER_OTLP_ENDPOINT,V()??void 0);f.configured&&(_e(`Desktop config written: ${f.configLibraryPath}`),Ue(`Wrapper script: ${f.wrapperScriptPath}`),Ue(`Config UUID: ${f.uuid}`),process.stdout.write(m(` Relaunch Claude Desktop to activate OTLP telemetry.
|
|
204
|
+
`)));}catch(f){Ce(`Claude Desktop config failed: ${f.message}`),Ue("CLI observability is configured \u2014 Desktop config can be retried.");}process.stdout.write(`
|
|
205
|
+
`);}if(Ut()){process.stdout.write(` ${v("GitHub Copilot (VS Code)")}
|
|
206
|
+
`);try{let f=fn(c.OTEL_EXPORTER_OTLP_ENDPOINT,{apiKey:V(),userEmail:h??be()});f.status==="configured"?_e(`Copilot OTEL configured: ${f.settingsPath}`):f.status==="already_configured"?_e("Copilot OTEL: Already configured \u2014 skipping."):(Ce(`Copilot OTEL skipped: ${f.reason??"unknown"}`),f.reason?.includes("could not be parsed")&&Ue("Remove comments from VS Code settings.json and re-run init, or add the keys manually."));}catch(f){Ce(`GitHub Copilot OTEL config failed: ${f.message}`),Ue("CLI observability is configured \u2014 Copilot config can be retried.");}process.stdout.write(`
|
|
206
207
|
`);}return e.skipHint||(process.stdout.write(`
|
|
207
208
|
`),process.stdout.write(R(` \u2713 Setup complete.
|
|
208
209
|
|
|
@@ -211,63 +212,63 @@
|
|
|
211
212
|
|
|
212
213
|
`)+m(` Start your code assistant and begin working.
|
|
213
214
|
|
|
214
|
-
`))),0}var
|
|
215
|
-
`);}function
|
|
216
|
-
`);}function
|
|
217
|
-
`);}function
|
|
218
|
-
`);}function
|
|
215
|
+
`))),0}var Sn=T(()=>{"use strict";le();P();de();Lt();ir();B();qt();x();fr();gr();});var kn={};Z(kn,{runStatus:()=>$o});function wn(e){return !e||e.length<=8?"****":e.slice(0,4)+"****...****"+e.slice(-4)}function No(e){process.stdout.write(` ${R("\u2713")} ${e}
|
|
216
|
+
`);}function Lr(e){process.stdout.write(` ${I("\u26A0")} ${e}
|
|
217
|
+
`);}function Dt(e){process.stdout.write(` ${R("\u2713")} ${e}
|
|
218
|
+
`);}function Rr(e){process.stdout.write(` ${I("\u26A0")} ${e}
|
|
219
|
+
`);}function xt(e){process.stdout.write(` ${k("\u2717")} ${e}
|
|
219
220
|
`);}function ze(e){process.stdout.write(` ${m(e)}
|
|
220
|
-
`);}function
|
|
221
|
+
`);}function An(e){process.stdout.write(v(M(`
|
|
221
222
|
${e}
|
|
222
|
-
`)));}function
|
|
223
|
+
`)));}function On(e,t=false){let r=t?`${I("\u26A0")} ${v(I(e))}`:v(e);process.stdout.write(`
|
|
223
224
|
${r}
|
|
224
|
-
`);}function
|
|
225
|
-
`);}async function
|
|
225
|
+
`);}function Ln(){process.stdout.write(`
|
|
226
|
+
`);}async function $o(){An("Auth");let e=await Nt();e.notConfigured?(Lr("Not configured."),process.stdout.write(`
|
|
226
227
|
`),process.stdout.write(` ${m("Run `flow-ai-obs init` to set up.")}
|
|
227
|
-
`)):!e.ok&&e.error==="No credentials found"?
|
|
228
|
+
`)):!e.ok&&e.error==="No credentials found"?Lr("Not authenticated. Run `flow-ai-obs login` to set up."):e.ok?(No("Authenticated"),process.stdout.write(` ${m("URL: ")}${e.baseUrl}
|
|
228
229
|
`),process.stdout.write(` ${m("Tenant: ")}${e.tenant}
|
|
229
230
|
`),process.stdout.write(` ${m("User: ")}${e.user}
|
|
230
231
|
`),process.stdout.write(` ${m("Storage: ANTHROPIC_AUTH_TOKEN (settings.json)")}
|
|
231
|
-
`)):
|
|
232
|
+
`)):Lr(`Session rejected by ${e.baseUrl}. Run \`flow-ai-obs login\` to re-authenticate.`);let t={},r={};try{let c=E__namespace.readFileSync(ee(),"utf8");r=JSON.parse(c),t=r.env||{};}catch{}An("Observability configuration (OpenTelemetry)");let n=Object.keys(me).filter(c=>!t[c]);On("Metrics and Logs",n.length>0),n.length===0?(Dt("All OTEL env vars present in settings.json"),ze(`Endpoint: ${t.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(process.stdout.write(`
|
|
232
233
|
`),process.stdout.write(` ${m("Run: flow-ai-obs init (restores missing vars automatically)")}
|
|
233
234
|
`),process.stdout.write(`
|
|
234
|
-
`),
|
|
235
|
-
`);}
|
|
235
|
+
`),Rr(`${n.length} OTEL var(s) missing from settings.json`),n.forEach(c=>xt(`Missing: ${c}`))),Ln();for(let c of Object.keys(me)){let u=t[c]??k("(missing)");process.stdout.write(m(` ${c.padEnd(36)}`)+u+`
|
|
236
|
+
`);}On("Trace Destination");let s=process.env[p.FLOW_TELEMETRY]==="true",o=process.env[p.LANGFUSE_BASE_URL],i=process.env[p.LANGFUSE_PUBLIC_KEY],a=process.env[p.LANGFUSE_SECRET_KEY];if(s)if(o&&i&&a){let c=await ue();for(let u of c)u.mode==="direct"&&(Dt("FLOW_TELEMETRY=true (direct mode enabled)"),Dt("Mode: direct"),ze(`Endpoint: ${u.endpoint}`),ze(`PK: ${wn(i)}`),ze(`SK: ${wn(a)}`));}else Rr("FLOW_TELEMETRY=true but missing LANGFUSE vars:"),o||xt("LANGFUSE_BASE_URL not set"),i||xt("LANGFUSE_PUBLIC_KEY not set"),a||xt("LANGFUSE_SECRET_KEY not set");else {let c=await ue();if(c.length>0)for(let u of c)u.mode==="gateway"&&(Dt("Mode: gateway"),ze(`Endpoint: ${u.endpoint}`));else c.authError?Rr("Gateway mode: token refresh failed. Run `flow-ai-obs login`."):ze("No active tracing destination configured.");}return Ln(),0}var In=T(()=>{"use strict";B();le();P();de();yr();});var Pn={};Z(Pn,{runUpdateApiKey:()=>Fo});async function Fo(e={}){let t=e.key!==void 0?ie(e.key):V();if(!t)return e.key!==void 0?process.stderr.write(k(` \u2717 Provided API key is invalid.
|
|
236
237
|
`)+m(` Ensure the key contains valid characters and does not exceed 1024 characters.
|
|
237
238
|
|
|
238
239
|
`)):process.stderr.write(k(` \u2717 FLOW_API_KEY environment variable is not set or is invalid.
|
|
239
240
|
`)+m(` Set FLOW_API_KEY=<key> in your environment and re-run.
|
|
240
241
|
|
|
241
|
-
`)),1;let r=false,n=
|
|
242
|
+
`)),1;let r=false,n=mn(t);n.status==="configured"?process.stdout.write(R(` \u2713 GitHub Copilot API key updated successfully in ${n.settingsPath}
|
|
242
243
|
`)):n.status==="already_configured"?process.stdout.write(R(` \u2713 GitHub Copilot API key is already up to date in ${n.settingsPath}
|
|
243
244
|
`)):n.reason?.includes("not installed")?process.stdout.write(m(` \u2139 VS Code is not installed \u2014 skipping Copilot API key update.
|
|
244
245
|
`)):(process.stderr.write(k(` \u2717 GitHub Copilot API key update failed: ${n.reason}
|
|
245
|
-
`)),r=true);let s=
|
|
246
|
+
`)),r=true);let s=un(t);return s.status==="configured"?process.stdout.write(R(` \u2713 Claude Desktop API key updated successfully in ${s.wrapperScriptPath}
|
|
246
247
|
`)):s.status==="already_configured"?process.stdout.write(R(` \u2713 Claude Desktop API key is already up to date in ${s.wrapperScriptPath}
|
|
247
248
|
`)):s.reason?.includes("not installed")?process.stdout.write(m(` \u2139 Claude Desktop is not installed \u2014 skipping Desktop API key update.
|
|
248
249
|
`)):(process.stderr.write(k(` \u2717 Claude Desktop API key update failed: ${s.reason}
|
|
249
|
-
`)),r=true),r?1:0}var
|
|
250
|
+
`)),r=true),r?1:0}var vn=T(()=>{"use strict";B();gr();fr();de();});var bn={};Z(bn,{runOtelHeaders:()=>Do});async function Do(){let e=V(),t=be(),r=te(lt(p.ANTHROPIC_AUTH_TOKEN));if(e&&!t&&!r)return process.stderr.write(`[flow-ai-obs otel-headers] FLOW_API_KEY is set but x-flow-user could not be resolved.
|
|
250
251
|
Run: flow-ai-obs init --custom-email <EMAIL>
|
|
251
252
|
`),1;if(!e&&process.env[p.FLOW_API_KEY]&&process.stderr.write(`[flow-ai-obs otel-headers] FLOW_API_KEY is set but its value was rejected (invalid characters or length). Falling back to OAuth.
|
|
252
253
|
`),e&&t){let i=c=>c.replace(/[\r\n]/g,""),a={"x-flow-api-key":i(e),"x-flow-user":i(t)};return process.stdout.write(JSON.stringify(a)+`
|
|
253
254
|
`),0}if(!r)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs login
|
|
254
|
-
`),1;let n=
|
|
255
|
+
`),1;let n=ut(),s=process.env[p.FLOW_BASE_URL];n&&(process.env[p.FLOW_BASE_URL]=n);let o;try{o=(await Y(r)).accessToken;}catch(i){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${i.message}
|
|
255
256
|
`),1}finally{s===void 0?delete process.env[p.FLOW_BASE_URL]:process.env[p.FLOW_BASE_URL]=s;}return o?(process.stdout.write(JSON.stringify({Authorization:`Bearer ${o.replace(/[\r\n]/g,"")}`})+`
|
|
256
257
|
`),0):(process.stderr.write(`[flow-ai-obs otel-headers] Empty token received
|
|
257
|
-
`),1)}var
|
|
258
|
-
`)[0].slice(0,t).trim()}function
|
|
259
|
-
`);for(let r=t.length-1;r>=0;r--)try{let n=JSON.parse(t[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function
|
|
258
|
+
`),1)}var Un=T(()=>{"use strict";Re();B();le();P();});function ae(e,t){let r=typeof e=="object"?JSON.stringify(e):String(e??"");return r.length>t?r.slice(0,t)+" \u2026[truncated]":r}function Mt(e,t=100){return String(e??"").split(`
|
|
259
|
+
`)[0].slice(0,t).trim()}function Et(){return new Promise(e=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{t+=r;}),process.stdin.on("end",()=>{try{e(JSON.parse(t));}catch{e({});}});})}function W(e){process.stdout.write(JSON.stringify(e));}var Ze=T(()=>{"use strict";});function Te(){return String(BigInt(Date.now())*1000000n)}var kr,Ne,ht=T(()=>{"use strict";kr=()=>nn.randomBytes(16).toString("hex"),Ne=()=>nn.randomBytes(8).toString("hex");});function Jo(e,t){let r=L.resolve(e);if(!r.startsWith(t))throw new Error(`Path traversal detected: ${e}`);return r}function Ir(e){if(!Vo.test(e))throw new Error(`Invalid session ID: ${e}`);return Jo(L.join(ke.tmpdir(),`flow-obs-${e}.json`),Go)}function Qe(e){let t;try{t=Ir(e);}catch{return null}if(!E.existsSync(t))return null;try{return JSON.parse(E.readFileSync(t,"utf8"))}catch{return null}}function et(e,t){E.writeFileSync(Ir(e),JSON.stringify(t),{encoding:"utf8",mode:384});}function Pr(e){try{E.unlinkSync(Ir(e));}catch{}}var Vo,Go,_t=T(()=>{"use strict";Vo=/^[0-9a-f-]{1,64}$/i,Go=L.normalize(ke.tmpdir())+L.sep;});function Dn(e){if(!e||!E.existsSync(e))return null;try{let t=E.readFileSync(e,"utf8").trimEnd().split(`
|
|
260
|
+
`);for(let r=t.length-1;r>=0;r--)try{let n=JSON.parse(t[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function vr(e){if(!e||!E.existsSync(e))return null;try{let t=E.readFileSync(e,"utf8").trimEnd().split(`
|
|
260
261
|
`),r=[],n=0,s=0,o;for(let i=t.length-1;i>=0;i--)try{let a=JSON.parse(t[i]);if(a.type==="user")break;if(a.type==="assistant"){!o&&a.message?.model&&(o=a.message.model);let u=(a.message?.content??[]).filter(d=>d.type==="text").map(d=>d.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(`
|
|
261
262
|
|
|
262
|
-
`),inputTokens:n,outputTokens:s,model:o}}catch{}return null}var
|
|
263
|
-
`)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function
|
|
264
|
-
`);return}let n=!!(await
|
|
265
|
-
`,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${
|
|
263
|
+
`),inputTokens:n,outputTokens:s,model:o}}catch{}return null}var br=T(()=>{"use strict";});function Bn(e){return e.replace(":","/")}function Bt(e,t){if(!e)return null;let r=Bn(e),n=[L.join(ke.homedir(),".claude","skills",r,"SKILL.md"),L.join(t??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(E.existsSync(s))try{return E.readFileSync(s,"utf8")}catch{}return null}function Wn(e){return e.split(`
|
|
264
|
+
`)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function Hn(e){return !!e.slashSkill||e.toolCalls.some(n=>n.tool==="Skill")?e.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||ti.has(n.tool))?"complete":"prerequisite_required":null}function Wt(e,t){if(!e)return null;let r=Bn(e),n=[L.join(ke.homedir(),".claude","skills",r),L.join(t??"",".claude","skills",r)],s=null;for(let a of n)if(E.existsSync(L.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let u of E.readdirSync(a,{withFileTypes:true})){if(Zo.has(u.name)||ei.has(u.name)||Qo.has(L.extname(u.name)))continue;let h=c?`${c}/${u.name}`:u.name;u.isDirectory()?i(L.join(a,u.name),h):o.push(h);}}return i(s,""),o.length>0?o:null}var Zo,Qo,ei,ti,Ht=T(()=>{"use strict";Zo=new Set([".venv","__pycache__",".git","node_modules"]),Qo=new Set([".pyc",".pyo"]),ei=new Set(["SKILL.md",".DS_Store",".gitignore"]);ti=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function si(e){try{let t=e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(t,"base64").toString())}catch{return null}}function oi(e,t,r,n){return new Promise(s=>{let o=new URL(e),i=o.protocol==="https:",a=(i?Is__namespace.default:js__namespace.default).request({hostname:o.hostname,port:o.port||(i?443:80),path:o.pathname+o.search,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(t),Authorization:`Bearer ${String(r).replace(/[\r\n]/g,"")}`,FlowTenant:String(n).replace(/[\r\n]/g,"")}},c=>{c.resume(),s(c.statusCode??0);});a.on("error",()=>s(0)),a.setTimeout(5e3,()=>{a.destroy(),s(0);}),a.write(t),a.end();})}async function $e(e,t={}){try{let r=te(process.env[p.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,s=new Promise((d,y)=>{n=setTimeout(()=>y(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:o}=await Promise.race([Y(r),s]);clearTimeout(n);let i=si(o);if(!i)return;let a=i.tenant||r.tenant,c=JSON.stringify({action:e,booster:At().BOOSTER,metadata:t,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:i.email||"",id:i.sub||"",name:i.name||i.email||""}}),u=ve(At().API_URL),h=await oi(u,c,o,a);l("metrics.logEvent",`action=${e} status=${h}`);}catch(r){l("metrics.logEvent",`silenced error: ${r.message}`);}}var Kt=T(()=>{"use strict";P();Re();B();x();});async function Ur(e,t=false){if(t){process.stdout.write(JSON.stringify({decision:"block",reason:ii})+`
|
|
265
|
+
`);return}let n=!!(await ue()).authError,s=e.session_id||"unknown",o=e.prompt||"",i=e.cwd||"",a=Dn(e.transcript_path)||kr(),c=Wn(o),u=c?Bt(c,i):null,h=c?Wt(c,i):null;et(s,{traceId:kr(),spanId:Ne(),startNs:Te(),sessionId:s,prompt:o,cwd:i,traceName:a,transcriptPath:e.transcript_path||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:u,skillArtifacts:h}),$e("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),l("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),W(e);}var ii,Kn=T(()=>{"use strict";ht();_t();br();Ht();Ze();x();P();B();Kt();ii=`\u26D4 Could not verify your Flow API key. This may be a temporary instability in the Flow services, or your API key may have expired. Please try again in a few minutes. If the issue persists, check your credentials at ${Oe()}/settings/api-keys and run: flow-ai-obs login. If it still persists, contact Flow support through the official channels.`;});async function Yn(e){let t=e.session_id||"unknown",r=e.tool_name||"unknown",n=e.tool_input||{},s=Qe(t);s&&(s.pendingTool={name:r,inputStr:ae(n,Q.TOOL_INPUT),startNs:Te()},et(t,s)),l("PreToolUse",`sid=${t}`,`tool=${r}`,`stateFound=${!!s}`),W(e);}var jn=T(()=>{"use strict";ht();_t();Ze();x();P();});function g(e,t){return t==null||t===""?null:{key:e,value:{stringValue:String(t)}}}function Fe(...e){return e.filter(t=>t!==null)}function Vn(e,t){return {resourceSpans:[{resource:{attributes:e},scopeSpans:[{scope:ai,spans:Array.isArray(t)?t:[t]}]}]}}var ai,O,Gn=T(()=>{"use strict";P();ai={name:wt.SCOPE_NAME,version:wt.SCOPE_VERSION},O={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 Xn(e,t,r,n,s){if(process.env[p.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:e,headers:t,body:JSON.parse(r)},response:{status:n,body:s}});try{E.writeFileSync(Jn,o+`
|
|
266
|
+
`,{flag:"a",encoding:"utf8",mode:384}),l("sendTraces:dump",`request appendada em ${Jn}`);}catch(i){l("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function fi(e){let t=new URL(e),r=new URL(H().GATEWAY_HEALTH);return r.hostname=t.hostname,r.port=t.port,r.protocol=t.protocol,r}function qn(e,t){return new Promise((r,n)=>{let s=e._isSSL?Is__namespace.default:js__namespace.default;e.headers=Object.assign({},e.headers,{Connection:"close"});let o=s.request(e,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}`))),t&&o.write(t),o.end();})}async function zn(e,t){let r;try{r=fi(e);}catch{return false}let n=r.protocol==="https:";try{let s={};t&&(s.Authorization=String(t).replace(/[\r\n]/g,""));let o=await qn({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 Yt(e,t,r){let n=JSON.stringify(e),s=new URL(t),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 ${t}`),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 qn({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}`),Xn(t,a,n,c.statusCode,c.body),c.statusCode}catch(c){return l("sendTraces:error",c.message),Xn(t,a,n,0,c.message),0}}var Jn,Zn=T(()=>{"use strict";P();x();Jn=L.join(ke.tmpdir(),"flow-obs-requests.ndjson");});function mi(){let e=parseInt(process.env[p.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(e)?Math.max(q.MIN_TTL_DAYS,Math.min(q.MAX_TTL_DAYS,e)):q.DEFAULT_TTL_DAYS)*24*60*60*1e3}function gi(){let e=parseInt(process.env[p.BUFFER_MAX_FILES]??"",10);return Number.isFinite(e)?Math.max(q.MIN_MAX_FILES,Math.min(q.MAX_MAX_FILES,e)):q.DEFAULT_MAX_FILES}function es(e){if(/[/\\]/.test(e))throw new Error(`Invalid buffer fileId: ${e}`);return L__namespace.default.join(ke__namespace.default.tmpdir(),`${q.FILE_PREFIX}${e}.json`)}function Nr(){let e=ke__namespace.default.tmpdir(),t;try{t=E__namespace.default.readdirSync(e);}catch{return []}return t.filter(r=>r.startsWith(q.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=L__namespace.default.join(e,r),s=0;try{s=E__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function Tt(e){try{let t=gi(),r=Nr();if(r.length>=t){let o=r.slice(0,r.length-t+1);for(let i of o)try{E__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:e};return E__namespace.default.writeFileSync(es(n),JSON.stringify(s),{encoding:"utf8",mode:384}),l("buffer",`saved fileId=${n}`),n}catch(t){return l("buffer",`saveToBuffer failed: ${t.message}`),null}}function ts(e){let t=Nr(),r=e!=null&&e>0?e:t.length,n=[];for(let s of t){if(n.length>=r)break;try{let o=E__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 rs(e){try{E__namespace.default.unlinkSync(es(e)),l("buffer",`deleted fileId=${e}`);}catch{}}function ns(){let e=Date.now()-mi();for(let t of Nr())try{let{mtimeMs:r}=E__namespace.default.statSync(t);r<e&&(E__namespace.default.unlinkSync(t),l("buffer",`evicted stale: ${L__namespace.default.basename(t)}`));}catch{}}var ss=T(()=>{"use strict";P();x();});async function Ei(e){ns();let t=ts(q.REPLAY_BATCH_SIZE);t.length&&(l("replayBufferedTraces",`replaying ${t.length} buffered trace(s)`),await Promise.allSettled(t.map(async r=>{try{let n=await Yt(r.payload,e.endpoint,e.authHeader);n>=200&&n<300?(rs(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 os(e){let t=await ue();if(!t.length)return t.authError&&(l("postToLangfuse","auth refresh failed \u2014 buffering trace"),Tt(e)),0;let r=await Promise.all(t.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await zn(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 Ei(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"),Tt(e),0;let c=await Yt(e,o.endpoint,o.authHeader);return (c===0||c>=500)&&(l("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),Tt(e)),c}let a=await Yt(e,o.endpoint,o.authHeader);return (a===0||a>=500)&&(l("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),Tt(e)),a}))).find(o=>o!==0)??0}var is=T(()=>{"use strict";B();x();Zn();ss();P();});var $r=T(()=>{"use strict";Gn();is();});function Se(e){if(e==null)return "";let t=typeof e=="string"?e:JSON.stringify(e);return yi.reduce((r,{re:n,replace:s})=>r.replace(n,s),t)}var z,hi,_i,Ti,as,yi,Fr=T(()=>{"use strict";z="[REDACTED]",hi="[REDACTED-EMAIL]",_i="[REDACTED-CPF]",Ti="[REDACTED-CNPJ]",as="[REDACTED-PHONE]",yi=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${z}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${z}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(e,t)=>`${t}${z}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(e,t)=>`${t}${z}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(e,t,r)=>`${t}
|
|
266
267
|
${z}
|
|
267
|
-
${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${z}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(e,t)=>`${t}${z}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${z}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${z}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${z}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(e,t,r)=>`${t}${r}${z}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(e,t)=>`${t}:${z}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>
|
|
268
|
-
`)),$=u?.inputTokens??0,b=u?.outputTokens??0
|
|
269
|
-
`),process.stdin.on("data",t=>process.stdout.write(t));}}var
|
|
270
|
-
`),process.exit(0);});});var
|
|
268
|
+
${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${z}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(e,t)=>`${t}${z}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${z}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${z}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${z}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(e,t,r)=>`${t}${r}${z}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(e,t)=>`${t}:${z}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>hi},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>_i},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Ti},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>as},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>as}];});async function cs(e){let t=e.session_id||"unknown",r=e.tool_name||"unknown",n=e.tool_input||{},s=e.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=Qe(t);if(!i){W(e);return}let a=Te(),c=i.pendingTool,u=c?.name===r,h=u?c.startNs:String(BigInt(a)-200000000n),d=u?c.inputStr:ae(n,Q.TOOL_INPUT),y=d,S=null;if(r==="Skill"){let we=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);S=we?String(we).trim():null;let pe=S?Bt(S,i.cwd):null;pe&&(y=pe,i.skillContent||(i.skillContent=pe),i.skillArtifacts||(i.skillArtifacts=Wt(S,i.cwd))),S&&!i.slashSkill&&(i.slashSkill=S),l("PostToolUse","Skill tool detected",`skillName=${S}`,`contentFound=${!!pe}`);}let $=Se(ae(o,Q.TOOL_OUTPUT)),b=/\b(error|exception|failed|failure|traceback|errno)\b/i.test($.slice(0,500)),xe=b?"ERROR":"DEFAULT",f=Ne(),F=Math.round(Number(BigInt(a)-BigInt(h))/1e6),ce={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",J=r==="Skill"&&S?S:Mt(d,60);i.toolCalls.push({tool:r,brief:J,error:b,durationMs:F});let oe=i.spans;oe.push({traceId:i.traceId,spanId:f,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:h,endTimeUnixNano:a,attributes:Fe(g(O.OBS_NAME,r),g(O.OBS_TYPE,ce),g(O.OBS_LEVEL,xe),g(O.OBS_INPUT,Se(y)),g(O.OBS_OUTPUT,$),g("tool.name",r),g("tool.error",String(b)),r==="Skill"&&S?g("skill.name",S):null,r==="Skill"?g("skill.invocation","slash-command"):null),status:{code:b?2:1}}),i.pendingTool=null,et(t,i),b&&$e("TOOL_ERROR",{toolName:r}),l("PostToolUse",`sid=${t}`,`tool=${r}`,`error=${b}`,`durationMs=${F}`,`totalSpans=${oe.length}`),W(e);}var ls=T(()=>{"use strict";ht();_t();$r();Ze();Ht();x();P();Fr();Kt();});function ps(e,t,r){let n=Object.keys(us).find(i=>(e??"").toLowerCase().includes(i));if(!n)return;let s=us[n],o=(t*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var us,ds=T(()=>{"use strict";us={"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 fs(e){let t=e.session_id||"unknown",r=e.stop_reason||"end_turn",n=Qe(t);if(!n){W(e);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(l("Stop",`sid=${t}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=Te(),o=await rn(),i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(A=>A.tool==="Skill")){let A=Ne(),Ae=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:A,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:Fe(g(O.OBS_NAME,"Skill"),g(O.OBS_TYPE,"TOOL"),g(O.OBS_LEVEL,"DEFAULT"),g(O.OBS_INPUT,Ae),g(O.OBS_OUTPUT,"loaded via slash command"),g("tool.name","Skill"),g("tool.error","false"),g("skill.name",n.slashSkill),g("skill.invocation","slash-command")),status:{code:1}}),l("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=e.transcript_path||n.transcriptPath||"",u=vr(c);if(c&&(i.some(A=>A.tool==="Skill"&&!A.synthetic)||!!n.slashSkill)&&!u?.text){await new Promise(Ae=>setTimeout(Ae,500));let A=vr(c);A?.text&&(u=A);}l("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${u?`text=${u.text.length}chars`:"null"}`);let d=i.length,y=i.filter(A=>A.error).length,S=Se(u?.text?ae(u.text,Q.TRACE_OUTPUT):d===0?"No tools used":i.map((A,Ae)=>`${Ae+1}. ${A.tool}${A.brief?` \u2192 ${A.brief}`:""}${A.error?" [ERROR]":""}`).join(`
|
|
269
|
+
`)),$=u?.inputTokens??0,b=u?.outputTokens??0,xe=i.map((A,Ae)=>`${Ae+1}. ${A.tool}${A.brief?` \u2192 ${A.brief}`:""}${A.error?" [ERROR]":""} (${A.durationMs}ms)`),f=!!(n.slashSkill||i.some(A=>A.tool==="Skill")),F=i.some(A=>A.tool==="Agent");if(!f&&!F){l("Stop",`sid=${t}`,"skipping trace \u2014 no Skill or Agent calls found"),$e("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),Pr(t),W(e);return}let se=f?"skill":"agent",ce=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),J=u?.model||"",rt=ps(J,$,b),oe=Hn(n);oe==="prerequisite_required"&&u?.text&&(oe="complete"),oe==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:Ne(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Fe(g(O.OBS_NAME,"prerequisite-check"),g(O.OBS_TYPE,"EVENT"),g(O.OBS_LEVEL,"WARNING"),g(O.OBS_OUTPUT,S),g("skill.name",n.slashSkill||void 0),g("execution_status","prerequisite_required")),status:{code:1}}),l("Stop",`sid=${t}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let we=(()=>{if(!(!f||!n.prompt)){if(n.slashSkill){let A=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return A?ae(Se(A),Q.USER_INSTRUCTION):void 0}return ae(Se(n.prompt),Q.USER_INSTRUCTION)||void 0}})(),pe=JSON.stringify({trace_type:se,...oe!==null&&{execution_status:oe},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...we!==void 0&&{user_instruction:we},latency_ms:ce,...$&&{tokens_input:$},...b&&{tokens_output:b},cost_usd:rt,...J?{model:J}:{},toolCount:d,errorCount:y,stopReason:r,sessionId:n.sessionId,tools:xe.length?xe:void 0}),yt=Se(ae(n.prompt,Q.TRACE_INPUT)),Me=Fe(g(O.TRACE_NAME,n.traceName),g(O.TRACE_INPUT,yt),g(O.TRACE_OUTPUT,S),g(O.OBS_INPUT,yt),g(O.OBS_OUTPUT,S),g(O.TRACE_METADATA,pe),g(O.SESSION_ID,n.sessionId),g(O.USER_ID,o.user),g(O.OBS_TYPE,"GENERATION"),g(O.MODEL,J),$?g(O.INPUT_TOKENS,$):null,b?g(O.OUTPUT_TOKENS,b):null,g("claude.stop_reason",r),g("claude.tool_count",String(d)),g("claude.error_count",String(y)),g("claude.session_id",n.sessionId),g("flow.trace_type",se),{key:O.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:se}]}}}),jt={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:Me,status:{code:y>0?2:1}},_s=Fe(g("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),g("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),Dr=[...a,jt];l("Stop",`sid=${t}`,`totalTools=${d}`,`errorTools=${y}`,`spans=${Dr.length}`,`inputTokens=${$}`,`outputTokens=${b}`,`traceOutput="${Mt(S,80)}"`);let Ts=await os(Vn(_s,Dr));l("Stop",`POST status=${Ts}`,`traceId=${n.traceId}`),$e("TRACE_SENT",{latencyMs:ce,totalTools:d,errorTools:y,inputTokens:$,outputTokens:b,costUsd:rt}),Pr(t),W(e);}var ms=T(()=>{"use strict";ht();_t();$r();B();ds();br();Ze();x();Ht();Fr();P();Kt();});var De,gs=T(()=>{"use strict";B();Ze();Kn();jn();ls();ms();De=class{static async userPromptSubmit(){let t=await Et(),r;try{r=await ue();}catch{W(t);return}r.authError?await Ur(t,!0):r.length>0?await Ur(t):W(t);}static async preToolUse(){let t=await Et();await Yn(t);}static async postToolUse(){let t=await Et();await cs(t);}static async stop(){let t=await Et();await fs(t);}};});var wi={};async function Si(){let e=process.argv[2];switch(e){case "UserPromptSubmit":await De.userPromptSubmit();break;case "PreToolUse":await De.preToolUse();break;case "PostToolUse":await De.postToolUse();break;case "Stop":await De.stop();break;default:process.stderr.write(`[flow-obs] unknown event: ${e}
|
|
270
|
+
`),process.stdin.on("data",t=>process.stdout.write(t));}}var Es=T(()=>{"use strict";gs();Si().catch(e=>{process.stderr.write(`[flow-obs] fatal: ${e.message}
|
|
271
|
+
`),process.exit(0);});});var Ai=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,G]=process.argv;function ne(e,t){let r=e.indexOf(t);return r!==-1?e[r+1]:void 0}function hs(){let{bold:e,cyan:t,dim:r,green:n}=(de(),D(Gt)),{version:s}=nt();process.stdout.write(`
|
|
271
272
|
`+e(" flow-ai-obs")+r(" v"+s)+`
|
|
272
273
|
|
|
273
274
|
`),process.stdout.write(t(" init")+r(` Configure environment: Claude Code + Proxy + OTEL + Trace hooks
|
|
@@ -285,18 +286,18 @@ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${z}`},{re:/(aws_secret_ac
|
|
|
285
286
|
|
|
286
287
|
`)),process.stdout.write(r(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
|
|
287
288
|
|
|
288
|
-
`));}if(
|
|
289
|
-
`);let t=(
|
|
289
|
+
`));}if(G==="--version"||G==="-v")(async()=>{let{version:e}=nt();process.stdout.write(e+`
|
|
290
|
+
`);let t=(Ke(),D(He)),r=await t.fetchLatestVersionAsync().catch(()=>null);if(r&&t.isNewer(e,r.version)){let{dim:n,yellow:s}=(de(),D(Gt));process.stdout.write(s(`
|
|
290
291
|
Update available: ${e} \u2192 ${r.version}
|
|
291
292
|
`)+n(` Run: flow-ai-obs update
|
|
292
293
|
|
|
293
|
-
`));}process.exit(0);})().catch(()=>process.exit(0));else if(
|
|
294
|
-
`),await(
|
|
295
|
-
`),process.exit(1);});else if(
|
|
296
|
-
`),process.exit(1);});else if(
|
|
297
|
-
`),process.exit(1);});else if(
|
|
298
|
-
`),process.exit(1);});else if(
|
|
294
|
+
`));}process.exit(0);})().catch(()=>process.exit(0));else if(G==="--help"||G==="-h")hs(),process.exit(0);else if(G==="init"||G==="install")(async()=>{G==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
|
|
295
|
+
`),await(Ke(),D(He)).checkForUpdateInteractive();let{runInit:e}=(Sn(),D(yn)),t=process.argv.slice(3);process.exit(await e({url:ne(t,"--custom-url"),noInteractive:t.includes("--no-interactive"),email:ne(t,"--custom-email"),token:ne(t,"--token"),clientId:ne(t,"--client-id"),clientSecret:ne(t,"--client-secret"),tenant:ne(t,"--tenant")}));})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
|
|
296
|
+
`),process.exit(1);});else if(G==="login")(async()=>{await(Ke(),D(He)).checkForUpdateInteractive();let{runLogin:e}=(mt(),D(ft)),t=process.argv.slice(3),r=await e({token:ne(t,"--token"),clientId:ne(t,"--client-id"),clientSecret:ne(t,"--client-secret"),tenant:ne(t,"--tenant")});process.exit(typeof r=="number"?r:r.code);})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
|
|
297
|
+
`),process.exit(1);});else if(G==="status")(async()=>{await(Ke(),D(He)).checkForUpdateInteractive();let{runStatus:e}=(In(),D(kn));process.exit(await e());})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
|
|
298
|
+
`),process.exit(1);});else if(G==="update-api-key")(async()=>{let{runUpdateApiKey:e}=(vn(),D(Pn)),t=process.argv.slice(3);process.exit(await e({key:ne(t,"--key")}));})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
|
|
299
|
+
`),process.exit(1);});else if(G==="update")(async()=>{let e=(Ke(),D(He)),{version:t}=nt(),r=await e.fetchLatestVersionAsync();r||(process.stderr.write(` \u2717 Could not reach npm registry \u2014 check your connection.
|
|
299
300
|
`),process.exit(1)),e.isNewer(t,r.version)||(process.stdout.write(` \u2713 Already up to date (v${t})
|
|
300
301
|
`),process.exit(0)),await e.runUpdate(r.version),process.exit(0);})().catch(e=>{process.stderr.write(`Unexpected error: ${e.message}
|
|
301
|
-
`),process.exit(1);});else if(
|
|
302
|
-
`),process.exit(1);});}else
|
|
302
|
+
`),process.exit(1);});else if(G==="otel-headers"){let{runOtelHeaders:e}=(Un(),D(bn));e().then(t=>process.exit(t)).catch(t=>{process.stderr.write(`[flow-ai-obs otel-headers] Unexpected error: ${t.message}
|
|
303
|
+
`),process.exit(1);});}else Ai.has(G)?(Es(),D(wi)):(hs(),process.exit(0));
|