@ciandt-flow/flow-ai-obs 0.7.1-beta.475 → 0.7.1-beta.501
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 +113 -110
- package/dist/setup.js +3 -3
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,78 +1,81 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';var _e=require('readline/promises'),
|
|
3
|
-
`);}catch(i){throw r.close(),i}if(r.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function
|
|
2
|
+
'use strict';var _e=require('readline/promises'),as=require('https'),y=require('fs'),tt=require('os'),kt=require('path'),child_process=require('child_process'),ks=require('http'),util=require('util'),crypto=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 _e__namespace=/*#__PURE__*/_interopNamespace(_e);var as__namespace=/*#__PURE__*/_interopNamespace(as);var y__namespace=/*#__PURE__*/_interopNamespace(y);var tt__namespace=/*#__PURE__*/_interopNamespace(tt);var kt__namespace=/*#__PURE__*/_interopNamespace(kt);var ks__namespace=/*#__PURE__*/_interopNamespace(ks);var Te=Object.defineProperty;var ts=Object.getOwnPropertyDescriptor;var es=Object.getOwnPropertyNames;var rs=Object.prototype.hasOwnProperty;var xt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var m=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var ns=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},M=(t,e)=>{for(var r in e)Te(t,r,{get:e[r],enumerable:true});},ss=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of es(e))!rs.call(t,s)&&s!==r&&Te(t,s,{get:()=>e[s],enumerable:!(n=ts(e,s))||n.enumerable});return t};var L=t=>ss(Te({},"__esModule",{value:true}),t);var re=ns((zo,os)=>{os.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.1-beta.501",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});var ye={};M(ye,{bold:()=>j,cyan:()=>H,dim:()=>S,green:()=>b,red:()=>B,yellow:()=>A});function ft(t,e){return is?r=>`\x1B[${t}m${r}\x1B[${e}m`:r=>r}var is,b,B,A,H,j,S,mt=m(()=>{"use strict";is=!process.env.NO_COLOR&&process.stdout.isTTY;b=ft("32","39"),B=ft("31","39"),A=ft("33","39"),H=ft("36","39"),j=ft("1","22"),S=ft("2","22");});function gt(){return process.stdout.isTTY===true&&process.stdin.isTTY===true&&!process.argv.includes("--no-interactive")}async function Ae(t,e){let r=_e__namespace.createInterface({input:process.stdin,output:process.stdout}),s=`${t} ${e===true?"(Y/n)":e===false?"(y/N)":"(y/n)"}: `;for(let o=1;o<=3;o++)try{let i=(await r.question(s)).trim().toLowerCase();if(i===""&&e!==void 0)return r.close(),e;if(i==="y"||i==="yes")return r.close(),!0;if(i==="n"||i==="no")return r.close(),!1;o<3&&process.stdout.write(` Invalid input. Please answer "y" or "n".
|
|
3
|
+
`);}catch(i){throw r.close(),i}if(r.close(),e!==void 0)return e;throw new Error("Too many invalid attempts for yes/no prompt")}async function dr(t,e){let r=_e__namespace.createInterface({input:process.stdin,output:process.stdout});try{let n=(await r.question(`${t}: `)).trim();if(e);return n}catch(n){throw n}finally{r.close();}}var ke=m(()=>{"use strict";});var wt={};M(wt,{checkForUpdate:()=>ms,checkForUpdateInteractive:()=>gs,fetchLatestVersionAsync:()=>gr,isNewer:()=>ht,primeUpdateCache:()=>hs});function I(){return Oe||(Oe=re()),Oe}function ht(t,e){let r=o=>{let i=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return i?[+i[1],+i[2],+i[3]]:null},n=r(t),s=r(e);return !n||!s?false:s[0]!==n[0]?s[0]>n[0]:s[1]!==n[1]?s[1]>n[1]:s[2]>n[2]}function be(){try{let t=JSON.parse(y__namespace.default.readFileSync(mr,"utf8"));return typeof t.latestVersion!="string"||Date.now()-t.checkedAt>=us?null:t}catch{return null}}function Ie(t,e,r=Date.now()){try{y__namespace.default.writeFileSync(mr,JSON.stringify({latestVersion:t,updatePriority:e??null,checkedAt:r}),{mode:384});}catch{}}function Re(t){let e=I().name,r=as__namespace.default.get(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{timeout:ds},n=>{if(n.statusCode!==200)return n.resume(),t(new Error(`HTTP ${n.statusCode}`));let s="";n.setEncoding("utf8"),n.on("data",o=>{s+=o;}),n.on("end",()=>{try{let o=JSON.parse(s);if(typeof o.version!="string")throw new Error("no version field");t(null,{version:o.version,updatePriority:typeof o.updatePriority=="string"?o.updatePriority:null});}catch(o){t(o);}});});r.on("error",t),r.on("timeout",()=>{r.destroy(new Error("timeout"));});}function ve(t){let e=I().name,n=` Update available: ${I().version} \u2192 ${t}`,s=` Run: npm install -g ${e}`,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 Le(t){let e=
|
|
9
|
+
`);}function Le(t){let e=I().name;process.stderr.write(`
|
|
10
10
|
[${e}] Critical update detected \u2014 auto-updating to ${t}...
|
|
11
11
|
|
|
12
|
-
`),child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",windowsHide:true}).unref();}async function
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
`),child_process.spawn("npm",["install","-g",`${e}@${t}`],{detached:true,stdio:"ignore",windowsHide:true}).unref();}async function ps(t,e=1e4){let r=xt("readline"),n=I().name,o=` Update available: ${I().version} \u2192 ${t}`,i=` Run: npm install -g ${n}`,a=" Install now? [y/N]: ",c=Math.max(o.length,i.length,a.length-2)+2,l="\u2500".repeat(c);return process.stderr.write(`
|
|
13
|
+
\u256D${l}\u256E
|
|
14
|
+
\u2502${o.padEnd(c)}\u2502
|
|
15
|
+
\u2502${i.padEnd(c)}\u2502
|
|
16
|
+
\u2502${a.padEnd(c)}\u2502
|
|
17
|
+
\u2570${l}\u256F
|
|
18
|
+
`),new Promise(p=>{let T=r.createInterface({input:process.stdin,output:void 0,terminal:false}),g=false;function E(_){g||(g=true,clearTimeout(O),T.close(),process.stderr.write(`
|
|
19
|
+
`),p(_));}let O=setTimeout(()=>E(false),e);T.once("line",_=>E(_.trim().toLowerCase()==="y")),T.once("close",()=>E(false));})}async function fs(t){let e=I().name;return process.stderr.write(` Installing ${e}@${t}...
|
|
17
20
|
`),new Promise(r=>{let n=child_process.spawn("npm",["install","-g",`${e}@${t}`],{stdio:"inherit"});n.on("close",s=>{s!==0?process.stderr.write(` \u2717 Update failed \u2014 continuing with current version.
|
|
18
21
|
|
|
19
22
|
`):process.stderr.write(` \u2713 Updated to ${t}. Please restart the command.
|
|
20
23
|
|
|
21
24
|
`),r();}),n.on("error",()=>{process.stderr.write(` \u2717 Update failed \u2014 continuing with current version.
|
|
22
25
|
|
|
23
|
-
`),r();});})}function
|
|
26
|
+
`),r();});})}function gr(){return new Promise(t=>{Re((e,r)=>t(e||!r?null:r));})}function ms(){try{let t=be();if(t){ht(I().version,t.latestVersion)&&(t.updatePriority==="auto"?Le(t.latestVersion):ve(t.latestVersion));return}setImmediate(()=>{Re((e,r)=>{e||!r||(Ie(r.version,r.updatePriority),ht(I().version,r.version)&&(r.updatePriority==="auto"?Le(r.version):ve(r.version)));});});}catch{}}async function gs(t={}){try{let e=be();if(e){if(!ht(I().version,e.latestVersion))return}else {let n=await gr();if(!n||(Ie(n.version,n.updatePriority),!ht(I().version,n.version)))return;e={latestVersion:n.version,updatePriority:n.updatePriority,checkedAt:Date.now()};}if(e.updatePriority==="auto"){Le(e.latestVersion);return}if(!gt()){ve(e.latestVersion);return}await ps(e.latestVersion,t.timeoutMs)&&await fs(e.latestVersion);}catch{}}function hs(){try{if(be())return;setImmediate(()=>{Re((t,e)=>{t||!e||ht(I().version,e.version)&&Ie(e.version,e.updatePriority,0);});});}catch{}}var Oe,mr,us,ds,Et=m(()=>{"use strict";ke();mr=kt__namespace.default.join(tt__namespace.default.tmpdir(),"flow-obs-update-cache.json"),us=1440*60*1e3,ds=3e3;});function hr(){if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return {home:e,username:process.env.SUDO_USER}}return {home:tt__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||tt__namespace.userInfo().username}}function G(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"){let t=process.env.USERPROFILE;if(!t){let r=child_process.spawnSync("cmd.exe",["/c","echo","%USERPROFILE%"],{encoding:"utf8",timeout:5e3}).stdout?.trim();r&&/^[A-Za-z]:\\/.test(r)&&(t=r);}if(t){let e=t.replace(/^([A-Za-z]):/,(r,n)=>`/mnt/${n.toLowerCase()}`).replace(/\\/g,"/");return kt__namespace.join(e,".claude","settings.json")}return kt__namespace.join(tt__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let t=process.env.USERPROFILE||tt__namespace.homedir();return kt__namespace.join(t,".claude","settings.json")}if(process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER){let e=child_process.spawnSync("getent",["passwd",process.env.SUDO_USER],{encoding:"utf8",timeout:5e3}).stdout?.split(":")[5]?.trim();if(e)return kt__namespace.join(e,".claude","settings.json")}return kt__namespace.join(tt__namespace.homedir(),".claude","settings.json")}function wr(){return process.platform==="linux"&&process.getuid?.()===0&&process.env.SUDO_USER?`Running as root via sudo is not recommended.
|
|
24
27
|
Configure npm to install globals without sudo:
|
|
25
28
|
npm config set prefix '~/.npm-global'
|
|
26
|
-
export PATH=~/.npm-global/bin:$PATH`:null}var ne=m(()=>{"use strict";});function
|
|
27
|
-
`,{encoding:"utf8",mode:384});}var
|
|
28
|
-
`;try{
|
|
29
|
-
`);}}var
|
|
30
|
-
`,{encoding:"utf8",mode:384});try{
|
|
31
|
-
`,{encoding:"utf8",mode:384});try{T__namespace.chmodSync(e,384);}catch{}}finally{Lr(r);}}var bs,Mt=m(()=>{"use strict";A();yt();ne();bs=Tt.LOCK_STALE_MS;});function Bt(){let t=tt__namespace.default.homedir();if(process.platform==="darwin")return At__namespace.default.join(t,"Library","Preferences",oe,ie);if(process.platform==="win32"){let r=process.env.APPDATA??At__namespace.default.join(t,"AppData","Roaming");return At__namespace.default.join(r,oe,ie)}let e=process.env.XDG_CONFIG_HOME??At__namespace.default.join(t,".config");return At__namespace.default.join(e,oe,ie)}function $e(){try{let t=T__namespace.default.readFileSync(Bt(),"utf8");return JSON.parse(t)}catch{return {}}}function Rr(t){let e=Bt();T__namespace.default.mkdirSync(At__namespace.default.dirname(e),{recursive:true}),T__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var Fe,ce,Pr=m(()=>{"use strict";A();Fe={credentials:"credentials","token-cache":"tokenCache"};ce=class{static isAvailable(){return !0}static hasExistingData(){try{if(!T__namespace.default.existsSync(Bt()))return !1;let e=JSON.parse(T__namespace.default.readFileSync(Bt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,r){let n=$e(),s=Fe[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(e,r,n){let s=$e(),o=Fe[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;Rr(s);}async deleteSecret(e,r){let n=$e(),s=Fe[r]??r;return s in n?(delete n[s],Rr(n),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Bt()}`}};});var Nr={};M(Nr,{MacOsKeyVaultProvider:()=>De});var xe,De,Cr=m(()=>{"use strict";xe=util.promisify(child_process.execFile),De=class{static async isAvailable(){try{return T.accessSync("/usr/bin/security",T.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await xe("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await xe("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await xe("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Fr={};M(Fr,{LinuxKeyVaultProvider:()=>Me});var Ur,Me,$r=m(()=>{"use strict";Ur=util.promisify(child_process.execFile),Me=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of e)try{return T.accessSync(r,T.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await Ur("secret-tool",["lookup","service",e,"account",r]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await new Promise((s,o)=>{let i=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",r]);i.on("error",o),i.on("close",a=>{a===0?s():o(new Error(`secret-tool exited with code ${a}`));}),i.stdin.write(n),i.stdin.end();});}async deleteSecret(e,r){try{return await Ur("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var xr={};M(xr,{WindowsKeyVaultProvider:()=>Be});var Be,Dr=m(()=>{"use strict";Be=class{static async isAvailable(){try{return await $t("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return $t("keytar").getPassword(e,r)}async setSecret(e,r,n){await $t("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return $t("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});async function Mr(){return await Hs()??new ce}async function Hs(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Cr(),Nr));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>($r(),Fr));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Dr(),xr));return await t.isAvailable()?new t:null}default:return null}}var Br=m(()=>{"use strict";Pr();});function Ot(){return He||(He=Mr()),He}async function O(){let e=await(await Ot()).getSecret(kt,je);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Ye(t){if(!t.clientId||!t.clientSecret||!t.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await Ot()).setSecret(kt,je,JSON.stringify(t));}async function Hr(){let t=await Ot();await t.deleteSecret(kt,je),await t.deleteSecret(kt,Ve);}async function jt(t){await(await Ot()).setSecret(kt,Ve,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function vt(){let e=await(await Ot()).getSecret(kt,Ve);if(!e)return null;try{let r=JSON.parse(e);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function le(){let t=await vt();return t?new Date(t.expiresAt)>new Date:false}async function at(){let t=await vt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}async function We(){let t=await Ot();if(typeof t.getStoragePath=="function")return t.getStoragePath();let e=process.platform;return e==="darwin"?"macOS Keychain":e==="win32"?"Windows Credential Manager":"Linux Secret Service (libsecret)"}async function jr(){let t=await O();return !!(t&&t.clientId&&t.clientSecret&&t.tenant)}var kt,je,Ve,He,Lt=m(()=>{"use strict";Br();A();kt=se.SERVICE,je=se.ACCOUNT_CREDS,Ve=se.ACCOUNT_TOKEN,He=null;});function Vs(t){return js.some(e=>e.test(t))}function Ys(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function b(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[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 Vr(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${r}.`}function It(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[f.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&Vs(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Yr(){let t=b(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(t)return {user:await at().catch(()=>null)??t.clientId,tenant:t.tenant};if(ae.KEYCHAIN_ENABLED)try{let e=await O();if(!e)return {user:"",tenant:""};let r=await at()??e.clientId??"",n=e.tenant??"";return {user:r,tenant:n}}catch{return {user:"",tenant:""}}return {user:"",tenant:""}}function Ws(){return new Date().toISOString().slice(0,10)}async function Gs(t){let e=Ws(),r=await vt();if(r?.lastAuthCheckAt!==e){u("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let o=await x(t);try{await jt({...o,lastAuthCheckAt:e});}catch{}return u("getOrRefreshToken",`daily check passed, expires=${o.expiresAt}`),o.accessToken}catch(o){if(o instanceof it)throw o;u("getOrRefreshToken",`daily check network error \u2014 using cache: ${o.message}`);}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(u("getOrRefreshToken",`cacheValid=${n}`),n)return u("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;u("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let s=await x(t);try{await jt({...s,lastAuthCheckAt:e});}catch(o){u("getOrRefreshToken",`token cache save failed (non-fatal): ${o.message}`);}return u("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function Ks(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function qs(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function K(){let t=[],e=process.env[f.ANTHROPIC_MODEL]??"",r=b(process.env[f.ANTHROPIC_AUTH_TOKEN]);u("resolveCredentials",r?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),r&&u("resolveCredentials",`clientId=${r.clientId}`,`tenant=${r.tenant}`),!r&&ae.KEYCHAIN_ENABLED&&(r=await O(),r&&u("resolveCredentials","credentials resolved from keychain (FEATURES.KEYCHAIN_ENABLED=true)"));let n=r?r.tenant:"",s=process.env[f.FLOW_TELEMETRY]==="true",o=process.env[f.LANGFUSE_BASE_URL],i=process.env[f.LANGFUSE_PUBLIC_KEY],a=process.env[f.LANGFUSE_SECRET_KEY];if(s&&o&&i&&a){let E="",S=n;if(r)E=await at().catch(()=>null)??r.clientId;else if(ae.KEYCHAIN_ENABLED)try{let k=await O();k&&(E=await at()??k.clientId,S=k.tenant);}catch{}let v={user:E??"",tenant:S??"",team:"",project:"",model:e};t.push({mode:"direct",...qs(It(o),i,a),...v}),u("resolveCredentials","direct mode active",`user=${v.user}`,`tenant=${v.tenant}`);}if(!r){if(t.length===0){let E=[];return E.authError=false,E}return t}let c;try{c=await Gs(r);}catch(E){if(u("resolveCredentials",`token refresh failed: ${E.message}`,`(tenant=${r.tenant} clientId=${r.clientId})`),t.length>0)return t.authError=true,t;let S=[];return S.authError=true,S}let d={user:Ys(c)??r.clientId,tenant:n,team:"",project:"",model:e},y=process.env[f.FLOW_TELEMETRY_GATEWAY]??nt();return t.push({mode:"gateway",...Ks(It(y),{accessToken:c}),...d}),t}async function Wr(){return (await K()).length>0}var js,Y=m(()=>{"use strict";Lt();yt();A();$();js=[/^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 Ge(){return At__namespace.default.join(tt__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function Kr(){try{let t=Ge();T__namespace.default.mkdirSync(At__namespace.default.dirname(t),{recursive:!0}),T__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function qr(){try{T__namespace.default.unlinkSync(Ge());}catch{}}function de(){try{return T__namespace.default.existsSync(Ge())}catch{return false}}var Jr=m(()=>{"use strict";});var Ke={};M(Ke,{runLogin:()=>bt,runLogout:()=>to,runStatus:()=>eo});function q(t){return typeof t=="string"?t.replace(zs,""):t}function Vt(t,e={}){return new Promise((r,n)=>{let{masked:s=false,defaultValue:o=""}=e;process.stdout.write(t+o);let i=o;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=d=>{if(d===""){l(),n(new Error("SIGINT"));return}if(d==="\r"||d===`
|
|
29
|
+
export PATH=~/.npm-global/bin:$PATH`:null}var ne=m(()=>{"use strict";});function yr(){if(process.platform==="win32"){let r=process.env.APPDATA||kt__namespace.join(tt__namespace.homedir(),"AppData","Roaming");return kt__namespace.join(r,Er,Sr)}let t=hr(),e=process.env.XDG_CONFIG_HOME||kt__namespace.join(t.home,".config");return kt__namespace.join(e,Er,Sr)}function _r(){try{let t=y__namespace.readFileSync(yr(),"utf8");return JSON.parse(t)}catch{return {}}}function rt(){let{baseUrl:t}=_r();return typeof t!="string"||t.trim()===""?null:t.trim().replace(/\/$/,"")}function Ar(t){let e=yr();y__namespace.mkdirSync(kt__namespace.dirname(e),{recursive:true});let n={..._r(),baseUrl:t};y__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
|
|
30
|
+
`,{encoding:"utf8",mode:384});}var Er,Sr,Ne=m(()=>{"use strict";ne();Er="flow-ai-obs",Sr="config.json";});function nt(){return rt()??process.env.FLOW_BASE_URL??ws}function st(){let t=nt();return {AUTH_ENGINE:process.env.FLOW_AUTH_ENGINE_URL||`${t}/auth-engine-api/v2/api-key/token`,GATEWAY_TRACES:process.env.FLOW_GATEWAY_TRACES_URL||`${t}/flow-langfuse-gateway/v1/traces`,GATEWAY_HEALTH:process.env.FLOW_GATEWAY_HEALTH_URL||`${t}/flow-langfuse-gateway/v1/health`,OTEL_ENDPOINT:process.env.FLOW_OTEL_ENDPOINT_URL||`${t}/otel`}}function Dt(){let t=nt();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${t}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}function Ue(){let t=nt();return {API_URL:process.env.FLOW_METRICS_URL||`${t}/metrics-collector-api/log-event`,BOOSTER:"flow-ai-obs"}}var ws,Es,se,oe,ie,Ce,ot,f,ae,yt,kr,$,Or,V,k=m(()=>{"use strict";Ne();ws="https://flow.ciandt.com";Es=st(),se={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials",ACCOUNT_TOKEN:"token-cache"},oe="FLOW-nodejs",ie="config.json",Ce={SCOPE_NAME:"flow-ai-obs",SCOPE_VERSION:"0.1.0"};ot={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:Es.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},f={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"},ae={KEYCHAIN_ENABLED:!1},yt={LOCK_STALE_MS:3e4,CONNECTIVITY_MAX_RETRY:3,CONNECTIVITY_RETRY_MS:2e3},kr={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15},$={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},Or="flow-ai-obs-debug.log",V={TOOL_INPUT:2e4,TOOL_OUTPUT:2e4,TRACE_OUTPUT:2e4,USER_INSTRUCTION:1e4,TRACE_INPUT:5e4,TOOL_BRIEF:60};});function u(...t){if(process.env[f.FLOW_OBS_DEBUG]!=="1")return;let e=`[${new Date().toISOString()}] ${t.join(" ")}
|
|
31
|
+
`;try{y.writeFileSync(_s,e,{flag:"a"});}catch(r){process.stderr.write(`[flow-obs debug ERROR] ${r.message}
|
|
32
|
+
`);}}var _s,F=m(()=>{"use strict";k();_s=kt.join(tt.tmpdir(),Or);});function vs(t){if(!Os.test(t))throw new Error(`Invalid tenant value: "${t}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}function Ls(t,e){let r=e.length>400?e.slice(0,400)+"\u2026":e;u("toAuthError",`status=${t} body=${r}`);try{let n=JSON.parse(e);if(typeof n.error=="string"&&(u("toAuthError",`api_error_code=${n.error}`+(n.message?` api_message=${n.message}`:"")),vr[n.error]))return new it(vr[n.error])}catch{}return t===401||t===403||t===500?new it("Invalid credentials"):t>=400&&t<500?new it("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}function x(t){return new Promise((e,r)=>{try{vs(t.tenant);}catch(l){return r(l)}let n=JSON.stringify({clientSecret:t.clientSecret}),s=new URL(st().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:t.tenant}};u("getToken",`requesting token tenant=${t.tenant} host=${i.hostname} path=${i.path}`);let c=(o?as__namespace.default:ks__namespace.default).request(i,l=>{let p=[];l.on("data",T=>p.push(T)),l.on("end",()=>{let T=p.join("");if((l.statusCode??0)>=400)return r(Ls(l.statusCode??0,T));let g;try{g=JSON.parse(T);}catch{return r(new Error("Invalid response from auth engine"))}let E=g.expires_at??new Date(Date.now()+(g.expires_in??3600)*1e3).toISOString();e({accessToken:g.access_token??"",expiresAt:E});});});c.on("error",l=>r(new Error(`Network error: ${l.message}`))),c.write(n),c.end();})}var it,Os,vr,_t=m(()=>{"use strict";k();F();it=class extends Error{constructor(e){super(e),this.name="AuthError";}},Os=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$|^[a-z0-9]$/;vr={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 Lr(t){try{let e=y__namespace.statSync(t);Date.now()-e.mtimeMs>Rs&&y__namespace.unlinkSync(t);}catch{}try{y__namespace.writeFileSync(t,String(process.pid),{flag:"wx"});}catch(e){throw e.code==="EEXIST"?new Error("Another install is already in progress. If this is stale, remove: "+t):e}}function br(t){try{y__namespace.unlinkSync(t);}catch{}}function Ps(t,e){let n=(Array.isArray(t)?t:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(i=>!i.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [e,...n]}function Ir(){let t=G(),e=t+".lock",r=[];y__namespace.mkdirSync(kt__namespace.dirname(t),{recursive:true}),Lr(e);try{if(y__namespace.existsSync(t)){y__namespace.copyFileSync(t,t+".bkp");try{y__namespace.chmodSync(t+".bkp",384);}catch{}}let n={};try{n=JSON.parse(y__namespace.readFileSync(t,"utf8"));}catch{}let s=n.env&&typeof n.env=="object"?n.env:{};n.env={...ot,...Dt(),...s},n.otelHeadersHelper="flow-ai-obs otel-headers",(!n.hooks||typeof n.hooks!="object"||Array.isArray(n.hooks))&&(n.hooks={});let o=(c,l)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:l}]}),i=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],a=n.hooks;for(let c of i){let l=Ps(a[c],o(c,kr[c]));l.length>1&&r.push(c),a[c]=l;}y__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
|
|
33
|
+
`,{encoding:"utf8",mode:384});try{y__namespace.chmodSync(t,384);}catch{}}finally{br(e);}return {settingsPath:t,preserved:r}}async function Rr(t){let e;try{e=(await x(t)).accessToken;}catch{return false}return e?new Promise(r=>{$e(`Bearer ${e}`,r,1);}):false}function $e(t,e,r){let n=new URL(st().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:t,"Content-Length":Buffer.byteLength(s)}},c=(o?as__namespace:ks__namespace).request(i,l=>{l.resume(),l.statusCode===200||l.statusCode===204?e(true):r<yt.CONNECTIVITY_MAX_RETRY?setTimeout(()=>$e(t,e,r+1),yt.CONNECTIVITY_RETRY_MS):e(false);});c.on("error",()=>{r<yt.CONNECTIVITY_MAX_RETRY?setTimeout(()=>$e(t,e,r+1),yt.CONNECTIVITY_RETRY_MS):e(false);}),c.write(s),c.end();}function At(t){let e=G(),r=e+".lock";y__namespace.mkdirSync(kt__namespace.dirname(e),{recursive:true}),Lr(r);try{let n={};try{n=JSON.parse(y__namespace.readFileSync(e,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,t),y__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
|
|
34
|
+
`,{encoding:"utf8",mode:384});try{y__namespace.chmodSync(e,384);}catch{}}finally{br(r);}}var Rs,Mt=m(()=>{"use strict";k();_t();ne();Rs=yt.LOCK_STALE_MS;});function Bt(){let t=tt__namespace.default.homedir();if(process.platform==="darwin")return kt__namespace.default.join(t,"Library","Preferences",oe,ie);if(process.platform==="win32"){let r=process.env.APPDATA??kt__namespace.default.join(t,"AppData","Roaming");return kt__namespace.default.join(r,oe,ie)}let e=process.env.XDG_CONFIG_HOME??kt__namespace.default.join(t,".config");return kt__namespace.default.join(e,oe,ie)}function De(){try{let t=y__namespace.default.readFileSync(Bt(),"utf8");return JSON.parse(t)}catch{return {}}}function Pr(t){let e=Bt();y__namespace.default.mkdirSync(kt__namespace.default.dirname(e),{recursive:true}),y__namespace.default.writeFileSync(e,JSON.stringify(t,null,2),{encoding:"utf8",mode:384});}var xe,ce,Nr=m(()=>{"use strict";k();xe={credentials:"credentials","token-cache":"tokenCache"};ce=class{static isAvailable(){return !0}static hasExistingData(){try{if(!y__namespace.default.existsSync(Bt()))return !1;let e=JSON.parse(y__namespace.default.readFileSync(Bt(),"utf8"));return !!(e&&e.credentials)}catch{return !1}}async getSecret(e,r){let n=De(),s=xe[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(e,r,n){let s=De(),o=xe[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;Pr(s);}async deleteSecret(e,r){let n=De(),s=xe[r]??r;return s in n?(delete n[s],Pr(n),!0):!1}getStoragePath(){return `config.json (unencrypted) \u2014 ${Bt()}`}};});var Cr={};M(Cr,{MacOsKeyVaultProvider:()=>Be});var Me,Be,Ur=m(()=>{"use strict";Me=util.promisify(child_process.execFile),Be=class{static async isAvailable(){try{return y.accessSync("/usr/bin/security",y.constants.X_OK),!0}catch{return !1}}async getSecret(e,r){try{let{stdout:n}=await Me("security",["find-generic-password","-w","-a",r,"-s",e]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await Me("security",["add-generic-password","-U","-a",r,"-s",e,"-w",n]);}async deleteSecret(e,r){try{return await Me("security",["delete-generic-password","-a",r,"-s",e]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var Fr={};M(Fr,{LinuxKeyVaultProvider:()=>He});var $r,He,xr=m(()=>{"use strict";$r=util.promisify(child_process.execFile),He=class{static async isAvailable(){let e=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of e)try{return y.accessSync(r,y.constants.X_OK),!0}catch{}return !1}async getSecret(e,r){try{let{stdout:n}=await $r("secret-tool",["lookup","service",e,"account",r]);return n.trim()||null}catch{return null}}async setSecret(e,r,n){await new Promise((s,o)=>{let i=child_process.spawn("secret-tool",["store","--label",e,"service",e,"account",r]);i.on("error",o),i.on("close",a=>{a===0?s():o(new Error(`secret-tool exited with code ${a}`));}),i.stdin.write(n),i.stdin.end();});}async deleteSecret(e,r){try{return await $r("secret-tool",["clear","service",e,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var Dr={};M(Dr,{WindowsKeyVaultProvider:()=>je});var je,Mr=m(()=>{"use strict";je=class{static async isAvailable(){try{return await xt("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(e,r){return xt("keytar").getPassword(e,r)}async setSecret(e,r,n){await xt("keytar").setPassword(e,r,n);}async deleteSecret(e,r){return xt("keytar").deletePassword(e,r)}getStoragePath(){return "Windows Credential Manager"}};});async function Br(){return await js()??new ce}async function js(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Ur(),Cr));return await t.isAvailable()?new t:null}case "linux":{let{LinuxKeyVaultProvider:t}=await Promise.resolve().then(()=>(xr(),Fr));return await t.isAvailable()?new t:null}case "win32":{let{WindowsKeyVaultProvider:t}=await Promise.resolve().then(()=>(Mr(),Dr));return await t.isAvailable()?new t:null}default:return null}}var Hr=m(()=>{"use strict";Nr();});function vt(){return Ve||(Ve=Br()),Ve}async function v(){let e=await(await vt()).getSecret(Ot,Ye);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Ge(t){if(!t.clientId||!t.clientSecret||!t.tenant)throw new Error("clientId, clientSecret and tenant are required");await(await vt()).setSecret(Ot,Ye,JSON.stringify(t));}async function jr(){let t=await vt();await t.deleteSecret(Ot,Ye),await t.deleteSecret(Ot,We);}async function jt(t){await(await vt()).setSecret(Ot,We,JSON.stringify({accessToken:t.accessToken,expiresAt:t.expiresAt,lastAuthCheckAt:t.lastAuthCheckAt}));}async function Lt(){let e=await(await vt()).getSecret(Ot,We);if(!e)return null;try{let r=JSON.parse(e);return {accessToken:r.accessToken,expiresAt:r.expiresAt,lastAuthCheckAt:r.lastAuthCheckAt}}catch{return null}}async function le(){let t=await Lt();return t?new Date(t.expiresAt)>new Date:false}async function at(){let t=await Lt();if(!t||!t.accessToken)return null;try{let e=t.accessToken.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email??r.preferred_username??r.upn??r.sub??null}catch{return null}}async function Ke(){let t=await vt();if(typeof t.getStoragePath=="function")return t.getStoragePath();let e=process.platform;return e==="darwin"?"macOS Keychain":e==="win32"?"Windows Credential Manager":"Linux Secret Service (libsecret)"}async function Vr(){let t=await v();return !!(t&&t.clientId&&t.clientSecret&&t.tenant)}var Ot,Ye,We,Ve,bt=m(()=>{"use strict";Hr();k();Ot=se.SERVICE,Ye=se.ACCOUNT_CREDS,We=se.ACCOUNT_TOKEN,Ve=null;});function Ys(t){return Vs.some(e=>e.test(t))}function Ws(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return r.email||r.preferred_username||r.upn||r.sub||null}catch{return null}}function R(t){if(!t)return null;try{let e=t.split(".");if(e.length<2)return null;let r=JSON.parse(Buffer.from(e[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 Yr(t){let e=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant})).toString("base64url");return `${e}.${r}.`}function It(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}let r=process.env[f.FLOW_OBS_ALLOW_HTTP]==="true";if(!r&&e.protocol!=="https:")throw new Error(`URL must use HTTPS: ${t}`);if(e.username||e.password)throw new Error(`URL must not contain embedded credentials: ${t}`);if(!r&&Ys(e.hostname))throw new Error(`SSRF: private/loopback host not allowed: ${e.hostname}`);return t}async function Wr(){let t=R(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(t)return {user:await at().catch(()=>null)??t.clientId,tenant:t.tenant};if(ae.KEYCHAIN_ENABLED)try{let e=await v();if(!e)return {user:"",tenant:""};let r=await at()??e.clientId??"",n=e.tenant??"";return {user:r,tenant:n}}catch{return {user:"",tenant:""}}return {user:"",tenant:""}}function Gs(){return new Date().toISOString().slice(0,10)}async function Ks(t){let e=Gs(),r=await Lt();if(r?.lastAuthCheckAt!==e){u("getOrRefreshToken",`daily auth check (last: ${r?.lastAuthCheckAt??"never"})`);try{let o=await x(t);try{await jt({...o,lastAuthCheckAt:e});}catch{}return u("getOrRefreshToken",`daily check passed, expires=${o.expiresAt}`),o.accessToken}catch(o){if(o instanceof it)throw o;u("getOrRefreshToken",`daily check network error \u2014 using cache: ${o.message}`);}}let n=r!=null&&new Date(r.expiresAt)>new Date;if(u("getOrRefreshToken",`cacheValid=${n}`),n)return u("getOrRefreshToken",`using cached token, expires=${r.expiresAt}`),r.accessToken;u("getOrRefreshToken",`token expired \u2014 refreshing via auth-engine (tenant=${t.tenant} clientId=${t.clientId})`);let s=await x(t);try{await jt({...s,lastAuthCheckAt:e});}catch(o){u("getOrRefreshToken",`token cache save failed (non-fatal): ${o.message}`);}return u("getOrRefreshToken",`token refreshed, expires=${s.expiresAt}`),s.accessToken}function qs(t,e){let r=e&&e.accessToken?e.accessToken:"";return {endpoint:t.replace(/\/$/,"")+"/flow-langfuse-gateway/v1/traces",authHeader:`Bearer ${r}`}}function Js(t,e,r){let n=Buffer.from(`${e}:${r}`).toString("base64");return {endpoint:t.replace(/\/$/,"")+"/api/public/otel/v1/traces",authHeader:`Basic ${n}`}}async function K(){let t=[],e=process.env[f.ANTHROPIC_MODEL]??"",r=R(process.env[f.ANTHROPIC_AUTH_TOKEN]);u("resolveCredentials",r?"credentials resolved from ANTHROPIC_AUTH_TOKEN":"ANTHROPIC_AUTH_TOKEN absent or invalid"),r&&u("resolveCredentials",`clientId=${r.clientId}`,`tenant=${r.tenant}`),!r&&ae.KEYCHAIN_ENABLED&&(r=await v(),r&&u("resolveCredentials","credentials resolved from keychain (FEATURES.KEYCHAIN_ENABLED=true)"));let n=r?r.tenant:"",s=process.env[f.FLOW_TELEMETRY]==="true",o=process.env[f.LANGFUSE_BASE_URL],i=process.env[f.LANGFUSE_PUBLIC_KEY],a=process.env[f.LANGFUSE_SECRET_KEY];if(s&&o&&i&&a){let g="",E=n;if(r)g=await at().catch(()=>null)??r.clientId;else if(ae.KEYCHAIN_ENABLED)try{let _=await v();_&&(g=await at()??_.clientId,E=_.tenant);}catch{}let O={user:g??"",tenant:E??"",team:"",project:"",model:e};t.push({mode:"direct",...Js(It(o),i,a),...O}),u("resolveCredentials","direct mode active",`user=${O.user}`,`tenant=${O.tenant}`);}if(!r){if(t.length===0){let g=[];return g.authError=false,g}return t}let c;try{c=await Ks(r);}catch(g){if(u("resolveCredentials",`token refresh failed: ${g.message}`,`(tenant=${r.tenant} clientId=${r.clientId})`),t.length>0)return t.authError=true,t;let E=[];return E.authError=true,E}let p={user:Ws(c)??r.clientId,tenant:n,team:"",project:"",model:e},T=process.env[f.FLOW_TELEMETRY_GATEWAY]??nt();return t.push({mode:"gateway",...qs(It(T),{accessToken:c}),...p}),t}async function Gr(){return (await K()).length>0}var Vs,Y=m(()=>{"use strict";bt();_t();k();F();Vs=[/^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 qe(){return kt__namespace.default.join(tt__namespace.default.homedir(),".claude","flow-obs",".logged-out")}function qr(){try{let t=qe();y__namespace.default.mkdirSync(kt__namespace.default.dirname(t),{recursive:!0}),y__namespace.default.writeFileSync(t,"",{mode:384});}catch{}}function Jr(){try{y__namespace.default.unlinkSync(qe());}catch{}}function de(){try{return y__namespace.default.existsSync(qe())}catch{return false}}var zr=m(()=>{"use strict";});var Je={};M(Je,{runLogin:()=>Rt,runLogout:()=>eo,runStatus:()=>ro});function q(t){return typeof t=="string"?t.replace(Xs,""):t}function Vt(t,e={}){return new Promise((r,n)=>{let{masked:s=false,defaultValue:o=""}=e;process.stdout.write(t+o);let i=o;function a(){try{process.stdin.setRawMode(!1);}catch{}}process.once("uncaughtException",a),process.once("unhandledRejection",a);let c=p=>{if(p===""){l(),n(new Error("SIGINT"));return}if(p==="\r"||p===`
|
|
32
35
|
`){l(),process.stdout.write(`
|
|
33
|
-
`),r(i);return}if(
|
|
36
|
+
`),r(i);return}if(p==="\x7F"){i.length>0&&(i=i.slice(0,-1),process.stdout.write("\b \b"));return}p.startsWith("\x1B")||(i+=p,process.stdout.write(s?"*".repeat(p.length):p));};function l(){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 Xr(t){if(!de())try{await v()||await Ge(t);}catch{}}async function Zr(t){let{accessToken:e,expiresAt:r}=await x(t);await Ge(t),await jt({accessToken:e,expiresAt:r}),Jr();try{let n=Yr(t);At({[f.ANTHROPIC_AUTH_TOKEN]:n});}catch{}}async function Zs(t){try{return await Zr(t),process.stdout.write(b(` \u2713 Setup complete. Tenant: ${q(t.tenant)}
|
|
34
37
|
|
|
35
38
|
`)),0}catch(e){return process.stderr.write(B(` \u2717 Authentication failed: ${q(e.message)}
|
|
36
|
-
`)),1}}async function
|
|
39
|
+
`)),1}}async function Qs(){try{process.stdout.write(`
|
|
37
40
|
`);let t=(await Vt(H(" ? ")+"Client ID: ")).trim(),e=(await Vt(H(" ? ")+"Client Secret: ",{masked:!0})).trim(),r=(await Vt(H(" ? ")+"Tenant: ")).trim();if(!t||!e||!r)return process.stderr.write(B(` \u2717 All fields are required
|
|
38
|
-
`)),1;try{await
|
|
39
|
-
`)),1}return process.stdout.write(
|
|
40
|
-
`)),process.stdout.write(` Storage: ${await
|
|
41
|
+
`)),1;try{await Zr({clientId:t,clientSecret:e,tenant:r});}catch(n){return process.stderr.write(B(` \u2717 Authentication failed: ${q(n.message)}
|
|
42
|
+
`)),1}return process.stdout.write(b(` \u2713 Setup complete. Tenant: ${q(r)}
|
|
43
|
+
`)),process.stdout.write(` Storage: ${await Ke()}
|
|
41
44
|
|
|
42
45
|
`),0}catch(t){if(t.message==="SIGINT")throw t;return process.stderr.write(B(` \u2717 Unexpected error: ${t.message}
|
|
43
|
-
`)),1}}async function
|
|
46
|
+
`)),1}}async function Rt(t={}){if(t.clientId&&t.clientSecret&&t.tenant)return Zs({clientId:t.clientId,clientSecret:t.clientSecret,tenant:t.tenant});let e=de()?null:R(process.env[f.ANTHROPIC_AUTH_TOKEN]);e&&await Xr(e);let r=e||await v();if(r){process.stdout.write(`
|
|
44
47
|
`),process.stdout.write(j(` Already authenticated
|
|
45
|
-
`)),process.stdout.write(
|
|
46
|
-
`),process.stdout.write(
|
|
48
|
+
`)),process.stdout.write(S(" Tenant: ")+q(r.tenant)+`
|
|
49
|
+
`),process.stdout.write(S(" Client ID: ")+q(r.clientId)+`
|
|
47
50
|
`),process.stdout.write(`
|
|
48
51
|
`);let n;try{n=await Vt(H(" ? ")+"Re-authenticate? (y/N): ");}catch(s){if(s.message==="SIGINT")return process.stdout.write(`
|
|
49
|
-
`),130;throw s}if(n.trim().toLowerCase()!=="y")return process.stdout.write(
|
|
52
|
+
`),130;throw s}if(n.trim().toLowerCase()!=="y")return process.stdout.write(b(` \u2713 Using existing credentials.
|
|
50
53
|
|
|
51
|
-
`)),0}try{return await
|
|
52
|
-
`),130;throw n}}async function
|
|
53
|
-
`),(await Vt(H(" ? ")+"Are you sure? This will remove your local credentials. (y/N): ")).toLowerCase()!=="y"?(process.stdout.write(
|
|
54
|
+
`)),0}try{return await Qs()}catch(n){if(n.message==="SIGINT")return process.stdout.write(`
|
|
55
|
+
`),130;throw n}}async function to(){try{return process.stdout.write(`
|
|
56
|
+
`),(await Vt(H(" ? ")+"Are you sure? This will remove your local credentials. (y/N): ")).toLowerCase()!=="y"?(process.stdout.write(A(` \u26A0 Logout cancelled
|
|
54
57
|
`)),0):null}catch(t){if(t.message==="SIGINT")return process.stdout.write(`
|
|
55
|
-
`),130;throw t}}async function
|
|
56
|
-
`)),0;if(!t){let e=await
|
|
58
|
+
`),130;throw t}}async function eo(t=false){if(!await Vr())return process.stdout.write(A(` \u26A0 You are not authenticated
|
|
59
|
+
`)),0;if(!t){let e=await to();if(e!==null)return e}try{return await jr(),qr(),process.stdout.write(b(` \u2713 Credentials removed successfully
|
|
57
60
|
`)),0}catch{return process.stderr.write(B(` \u2717 Error removing credentials
|
|
58
|
-
`)),1}}async function
|
|
61
|
+
`)),1}}async function ro(){if(de())return process.stdout.write(A(" \u26A0 Not authenticated. Run `flow-ai-obs auth login` to set up.\n")),0;let t=R(process.env[f.ANTHROPIC_AUTH_TOKEN]);t&&await Xr(t);let e=t||await v();if(!e)return process.stdout.write(A(" \u26A0 Not authenticated. Run `flow-ai-obs auth login` to set up.\n")),0;if(!t&&!await le())return process.stdout.write(A(" \u26A0 Session expired. Run `flow-ai-obs auth login` to re-authenticate.\n")),0;let r=e.clientSecret.length>4?"****...****"+e.clientSecret.slice(-4):"****",n=t?"ANTHROPIC_AUTH_TOKEN (settings.json)":await Ke();return process.stdout.write(`
|
|
59
62
|
`+j(` Authenticated
|
|
60
|
-
`)),process.stdout.write(
|
|
61
|
-
`),process.stdout.write(
|
|
62
|
-
`),process.stdout.write(
|
|
63
|
-
`),process.stdout.write(
|
|
63
|
+
`)),process.stdout.write(S(" Tenant: ")+q(e.tenant)+`
|
|
64
|
+
`),process.stdout.write(S(" Client ID: ")+q(e.clientId)+`
|
|
65
|
+
`),process.stdout.write(S(" Client Secret: ")+r+`
|
|
66
|
+
`),process.stdout.write(S(" Storage: ")+n+`
|
|
64
67
|
|
|
65
|
-
`),0}var
|
|
68
|
+
`),0}var Xs,Yt=m(()=>{"use strict";bt();zr();_t();Y();Mt();k();mt();Xs=/[\x00-\x08\x0B-\x1F\x7F]|\x1b\[[0-9;]*[a-zA-Z]/g;});var sn={};M(sn,{runInit:()=>ze});function no(){if(process.env.WSL_DISTRO_NAME&&process.platform==="linux")return child_process.spawnSync("cmd.exe",["/c","where","claude"],{encoding:"utf8",timeout:5e3}).status===0;let t=process.platform==="win32"?"where":"which";return child_process.spawnSync(t,["claude"],{encoding:"utf8",timeout:5e3}).status===0}function so(){try{let t=y__namespace.readFileSync(G(),"utf8"),e=JSON.parse(t);return !!(e.env&&e.env[f.ANTHROPIC_AUTH_TOKEN])}catch{return false}}function nn(t){let e;try{e=new URL(t);}catch{throw new Error(`Invalid URL: ${t}`)}if(e.protocol!=="https:")throw new Error(`Custom URL must use HTTPS: ${t}`);let r=process.env[f.FLOW_OBS_ALLOW_HTTP];try{delete process.env[f.FLOW_OBS_ALLOW_HTTP],It(t);}finally{r!==void 0&&(process.env[f.FLOW_OBS_ALLOW_HTTP]=r);}if(e.pathname!=="/"&&e.pathname!=="")throw new Error(`Custom URL must be a base URL with no path beyond the root.
|
|
66
69
|
Received: ${t}
|
|
67
70
|
Expected: https://tenant.example.com`);if(e.search)throw new Error(`Custom URL must not contain query parameters.
|
|
68
71
|
Received: ${t}
|
|
69
72
|
Expected: https://tenant.example.com`);if(e.hash)throw new Error(`Custom URL must not contain fragment.
|
|
70
73
|
Received: ${t}
|
|
71
|
-
Expected: https://tenant.example.com`);return t.replace(/\/$/,"")}async function
|
|
74
|
+
Expected: https://tenant.example.com`);return t.replace(/\/$/,"")}async function en(){for(let t=1;t<=3;t++)try{let e=await dr(" Enter your Flow base URL (e.g., https://tenant.ciandt.com)");return nn(e)}catch(e){if(process.stderr.write(A(` \u2717 ${e.message}
|
|
72
75
|
|
|
73
76
|
`)),t===3)throw process.stderr.write(B(` Too many invalid attempts.
|
|
74
77
|
|
|
75
|
-
`)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}async function
|
|
78
|
+
`)),new Error("Too many invalid URL attempts")}throw new Error("Too many invalid URL attempts")}async function ze(t={}){let e=t.url;if(!no()){let l=tn[process.platform]||tn.linux;return process.stderr.write(`
|
|
76
79
|
`+B(` \u2717 Claude Code is not installed or not found in PATH.
|
|
77
80
|
|
|
78
81
|
`)+` flow-ai-obs requires Claude Code to function.
|
|
@@ -80,111 +83,111 @@
|
|
|
80
83
|
|
|
81
84
|
`+H(` ${l}`)+`
|
|
82
85
|
|
|
83
|
-
`),1}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(
|
|
84
|
-
`)+
|
|
85
|
-
`)+
|
|
86
|
+
`),1}if(process.env.WSL_DISTRO_NAME&&process.platform==="linux"&&process.stdout.write(A(` \u26A0 WSL detected. If Claude Code is installed on Windows, install flow-ai-obs
|
|
87
|
+
`)+A(" on Windows too: ")+H(`npm install -g @ciandt-flow/flow-ai-obs
|
|
88
|
+
`)+A(` Running Claude (Windows) + flow-ai-obs (WSL) is not a supported configuration.
|
|
86
89
|
|
|
87
90
|
`)),!e&&!t.noInteractive&>()){let l=rt();try{l?(process.stdout.write(`
|
|
88
91
|
Current base URL: ${j(l)}
|
|
89
|
-
`),await Ae(" Keep this URL?",!0)||(e=await
|
|
90
|
-
`),await Ae(" Does your organization use a custom Flow URL?",!1)&&(e=await
|
|
91
|
-
`);}if(!e&&!t.noInteractive&&!gt()){let l=rt(),
|
|
92
|
-
`)+
|
|
93
|
-
`)+(
|
|
92
|
+
`),await Ae(" Keep this URL?",!0)||(e=await en())):(process.stdout.write(`
|
|
93
|
+
`),await Ae(" Does your organization use a custom Flow URL?",!1)&&(e=await en()));}catch{return 1}process.stdout.write(`
|
|
94
|
+
`);}if(!e&&!t.noInteractive&&!gt()){let l=rt(),p=process.env.FLOW_BASE_URL,T=l??p??"https://flow.ciandt.com",g=!!(l??p);process.stdout.write(A(` \u26A0 Non-interactive environment detected.
|
|
95
|
+
`)+S(` Using URL: ${T}
|
|
96
|
+
`)+(g?"":S(` Run with --custom-url to configure a custom domain.
|
|
94
97
|
`))+`
|
|
95
|
-
`);}let r=null,n=null;if(e){let l;try{l=
|
|
96
|
-
\u2717 Invalid --custom-url: ${
|
|
98
|
+
`);}let r=null,n=null;if(e){let l;try{l=nn(e);}catch(T){return process.stderr.write(`
|
|
99
|
+
\u2717 Invalid --custom-url: ${T.message}
|
|
97
100
|
|
|
98
|
-
`),1}let
|
|
99
|
-
\u2717 Failed to persist custom URL: ${
|
|
101
|
+
`),1}let p=rt();try{Ar(l);}catch(T){return process.stderr.write(`
|
|
102
|
+
\u2717 Failed to persist custom URL: ${T.message}
|
|
100
103
|
|
|
101
|
-
`),1}r=l,n={OTEL_EXPORTER_OTLP_ENDPOINT:`${l}/otel`,ANTHROPIC_BASE_URL:`${l}/flow-llm-proxy/`},
|
|
102
|
-
`)+
|
|
103
|
-
`)+
|
|
104
|
+
`),1}r=l,n={OTEL_EXPORTER_OTLP_ENDPOINT:`${l}/otel`,ANTHROPIC_BASE_URL:`${l}/flow-llm-proxy/`},p&&p!==l?process.stdout.write(A(` \u26A0 Base URL updated.
|
|
105
|
+
`)+S(` Previous: ${p}
|
|
106
|
+
`)+S(` New: ${l}
|
|
104
107
|
|
|
105
|
-
`)):process.stdout.write(
|
|
108
|
+
`)):process.stdout.write(b(` \u2713 Base URL configured: ${l}
|
|
106
109
|
|
|
107
|
-
`));}if(!
|
|
110
|
+
`));}if(!so())if(t.noInteractive||!gt())process.stdout.write(A(" \u26A0 No credentials found in settings.json \u2014 run `flow-ai-obs auth login` to authenticate.\n\n"));else {process.stdout.write(A(` \u26A0 No credentials found in settings.json \u2014 authentication required.
|
|
108
111
|
|
|
109
|
-
`));let{runLogin:l}=await Promise.resolve().then(()=>(Yt(),
|
|
112
|
+
`));let{runLogin:l}=await Promise.resolve().then(()=>(Yt(),Je)),p=await l();if(p!==0)return p}let s,o;try{(({settingsPath:s,preserved:o}=Ir())),n&&At(n);}catch(l){return process.stderr.write(` \u2717 Failed to write settings: ${l.message}
|
|
110
113
|
`),1}process.stdout.write(`
|
|
111
114
|
`+j(" Native OTEL configured")+` (metrics & logs)
|
|
112
|
-
`);let i=n?{...ot,OTEL_EXPORTER_OTLP_ENDPOINT:n.OTEL_EXPORTER_OTLP_ENDPOINT}:ot;for(let[l,
|
|
115
|
+
`);let i=n?{...ot,OTEL_EXPORTER_OTLP_ENDPOINT:n.OTEL_EXPORTER_OTLP_ENDPOINT}:ot;for(let[l,p]of Object.entries(i))process.stdout.write(S(` ${l.padEnd(36)}`)+p+`
|
|
113
116
|
`);process.stdout.write(`
|
|
114
117
|
`),process.stdout.write(j(" Hooks registered")+` (Langfuse trace capture)
|
|
115
|
-
`),process.stdout.write(
|
|
116
|
-
`),process.stdout.write(
|
|
117
|
-
`),process.stdout.write(
|
|
118
|
-
`),process.stdout.write(
|
|
118
|
+
`),process.stdout.write(S(" UserPromptSubmit")+` \u2192 flow-ai-obs UserPromptSubmit (timeout: 5s)
|
|
119
|
+
`),process.stdout.write(S(" PreToolUse ")+` \u2192 flow-ai-obs PreToolUse (timeout: 3s)
|
|
120
|
+
`),process.stdout.write(S(" PostToolUse ")+` \u2192 flow-ai-obs PostToolUse (timeout: 10s)
|
|
121
|
+
`),process.stdout.write(S(" Stop ")+` \u2192 flow-ai-obs Stop (timeout: 15s)
|
|
119
122
|
`),o.length>0&&(process.stdout.write(`
|
|
120
|
-
`),process.stdout.write(
|
|
121
|
-
`)),process.stdout.write(
|
|
123
|
+
`),process.stdout.write(A(` \u26A0 Third-party hooks detected and preserved on: ${o.join(", ")}
|
|
124
|
+
`)),process.stdout.write(S(` flow-ai-obs was prepended \u2014 it executes first.
|
|
122
125
|
`))),process.stdout.write(`
|
|
123
|
-
`),process.stdout.write(
|
|
124
|
-
`),process.stdout.write(
|
|
125
|
-
`),process.stdout.write(
|
|
126
|
-
`));let a=r??rt()??process.env.FLOW_BASE_URL??"https://flow.ciandt.com";process.stdout.write(
|
|
126
|
+
`),process.stdout.write(S(" Settings: ")+s+`
|
|
127
|
+
`),process.stdout.write(S(" Backup: ")+s+`.bkp
|
|
128
|
+
`),process.stdout.write(S(" OTEL auth: flow-ai-obs otel-headers")+S(` (reads keychain at runtime)
|
|
129
|
+
`));let a=r??rt()??process.env.FLOW_BASE_URL??"https://flow.ciandt.com";process.stdout.write(S(" Base URL: ")+a+`
|
|
127
130
|
`),process.stdout.write(`
|
|
128
|
-
`),process.stdout.write(
|
|
129
|
-
`)),process.stdout.write(
|
|
131
|
+
`),process.stdout.write(b(` \u2713 Ready. Native OTEL + Langfuse trace capture active.
|
|
132
|
+
`)),process.stdout.write(S(" Run `flow-ai-obs setup` to also configure the Flow LLM Proxy.\n\n"));let c=wr();return c&&process.stdout.write(A(` \u26A0 ${c}
|
|
130
133
|
|
|
131
|
-
`)),0}var
|
|
134
|
+
`)),0}var tn,Xe=m(()=>{"use strict";Mt();k();mt();ne();Ne();Y();ke();tn={darwin:`npm install -g @anthropic-ai/claude-code
|
|
132
135
|
or visit: https://claude.ai/download`,linux:"npm install -g @anthropic-ai/claude-code",win32:`npm install -g @anthropic-ai/claude-code
|
|
133
|
-
or visit: https://claude.ai/download`};});var
|
|
136
|
+
or visit: https://claude.ai/download`};});var on={};M(on,{runSetup:()=>oo});async function oo(t={}){process.stdout.write(`
|
|
134
137
|
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
|
|
135
138
|
`),process.stdout.write(`\u2551 flow-ai-obs \u2014 setup \u2551
|
|
136
139
|
`),process.stdout.write(`\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
|
|
137
140
|
|
|
138
|
-
`);let e=await
|
|
141
|
+
`);let e=await Rt(t);if(e!==0)return process.stderr.write(`
|
|
139
142
|
Setup aborted. Run \`flow-ai-obs auth login\` to retry.
|
|
140
143
|
|
|
141
144
|
`),e;process.stdout.write(`
|
|
142
|
-
`);let r=await
|
|
145
|
+
`);let r=await ze({noInteractive:true});if(r!==0)return r;try{At(Dt());}catch(s){process.stderr.write(` \u26A0 Could not write LLM Proxy config: ${s.message}
|
|
143
146
|
`);}process.stdout.write(j(" Flow LLM Proxy configured")+` (model provider)
|
|
144
|
-
`);for(let[s,o]of Object.entries(Dt()))process.stdout.write(
|
|
147
|
+
`);for(let[s,o]of Object.entries(Dt()))process.stdout.write(S(` ${s.padEnd(36)}`)+o+`
|
|
145
148
|
`);process.stdout.write(`
|
|
146
149
|
`),process.stdout.write(` Validating connectivity to Flow OTEL endpoint\u2026
|
|
147
|
-
`);let n=await
|
|
150
|
+
`);let n=await v();return n?await Rr(n)?process.stdout.write(b(` \u2713 Connectivity validated \u2014 telemetry is active.
|
|
148
151
|
|
|
149
|
-
`)):process.stdout.write(
|
|
152
|
+
`)):process.stdout.write(A(` \u26A0 Could not reach the OTEL endpoint. Telemetry will activate once connectivity is restored.
|
|
150
153
|
|
|
151
|
-
`)):process.stdout.write(
|
|
154
|
+
`)):process.stdout.write(A(` \u26A0 Could not read stored credentials \u2014 skipping connectivity check.
|
|
152
155
|
|
|
153
|
-
`)),process.stdout.write(
|
|
154
|
-
`)),process.stdout.write(
|
|
156
|
+
`)),process.stdout.write(b(` \u2713 Setup complete!
|
|
157
|
+
`)),process.stdout.write(S(` Settings: ${G()}
|
|
155
158
|
|
|
156
|
-
`)),0}var
|
|
159
|
+
`)),0}var an=m(()=>{"use strict";k();mt();Yt();Xe();Mt();bt();});var cn={};M(cn,{runOtelHeaders:()=>io});async function io(){let t=R(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(!t)try{t=await v();}catch{return process.stderr.write(`[flow-ai-obs otel-headers] Failed to read credentials
|
|
157
160
|
`),1}if(!t)return process.stderr.write(`[flow-ai-obs otel-headers] Not authenticated \u2014 run: flow-ai-obs auth login
|
|
158
161
|
`),1;let e;try{e=(await x(t)).accessToken;}catch(r){return process.stderr.write(`[flow-ai-obs otel-headers] Token fetch failed: ${r.message}
|
|
159
162
|
`),1}return e?(process.stdout.write(`{"Authorization": "Bearer ${e}"}
|
|
160
163
|
`),0):(process.stderr.write(`[flow-ai-obs otel-headers] Empty token received
|
|
161
|
-
`),1)}var
|
|
164
|
+
`),1)}var ln=m(()=>{"use strict";bt();_t();Y();k();});var dn={};M(dn,{runCheck:()=>ao});function Ze(t){return !t||t.length<=8?"****":t.slice(0,4)+"****...****"+t.slice(-4)}function Wt(t){process.stdout.write(` \u2713 ${t}
|
|
162
165
|
`);}function pe(t){process.stdout.write(` \u26A0 ${t}
|
|
163
166
|
`);}function fe(t){process.stdout.write(` \u2717 ${t}
|
|
164
|
-
`);}function
|
|
165
|
-
`);}function
|
|
166
|
-
`);}async function
|
|
167
|
-
`),
|
|
168
|
-
`);let t=
|
|
169
|
-
`);}if(!t&&!await le()){pe("Session expired \u2014 re-authenticating..."),
|
|
170
|
-
`);}let r=await at()||e.clientId;Wt("Authenticated"),
|
|
171
|
-
`);let n={};try{let a=
|
|
172
|
-
`),process.env[f.FLOW_TELEMETRY]==="true"){Wt("FLOW_TELEMETRY=true (direct mode enabled)");let a=[f.LANGFUSE_BASE_URL,f.LANGFUSE_PUBLIC_KEY,f.LANGFUSE_SECRET_KEY].filter(c=>!process.env[c]);a.length>0&&a.forEach(c=>pe(`Missing: ${c}`));}else
|
|
173
|
-
`),
|
|
174
|
-
`)[0].slice(0,e).trim()}function
|
|
175
|
-
`);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function
|
|
176
|
-
`),r=[],n=0,s=0;for(let o=e.length-1;o>=0;o--)try{let i=JSON.parse(e[o]);if(i.type==="user")break;if(i.type==="assistant"){let c=(i.message?.content??[]).filter(
|
|
177
|
-
|
|
178
|
-
`),inputTokens:n,outputTokens:s}}catch{}return null}var
|
|
179
|
-
`)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function
|
|
180
|
-
`);return}let n=!!(await K()).authError,s=t.session_id||"unknown",o=t.prompt||"",i=t.cwd||"",a=
|
|
181
|
-
`,{flag:"a",encoding:"utf8",mode:384}),u("sendTraces:dump",`request appendada em ${
|
|
182
|
-
${
|
|
183
|
-
${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${
|
|
184
|
-
`)),
|
|
185
|
-
`),process.stdout.write(JSON.stringify(e));}}var
|
|
186
|
-
`),process.exit(0);});});var
|
|
187
|
-
`),process.exit(0);}else if(
|
|
167
|
+
`);}function P(t){process.stdout.write(` ${t}
|
|
168
|
+
`);}function N(){process.stdout.write(`
|
|
169
|
+
`);}async function ao(){N(),process.stdout.write(` flow-claude-observability \u2014 configuration check
|
|
170
|
+
`),N(),process.stdout.write(` Auth
|
|
171
|
+
`);let t=R(process.env[f.ANTHROPIC_AUTH_TOKEN]),e=t||await v();if(!e){pe("Not authenticated \u2014 starting setup..."),N();let a=await Rt();if(a!==0)return a;if(t=R(process.env[f.ANTHROPIC_AUTH_TOKEN]),e=t||await v(),!e)return fe("Authentication failed"),N(),1;N(),process.stdout.write(` Auth
|
|
172
|
+
`);}if(!t&&!await le()){pe("Session expired \u2014 re-authenticating..."),N();let a=await Rt();if(a!==0)return a;N(),process.stdout.write(` Auth
|
|
173
|
+
`);}let r=await at()||e.clientId;Wt("Authenticated"),P(`Tenant: ${e.tenant}`),P(`User: ${r}`),N(),process.stdout.write(` Native OTEL
|
|
174
|
+
`);let n={};try{let a=y__namespace.readFileSync(G(),"utf8");n=JSON.parse(a).env||{};}catch{}let s=Object.keys(ot).filter(a=>!n[a]);if(s.length===0?(Wt("All OTEL env vars present in settings.json"),P(`Endpoint: ${n.OTEL_EXPORTER_OTLP_ENDPOINT}`)):(pe(`${s.length} OTEL var(s) missing from settings.json \u2014 native metrics/logs disabled`),s.forEach(a=>fe(`Missing: ${a}`)),P("Run: flow-ai-obs init (restores missing vars automatically)")),N(),process.stdout.write(` Tracing
|
|
175
|
+
`),process.env[f.FLOW_TELEMETRY]==="true"){Wt("FLOW_TELEMETRY=true (direct mode enabled)");let a=[f.LANGFUSE_BASE_URL,f.LANGFUSE_PUBLIC_KEY,f.LANGFUSE_SECRET_KEY].filter(c=>!process.env[c]);a.length>0&&a.forEach(c=>pe(`Missing: ${c}`));}else P("FLOW_TELEMETRY not set \u2014 direct mode inactive (gateway mode may still be active)");let i=await K();if(!i||i.length===0)return i&&i.authError?fe("Token refresh failed \u2014 gateway mode could not activate"):(fe("No active destinations \u2014 no traces will be sent"),P("For direct mode: set FLOW_TELEMETRY=true + LANGFUSE_BASE_URL + LANGFUSE_PUBLIC_KEY + LANGFUSE_SECRET_KEY"),P("For gateway mode: run flow-claude-observability auth login")),N(),1;for(let a of i)if(a.mode==="gateway"){let c=await Lt();Wt("Mode: gateway"),P(`Endpoint: ${a.endpoint}`),P(`Token: ${Ze(c?.accessToken)}`);}else a.mode==="direct"&&(Wt("Mode: direct"),P(`Endpoint: ${a.endpoint}`),P(`PK: ${Ze(process.env[f.LANGFUSE_PUBLIC_KEY])}`),P(`SK: ${Ze(process.env[f.LANGFUSE_SECRET_KEY])}`));return N(),process.stdout.write(` All checks passed \u2014 observability is active.
|
|
176
|
+
`),N(),0}var pn=m(()=>{"use strict";bt();Y();Mt();k();Yt();});function W(t,e){let r=typeof t=="object"?JSON.stringify(t):String(t??"");return r.length>e?r.slice(0,e)+" \u2026[truncated]":r}function me(t,e=100){return String(t??"").split(`
|
|
177
|
+
`)[0].slice(0,e).trim()}function Qe(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{e+=r;}),process.stdin.on("end",()=>{try{t(JSON.parse(e));}catch{t({});}});})}function D(t){process.stdout.write(JSON.stringify(t));}var Pt=m(()=>{"use strict";});function J(){return String(BigInt(Date.now())*1000000n)}var tr,ct,Gt=m(()=>{"use strict";tr=()=>crypto.randomBytes(16).toString("hex"),ct=()=>crypto.randomBytes(8).toString("hex");});function So(t,e){let r=kt.resolve(t);if(!r.startsWith(e))throw new Error(`Path traversal detected: ${t}`);return r}function er(t){if(!wo.test(t))throw new Error(`Invalid session ID: ${t}`);return So(kt.join(tt.tmpdir(),`flow-obs-${t}.json`),Eo)}function Nt(t){let e=er(t);if(!y.existsSync(e))return null;try{return JSON.parse(y.readFileSync(e,"utf8"))}catch{return null}}function Ct(t,e){y.writeFileSync(er(t),JSON.stringify(e),{encoding:"utf8",mode:384});}function rr(t){try{y.unlinkSync(er(t));}catch{}}var wo,Eo,Kt=m(()=>{"use strict";wo=/^[0-9a-f-]{1,64}$/i,Eo=kt.normalize(tt.tmpdir())+kt.sep;});function wn(t){if(!t||!y.existsSync(t))return null;try{let e=y.readFileSync(t,"utf8").trimEnd().split(`
|
|
178
|
+
`);for(let r=e.length-1;r>=0;r--)try{let n=JSON.parse(e[r]);if(n.type==="user"&&n.uuid)return n.uuid}catch{}}catch{}return null}function nr(t){if(!t||!y.existsSync(t))return null;try{let e=y.readFileSync(t,"utf8").trimEnd().split(`
|
|
179
|
+
`),r=[],n=0,s=0;for(let o=e.length-1;o>=0;o--)try{let i=JSON.parse(e[o]);if(i.type==="user")break;if(i.type==="assistant"){let c=(i.message?.content??[]).filter(p=>p.type==="text").map(p=>p.text??"").join("");c&&r.unshift(c);let l=i.message?.usage??{};n+=(l.input_tokens??0)+(l.cache_read_input_tokens??0)+(l.cache_creation_input_tokens??0),s+=l.output_tokens??0;}}catch{}return !r.length&&n===0?null:{text:r.join(`
|
|
180
|
+
|
|
181
|
+
`),inputTokens:n,outputTokens:s}}catch{}return null}var sr=m(()=>{"use strict";});function Tn(t){return t.replace(":","/")}function ge(t,e){if(!t)return null;let r=Tn(t),n=[kt.join(tt.homedir(),".claude","skills",r,"SKILL.md"),kt.join(e??"",".claude","skills",r,"SKILL.md")];for(let s of n)if(y.existsSync(s))try{return y.readFileSync(s,"utf8")}catch{}return null}function yn(t){return t.split(`
|
|
182
|
+
`)[0].match(/^\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?:\s.*)?$/i)?.[1]??null}function _n(t){return !!t.slashSkill||t.toolCalls.some(n=>n.tool==="Skill")?t.toolCalls.some(n=>n.tool==="Skill"&&!n.synthetic||vo.has(n.tool))?"complete":"prerequisite_required":null}function he(t,e){if(!t)return null;let r=Tn(t),n=[kt.join(tt.homedir(),".claude","skills",r),kt.join(e??"",".claude","skills",r)],s=null;for(let a of n)if(y.existsSync(kt.join(a,"SKILL.md"))){s=a;break}if(!s)return null;let o=[];function i(a,c){for(let l of y.readdirSync(a,{withFileTypes:true})){if(Ao.has(l.name)||Oo.has(l.name)||ko.has(kt.extname(l.name)))continue;let p=c?`${c}/${l.name}`:l.name;l.isDirectory()?i(kt.join(a,l.name),p):o.push(p);}}return i(s,""),o.length>0?o:null}var Ao,ko,Oo,vo,we=m(()=>{"use strict";Ao=new Set([".venv","__pycache__",".git","node_modules"]),ko=new Set([".pyc",".pyo"]),Oo=new Set(["SKILL.md",".DS_Store",".gitignore"]);vo=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","TodoWrite","WebFetch","WebSearch","Agent","Task"]);});function Io(t){try{let e=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(e,"base64").toString())}catch{return null}}function Ro(t,e,r,n){return new Promise(s=>{let o=new URL(t),i=o.protocol==="https:",a=(i?as__namespace.default:ks__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(e),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(e),a.end();})}async function lt(t,e={}){try{let r=R(process.env[f.ANTHROPIC_AUTH_TOKEN]);if(!r)return;let n,s=new Promise((T,g)=>{n=setTimeout(()=>g(new Error("getToken timeout")),4e3),n.unref();}),{accessToken:o}=await Promise.race([x(r),s]);clearTimeout(n);let i=Io(o);if(!i)return;let a=i.tenant||r.tenant,c=JSON.stringify({action:t,booster:Ue().BOOSTER,metadata:e,success:!0,tenant:a,timestamp:new Date().toISOString(),os:process.platform,user:{email:i.email||"",id:i.sub||"",name:i.name||i.email||""}}),l=It(Ue().API_URL),p=await Ro(l,c,o,a);u("metrics.logEvent",`action=${t} status=${p}`);}catch(r){u("metrics.logEvent",`silenced error: ${r.message}`);}}var Ee=m(()=>{"use strict";k();_t();Y();F();});async function or(t,e=false){if(e){process.stdout.write(JSON.stringify({decision:"block",reason:Po})+`
|
|
183
|
+
`);return}let n=!!(await K()).authError,s=t.session_id||"unknown",o=t.prompt||"",i=t.cwd||"",a=wn(t.transcript_path)||tr(),c=yn(o),l=c?ge(c,i):null,p=c?he(c,i):null;Ct(s,{traceId:tr(),spanId:ct(),startNs:J(),sessionId:s,prompt:o,cwd:i,traceName:a,transcriptPath:t.transcript_path||"",model:process.env[f.ANTHROPIC_MODEL]||"",toolCalls:[],spans:[],pendingTool:null,slashSkill:c,skillContent:l,skillArtifacts:p}),lt("SESSION_STARTED",{traceType:c?"skill":"prompt",slashSkill:c,clientIdExpired:n}),u("UserPromptSubmit",`sid=${s}`,`traceName=${a}`,`slashSkill=${c}`),D(t);}var Po,An=m(()=>{"use strict";Gt();Kt();sr();we();Pt();F();k();Y();Ee();Po=`\u26D4 Your Flow API key has expired. You no longer have access to Claude Code through the Flow platform. To restore observability and access, visit ${nt()}/settings/api-keys to generate a new API key, then run: flow-ai-obs auth login`;});async function kn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=Nt(e);s&&(s.pendingTool={name:r,inputStr:W(n,V.TOOL_INPUT),startNs:J()},Ct(e,s)),u("PreToolUse",`sid=${e}`,`tool=${r}`,`stateFound=${!!s}`),D(t);}var On=m(()=>{"use strict";Gt();Kt();Pt();F();k();});function d(t,e){return e==null||e===""?null:{key:t,value:{stringValue:String(e)}}}function ut(...t){return t.filter(e=>e!==null)}function vn(t,e){return {resourceSpans:[{resource:{attributes:t},scopeSpans:[{scope:No,spans:Array.isArray(e)?e:[e]}]}]}}var No,w,Ln=m(()=>{"use strict";k();No={name:Ce.SCOPE_NAME,version:Ce.SCOPE_VERSION},w={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 In(t,e,r,n,s){if(process.env[f.FLOW_OBS_DEBUG]!=="1")return;let o=JSON.stringify({ts:new Date().toISOString(),request:{method:"POST",url:t,headers:e,body:JSON.parse(r)},response:{status:n,body:s}});try{y.writeFileSync(bn,o+`
|
|
184
|
+
`,{flag:"a",encoding:"utf8",mode:384}),u("sendTraces:dump",`request appendada em ${bn}`);}catch(i){u("sendTraces:dump",`falha ao salvar: ${i.message}`);}}function Do(t){let e=new URL(t),r=new URL(st().GATEWAY_HEALTH);return r.hostname=e.hostname,r.port=e.port,r.protocol=e.protocol,r}function Rn(t,e){return new Promise((r,n)=>{let s=t._isSSL?as__namespace.default:ks__namespace.default;t.headers=Object.assign({},t.headers,{Connection:"close"});let o=s.request(t,i=>{let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>r({statusCode:i.statusCode??0,body:a.join("")}));});o.setTimeout(1e4,()=>{o.destroy(new Error("Request timeout"));}),o.on("error",i=>n(new Error(`Network error: ${i.message}`))),e&&o.write(e),o.end();})}async function Pn(t,e){let r;try{r=Do(t);}catch{return false}let n=r.protocol==="https:";try{let s={};e&&(s.Authorization=String(e).replace(/[\r\n]/g,""));let o=await Rn({hostname:r.hostname,port:r.port||(n?443:80),path:r.pathname,method:"GET",headers:s,_isSSL:n},null);return u("checkHealth",`url=${r.href} status=${o.statusCode}`),o.statusCode>=200&&o.statusCode<300}catch{return false}}async function Se(t,e,r){let n=JSON.stringify(t),s=new URL(e),o=s.protocol==="https:",i=String(r).replace(/[\r\n]/g,""),a={"Content-Type":"application/json",Authorization:i,"Content-Length":Buffer.byteLength(n)};u("sendTraces:request",`POST ${e}`),u("sendTraces:request",`headers=${JSON.stringify({...a,Authorization:i.slice(0,20)+"\u2026"})}`),u("sendTraces:request",`body=${n.slice(0,500)}${n.length>500?"\u2026":""}`);try{let c=await Rn({hostname:s.hostname,port:s.port||(o?443:80),path:s.pathname,method:"POST",headers:a,_isSSL:o},n);return u("sendTraces:response",`status=${c.statusCode}`),In(e,a,n,c.statusCode,c.body),c.statusCode}catch(c){return u("sendTraces:error",c.message),In(e,a,n,0,c.message),0}}var bn,Nn=m(()=>{"use strict";k();F();bn=kt.join(tt.tmpdir(),"flow-obs-requests.ndjson");});function Mo(){let t=parseInt(process.env[f.BUFFER_TTL_DAYS]??"",10);return (Number.isFinite(t)?Math.max($.MIN_TTL_DAYS,Math.min($.MAX_TTL_DAYS,t)):$.DEFAULT_TTL_DAYS)*24*60*60*1e3}function Bo(){let t=parseInt(process.env[f.BUFFER_MAX_FILES]??"",10);return Number.isFinite(t)?Math.max($.MIN_MAX_FILES,Math.min($.MAX_MAX_FILES,t)):$.DEFAULT_MAX_FILES}function Un(t){if(/[/\\]/.test(t))throw new Error(`Invalid buffer fileId: ${t}`);return kt__namespace.default.join(tt__namespace.default.tmpdir(),`${$.FILE_PREFIX}${t}.json`)}function ar(){let t=tt__namespace.default.tmpdir(),e;try{e=y__namespace.default.readdirSync(t);}catch{return []}return e.filter(r=>r.startsWith($.FILE_PREFIX)&&r.endsWith(".json")).map(r=>{let n=kt__namespace.default.join(t,r),s=0;try{s=y__namespace.default.statSync(n).mtimeMs;}catch{}return {full:n,mtime:s}}).sort((r,n)=>r.mtime-n.mtime).map(r=>r.full)}function qt(t){try{let e=Bo(),r=ar();if(r.length>=e){let o=r.slice(0,r.length-e+1);for(let i of o)try{y__namespace.default.unlinkSync(i);}catch{}}let n=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s={fileId:n,bufferedAt:Date.now(),payload:t};return y__namespace.default.writeFileSync(Un(n),JSON.stringify(s),{encoding:"utf8",mode:384}),u("buffer",`saved fileId=${n}`),n}catch(e){return u("buffer",`saveToBuffer failed: ${e.message}`),null}}function $n(t){let e=ar(),r=t!=null&&t>0?t:e.length,n=[];for(let s of e){if(n.length>=r)break;try{let o=y__namespace.default.readFileSync(s,"utf8"),i=JSON.parse(o);i&&i.fileId&&i.payload&&n.push(i);}catch{u("buffer",`skipping malformed file: ${s}`);}}return n}function Fn(t){try{y__namespace.default.unlinkSync(Un(t)),u("buffer",`deleted fileId=${t}`);}catch{}}function xn(){let t=Date.now()-Mo();for(let e of ar())try{let{mtimeMs:r}=y__namespace.default.statSync(e);r<t&&(y__namespace.default.unlinkSync(e),u("buffer",`evicted stale: ${kt__namespace.default.basename(e)}`));}catch{}}var Dn=m(()=>{"use strict";k();F();});async function Ho(t){xn();let e=$n($.REPLAY_BATCH_SIZE);e.length&&(u("replayBufferedTraces",`replaying ${e.length} buffered trace(s)`),await Promise.allSettled(e.map(async r=>{try{let n=await Se(r.payload,t.endpoint,t.authHeader);n>=200&&n<300?(Fn(r.fileId),u("replayBufferedTraces",`replayed fileId=${r.fileId} status=${n}`)):u("replayBufferedTraces",`replay failed fileId=${r.fileId} status=${n}`);}catch(n){u("replayBufferedTraces",`replay error fileId=${r.fileId}: ${n.message}`);}})));}async function Mn(t){let e=await K();if(!e.length)return e.authError&&(u("postToLangfuse","auth refresh failed \u2014 buffering trace"),qt(t)),0;let r=await Promise.all(e.map(async o=>{if(o.mode!=="gateway")return {creds:o,healthy:true};let i=await Pn(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 Ho(n),(await Promise.all(r.map(async({creds:o,healthy:i})=>{if(o.mode==="gateway"){if(!i)return u("postToLangfuse","gateway health check failed \u2014 buffering trace"),qt(t),0;let c=await Se(t,o.endpoint,o.authHeader);return (c===0||c>=500)&&(u("postToLangfuse",`gateway send failed (status ${c}) \u2014 buffering trace`),qt(t)),c}let a=await Se(t,o.endpoint,o.authHeader);return (a===0||a>=500)&&(u("postToLangfuse",`direct endpoint unavailable (status ${a}) \u2014 buffering trace`),qt(t)),a}))).find(o=>o!==0)??0}var Bn=m(()=>{"use strict";Y();F();Nn();Dn();k();});var cr=m(()=>{"use strict";Ln();Bn();});function X(t){if(t==null)return "";let e=typeof t=="string"?t:JSON.stringify(t);return Wo.reduce((r,{re:n,replace:s})=>r.replace(n,s),e)}var C,jo,Vo,Yo,Hn,Wo,lr=m(()=>{"use strict";C="[REDACTED]",jo="[REDACTED-EMAIL]",Vo="[REDACTED-CPF]",Yo="[REDACTED-CNPJ]",Hn="[REDACTED-PHONE]",Wo=[{re:/\b(sk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`sk-${C}`},{re:/\b(pk-[A-Za-z0-9_\-]{20,})/g,replace:()=>`pk-${C}`},{re:/\b(Bearer\s+)[A-Za-z0-9\-._~+/]+=*/gi,replace:(t,e)=>`${e}${C}`},{re:/\b(Basic\s+)[A-Za-z0-9+/]+=*/gi,replace:(t,e)=>`${e}${C}`},{re:/(-----BEGIN [A-Z ]+-----)[^-]*(-----END [A-Z ]+-----)/g,replace:(t,e,r)=>`${e}
|
|
185
|
+
${C}
|
|
186
|
+
${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${C}`},{re:/(aws_secret_access_key\s*[=:]\s*)([A-Za-z0-9/+]{40})/gi,replace:(t,e)=>`${e}${C}`},{re:/\b(ghp_[A-Za-z0-9]{36,})/g,replace:()=>`ghp_${C}`},{re:/\b(github_pat_[A-Za-z0-9_]{36,})/gi,replace:()=>`github_pat_${C}`},{re:/\b(eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+)/g,replace:()=>`eyJ.${C}`},{re:/\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|PWD|CREDENTIAL|API)[A-Z0-9_]*\s*=\s*)(['"]?)([^\s'"#\n]+)\2/gi,replace:(t,e,r)=>`${e}${r}${C}${r}`},{re:/([a-z][a-z0-9+\-.]*:\/\/[^:/?#\s]*):([^@\s]+)@/gi,replace:(t,e)=>`${e}:${C}@`},{re:/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g,replace:()=>jo},{re:/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g,replace:()=>Vo},{re:/\b\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}\b/g,replace:()=>Yo},{re:/\(\d{2}\)\s?\d{4,5}[-\s]?\d{4}/g,replace:()=>Hn},{re:/\+55[\s-]?\d{2}[\s-]?\d{4,5}[-\s]?\d{4}/g,replace:()=>Hn}];});async function jn(t){let e=t.session_id||"unknown",r=t.tool_name||"unknown",n=t.tool_input||{},s=t.tool_response,o=s!==null&&typeof s=="object"?s.output??JSON.stringify(s):s??"",i=Nt(e);if(!i){D(t);return}let a=J(),c=i.pendingTool,l=c?.name===r,p=l?c.startNs:String(BigInt(a)-200000000n),T=l?c.inputStr:W(n,V.TOOL_INPUT),g=T,E=null;if(r==="Skill"){let ee=typeof n=="object"&&n!==null?n.skill||n.name||n.skillName||n.commandName||String(Object.values(n)[0]??""):String(n);E=ee?String(ee).trim():null;let Z=E?ge(E,i.cwd):null;Z&&(g=Z,i.skillContent||(i.skillContent=Z),i.skillArtifacts||(i.skillArtifacts=he(E,i.cwd))),E&&!i.slashSkill&&(i.slashSkill=E),u("PostToolUse","Skill tool detected",`skillName=${E}`,`contentFound=${!!Z}`);}let O=X(W(o,V.TOOL_OUTPUT)),_=/\b(error|exception|failed|failure|traceback|errno)\b/i.test(O.slice(0,500)),zt=_?"ERROR":"DEFAULT",$t=ct(),Xt=Math.round(Number(BigInt(a)-BigInt(p))/1e6),Qt={Agent:"AGENT",Task:"AGENT"}[r]??"TOOL",te=r==="Skill"&&E?E:me(T,60);i.toolCalls.push({tool:r,brief:te,error:_,durationMs:Xt});let Ft=i.spans;Ft.push({traceId:i.traceId,spanId:$t,parentSpanId:i.spanId,name:r,kind:3,startTimeUnixNano:p,endTimeUnixNano:a,attributes:ut(d(w.OBS_NAME,r),d(w.OBS_TYPE,Qt),d(w.OBS_LEVEL,zt),d(w.OBS_INPUT,X(g)),d(w.OBS_OUTPUT,O),d("tool.name",r),d("tool.error",String(_)),r==="Skill"&&E?d("skill.name",E):null,r==="Skill"?d("skill.invocation","slash-command"):null),status:{code:_?2:1}}),i.pendingTool=null,Ct(e,i),_&<("TOOL_ERROR",{toolName:r}),u("PostToolUse",`sid=${e}`,`tool=${r}`,`error=${_}`,`durationMs=${Xt}`,`totalSpans=${Ft.length}`),D(t);}var Vn=m(()=>{"use strict";Gt();Kt();cr();Pt();we();F();k();lr();Ee();});function Wn(t,e,r){let n=Object.keys(Yn).find(i=>(t??"").toLowerCase().includes(i));if(!n)return;let s=Yn[n],o=(e*s.input+r*s.output)/1e6;return Math.round(o*1e6)/1e6}var Yn,Gn=m(()=>{"use strict";Yn={"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"claude-haiku-4-5":{input:.8,output:4},"claude-4-6-opus":{input:15,output:75},"claude-4-6-sonnet":{input:3,output:15},"claude-4-5-opus":{input:15,output:75},"claude-4-5-sonnet":{input:3,output:15},"claude-4-5-haiku":{input:.8,output:4},"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-5-haiku-20241022":{input:.8,output:4},"claude-3-opus-20240229":{input:15,output:75}};});async function Kn(t){let e=t.session_id||"unknown",r=t.stop_reason||"end_turn",n=Nt(e);if(!n){D(t);return}n.slashSkill&&!/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?$/i.test(n.slashSkill)&&(u("Stop",`sid=${e}`,`slashSkill rejected post-disk: "${n.slashSkill}"`),n.slashSkill=null);let s=J(),o=await Wr(),i=n.toolCalls,a=n.spans;if(n.slashSkill&&!i.some(h=>h.tool==="Skill")){let h=ct(),Q=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:h,parentSpanId:n.spanId,name:"Skill",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:n.startNs,attributes:ut(d(w.OBS_NAME,"Skill"),d(w.OBS_TYPE,"TOOL"),d(w.OBS_LEVEL,"DEFAULT"),d(w.OBS_INPUT,Q),d(w.OBS_OUTPUT,"loaded via slash command"),d("tool.name","Skill"),d("tool.error","false"),d("skill.name",n.slashSkill),d("skill.invocation","slash-command")),status:{code:1}}),u("Stop",`slashSkill=${n.slashSkill}`,"synthetic span injected");}let c=t.transcript_path||n.transcriptPath||"",l=nr(c);if(c&&(i.some(h=>h.tool==="Skill"&&!h.synthetic)||!!n.slashSkill)&&!l?.text){await new Promise(Q=>setTimeout(Q,500));let h=nr(c);h?.text&&(l=h);}u("Stop",`transcriptPath=${c||"(empty)"}`,`assistantOut=${l?`text=${l.text.length}chars`:"null"}`);let T=i.length,g=i.filter(h=>h.error).length,E=X(l?.text?W(l.text,V.TRACE_OUTPUT):T===0?"No tools used":i.map((h,Q)=>`${Q+1}. ${h.tool}${h.brief?` \u2192 ${h.brief}`:""}${h.error?" [ERROR]":""}`).join(`
|
|
187
|
+
`)),O=l?.inputTokens??0,_=l?.outputTokens??0,zt=i.map((h,Q)=>`${Q+1}. ${h.tool}${h.brief?` \u2192 ${h.brief}`:""}${h.error?" [ERROR]":""} (${h.durationMs}ms)`),$t=!!(n.slashSkill||i.some(h=>h.tool==="Skill")),Xt=i.some(h=>h.tool==="Agent");if(!$t&&!Xt){u("Stop",`sid=${e}`,"skipping trace \u2014 no Skill or Agent calls found"),lt("TRACE_SKIPPED",{reason:"no_skill_or_agent"}),rr(e),D(t);return}let Zt=$t?"skill":"agent",Qt=Math.round(Number(BigInt(s)-BigInt(n.startNs))/1e6),te=Wn(n.model,O,_),pt=_n(n);pt==="prerequisite_required"&&l?.text&&(pt="complete"),pt==="prerequisite_required"&&(a.push({traceId:n.traceId,spanId:ct(),parentSpanId:n.spanId,name:"prerequisite-check",kind:3,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:ut(d(w.OBS_NAME,"prerequisite-check"),d(w.OBS_TYPE,"EVENT"),d(w.OBS_LEVEL,"WARNING"),d(w.OBS_OUTPUT,E),d("skill.name",n.slashSkill||void 0),d("execution_status","prerequisite_required")),status:{code:1}}),u("Stop",`sid=${e}`,"prerequisite-check span injected",`skill=${n.slashSkill}`));let Ft=(()=>{if(!(!$t||!n.prompt)){if(n.slashSkill){let h=n.prompt.replace(new RegExp(`^\\/${n.slashSkill}\\s*`,"i"),"").trim();return h?W(X(h),V.USER_INSTRUCTION):void 0}return W(X(n.prompt),V.USER_INSTRUCTION)||void 0}})(),ee=JSON.stringify({trace_type:Zt,...pt!==null&&{execution_status:pt},...n.slashSkill?{skill_name:n.slashSkill}:{},...n.skillArtifacts?.length&&{skill_artifacts:n.skillArtifacts},...Ft!==void 0&&{user_instruction:Ft},latency_ms:Qt,...O&&{tokens_input:O},..._&&{tokens_output:_},cost_usd:te,...n.model?{model:n.model}:{},toolCount:T,errorCount:g,stopReason:r,sessionId:n.sessionId,tools:zt.length?zt:void 0}),Z=X(W(n.prompt,V.TRACE_INPUT)),zn=ut(d(w.TRACE_NAME,n.traceName),d(w.TRACE_INPUT,Z),d(w.TRACE_OUTPUT,E),d(w.OBS_INPUT,Z),d(w.OBS_OUTPUT,E),d(w.TRACE_METADATA,ee),d(w.SESSION_ID,n.sessionId),d(w.USER_ID,o.user),d(w.OBS_TYPE,"GENERATION"),d(w.MODEL,n.model),O?d(w.INPUT_TOKENS,O):null,_?d(w.OUTPUT_TOKENS,_):null,d("claude.stop_reason",r),d("claude.tool_count",String(T)),d("claude.error_count",String(g)),d("claude.session_id",n.sessionId),d("flow.trace_type",Zt),{key:w.TRACE_TAGS,value:{arrayValue:{values:[{stringValue:Zt}]}}}),Xn={traceId:n.traceId,spanId:n.spanId,name:n.traceName,kind:1,startTimeUnixNano:n.startNs,endTimeUnixNano:s,attributes:zn,status:{code:g>0?2:1}},Zn=ut(d("service.name",process.env.LANGFUSE_PROJECT_NAME||"claude-code"),d("deployment.environment",process.env.LANGFUSE_ENVIRONMENT||"default")),ur=[...a,Xn];u("Stop",`sid=${e}`,`totalTools=${T}`,`errorTools=${g}`,`spans=${ur.length}`,`inputTokens=${O}`,`outputTokens=${_}`,`traceOutput="${me(E,80)}"`);let Qn=await Mn(vn(Zn,ur));u("Stop",`POST status=${Qn}`,`traceId=${n.traceId}`),lt("TRACE_SENT",{latencyMs:Qt,totalTools:T,errorTools:g,inputTokens:O,outputTokens:_,costUsd:te}),rr(e),D(t);}var qn=m(()=>{"use strict";Gt();Kt();cr();Y();Gn();sr();Pt();F();we();lr();k();Ee();});async function Go(){let t=process.argv[2];if(t==="UserPromptSubmit"){let r=await Qe(),n;try{n=await K();}catch{process.stdout.write(JSON.stringify(r));return}n.authError?await or(r,true):n.length>0?await or(r):process.stdout.write(JSON.stringify(r));return}if(!await Gr()){let r=[];process.stdin.on("data",n=>r.push(n)),process.stdin.on("end",()=>process.stdout.write(r.join("")));return}let e=await Qe();switch(t){case "PreToolUse":await kn(e);break;case "PostToolUse":await jn(e);break;case "Stop":await Kn(e);break;default:process.stderr.write(`[flow-obs] unknown event: ${t}
|
|
188
|
+
`),process.stdout.write(JSON.stringify(e));}}var Jn=m(()=>{"use strict";Y();Pt();An();On();Vn();qn();Go().catch(t=>{process.stderr.write(`[flow-obs] fatal: ${t.message}
|
|
189
|
+
`),process.exit(0);});});var qo=new Set(["UserPromptSubmit","PreToolUse","PostToolUse","Stop"]),[,,U,Jt]=process.argv;function dt(t,e){let r=t.indexOf(e);return r!==-1?t[r+1]:void 0}if(U==="--version"||U==="-v"){let{version:t}=re();process.stdout.write(t+`
|
|
190
|
+
`),process.exit(0);}else if(U==="--help"||U==="-h"){let{bold:t,cyan:e,dim:r}=(mt(),L(ye)),{version:n}=re();process.stdout.write(`
|
|
188
191
|
`+t(" flow-ai-obs")+r(" v"+n)+`
|
|
189
192
|
|
|
190
193
|
`),process.stdout.write(e(" init")+r(` Auth (if needed) + hooks + native OTEL
|
|
@@ -204,13 +207,13 @@ ${r}`},{re:/\b(AKIA[0-9A-Z]{16})\b/g,replace:()=>`AKIA${N}`},{re:/(aws_secret_ac
|
|
|
204
207
|
|
|
205
208
|
`)),process.stdout.write(r(` (Hook events: UserPromptSubmit | PreToolUse | PostToolUse | Stop)
|
|
206
209
|
|
|
207
|
-
`)),process.exit(0);}else if(
|
|
208
|
-
`),await(
|
|
209
|
-
`),process.exit(1);});else if(
|
|
210
|
-
`),process.exit(1);});else if(
|
|
210
|
+
`)),process.exit(0);}else if(U==="init"||U==="install")(async()=>{U==="install"&&process.stderr.write(`Warning: "install" is deprecated, use "init" instead
|
|
211
|
+
`),await(Et(),L(wt)).checkForUpdateInteractive();let{runInit:t}=(Xe(),L(sn)),e=process.argv.slice(3);process.exit(await t({url:dt(e,"--custom-url"),noInteractive:e.includes("--no-interactive")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
|
|
212
|
+
`),process.exit(1);});else if(U==="setup")(async()=>{await(Et(),L(wt)).checkForUpdateInteractive();let{runSetup:t}=(an(),L(on)),e=process.argv.slice(3);process.exit(await t({clientId:dt(e,"--client-id"),clientSecret:dt(e,"--client-secret"),tenant:dt(e,"--tenant")}));})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
|
|
213
|
+
`),process.exit(1);});else if(U==="auth")(async()=>{let{runLogin:t,runLogout:e,runStatus:r}=(Yt(),L(Je)),n=0;if(Jt==="login"||!Jt){await(Et(),L(wt)).checkForUpdateInteractive();let s=process.argv.slice(4);n=await t({clientId:dt(s,"--client-id"),clientSecret:dt(s,"--client-secret"),tenant:dt(s,"--tenant")});}else if(Jt==="logout"){let s=process.argv.includes("--force");n=await e(s);}else Jt==="status"?(await(Et(),L(wt)).checkForUpdateInteractive(),n=await r()):(process.stderr.write(`Unknown auth subcommand: ${Jt}
|
|
211
214
|
`),process.stderr.write(`Usage: flow-ai-obs auth [login|logout|status]
|
|
212
|
-
`),n=1);process.exit(n);})();else if(
|
|
213
|
-
`),process.exit(1);});else if(
|
|
215
|
+
`),n=1);process.exit(n);})();else if(U==="otel-headers"){let{runOtelHeaders:t}=(ln(),L(cn));t().then(e=>process.exit(e)).catch(()=>process.exit(1));}else if(U==="check")(async()=>{await(Et(),L(wt)).checkForUpdateInteractive();let{runCheck:t}=(pn(),L(dn));process.exit(await t());})().catch(t=>{process.stderr.write(`Unexpected error: ${t.message}
|
|
216
|
+
`),process.exit(1);});else if(qo.has(U))Jn();else {let{bold:t,cyan:e,dim:r}=(mt(),L(ye));process.stdout.write(`
|
|
214
217
|
`+t(" flow-ai-obs")+`
|
|
215
218
|
|
|
216
219
|
`),process.stdout.write(e(" init")+r(` Auth (if needed) + hooks + native OTEL
|
package/dist/setup.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),d=require('path'),l=require('os'),Be=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var i__namespace=/*#__PURE__*/_interopNamespace(i);var d__namespace=/*#__PURE__*/_interopNamespace(d);var l__namespace=/*#__PURE__*/_interopNamespace(l);var Be__default=/*#__PURE__*/_interopDefault(Be);var Ee=Object.defineProperty;var y=(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 v=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var ye=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},O=(e,t)=>{for(var r in t)Ee(e,r,{get:t[r],enumerable:true});};var z={};O(z,{MacOsKeyVaultProvider:()=>U});var N,U,Z=v(()=>{"use strict";N=util.promisify(child_process.execFile),U=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(t,r){try{let{stdout:n}=await N("security",["find-generic-password","-w","-a",r,"-s",t]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await N("security",["add-generic-password","-U","-a",r,"-s",t,"-w",n]);}async deleteSecret(t,r){try{return await N("security",["delete-generic-password","-a",r,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var ee={};O(ee,{LinuxKeyVaultProvider:()=>b});var Q,b,te=v(()=>{"use strict";Q=util.promisify(child_process.execFile),b=class{static async isAvailable(){let t=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of t)try{return i.accessSync(r,i.constants.X_OK),!0}catch{}return !1}async getSecret(t,r){try{let{stdout:n}=await Q("secret-tool",["lookup","service",t,"account",r]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await new Promise((s,o)=>{let a=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",r]);a.on("error",o),a.on("close",f=>{f===0?s():o(new Error(`secret-tool exited with code ${f}`));}),a.stdin.write(n),a.stdin.end();});}async deleteSecret(t,r){try{return await Q("secret-tool",["clear","service",t,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var re={};O(re,{WindowsKeyVaultProvider:()=>F});var F,ne=v(()=>{"use strict";F=class{static async isAvailable(){try{return await y("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,r){return y("keytar").getPassword(t,r)}async setSecret(t,r,n){await y("keytar").setPassword(t,r,n);}async deleteSecret(t,r){return y("keytar").deletePassword(t,r)}getStoragePath(){return "Windows Credential Manager"}};});var pe=ye((qt,Ge)=>{Ge.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.1-beta.475",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function x(){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:l__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||l__namespace.userInfo().username}}function R(){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 d__namespace.join(t,".claude","settings.json")}return d__namespace.join(l__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||l__namespace.homedir();return d__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 d__namespace.join(t,".claude","settings.json")}return d__namespace.join(l__namespace.homedir(),".claude","settings.json")}var V="flow-ai-obs",Y="config.json";function Te(){if(process.platform==="win32"){let r=process.env.APPDATA||d__namespace.join(l__namespace.homedir(),"AppData","Roaming");return d__namespace.join(r,V,Y)}let e=x(),t=process.env.XDG_CONFIG_HOME||d__namespace.join(e.home,".config");return d__namespace.join(t,V,Y)}function _e(){try{let e=i__namespace.readFileSync(Te(),"utf8");return JSON.parse(e)}catch{return {}}}function G(){let{baseUrl:e}=_e();return typeof e!="string"||e.trim()===""?null:e.trim().replace(/\/$/,"")}var Se="https://flow.ciandt.com";function I(){return G()??process.env.FLOW_BASE_URL??Se}function P(){let e=I();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`}}var we=P(),_={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials"},S="FLOW-nodejs",w="config.json";function B(){let e=I();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${e}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}var W={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:we.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},m={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var K={LOCK_STALE_MS:3e4},J={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15};var X="flow-ai-obs-debug.log";var C={credentials:"credentials","token-cache":"tokenCache"};function g(){let e=l__namespace.default.homedir();if(process.platform==="darwin")return d__namespace.default.join(e,"Library","Preferences",S,w);if(process.platform==="win32"){let r=process.env.APPDATA??d__namespace.default.join(e,"AppData","Roaming");return d__namespace.default.join(r,S,w)}let t=process.env.XDG_CONFIG_HOME??d__namespace.default.join(e,".config");return d__namespace.default.join(t,S,w)}function k(){try{let e=i__namespace.default.readFileSync(g(),"utf8");return JSON.parse(e)}catch{return {}}}function q(e){let t=g();i__namespace.default.mkdirSync(d__namespace.default.dirname(t),{recursive:true}),i__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var A=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(g()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(g(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,r){let n=k(),s=C[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,r,n){let s=k(),o=C[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;q(s);}async deleteSecret(t,r){let n=k(),s=C[r]??r;return s in n?(delete n[s],q(n),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${g()}`}};async function se(){return await Ue()??new A}async function Ue(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(Z(),z));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(te(),ee));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(ne(),re));return await e.isAvailable()?new e:null}default:return null}}var be=_.SERVICE,Fe=_.ACCOUNT_CREDS,D=null;function De(){return D||(D=se()),D}async function $(){let t=await(await De()).getSecret(be,Fe);if(!t)return null;try{return JSON.parse(t)}catch{return null}}d.join(l.tmpdir(),X);var Ve=K.LOCK_STALE_MS;function oe(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>Ve&&i__namespace.unlinkSync(e);}catch{}try{i__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 ie(e){try{i__namespace.unlinkSync(e);}catch{}}function Ye(e,t){let n=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(a=>!a.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [t,...n]}function ae(){let e=R(),t=e+".lock",r=[];i__namespace.mkdirSync(d__namespace.dirname(e),{recursive:true}),oe(t);try{if(i__namespace.existsSync(e)){i__namespace.copyFileSync(e,e+".bkp");try{i__namespace.chmodSync(e+".bkp",384);}catch{}}let n={};try{n=JSON.parse(i__namespace.readFileSync(e,"utf8"));}catch{}let s=n.env&&typeof n.env=="object"?n.env:{};n.env={...W,...B(),...s},n.otelHeadersHelper="flow-ai-obs otel-headers",(!n.hooks||typeof n.hooks!="object"||Array.isArray(n.hooks))&&(n.hooks={});let o=(c,E)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:E}]}),a=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],f=n.hooks;for(let c of a){let E=Ye(f[c],o(c,J[c]));E.length>1&&r.push(c),f[c]=E;}i__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
|
|
3
|
-
`,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(e,384);}catch{}}finally{ie(t);}return {settingsPath:e,preserved:r}}function ce(e){let t=
|
|
4
|
-
`,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}}finally{ie(r);}}function le(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 ue(e){let t=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant})).toString("base64url");return `${t}.${r}.`}var M;function fe(){return M||(M=pe()),M}var me=d__namespace.default.join(l__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Je=1440*60*1e3,Xe=3e3;function qe(e,t){let r=o=>{let a=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[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 ze(){try{let e=JSON.parse(i__namespace.default.readFileSync(me,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=Je?null:e}catch{return null}}function Ze(e,t,r=Date.now()){try{i__namespace.default.writeFileSync(me,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function Qe(e){let t=fe().name,r=Be__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Xe},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 ge(){try{if(ze())return;setImmediate(()=>{Qe((e,t)=>{e||!t||qe(fe().version,t.version)&&Ze(t.version,t.updatePriority,0);});});}catch{}}var et=d__namespace.default.resolve(__dirname,".."),tt=process.env.INIT_CWD?d__namespace.default.resolve(process.env.INIT_CWD):null;tt===et&&process.exit(0);async function rt(){try{ae();}catch{}let e=await
|
|
2
|
+
'use strict';var child_process=require('child_process'),util=require('util'),i=require('fs'),d=require('path'),l=require('os'),Be=require('https');require('readline/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var i__namespace=/*#__PURE__*/_interopNamespace(i);var d__namespace=/*#__PURE__*/_interopNamespace(d);var l__namespace=/*#__PURE__*/_interopNamespace(l);var Be__default=/*#__PURE__*/_interopDefault(Be);var Ee=Object.defineProperty;var y=(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 v=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var ye=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},O=(e,t)=>{for(var r in t)Ee(e,r,{get:t[r],enumerable:true});};var z={};O(z,{MacOsKeyVaultProvider:()=>U});var N,U,Z=v(()=>{"use strict";N=util.promisify(child_process.execFile),U=class{static async isAvailable(){try{return i.accessSync("/usr/bin/security",i.constants.X_OK),!0}catch{return !1}}async getSecret(t,r){try{let{stdout:n}=await N("security",["find-generic-password","-w","-a",r,"-s",t]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await N("security",["add-generic-password","-U","-a",r,"-s",t,"-w",n]);}async deleteSecret(t,r){try{return await N("security",["delete-generic-password","-a",r,"-s",t]),!0}catch{return !1}}getStoragePath(){return "macOS Keychain"}};});var ee={};O(ee,{LinuxKeyVaultProvider:()=>b});var Q,b,te=v(()=>{"use strict";Q=util.promisify(child_process.execFile),b=class{static async isAvailable(){let t=["/usr/bin/secret-tool","/bin/secret-tool","/usr/local/bin/secret-tool"];for(let r of t)try{return i.accessSync(r,i.constants.X_OK),!0}catch{}return !1}async getSecret(t,r){try{let{stdout:n}=await Q("secret-tool",["lookup","service",t,"account",r]);return n.trim()||null}catch{return null}}async setSecret(t,r,n){await new Promise((s,o)=>{let a=child_process.spawn("secret-tool",["store","--label",t,"service",t,"account",r]);a.on("error",o),a.on("close",f=>{f===0?s():o(new Error(`secret-tool exited with code ${f}`));}),a.stdin.write(n),a.stdin.end();});}async deleteSecret(t,r){try{return await Q("secret-tool",["clear","service",t,"account",r]),!0}catch{return !1}}getStoragePath(){return "Linux Secret Service (libsecret)"}};});var re={};O(re,{WindowsKeyVaultProvider:()=>F});var F,ne=v(()=>{"use strict";F=class{static async isAvailable(){try{return await y("keytar").getPassword("__flow_probe__","__flow_probe__"),!0}catch{return !1}}async getSecret(t,r){return y("keytar").getPassword(t,r)}async setSecret(t,r,n){await y("keytar").setPassword(t,r,n);}async deleteSecret(t,r){return y("keytar").deletePassword(t,r)}getStoragePath(){return "Windows Credential Manager"}};});var pe=ye((qt,Ge)=>{Ge.exports={name:"@ciandt-flow/flow-ai-obs",version:"0.7.1-beta.501",description:"Claude Code hooks for Langfuse OTLP tracing \u2014 cross-platform",main:"dist/index.js",bin:{"flow-ai-obs":"dist/cli.js","flow-ai-obs-setup":"dist/setup.js"},scripts:{build:"tsup",test:"jest",typecheck:"tsc --noEmit",lint:"eslint src bin scripts",format:'prettier --write "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"format:check":'prettier --check "src/**/*.ts" "bin/**/*.ts" "scripts/**/*.ts"',"security-scan":"trufflehog filesystem src/ --fail --no-update --exclude-paths .trufflehogignore",postinstall:`node -e "require('fs').existsSync('dist/setup.js') && require('child_process').execFileSync(process.execPath, ['dist/setup.js'], {stdio:'inherit'})"`,prepublishOnly:"npm run security-scan && npm run build","release:npm":"changeset publish",changeset:"changeset","version-packages":"changeset version","install:hooks":"node dist/cli.js install","auth:login":"node dist/cli.js auth login","auth:logout":"node dist/cli.js auth logout","auth:status":"node dist/cli.js auth status",smoke:"bash scripts/smoke-test.sh","smoke:debug":"bash scripts/smoke-test.sh --debug","smoke:send":"bash scripts/smoke-test.sh --send --allow-http --debug"},files:["dist/","README.md","LICENSE.md"],keywords:["claude-code","langfuse","observability","otlp","hooks","flow","ciandt"],author:"CI&T Flow Team",license:"SEE LICENSE IN LICENSE.md",private:!1,dependencies:{},optionalDependencies:{keytar:"7.9.0"},devDependencies:{"@changesets/changelog-github":"^0.6.0","@changesets/cli":"^2.30.0","@types/jest":"^30.0.0","@types/node":"^25.8.0",jest:"^30.4.2","ts-jest":"^29.4.9",tsup:"^8.5.1","eslint-config-prettier":"^10.1.5",prettier:"^3.5.3",typescript:"^6.0.3","typescript-eslint":"^8.33.0"},engines:{node:">=18.0.0"},overrides:{esbuild:"^0.28.1"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"git+https://github.com/CI-T-HyperX/flow-codeassistant-observability.git"}};});function x(){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:l__namespace.homedir(),username:process.env.SUDO_USER||process.env.USER||l__namespace.userInfo().username}}function P(){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 d__namespace.join(t,".claude","settings.json")}return d__namespace.join(l__namespace.homedir(),".claude","settings.json")}if(process.platform==="win32"){let e=process.env.USERPROFILE||l__namespace.homedir();return d__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 d__namespace.join(t,".claude","settings.json")}return d__namespace.join(l__namespace.homedir(),".claude","settings.json")}var V="flow-ai-obs",Y="config.json";function Te(){if(process.platform==="win32"){let r=process.env.APPDATA||d__namespace.join(l__namespace.homedir(),"AppData","Roaming");return d__namespace.join(r,V,Y)}let e=x(),t=process.env.XDG_CONFIG_HOME||d__namespace.join(e.home,".config");return d__namespace.join(t,V,Y)}function _e(){try{let e=i__namespace.readFileSync(Te(),"utf8");return JSON.parse(e)}catch{return {}}}function G(){let{baseUrl:e}=_e();return typeof e!="string"||e.trim()===""?null:e.trim().replace(/\/$/,"")}var Se="https://flow.ciandt.com";function R(){return G()??process.env.FLOW_BASE_URL??Se}function I(){let e=R();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`}}var we=I(),_={SERVICE:"flow-plugins-cli",ACCOUNT_CREDS:"credentials"},S="FLOW-nodejs",w="config.json";function B(){let e=R();return {ANTHROPIC_BASE_URL:process.env.FLOW_LLM_PROXY_URL??`${e}/flow-llm-proxy/`,ANTHROPIC_MODEL:process.env.FLOW_LLM_PROXY_MODEL??"anthropic.claude-4-6-sonnet",ANTHROPIC_SMALL_FAST_MODEL:process.env.FLOW_LLM_PROXY_SMALL_MODEL??"anthropic.claude-4-6-sonnet",CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:"1"}}var W={CLAUDE_CODE_ENABLE_TELEMETRY:"1",OTEL_EXPORTER_OTLP_ENDPOINT:we.OTEL_ENDPOINT,OTEL_EXPORTER_OTLP_PROTOCOL:"http/json",OTEL_METRICS_EXPORTER:"otlp",OTEL_LOGS_EXPORTER:"otlp",OTEL_LOG_TOOL_DETAILS:"1",OTEL_LOG_USER_PROMPTS:"1"},m={FLOW_TELEMETRY:"FLOW_TELEMETRY",FLOW_TELEMETRY_GATEWAY:"FLOW_TELEMETRY_GATEWAY_URL",LANGFUSE_BASE_URL:"LANGFUSE_BASE_URL",LANGFUSE_PUBLIC_KEY:"LANGFUSE_PUBLIC_KEY",LANGFUSE_SECRET_KEY:"LANGFUSE_SECRET_KEY",ANTHROPIC_MODEL:"ANTHROPIC_MODEL",ANTHROPIC_AUTH_TOKEN:"ANTHROPIC_AUTH_TOKEN",FLOW_OBS_DEBUG:"FLOW_TELEMETRY_DEBUG",FLOW_OBS_ALLOW_HTTP:"FLOW_TELEMETRY_ALLOW_HTTP",BUFFER_TTL_DAYS:"FLOW_TELEMETRY_BUFFER_TTL_DAYS",BUFFER_MAX_FILES:"FLOW_TELEMETRY_BUFFER_MAX_FILES"};var K={LOCK_STALE_MS:3e4},J={UserPromptSubmit:5,PreToolUse:3,PostToolUse:10,Stop:15};var X="flow-ai-obs-debug.log";var C={credentials:"credentials","token-cache":"tokenCache"};function g(){let e=l__namespace.default.homedir();if(process.platform==="darwin")return d__namespace.default.join(e,"Library","Preferences",S,w);if(process.platform==="win32"){let r=process.env.APPDATA??d__namespace.default.join(e,"AppData","Roaming");return d__namespace.default.join(r,S,w)}let t=process.env.XDG_CONFIG_HOME??d__namespace.default.join(e,".config");return d__namespace.default.join(t,S,w)}function k(){try{let e=i__namespace.default.readFileSync(g(),"utf8");return JSON.parse(e)}catch{return {}}}function q(e){let t=g();i__namespace.default.mkdirSync(d__namespace.default.dirname(t),{recursive:true}),i__namespace.default.writeFileSync(t,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});}var A=class{static isAvailable(){return true}static hasExistingData(){try{if(!i__namespace.default.existsSync(g()))return !1;let t=JSON.parse(i__namespace.default.readFileSync(g(),"utf8"));return !!(t&&t.credentials)}catch{return false}}async getSecret(t,r){let n=k(),s=C[r]??r,o=n[s];return o?typeof o=="string"?o:JSON.stringify(o):null}async setSecret(t,r,n){let s=k(),o=C[r]??r;if(r==="token-cache")try{s[o]=JSON.parse(n);}catch{s[o]=n;}else s[o]=n;q(s);}async deleteSecret(t,r){let n=k(),s=C[r]??r;return s in n?(delete n[s],q(n),true):false}getStoragePath(){return `config.json (unencrypted) \u2014 ${g()}`}};async function se(){return await Ue()??new A}async function Ue(){switch(process.platform){case "darwin":{let{MacOsKeyVaultProvider:e}=await Promise.resolve().then(()=>(Z(),z));return await e.isAvailable()?new e:null}case "linux":{let{LinuxKeyVaultProvider:e}=await Promise.resolve().then(()=>(te(),ee));return await e.isAvailable()?new e:null}case "win32":{let{WindowsKeyVaultProvider:e}=await Promise.resolve().then(()=>(ne(),re));return await e.isAvailable()?new e:null}default:return null}}var be=_.SERVICE,Fe=_.ACCOUNT_CREDS,$=null;function $e(){return $||($=se()),$}async function D(){let t=await(await $e()).getSecret(be,Fe);if(!t)return null;try{return JSON.parse(t)}catch{return null}}d.join(l.tmpdir(),X);var Ve=K.LOCK_STALE_MS;function oe(e){try{let t=i__namespace.statSync(e);Date.now()-t.mtimeMs>Ve&&i__namespace.unlinkSync(e);}catch{}try{i__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 ie(e){try{i__namespace.unlinkSync(e);}catch{}}function Ye(e,t){let n=(Array.isArray(e)?e:[]).map(s=>{if(!Array.isArray(s?.hooks))return null;let o=s.hooks.filter(a=>!a.command?.startsWith?.("flow-ai-obs "));return o.length>0?{...s,hooks:o}:null}).filter(s=>s!=null);return [t,...n]}function ae(){let e=P(),t=e+".lock",r=[];i__namespace.mkdirSync(d__namespace.dirname(e),{recursive:true}),oe(t);try{if(i__namespace.existsSync(e)){i__namespace.copyFileSync(e,e+".bkp");try{i__namespace.chmodSync(e+".bkp",384);}catch{}}let n={};try{n=JSON.parse(i__namespace.readFileSync(e,"utf8"));}catch{}let s=n.env&&typeof n.env=="object"?n.env:{};n.env={...W,...B(),...s},n.otelHeadersHelper="flow-ai-obs otel-headers",(!n.hooks||typeof n.hooks!="object"||Array.isArray(n.hooks))&&(n.hooks={});let o=(c,E)=>({matcher:"",hooks:[{type:"command",command:`flow-ai-obs ${c}`,timeout:E}]}),a=["UserPromptSubmit","PreToolUse","PostToolUse","Stop"],f=n.hooks;for(let c of a){let E=Ye(f[c],o(c,J[c]));E.length>1&&r.push(c),f[c]=E;}i__namespace.writeFileSync(e,JSON.stringify(n,null,2)+`
|
|
3
|
+
`,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(e,384);}catch{}}finally{ie(t);}return {settingsPath:e,preserved:r}}function ce(e){let t=P(),r=t+".lock";i__namespace.mkdirSync(d__namespace.dirname(t),{recursive:true}),oe(r);try{let n={};try{n=JSON.parse(i__namespace.readFileSync(t,"utf8"));}catch{}(!n.env||typeof n.env!="object")&&(n.env={}),Object.assign(n.env,e),i__namespace.writeFileSync(t,JSON.stringify(n,null,2)+`
|
|
4
|
+
`,{encoding:"utf8",mode:384});try{i__namespace.chmodSync(t,384);}catch{}}finally{ie(r);}}function le(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 ue(e){let t=Buffer.from(JSON.stringify({alg:"none",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant})).toString("base64url");return `${t}.${r}.`}var M;function fe(){return M||(M=pe()),M}var me=d__namespace.default.join(l__namespace.default.tmpdir(),"flow-obs-update-cache.json"),Je=1440*60*1e3,Xe=3e3;function qe(e,t){let r=o=>{let a=String(o).replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return a?[+a[1],+a[2],+a[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 ze(){try{let e=JSON.parse(i__namespace.default.readFileSync(me,"utf8"));return typeof e.latestVersion!="string"||Date.now()-e.checkedAt>=Je?null:e}catch{return null}}function Ze(e,t,r=Date.now()){try{i__namespace.default.writeFileSync(me,JSON.stringify({latestVersion:e,updatePriority:t??null,checkedAt:r}),{mode:384});}catch{}}function Qe(e){let t=fe().name,r=Be__default.default.get(`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`,{timeout:Xe},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 ge(){try{if(ze())return;setImmediate(()=>{Qe((e,t)=>{e||!t||qe(fe().version,t.version)&&Ze(t.version,t.updatePriority,0);});});}catch{}}var et=d__namespace.default.resolve(__dirname,".."),tt=process.env.INIT_CWD?d__namespace.default.resolve(process.env.INIT_CWD):null;tt===et&&process.exit(0);async function rt(){try{ae();}catch{}let e=await D();if(!e){process.stderr.write(`
|
|
5
5
|
[flow-ai-obs] No credentials found.
|
|
6
6
|
Run \`flow-ai-obs auth login\` to authenticate and enable telemetry.
|
|
7
7
|
|