@pinta-ai/pinta-gemini 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,16 +1,23 @@
1
1
  import { createRequire as __pintaCreateRequire } from 'module'; const require = __pintaCreateRequire(import.meta.url);
2
- var rt=Object.create;var ie=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var ot=Object.getPrototypeOf,st=Object.prototype.hasOwnProperty;var p=(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 g=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var at=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of it(t))!st.call(e,i)&&i!==r&&ie(e,i,{get:()=>t[i],enumerable:!(n=nt(t,i))||n.enumerable});return e};var T=(e,t,r)=>(r=e!=null?rt(ot(e)):{},at(t||!e||!e.__esModule?ie(r,"default",{value:e,enumerable:!0}):r,e));var C=g(c=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});c.PATTERNS=c.MAX_BYTES=void 0;c.truncate=ut;c.collectMatches=oe;c.resolveOverlaps=se;c.applyMatches=ae;c.redact=ct;c.MAX_BYTES=102400;function ut(e){let t=Buffer.from(e,"utf-8");return t.length<=c.MAX_BYTES?e:`${t.subarray(0,c.MAX_BYTES).toString("utf-8")}\u2026[TRUNCATED:${t.length}]`}c.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function oe(e,t){let r=[];for(let n of c.PATTERNS){if(n.requireContext&&n.requireContext!==t.context)continue;let i=new RegExp(n.regex.source,n.regex.flags),s;for(;(s=i.exec(e))!==null;){let a=n.captureGroup??0,u=s[a];if(u===void 0){s.index===i.lastIndex&&i.lastIndex++;continue}let f=s.index,x=s.index+s[0].length,M=f+s[0].indexOf(u),q=M+u.length;r.push({start:f,end:x,replaceStart:M,replaceEnd:q,type:n.type}),s.index===i.lastIndex&&i.lastIndex++}}return r}function se(e){let t=[...e].sort((i,s)=>i.start!==s.start?i.start-s.start:s.end-s.start-(i.end-i.start)),r=[],n=-1;for(let i of t)i.start<n||(r.push(i),n=i.end);return r}function ae(e,t){let r=[...t].sort((i,s)=>s.replaceStart-i.replaceStart),n=e;for(let i of r)n=n.slice(0,i.replaceStart)+`[REDACTED:${i.type}]`+n.slice(i.replaceEnd);return n}function ct(e,t={}){if(e.length===0)return e;let r=oe(e,t);if(r.length===0)return e;let n=se(r);return ae(e,n)}});var $=g(d=>{"use strict";var lt=d&&d.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(d,"__esModule",{value:!0});d.ulidToTraceId=le;d.newSpanId=de;d.snakeCase=ft;d.toOtlpValue=pe;d.attrsFromRecord=gt;d.guardAttrs=fe;d.clientAttrs=ge;d.buildPayload=yt;d.mergeBatch=ht;var dt=lt(p("crypto")),ue=C(),pt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function le(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let n of e){let i=pt.indexOf(n);if(i<0)throw new Error(`ulidToTraceId: invalid Crockford char "${n}"`);t=t<<5n|BigInt(i)}let r=(1n<<128n)-1n;return t&=r,t.toString(16).padStart(32,"0")}function de(){return dt.default.randomBytes(8).toString("hex")}function ft(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var ce=new Set;function R(e,t,r){let n=(0,ue.truncate)(t);if((r.skipRedactKeys??ce).has(e))return n;let i=(r.bashContextKeys??ce).has(e)?"bash":void 0;return(0,ue.redact)(n,{context:i})}function pe(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:R(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:R(e,JSON.stringify(t),r)}}catch{return{stringValue:R(e,String(t),r)}}default:return{stringValue:R(e,String(t),r)}}}function gt(e,t,r={}){let n=[];for(let[i,s]of Object.entries(e)){let a=`${t}.${i}`,u=pe(a,s,r);u!==null&&n.push({key:a,value:u})}return n}function fe(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function ge(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}function yt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...fe(e.guard));let i=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);i&&n.push(...ge(i));let s={traceId:le(e.traceId),spanId:de(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]}}function ht(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var he=g(F=>{"use strict";Object.defineProperty(F,"__esModule",{value:!0});F.evaluateGuard=Pt;var mt=1e4,_t="pinta-core";function ye(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}function vt(e){return new Promise((t,r)=>setTimeout(()=>{let n=new Error("Guard request timed out");n.name="TimeoutError",r(n)},e))}async function Pt(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??mt,i=Date.now();try{let s=await Promise.race([fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??_t,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e})}),vt(n)]);if(s.status!==200)return ye(Date.now()-i,"error");let a=await s.json(),u=Date.now()-i;return{decision:a.decision,reason:a.reason,userMessage:a.userMessage??null,durationMs:a.durationMs??u,clientRttMs:u}}catch(s){let a=s.name==="TimeoutError"?"timeout":"error";return ye(Date.now()-i,a)}}});var U=g(_=>{"use strict";var me=_&&_.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(_,"__esModule",{value:!0});_.MemoryRetryQueue=_.DiskRetryQueue=void 0;var l=me(p("fs")),j=me(p("path")),D=1e3,Ot=50,Tt=5,L=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=j.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{l.default.mkdirSync(j.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
- `;l.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
4
- `)}}readAll(){try{let t=l.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
5
- `))if(n.trim())try{r.push(JSON.parse(n))}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){l.default.existsSync(this.filePath)&&l.default.unlinkSync(this.filePath);return}l.default.mkdirSync(j.default.dirname(this.filePath),{recursive:!0}),l.default.writeFileSync(this.filePath,t.map(r=>JSON.stringify(r)).join(`
2
+ var ft=Object.create;var ce=Object.defineProperty;var pt=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames;var yt=Object.getPrototypeOf,ht=Object.prototype.hasOwnProperty;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 _=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var _t=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of gt(t))!ht.call(e,i)&&i!==r&&ce(e,i,{get:()=>t[i],enumerable:!(n=pt(t,i))||n.enumerable});return e};var b=(e,t,r)=>(r=e!=null?ft(yt(e)):{},_t(t||!e||!e.__esModule?ce(r,"default",{value:e,enumerable:!0}):r,e));var F=_(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.PATTERNS=f.MAX_BYTES=void 0;f.truncateTo=le;f.truncate=mt;f.collectMatches=de;f.resolveOverlaps=fe;f.applyMatches=pe;f.redact=Pt;f.MAX_BYTES=102400;function le(e,t){let r=Buffer.from(e,"utf-8");return r.length<=t?e:`${r.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${r.length}]`}function mt(e){return le(e,f.MAX_BYTES)}f.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function de(e,t){let r=[];for(let n of f.PATTERNS){if(n.requireContext&&n.requireContext!==t.context)continue;let i=new RegExp(n.regex.source,n.regex.flags),o;for(;(o=i.exec(e))!==null;){let a=n.captureGroup??0,u=o[a];if(u===void 0){o.index===i.lastIndex&&i.lastIndex++;continue}let c=o.index,p=o.index+o[0].length,E=c+o[0].indexOf(u),L=E+u.length;r.push({start:c,end:p,replaceStart:E,replaceEnd:L,type:n.type}),o.index===i.lastIndex&&i.lastIndex++}}return r}function fe(e){let t=[...e].sort((i,o)=>i.start!==o.start?i.start-o.start:o.end-o.start-(i.end-i.start)),r=[],n=-1;for(let i of t)i.start<n||(r.push(i),n=i.end);return r}function pe(e,t){let r=[...t].sort((i,o)=>o.replaceStart-i.replaceStart),n=e;for(let i of r)n=n.slice(0,i.replaceStart)+`[REDACTED:${i.type}]`+n.slice(i.replaceEnd);return n}function Pt(e,t={}){if(e.length===0)return e;let r=de(e,t);if(r.length===0)return e;let n=fe(r);return pe(e,n)}});var Y=_(d=>{"use strict";var vt=d&&d.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(d,"__esModule",{value:!0});d.MAX_SPAN_BYTES=void 0;d.ulidToTraceId=_e;d.newSpanId=me;d.snakeCase=St;d.toOtlpValue=Pe;d.attrsFromRecord=Et;d.guardAttrs=ve;d.clientAttrs=Oe;d.enforceSpanBudget=Te;d.buildPayload=bt;d.mergeBatch=kt;var Ot=vt(y("crypto")),V=F(),Tt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function _e(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let n of e){let i=Tt.indexOf(n);if(i<0)throw new Error(`ulidToTraceId: invalid Crockford char "${n}"`);t=t<<5n|BigInt(i)}let r=(1n<<128n)-1n;return t&=r,t.toString(16).padStart(32,"0")}function me(){return Ot.default.randomBytes(8).toString("hex")}function St(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var ge=new Set;function j(e,t,r){let n=(0,V.truncate)(t);if((r.skipRedactKeys??ge).has(e))return n;let i=(r.bashContextKeys??ge).has(e)?"bash":void 0;return(0,V.redact)(n,{context:i})}function Pe(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:j(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:j(e,JSON.stringify(t),r)}}catch{return{stringValue:j(e,String(t),r)}}default:return{stringValue:j(e,String(t),r)}}}function Et(e,t,r={}){let n=[];for(let[i,o]of Object.entries(e)){let a=`${t}.${i}`,u=Pe(a,o,r);u!==null&&n.push({key:a,value:u})}return n}function ve(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function Oe(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}d.MAX_SPAN_BYTES=800*1024;function ye(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var he=1024;function Te(e,t=d.MAX_SPAN_BYTES){let r=ye(e);for(let n=0;n<100&&r>t;n++){let i=null,o=0;for(let c of e.attributes){if(!("stringValue"in c.value))continue;let p=Buffer.byteLength(c.value.stringValue,"utf-8");p>o&&(o=p,i=c.value)}if(i===null||o<=he)break;let a=r-t,u=Math.max(he,o-a-64);i.stringValue=(0,V.truncateTo)(i.stringValue,u),r=ye(e)}return e}function bt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...ve(e.guard));let i=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);i&&n.push(...Oe(i));let o={traceId:_e(e.traceId),spanId:me(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return Te(o),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[o]}]}]}}function kt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var Se=_(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});U.evaluateGuard=It;var At=1e4,wt="pinta-core";function X(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Mt=new Set(["ALLOW","DENY","REVIEW"]);async function It(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??At,i=Date.now(),o=new AbortController,a=setTimeout(()=>o.abort(),n);try{let u=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??wt,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e}),signal:o.signal});if(u.status!==200)return X(Date.now()-i,"error");let c=await u.json(),p=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!Mt.has(c.decision)||!p)return X(Date.now()-i,"error");let E=Date.now()-i;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??E,clientRttMs:E}}catch(u){let c=u.name,p=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return X(Date.now()-i,p)}finally{clearTimeout(a)}}});var N=_(M=>{"use strict";var xt=M&&M.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(M,"__esModule",{value:!0});M.atomicWriteFileSync=Rt;var Ee=xt(y("fs"));function Rt(e,t){let r=`${e}.${process.pid}.tmp`;Ee.default.writeFileSync(r,t),Ee.default.renameSync(r,e)}});var H=_(P=>{"use strict";var be=P&&P.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(P,"__esModule",{value:!0});P.MemoryRetryQueue=P.DiskRetryQueue=void 0;var g=be(y("fs")),D=be(y("path")),jt=N(),$=1e3,Nt=50,Dt=5,z=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=D.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{g.default.mkdirSync(D.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
+ `;g.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
4
+ `)}}readAll(){try{let t=g.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
5
+ `))if(n.trim())try{let i=JSON.parse(n);Array.isArray(i?.payload?.resourceSpans)&&r.push(i)}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){g.default.existsSync(this.filePath)&&g.default.unlinkSync(this.filePath);return}g.default.mkdirSync(D.default.dirname(this.filePath),{recursive:!0}),(0,jt.atomicWriteFileSync)(this.filePath,t.map(r=>JSON.stringify(r)).join(`
6
6
  `)+`
7
7
  `)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
8
- `)}}tryAcquireLock(){let t=Date.now();for(l.default.mkdirSync(j.default.dirname(this.lockPath),{recursive:!0});Date.now()-t<Ot;)try{let r=l.default.openSync(this.lockPath,"wx");return l.default.writeSync(r,String(process.pid)),l.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
9
- `),!1;try{let s=l.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){l.default.unlinkSync(this.lockPath);continue}}catch{}let n=Tt,i=Date.now()+n;for(;Date.now()<i;);}return!1}release(){try{l.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=D)return;let r=t.length-D;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
10
- `),this.rewrite(t.slice(r))}};_.DiskRetryQueue=L;var V=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>D&&this.entries.splice(0,this.entries.length-D)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};_.MemoryRetryQueue=V});var Te=g(y=>{"use strict";Object.defineProperty(y,"__esModule",{value:!0});y.MemoryTransport=y.DiskTransport=void 0;y.parseHeadersEnv=Pe;y.envOptionsResolver=Oe;y.postOtlp=b;var _e=U(),ve=$(),Et=5e3;function Pe(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let r of e.split(",")){let[n,...i]=r.split("=");n&&i.length>0&&(t[n.trim()]=i.join("=").trim())}return t}function Oe(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:Pe(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function b(e,t,r){let n=new AbortController,i=setTimeout(()=>n.abort(),Et);try{let s=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!s.ok){let a="";try{a=(await s.text()).slice(0,200)}catch{}let u=s.status===401||s.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":s.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":s.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${s.status} ${t.endpoint}${u}${a?` body=${a}`:""}
11
- `),!1}return!0}catch(s){return process.stderr.write(`[${r}] OTLP POST failed: ${s.message??String(s)}
12
- `),!1}finally{clearTimeout(i)}}var B=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new _e.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Oe}async send(t){let r=this.resolveOptions();if(!r)return;await b(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let n=(0,ve.mergeBatch)(r.map(s=>s.payload));await b(n,t,this.logPrefix)&&this.queue.rewrite([])}finally{this.queue.release()}}};y.DiskTransport=B;var K=class{queue=new _e.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;await b(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let n=(0,ve.mergeBatch)(r);if(!await b(n,t,this.logPrefix))for(let s of r)this.queue.enqueue(s)}};y.MemoryTransport=K});var X=g(E=>{"use strict";var z=E&&E.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(E,"__esModule",{value:!0});E.TraceManager=void 0;E.generateUlid=Ee;var H=z(p("fs")),kt=z(p("path")),St=z(p("crypto")),Z="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ee(){let e=Date.now(),t="",r=e;for(let s=0;s<10;s++)t=Z[r&31]+t,r=Math.floor(r/32);let n=St.default.randomBytes(10),i="";for(let s=0;s<10;s++)i+=Z[n[s]&31];for(;i.length<16;)i+=Z[0];return t+i}var Y=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ee();return this.save(t),t}currentTrace(){try{let t=H.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){H.default.mkdirSync(kt.default.dirname(this.tracePath),{recursive:!0}),H.default.writeFileSync(this.tracePath,JSON.stringify({traceId:t}))}};E.TraceManager=Y});var we=g(v=>{"use strict";var ke=v&&v.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(v,"__esModule",{value:!0});v.MemorySessionTraceManager=v.DiskSessionTraceManager=void 0;var J=ke(p("fs")),bt=ke(p("path")),Se=X(),be=200,Q=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??be}read(){try{let t=JSON.parse(J.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{J.default.mkdirSync(bt.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;J.default.writeFileSync(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Se.generateUlid)(),i=this.read();return i[r]=n,this.write(i),n}currentTrace(t){let r=t||"default",n=this.read()[r];return n||this.newTrace(r)}};v.DiskSessionTraceManager=Q;var W=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??be}newTrace(t){let r=t||"default",n=(0,Se.generateUlid)();if(this.map.set(r,n),this.map.size>this.maxSessions){let i=this.map.keys().next().value;i!==void 0&&this.map.delete(i)}return n}currentTrace(t){let r=t||"default";return this.map.get(r)??this.newTrace(r)}};v.MemorySessionTraceManager=W});var xe=g(k=>{"use strict";var ee=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.envFilePath=It;k.parseEnvFile=Ie;k.loadEnvFile=xt;var wt=ee(p("node:fs")),At=ee(p("node:os")),Ae=ee(p("node:path"));function It(e,t,r){let n=r?process.env[r]:void 0,i=n&&n.length>0?n:Ae.default.join(At.default.homedir(),e);return Ae.default.join(i,t)}function Ie(e){let t={};for(let r of e.split(`
13
- `)){let n=r.trim();if(!n||n.startsWith("#"))continue;let i=n.indexOf("=");if(i<0)continue;let s=n.slice(0,i).trim(),a=n.slice(i+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),s&&(t[s]=a)}return t}function xt(e){let t;try{t=wt.default.readFileSync(e,"utf-8")}catch{return}let r=Ie(t);for(let[n,i]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=i)}});var P=g(o=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});o.loadEnvFile=o.parseEnvFile=o.envFilePath=o.MemorySessionTraceManager=o.DiskSessionTraceManager=o.generateUlid=o.TraceManager=o.parseHeadersEnv=o.envOptionsResolver=o.postOtlp=o.MemoryTransport=o.DiskTransport=o.MemoryRetryQueue=o.DiskRetryQueue=o.evaluateGuard=o.mergeBatch=o.buildPayload=o.clientAttrs=o.guardAttrs=o.attrsFromRecord=o.toOtlpValue=o.snakeCase=o.newSpanId=o.ulidToTraceId=o.MAX_BYTES=o.PATTERNS=o.applyMatches=o.resolveOverlaps=o.collectMatches=o.truncate=o.redact=void 0;var S=C();Object.defineProperty(o,"redact",{enumerable:!0,get:function(){return S.redact}});Object.defineProperty(o,"truncate",{enumerable:!0,get:function(){return S.truncate}});Object.defineProperty(o,"collectMatches",{enumerable:!0,get:function(){return S.collectMatches}});Object.defineProperty(o,"resolveOverlaps",{enumerable:!0,get:function(){return S.resolveOverlaps}});Object.defineProperty(o,"applyMatches",{enumerable:!0,get:function(){return S.applyMatches}});Object.defineProperty(o,"PATTERNS",{enumerable:!0,get:function(){return S.PATTERNS}});Object.defineProperty(o,"MAX_BYTES",{enumerable:!0,get:function(){return S.MAX_BYTES}});var h=$();Object.defineProperty(o,"ulidToTraceId",{enumerable:!0,get:function(){return h.ulidToTraceId}});Object.defineProperty(o,"newSpanId",{enumerable:!0,get:function(){return h.newSpanId}});Object.defineProperty(o,"snakeCase",{enumerable:!0,get:function(){return h.snakeCase}});Object.defineProperty(o,"toOtlpValue",{enumerable:!0,get:function(){return h.toOtlpValue}});Object.defineProperty(o,"attrsFromRecord",{enumerable:!0,get:function(){return h.attrsFromRecord}});Object.defineProperty(o,"guardAttrs",{enumerable:!0,get:function(){return h.guardAttrs}});Object.defineProperty(o,"clientAttrs",{enumerable:!0,get:function(){return h.clientAttrs}});Object.defineProperty(o,"buildPayload",{enumerable:!0,get:function(){return h.buildPayload}});Object.defineProperty(o,"mergeBatch",{enumerable:!0,get:function(){return h.mergeBatch}});var Mt=he();Object.defineProperty(o,"evaluateGuard",{enumerable:!0,get:function(){return Mt.evaluateGuard}});var Me=U();Object.defineProperty(o,"DiskRetryQueue",{enumerable:!0,get:function(){return Me.DiskRetryQueue}});Object.defineProperty(o,"MemoryRetryQueue",{enumerable:!0,get:function(){return Me.MemoryRetryQueue}});var w=Te();Object.defineProperty(o,"DiskTransport",{enumerable:!0,get:function(){return w.DiskTransport}});Object.defineProperty(o,"MemoryTransport",{enumerable:!0,get:function(){return w.MemoryTransport}});Object.defineProperty(o,"postOtlp",{enumerable:!0,get:function(){return w.postOtlp}});Object.defineProperty(o,"envOptionsResolver",{enumerable:!0,get:function(){return w.envOptionsResolver}});Object.defineProperty(o,"parseHeadersEnv",{enumerable:!0,get:function(){return w.parseHeadersEnv}});var Re=X();Object.defineProperty(o,"TraceManager",{enumerable:!0,get:function(){return Re.TraceManager}});Object.defineProperty(o,"generateUlid",{enumerable:!0,get:function(){return Re.generateUlid}});var je=we();Object.defineProperty(o,"DiskSessionTraceManager",{enumerable:!0,get:function(){return je.DiskSessionTraceManager}});Object.defineProperty(o,"MemorySessionTraceManager",{enumerable:!0,get:function(){return je.MemorySessionTraceManager}});var te=xe();Object.defineProperty(o,"envFilePath",{enumerable:!0,get:function(){return te.envFilePath}});Object.defineProperty(o,"parseEnvFile",{enumerable:!0,get:function(){return te.parseEnvFile}});Object.defineProperty(o,"loadEnvFile",{enumerable:!0,get:function(){return te.loadEnvFile}})});var A=T(P(),1);function Rt(){return(0,A.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function De(e=Rt()){(0,A.loadEnvFile)(e)}var Ne=T(P(),1);import jt from"os";import re from"path";function Dt(){return process.env.GEMINI_HOME||re.join(jt.homedir(),".gemini")}function Nt(){let e=process.env.GEMINI_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;if(e)return e.replace(/\/+$/,"");let t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;if(t)return t.replace(/\/+$/,"")+"/v1/traces"}function Gt(){let e=(0,Ne.parseHeadersEnv)(process.env.GEMINI_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS),t=process.env.GEMINI_PLUGIN_OPTION_API_KEY;return t&&!e["x-pinta-relay-token"]&&(e["x-pinta-relay-token"]=t),e}function Ge(){let e=process.env.GEMINI_PLUGIN_DATA||re.join(Dt(),"pinta-gemini-data");return!process.env.PINTA_RELAY_TOKEN&&process.env.GEMINI_PLUGIN_OPTION_API_KEY&&(process.env.PINTA_RELAY_TOKEN=process.env.GEMINI_PLUGIN_OPTION_API_KEY),{pluginData:e,tracePath:re.join(e,"trace.json"),endpoint:Nt(),headers:Gt(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function qe(e=process.argv){let t=r=>{let n=e.indexOf(r);return n>=0?e[n+1]:void 0};return{agent:t("--agent")||"gemini",event:t("--event")}}function Ce(e){let t=e.transcriptPath;if(typeof t=="string"){if(t.includes("/antigravity-cli/brain/"))return"agy";if(t.includes("/antigravity/brain/"))return"antigravity2"}}var m=e=>e==="gemini",qt={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},Ct={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},$e=e=>m(e)?qt:Ct;function Fe(e){return $e(e).identity}function Le(e){return $e(e).gateEvent}var $t=new Set(["AfterModel"]),Ve=e=>$t.has(e);function Ue(e,t,r){if(m(e))return{hook:t||r.hook_event_name||"unknown",session_id:I(r.session_id),cwd:I(r.cwd),tool_name:I(r.tool_name),tool_input:r.tool_input};let n=r.workspacePaths,i=r.toolCall;return{hook:t||"unknown",session_id:I(r.conversationId),cwd:Array.isArray(n)?I(n[0]):void 0,tool_name:i?.name,tool_input:i?.args}}function I(e){return typeof e=="string"?e:void 0}var Be=T(P(),1),Ft=50,Lt="pinta-gemini/0.6.0";function Ke(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,r=t.command??t.CommandLine;return typeof r=="string"?r:void 0}function He(e,t,r){return(0,Be.evaluateGuard)(e,t,{timeoutMs:Ft,token:r??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Lt})}var Ze=T(P(),1),N=class extends Ze.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-gemini",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var Ye=T(P(),1),G=class extends Ye.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import ne from"os";var O=T(P(),1),Bt=T(P(),1),ze="0.6.0";function Vt(e){return{skipRedactKeys:new Set([`${e}.hook`,`${e}.agent`,`${e}.tool_name`,`${e}.session_id`,`${e}.transcript_path`,`${e}.transcriptPath`,`${e}.cwd`]),bashContextKeys:new Set([`${e}.tool_input`,`${e}.tool_response`,`${e}.toolCall`])}}function Ut(e){return[{key:"service.name",value:{stringValue:e}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-gemini"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:ze}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:ne.userInfo().username}},{key:"host.name",value:{stringValue:ne.hostname()}},{key:"host.arch",value:{stringValue:ne.arch()}}]}function Xe(e){let t=Fe(e.agent),r=Vt(t.prefix),n=[{key:"ingest.type",value:{stringValue:t.ingest}},{key:`${t.prefix}.hook`,value:{stringValue:e.canonical.hook}},{key:`${t.prefix}.agent`,value:{stringValue:e.agent}}];e.product&&n.push({key:`${t.prefix}.product`,value:{stringValue:e.product}}),n.push(...(0,O.attrsFromRecord)(e.event,t.prefix,r));let i=new Set(n.map(s=>s.key));for(let[s,a]of[["session_id",e.canonical.session_id],["cwd",e.canonical.cwd],["tool_name",e.canonical.tool_name]]){let u=`${t.prefix}.${s}`;if(a!=null&&!i.has(u)){let f=(0,O.toOtlpValue)(u,String(a),r);f!==null&&n.push({key:u,value:f})}}return(0,O.buildPayload)({traceId:e.traceId,spanName:`${t.ingest}.${(0,O.snakeCase)(e.canonical.hook)}`,attributes:n,resource:Ut(t.service),scope:{name:"pinta-gemini",version:ze},now:e.now,guard:e.guard})}function Je(e,t,r){if(r&&r.decision==="DENY"){let n=r.userMessage??r.reason??"guard_deny";return m(e)?{decision:"deny",reason:n,systemMessage:r.userMessage??void 0}:{decision:"deny",reason:n}}return!m(e)&&t==="PreToolUse"?{decision:"allow"}:{}}import Qe from"fs";import Kt from"path";function We(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{Qe.mkdirSync(e.pluginData,{recursive:!0}),Qe.appendFileSync(Kt.join(e.pluginData,"invocations.jsonl"),JSON.stringify(t)+`
14
- `)}catch{}}async function Ht(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}function Zt(e,t,r){return m(e)?t.hook==="BeforeAgent":t.hook==="PreInvocation"&&r.invocationNum===1}async function et(){let{agent:e,event:t}=qe(),r={},n={},i,s=null,a=Ge();try{if(n=JSON.parse(await Ht()||"{}"),i=Ue(e,t,n),!Ve(i.hook)){let u=new N(a);await u.flush();let f=i.session_id??"unknown",x=new G(a),M=Zt(e,i,n)?x.newTrace(f):x.currentTrace(f);if(i.hook===Le(e)){let tt=Ke(i.tool_input)??(typeof i.tool_input=="string"?i.tool_input:JSON.stringify(i.tool_input??null));s=await He({spanId:f,toolName:i.tool_name,toolInput:i.tool_input,rawTextFields:{toolInput:tt}},a.guardEndpoint,a.headers["x-pinta-relay-token"])}let q=m(e)?void 0:Ce(n);await u.send(Xe({agent:e,canonical:i,event:n,traceId:M,guard:s,product:q})),r=Je(e,t,s)}}catch(u){process.stderr.write(`[pinta-gemini] error: ${u}
15
- `),r={}}We(a,{ts:new Date().toISOString(),pid:process.pid,agent:e,event:t,argv:process.argv.slice(2),received_payload:n,normalized:i??null,guard:s,decision_returned:r}),process.stdout.write(JSON.stringify(r)+`
16
- `),process.exit(0)}De();et();
8
+ `)}}tryAcquireLock(){let t=Date.now();try{g.default.mkdirSync(D.default.dirname(this.lockPath),{recursive:!0})}catch(r){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${r}
9
+ `),!1}for(;Date.now()-t<Nt;)try{let r=g.default.openSync(this.lockPath,"wx");return g.default.writeSync(r,String(process.pid)),g.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
10
+ `),!1;try{let o=g.default.statSync(this.lockPath);if(Date.now()-o.mtimeMs>3e4){g.default.unlinkSync(this.lockPath);continue}}catch{}let n=Dt,i=Date.now()+n;for(;Date.now()<i;);}return!1}release(){try{g.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=$)return;let r=t.length-$;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
11
+ `),this.rewrite(t.slice(r))}};P.DiskRetryQueue=z;var K=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>$&&this.entries.splice(0,this.entries.length-$)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};P.MemoryRetryQueue=K});var xe=_(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});l.MemoryTransport=l.DiskTransport=l.MAX_POST_BYTES=void 0;l.parseHeadersEnv=Me;l.envOptionsResolver=Ie;l.postOtlp=I;var ke=H(),Ae=Y(),$t=5e3;l.MAX_POST_BYTES=900*1024;function q(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function we(e,t,r){let n=[],i=[],o=[],a=0;for(let u of e){let c=t(u);if(c>r){i.push(u);continue}o.length>0&&a+c>r&&(n.push(o),o=[],a=0),o.push(u),a+=c}return o.length>0&&n.push(o),{chunks:n,oversize:i}}function Me(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let r of e.split(",")){let[n,...i]=r.split("=");n&&i.length>0&&(t[n.trim()]=i.join("=").trim())}return t}function Ie(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:Me(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function I(e,t,r){let n=new AbortController,i=setTimeout(()=>n.abort(),$t);try{let o=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!o.ok){let a="";try{a=(await o.text()).slice(0,200)}catch{}let u=o.status===401||o.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":o.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":o.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${o.status} ${t.endpoint}${u}${a?` body=${a}`:""}
12
+ `),!1}return!0}catch(o){return process.stderr.write(`[${r}] OTLP POST failed: ${o.message??String(o)}
13
+ `),!1}finally{clearTimeout(i)}}var Z=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new ke.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Ie}async send(t){let r=this.resolveOptions();if(!r||this.dropIfOversized(t))return;await I(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let{chunks:n,oversize:i}=we(r,u=>q(u.payload),l.MAX_POST_BYTES);i.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${i.length} oversized retry ${i.length===1?"entry":"entries"} (each > ${l.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
14
+ `);let o=[].concat(...n),a=0;for(let u of n){if(!await I((0,Ae.mergeBatch)(u.map(p=>p.payload)),t,this.logPrefix))break;a+=u.length}this.queue.rewrite(o.slice(a))}catch(r){process.stderr.write(`[${this.logPrefix}] flush failed: ${r?.message??String(r)}
15
+ `)}finally{this.queue.release()}}dropIfOversized(t){let r=q(t);return r<=l.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${r} > ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
16
+ `),!0)}};l.DiskTransport=Z;var J=class{queue=new ke.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;if(q(t)>l.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
17
+ `);return}await I(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let{chunks:n,oversize:i}=we(r,q,l.MAX_POST_BYTES);i.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${i.length} oversized buffered ${i.length===1?"payload":"payloads"} (each > ${l.MAX_POST_BYTES} bytes \u2014 undeliverable)
18
+ `);let o=[].concat(...n),a=0;for(let u of n){if(!await I((0,Ae.mergeBatch)(u),t,this.logPrefix))break;a+=u.length}for(let u of o.slice(a))this.queue.enqueue(u)}};l.MemoryTransport=J});var te=_(k=>{"use strict";var ee=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.TraceManager=void 0;k.generateUlid=je;var Re=ee(y("fs")),qt=ee(y("path")),Gt=ee(y("crypto")),Bt=N(),W="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function je(){let e=Date.now(),t="",r=e;for(let o=0;o<10;o++)t=W[r&31]+t,r=Math.floor(r/32);let n=Gt.default.randomBytes(10),i="";for(let o=0;o<10;o++)i+=W[n[o]&31];for(;i.length<16;)i+=W[0];return t+i}var Q=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=je();return this.save(t),t}currentTrace(){try{let t=Re.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){try{Re.default.mkdirSync(qt.default.dirname(this.tracePath),{recursive:!0}),(0,Bt.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(r){process.stderr.write(`[pinta-core] trace persistence failed: ${r}
19
+ `)}}};k.TraceManager=Q});var Ge=_(v=>{"use strict";var De=v&&v.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(v,"__esModule",{value:!0});v.MemorySessionTraceManager=v.DiskSessionTraceManager=void 0;var Ne=De(y("fs")),Ct=De(y("path")),$e=te(),Lt=N(),qe=200,re=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??qe}read(){try{let t=JSON.parse(Ne.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Ne.default.mkdirSync(Ct.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;(0,Lt.atomicWriteFileSync)(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,$e.generateUlid)(),i=this.read();return i[r]=n,this.write(i),n}currentTrace(t){let r=t||"default",n=this.read()[r];return n||this.newTrace(r)}};v.DiskSessionTraceManager=re;var ne=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??qe}newTrace(t){let r=t||"default",n=(0,$e.generateUlid)();if(this.map.set(r,n),this.map.size>this.maxSessions){let i=this.map.keys().next().value;i!==void 0&&this.map.delete(i)}return n}currentTrace(t){let r=t||"default";return this.map.get(r)??this.newTrace(r)}};v.MemorySessionTraceManager=ne});var Le=_(A=>{"use strict";var ie=A&&A.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(A,"__esModule",{value:!0});A.envFilePath=Yt;A.parseEnvFile=Ce;A.loadEnvFile=Xt;var Ft=ie(y("node:fs")),Vt=ie(y("node:os")),Be=ie(y("node:path"));function Yt(e,t,r){let n=r?process.env[r]:void 0,i=n&&n.length>0?n:Be.default.join(Vt.default.homedir(),e);return Be.default.join(i,t)}function Ce(e){let t={};for(let r of e.split(`
20
+ `)){let n=r.trim();if(!n||n.startsWith("#"))continue;let i=n.indexOf("=");if(i<0)continue;let o=n.slice(0,i).trim(),a=n.slice(i+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),o&&(t[o]=a)}return t}function Xt(e){let t;try{t=Ft.default.readFileSync(e,"utf-8")}catch{return}let r=Ce(t);for(let[n,i]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=i)}});var T=_(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.loadEnvFile=s.parseEnvFile=s.envFilePath=s.MemorySessionTraceManager=s.DiskSessionTraceManager=s.generateUlid=s.TraceManager=s.MAX_POST_BYTES=s.parseHeadersEnv=s.envOptionsResolver=s.postOtlp=s.MemoryTransport=s.DiskTransport=s.MemoryRetryQueue=s.DiskRetryQueue=s.evaluateGuard=s.MAX_SPAN_BYTES=s.enforceSpanBudget=s.mergeBatch=s.buildPayload=s.clientAttrs=s.guardAttrs=s.attrsFromRecord=s.toOtlpValue=s.snakeCase=s.newSpanId=s.ulidToTraceId=s.MAX_BYTES=s.PATTERNS=s.applyMatches=s.resolveOverlaps=s.collectMatches=s.truncateTo=s.truncate=s.redact=void 0;var O=F();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return O.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return O.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return O.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return O.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return O.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return O.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return O.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return O.MAX_BYTES}});var h=Y();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return h.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return h.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return h.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return h.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return h.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return h.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return h.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return h.buildPayload}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return h.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return h.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return h.MAX_SPAN_BYTES}});var Ut=Se();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Ut.evaluateGuard}});var Fe=H();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return Fe.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return Fe.MemoryRetryQueue}});var w=xe();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return w.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return w.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return w.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return w.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return w.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return w.MAX_POST_BYTES}});var Ve=te();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return Ve.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return Ve.generateUlid}});var Ye=Ge();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Ye.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Ye.MemorySessionTraceManager}});var oe=Le();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return oe.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return oe.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return oe.loadEnvFile}})});var x=b(T(),1);function zt(){return(0,x.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function Xe(e=zt()){(0,x.loadEnvFile)(e)}var Ue=b(T(),1);import Kt from"os";import se from"path";function Ht(){return process.env.GEMINI_HOME||se.join(Kt.homedir(),".gemini")}function Zt(){let e=process.env.GEMINI_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;if(e)return e.replace(/\/+$/,"");let t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;if(t)return t.replace(/\/+$/,"")+"/v1/traces"}function Jt(){let e=(0,Ue.parseHeadersEnv)(process.env.GEMINI_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS),t=process.env.GEMINI_PLUGIN_OPTION_API_KEY;return t&&!e["x-pinta-relay-token"]&&(e["x-pinta-relay-token"]=t),e}function ze(){let e=process.env.GEMINI_PLUGIN_DATA||se.join(Ht(),"pinta-gemini-data");return!process.env.PINTA_RELAY_TOKEN&&process.env.GEMINI_PLUGIN_OPTION_API_KEY&&(process.env.PINTA_RELAY_TOKEN=process.env.GEMINI_PLUGIN_OPTION_API_KEY),{pluginData:e,tracePath:se.join(e,"trace.json"),endpoint:Zt(),headers:Jt(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function Ke(e=process.argv){let t=r=>{let n=e.indexOf(r);return n>=0?e[n+1]:void 0};return{agent:t("--agent")||"gemini",event:t("--event")}}function He(e){let t=e.transcriptPath;if(typeof t=="string"){if(t.includes("/antigravity-cli/brain/"))return"agy";if(t.includes("/antigravity/brain/"))return"antigravity2"}}var m=e=>e==="gemini",Wt={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},Qt={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},Ze=e=>m(e)?Wt:Qt;function Je(e){return Ze(e).identity}function We(e){return Ze(e).gateEvent}var er=new Set(["AfterModel"]),Qe=e=>er.has(e);function et(e,t,r){if(m(e))return{hook:t||r.hook_event_name||"unknown",session_id:R(r.session_id),cwd:R(r.cwd),tool_name:R(r.tool_name),tool_input:r.tool_input};let n=r.workspacePaths,i=r.toolCall;return{hook:t||"unknown",session_id:R(r.conversationId),cwd:Array.isArray(n)?R(n[0]):void 0,tool_name:i?.name,tool_input:i?.args}}function R(e){return typeof e=="string"?e:void 0}var tt=b(T(),1),tr=50,rr="pinta-gemini/0.7.0";function rt(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,r=t.command??t.CommandLine;return typeof r=="string"?r:void 0}function nt(e,t,r){return(0,tt.evaluateGuard)(e,t,{timeoutMs:tr,token:r??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:rr})}var it=b(T(),1),G=class extends it.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-gemini",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var ot=b(T(),1),B=class extends ot.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import ae from"os";var S=b(T(),1),sr=b(T(),1),C;function nr(){if(C===void 0)try{C=ae.userInfo().username}catch{C=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return C}var st="0.7.0";function ir(e){return{skipRedactKeys:new Set([`${e}.hook`,`${e}.agent`,`${e}.tool_name`,`${e}.session_id`,`${e}.transcript_path`,`${e}.transcriptPath`,`${e}.cwd`]),bashContextKeys:new Set([`${e}.tool_input`,`${e}.tool_response`,`${e}.toolCall`])}}function or(e){return[{key:"service.name",value:{stringValue:e}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-gemini"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:st}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:nr()}},{key:"host.name",value:{stringValue:ae.hostname()}},{key:"host.arch",value:{stringValue:ae.arch()}}]}function at(e){let t=Je(e.agent),r=ir(t.prefix),n=[{key:"ingest.type",value:{stringValue:t.ingest}},{key:`${t.prefix}.hook`,value:{stringValue:e.canonical.hook}},{key:`${t.prefix}.agent`,value:{stringValue:e.agent}}];e.product&&n.push({key:`${t.prefix}.product`,value:{stringValue:e.product}}),n.push(...(0,S.attrsFromRecord)(e.event,t.prefix,r));let i=new Set(n.map(o=>o.key));for(let[o,a]of[["session_id",e.canonical.session_id],["cwd",e.canonical.cwd],["tool_name",e.canonical.tool_name]]){let u=`${t.prefix}.${o}`;if(a!=null&&!i.has(u)){let c=(0,S.toOtlpValue)(u,String(a),r);c!==null&&n.push({key:u,value:c})}}return(0,S.buildPayload)({traceId:e.traceId,spanName:`${t.ingest}.${(0,S.snakeCase)(e.canonical.hook)}`,attributes:n,resource:or(t.service),scope:{name:"pinta-gemini",version:st},now:e.now,guard:e.guard})}function ue(e,t,r){if(r&&r.decision==="DENY"){let n=r.userMessage??r.reason??"guard_deny";return m(e)?{decision:"deny",reason:n,systemMessage:r.userMessage??void 0}:{decision:"deny",reason:n}}return!m(e)&&t==="PreToolUse"?{decision:"allow"}:{}}import ut from"fs";import ar from"path";function ct(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{ut.mkdirSync(e.pluginData,{recursive:!0}),ut.appendFileSync(ar.join(e.pluginData,"invocations.jsonl"),JSON.stringify(t)+`
21
+ `)}catch{}}async function ur(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}function cr(e,t,r){return m(e)?t.hook==="BeforeAgent":t.hook==="PreInvocation"&&r.invocationNum===1}async function lt(){let{agent:e,event:t}=Ke(),r={},n={},i,o=null,a=ze();try{if(n=JSON.parse(await ur()||"{}"),i=et(e,t,n),!Qe(i.hook)){let u=new G(a);await u.flush();let c=i.session_id??"unknown",p=new B(a),E=cr(e,i,n)?p.newTrace(c):p.currentTrace(c);if(i.hook===We(e)){let dt=rt(i.tool_input)??(typeof i.tool_input=="string"?i.tool_input:JSON.stringify(i.tool_input??null));o=await nt({spanId:c,toolName:i.tool_name,method:i.hook,cwd:i.cwd,toolInput:i.tool_input,rawTextFields:{toolInput:dt}},a.guardEndpoint,a.headers["x-pinta-relay-token"])}r=ue(e,t,o);let L=m(e)?void 0:He(n);await u.send(at({agent:e,canonical:i,event:n,traceId:E,guard:o,product:L}))}}catch(u){process.stderr.write(`[pinta-gemini] error: ${u}
22
+ `),r=o?ue(e,t,o):{}}ct(a,{ts:new Date().toISOString(),pid:process.pid,agent:e,event:t,argv:process.argv.slice(2),received_payload:n,normalized:i??null,guard:o,decision_returned:r}),process.stdout.write(JSON.stringify(r)+`
23
+ `),process.exit(0)}Xe();lt();
package/dist/index.mjs CHANGED
@@ -1,16 +1,23 @@
1
1
  import { createRequire as __pintaCreateRequire } from 'module'; const require = __pintaCreateRequire(import.meta.url);
2
- var Pt=Object.create;var fe=Object.defineProperty;var vt=Object.getOwnPropertyDescriptor;var bt=Object.getOwnPropertyNames;var Ot=Object.getPrototypeOf,Tt=Object.prototype.hasOwnProperty;var m=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var h=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var wt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of bt(t))!Tt.call(e,i)&&i!==n&&fe(e,i,{get:()=>t[i],enumerable:!(r=vt(t,i))||r.enumerable});return e};var S=(e,t,n)=>(n=e!=null?Pt(Ot(e)):{},wt(t||!e||!e.__esModule?fe(n,"default",{value:e,enumerable:!0}):n,e));var B=h(d=>{"use strict";Object.defineProperty(d,"__esModule",{value:!0});d.PATTERNS=d.MAX_BYTES=void 0;d.truncate=Et;d.collectMatches=ge;d.resolveOverlaps=me;d.applyMatches=ye;d.redact=St;d.MAX_BYTES=102400;function Et(e){let t=Buffer.from(e,"utf-8");return t.length<=d.MAX_BYTES?e:`${t.subarray(0,d.MAX_BYTES).toString("utf-8")}\u2026[TRUNCATED:${t.length}]`}d.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function ge(e,t){let n=[];for(let r of d.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;let i=new RegExp(r.regex.source,r.regex.flags),s;for(;(s=i.exec(e))!==null;){let a=r.captureGroup??0,c=s[a];if(c===void 0){s.index===i.lastIndex&&i.lastIndex++;continue}let u=s.index,f=s.index+s[0].length,y=u+s[0].indexOf(c),E=y+c.length;n.push({start:u,end:f,replaceStart:y,replaceEnd:E,type:r.type}),s.index===i.lastIndex&&i.lastIndex++}}return n}function me(e){let t=[...e].sort((i,s)=>i.start!==s.start?i.start-s.start:s.end-s.start-(i.end-i.start)),n=[],r=-1;for(let i of t)i.start<r||(n.push(i),r=i.end);return n}function ye(e,t){let n=[...t].sort((i,s)=>s.replaceStart-i.replaceStart),r=e;for(let i of n)r=r.slice(0,i.replaceStart)+`[REDACTED:${i.type}]`+r.slice(i.replaceEnd);return r}function St(e,t={}){if(e.length===0)return e;let n=ge(e,t);if(n.length===0)return e;let r=me(n);return ye(e,r)}});var H=h(g=>{"use strict";var kt=g&&g.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(g,"__esModule",{value:!0});g.ulidToTraceId=Pe;g.newSpanId=ve;g.snakeCase=xt;g.toOtlpValue=be;g.attrsFromRecord=jt;g.guardAttrs=Oe;g.clientAttrs=Te;g.buildPayload=Mt;g.mergeBatch=Rt;var At=kt(m("crypto")),he=B(),It="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Pe(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let r of e){let i=It.indexOf(r);if(i<0)throw new Error(`ulidToTraceId: invalid Crockford char "${r}"`);t=t<<5n|BigInt(i)}let n=(1n<<128n)-1n;return t&=n,t.toString(16).padStart(32,"0")}function ve(){return At.default.randomBytes(8).toString("hex")}function xt(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var _e=new Set;function G(e,t,n){let r=(0,he.truncate)(t);if((n.skipRedactKeys??_e).has(e))return r;let i=(n.bashContextKeys??_e).has(e)?"bash":void 0;return(0,he.redact)(r,{context:i})}function be(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:G(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:G(e,JSON.stringify(t),n)}}catch{return{stringValue:G(e,String(t),n)}}default:return{stringValue:G(e,String(t),n)}}}function jt(e,t,n={}){let r=[];for(let[i,s]of Object.entries(e)){let a=`${t}.${i}`,c=be(a,s,n);c!==null&&r.push({key:a,value:c})}return r}function Oe(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function Te(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}function Mt(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes];e.guard&&r.push(...Oe(e.guard));let i=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);i&&r.push(...Te(i));let s={traceId:Pe(e.traceId),spanId:ve(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};return{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]}}function Rt(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var Ee=h(z=>{"use strict";Object.defineProperty(z,"__esModule",{value:!0});z.evaluateGuard=qt;var Dt=1e4,Nt="pinta-core";function we(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}function Ct(e){return new Promise((t,n)=>setTimeout(()=>{let r=new Error("Guard request timed out");r.name="TimeoutError",n(r)},e))}async function qt(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??Dt,i=Date.now();try{let s=await Promise.race([fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??Nt,"x-pinta-relay-token":n.token??""},body:JSON.stringify({input:e})}),Ct(r)]);if(s.status!==200)return we(Date.now()-i,"error");let a=await s.json(),c=Date.now()-i;return{decision:a.decision,reason:a.reason,userMessage:a.userMessage??null,durationMs:a.durationMs??c,clientRttMs:c}}catch(s){let a=s.name==="TimeoutError"?"timeout":"error";return we(Date.now()-i,a)}}});var X=h(b=>{"use strict";var Se=b&&b.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(b,"__esModule",{value:!0});b.MemoryRetryQueue=b.DiskRetryQueue=void 0;var p=Se(m("fs")),F=Se(m("path")),$=1e3,Gt=50,Ft=5,Y=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=F.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{p.default.mkdirSync(F.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
- `;p.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
4
- `)}}readAll(){try{let t=p.default.readFileSync(this.filePath,"utf-8"),n=[];for(let r of t.split(`
5
- `))if(r.trim())try{n.push(JSON.parse(r))}catch{}return n}catch{return[]}}rewrite(t){try{if(t.length===0){p.default.existsSync(this.filePath)&&p.default.unlinkSync(this.filePath);return}p.default.mkdirSync(F.default.dirname(this.filePath),{recursive:!0}),p.default.writeFileSync(this.filePath,t.map(n=>JSON.stringify(n)).join(`
2
+ var jt=Object.create;var Pe=Object.defineProperty;var xt=Object.getOwnPropertyDescriptor;var Rt=Object.getOwnPropertyNames;var Dt=Object.getPrototypeOf,Nt=Object.prototype.hasOwnProperty;var _=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):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)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var $t=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Rt(t))!Nt.call(e,i)&&i!==n&&Pe(e,i,{get:()=>t[i],enumerable:!(r=xt(t,i))||r.enumerable});return e};var k=(e,t,n)=>(n=e!=null?jt(Dt(e)):{},$t(t||!e||!e.__esModule?Pe(n,"default",{value:e,enumerable:!0}):n,e));var W=v(h=>{"use strict";Object.defineProperty(h,"__esModule",{value:!0});h.PATTERNS=h.MAX_BYTES=void 0;h.truncateTo=ve;h.truncate=qt;h.collectMatches=be;h.resolveOverlaps=Te;h.applyMatches=Se;h.redact=Ct;h.MAX_BYTES=102400;function ve(e,t){let n=Buffer.from(e,"utf-8");return n.length<=t?e:`${n.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${n.length}]`}function qt(e){return ve(e,h.MAX_BYTES)}h.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function be(e,t){let n=[];for(let r of h.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;let i=new RegExp(r.regex.source,r.regex.flags),s;for(;(s=i.exec(e))!==null;){let a=r.captureGroup??0,c=s[a];if(c===void 0){s.index===i.lastIndex&&i.lastIndex++;continue}let u=s.index,l=s.index+s[0].length,m=u+s[0].indexOf(c),f=m+c.length;n.push({start:u,end:l,replaceStart:m,replaceEnd:f,type:r.type}),s.index===i.lastIndex&&i.lastIndex++}}return n}function Te(e){let t=[...e].sort((i,s)=>i.start!==s.start?i.start-s.start:s.end-s.start-(i.end-i.start)),n=[],r=-1;for(let i of t)i.start<r||(n.push(i),r=i.end);return n}function Se(e,t){let n=[...t].sort((i,s)=>s.replaceStart-i.replaceStart),r=e;for(let i of n)r=r.slice(0,i.replaceStart)+`[REDACTED:${i.type}]`+r.slice(i.replaceEnd);return r}function Ct(e,t={}){if(e.length===0)return e;let n=be(e,t);if(n.length===0)return e;let r=Te(n);return Se(e,r)}});var J=v(g=>{"use strict";var Ft=g&&g.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(g,"__esModule",{value:!0});g.MAX_SPAN_BYTES=void 0;g.ulidToTraceId=Ae;g.newSpanId=ke;g.snakeCase=Lt;g.toOtlpValue=Me;g.attrsFromRecord=Vt;g.guardAttrs=Ie;g.clientAttrs=je;g.enforceSpanBudget=xe;g.buildPayload=Yt;g.mergeBatch=Xt;var Gt=Ft(_("crypto")),Z=W(),Bt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ae(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let r of e){let i=Bt.indexOf(r);if(i<0)throw new Error(`ulidToTraceId: invalid Crockford char "${r}"`);t=t<<5n|BigInt(i)}let n=(1n<<128n)-1n;return t&=n,t.toString(16).padStart(32,"0")}function ke(){return Gt.default.randomBytes(8).toString("hex")}function Lt(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Oe=new Set;function G(e,t,n){let r=(0,Z.truncate)(t);if((n.skipRedactKeys??Oe).has(e))return r;let i=(n.bashContextKeys??Oe).has(e)?"bash":void 0;return(0,Z.redact)(r,{context:i})}function Me(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:G(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:G(e,JSON.stringify(t),n)}}catch{return{stringValue:G(e,String(t),n)}}default:return{stringValue:G(e,String(t),n)}}}function Vt(e,t,n={}){let r=[];for(let[i,s]of Object.entries(e)){let a=`${t}.${i}`,c=Me(a,s,n);c!==null&&r.push({key:a,value:c})}return r}function Ie(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function je(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}g.MAX_SPAN_BYTES=800*1024;function we(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Ee=1024;function xe(e,t=g.MAX_SPAN_BYTES){let n=we(e);for(let r=0;r<100&&n>t;r++){let i=null,s=0;for(let u of e.attributes){if(!("stringValue"in u.value))continue;let l=Buffer.byteLength(u.value.stringValue,"utf-8");l>s&&(s=l,i=u.value)}if(i===null||s<=Ee)break;let a=n-t,c=Math.max(Ee,s-a-64);i.stringValue=(0,Z.truncateTo)(i.stringValue,c),n=we(e)}return e}function Yt(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes];e.guard&&r.push(...Ie(e.guard));let i=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);i&&r.push(...je(i));let s={traceId:Ae(e.traceId),spanId:ke(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};return xe(s),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]}}function Xt(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var Re=v(ee=>{"use strict";Object.defineProperty(ee,"__esModule",{value:!0});ee.evaluateGuard=Ht;var Kt=1e4,zt="pinta-core";function Q(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Ut=new Set(["ALLOW","DENY","REVIEW"]);async function Ht(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??Kt,i=Date.now(),s=new AbortController,a=setTimeout(()=>s.abort(),r);try{let c=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??zt,"x-pinta-relay-token":n.token??""},body:JSON.stringify({input:e}),signal:s.signal});if(c.status!==200)return Q(Date.now()-i,"error");let u=await c.json(),l=u?.durationMs===void 0||typeof u.durationMs=="number"&&Number.isFinite(u.durationMs);if(!u||!Ut.has(u.decision)||!l)return Q(Date.now()-i,"error");let m=Date.now()-i;return{decision:u.decision,reason:u.reason??null,userMessage:u.userMessage??null,durationMs:u.durationMs??m,clientRttMs:m}}catch(c){let u=c.name,l=u==="AbortError"||u==="TimeoutError"?"timeout":"error";return Q(Date.now()-i,l)}finally{clearTimeout(a)}}});var B=v(N=>{"use strict";var Wt=N&&N.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(N,"__esModule",{value:!0});N.atomicWriteFileSync=Zt;var De=Wt(_("fs"));function Zt(e,t){let n=`${e}.${process.pid}.tmp`;De.default.writeFileSync(n,t),De.default.renameSync(n,e)}});var re=v(T=>{"use strict";var Ne=T&&T.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(T,"__esModule",{value:!0});T.MemoryRetryQueue=T.DiskRetryQueue=void 0;var y=Ne(_("fs")),L=Ne(_("path")),Jt=B(),V=1e3,Qt=50,en=5,te=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=L.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{y.default.mkdirSync(L.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
+ `;y.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
4
+ `)}}readAll(){try{let t=y.default.readFileSync(this.filePath,"utf-8"),n=[];for(let r of t.split(`
5
+ `))if(r.trim())try{let i=JSON.parse(r);Array.isArray(i?.payload?.resourceSpans)&&n.push(i)}catch{}return n}catch{return[]}}rewrite(t){try{if(t.length===0){y.default.existsSync(this.filePath)&&y.default.unlinkSync(this.filePath);return}y.default.mkdirSync(L.default.dirname(this.filePath),{recursive:!0}),(0,Jt.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
6
6
  `)+`
7
7
  `)}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${n}
8
- `)}}tryAcquireLock(){let t=Date.now();for(p.default.mkdirSync(F.default.dirname(this.lockPath),{recursive:!0});Date.now()-t<Gt;)try{let n=p.default.openSync(this.lockPath,"wx");return p.default.writeSync(n,String(process.pid)),p.default.closeSync(n),!0}catch(n){if(n?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${n}
9
- `),!1;try{let s=p.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){p.default.unlinkSync(this.lockPath);continue}}catch{}let r=Ft,i=Date.now()+r;for(;Date.now()<i;);}return!1}release(){try{p.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=$)return;let n=t.length-$;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
10
- `),this.rewrite(t.slice(n))}};b.DiskRetryQueue=Y;var Z=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>$&&this.entries.splice(0,this.entries.length-$)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};b.MemoryRetryQueue=Z});var je=h(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});_.MemoryTransport=_.DiskTransport=void 0;_.parseHeadersEnv=Ie;_.envOptionsResolver=xe;_.postOtlp=R;var ke=X(),Ae=H(),$t=5e3;function Ie(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let n of e.split(",")){let[r,...i]=n.split("=");r&&i.length>0&&(t[r.trim()]=i.join("=").trim())}return t}function xe(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,n;return e?n=e.replace(/\/+$/,""):t&&(n=t.replace(/\/+$/,"")+"/v1/traces"),n?{endpoint:n,headers:Ie(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function R(e,t,n){let r=new AbortController,i=setTimeout(()=>r.abort(),$t);try{let s=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:r.signal});if(!s.ok){let a="";try{a=(await s.text()).slice(0,200)}catch{}let c=s.status===401||s.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":s.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":s.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${n}] OTLP POST ${s.status} ${t.endpoint}${c}${a?` body=${a}`:""}
8
+ `)}}tryAcquireLock(){let t=Date.now();try{y.default.mkdirSync(L.default.dirname(this.lockPath),{recursive:!0})}catch(n){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${n}
9
+ `),!1}for(;Date.now()-t<Qt;)try{let n=y.default.openSync(this.lockPath,"wx");return y.default.writeSync(n,String(process.pid)),y.default.closeSync(n),!0}catch(n){if(n?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${n}
10
+ `),!1;try{let s=y.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){y.default.unlinkSync(this.lockPath);continue}}catch{}let r=en,i=Date.now()+r;for(;Date.now()<i;);}return!1}release(){try{y.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=V)return;let n=t.length-V;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
11
+ `),this.rewrite(t.slice(n))}};T.DiskRetryQueue=te;var ne=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>V&&this.entries.splice(0,this.entries.length-V)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};T.MemoryRetryQueue=ne});var Be=v(d=>{"use strict";Object.defineProperty(d,"__esModule",{value:!0});d.MemoryTransport=d.DiskTransport=d.MAX_POST_BYTES=void 0;d.parseHeadersEnv=Fe;d.envOptionsResolver=Ge;d.postOtlp=$;var $e=re(),qe=J(),tn=5e3;d.MAX_POST_BYTES=900*1024;function Y(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function Ce(e,t,n){let r=[],i=[],s=[],a=0;for(let c of e){let u=t(c);if(u>n){i.push(c);continue}s.length>0&&a+u>n&&(r.push(s),s=[],a=0),s.push(c),a+=u}return s.length>0&&r.push(s),{chunks:r,oversize:i}}function Fe(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let n of e.split(",")){let[r,...i]=n.split("=");r&&i.length>0&&(t[r.trim()]=i.join("=").trim())}return t}function Ge(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,n;return e?n=e.replace(/\/+$/,""):t&&(n=t.replace(/\/+$/,"")+"/v1/traces"),n?{endpoint:n,headers:Fe(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function $(e,t,n){let r=new AbortController,i=setTimeout(()=>r.abort(),tn);try{let s=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:r.signal});if(!s.ok){let a="";try{a=(await s.text()).slice(0,200)}catch{}let c=s.status===401||s.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":s.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":s.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${n}] OTLP POST ${s.status} ${t.endpoint}${c}${a?` body=${a}`:""}
11
12
  `),!1}return!0}catch(s){return process.stderr.write(`[${n}] OTLP POST failed: ${s.message??String(s)}
12
- `),!1}finally{clearTimeout(i)}}var J=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new ke.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??xe}async send(t){let n=this.resolveOptions();if(!n)return;await R(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let n=this.queue.readAll();if(n.length===0)return;let r=(0,Ae.mergeBatch)(n.map(s=>s.payload));await R(r,t,this.logPrefix)&&this.queue.rewrite([])}finally{this.queue.release()}}};_.DiskTransport=J;var W=class{queue=new ke.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;await R(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let n=this.queue.drain();if(n.length===0)return;let r=(0,Ae.mergeBatch)(n);if(!await R(r,t,this.logPrefix))for(let s of n)this.queue.enqueue(s)}};_.MemoryTransport=W});var re=h(k=>{"use strict";var ne=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.TraceManager=void 0;k.generateUlid=Me;var Q=ne(m("fs")),Lt=ne(m("path")),Vt=ne(m("crypto")),ee="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Me(){let e=Date.now(),t="",n=e;for(let s=0;s<10;s++)t=ee[n&31]+t,n=Math.floor(n/32);let r=Vt.default.randomBytes(10),i="";for(let s=0;s<10;s++)i+=ee[r[s]&31];for(;i.length<16;)i+=ee[0];return t+i}var te=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Me();return this.save(t),t}currentTrace(){try{let t=Q.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){Q.default.mkdirSync(Lt.default.dirname(this.tracePath),{recursive:!0}),Q.default.writeFileSync(this.tracePath,JSON.stringify({traceId:t}))}};k.TraceManager=te});var Ce=h(O=>{"use strict";var Re=O&&O.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(O,"__esModule",{value:!0});O.MemorySessionTraceManager=O.DiskSessionTraceManager=void 0;var ie=Re(m("fs")),Kt=Re(m("path")),De=re(),Ne=200,se=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??Ne}read(){try{let t=JSON.parse(ie.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{ie.default.mkdirSync(Kt.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;ie.default.writeFileSync(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,De.generateUlid)(),i=this.read();return i[n]=r,this.write(i),r}currentTrace(t){let n=t||"default",r=this.read()[n];return r||this.newTrace(n)}};O.DiskSessionTraceManager=se;var oe=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ne}newTrace(t){let n=t||"default",r=(0,De.generateUlid)();if(this.map.set(n,r),this.map.size>this.maxSessions){let i=this.map.keys().next().value;i!==void 0&&this.map.delete(i)}return r}currentTrace(t){let n=t||"default";return this.map.get(n)??this.newTrace(n)}};O.MemorySessionTraceManager=oe});var Fe=h(A=>{"use strict";var ae=A&&A.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(A,"__esModule",{value:!0});A.envFilePath=Ht;A.parseEnvFile=Ge;A.loadEnvFile=zt;var Ut=ae(m("node:fs")),Bt=ae(m("node:os")),qe=ae(m("node:path"));function Ht(e,t,n){let r=n?process.env[n]:void 0,i=r&&r.length>0?r:qe.default.join(Bt.default.homedir(),e);return qe.default.join(i,t)}function Ge(e){let t={};for(let n of e.split(`
13
- `)){let r=n.trim();if(!r||r.startsWith("#"))continue;let i=r.indexOf("=");if(i<0)continue;let s=r.slice(0,i).trim(),a=r.slice(i+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),s&&(t[s]=a)}return t}function zt(e){let t;try{t=Ut.default.readFileSync(e,"utf-8")}catch{return}let n=Ge(t);for(let[r,i]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=i)}});var T=h(o=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});o.loadEnvFile=o.parseEnvFile=o.envFilePath=o.MemorySessionTraceManager=o.DiskSessionTraceManager=o.generateUlid=o.TraceManager=o.parseHeadersEnv=o.envOptionsResolver=o.postOtlp=o.MemoryTransport=o.DiskTransport=o.MemoryRetryQueue=o.DiskRetryQueue=o.evaluateGuard=o.mergeBatch=o.buildPayload=o.clientAttrs=o.guardAttrs=o.attrsFromRecord=o.toOtlpValue=o.snakeCase=o.newSpanId=o.ulidToTraceId=o.MAX_BYTES=o.PATTERNS=o.applyMatches=o.resolveOverlaps=o.collectMatches=o.truncate=o.redact=void 0;var I=B();Object.defineProperty(o,"redact",{enumerable:!0,get:function(){return I.redact}});Object.defineProperty(o,"truncate",{enumerable:!0,get:function(){return I.truncate}});Object.defineProperty(o,"collectMatches",{enumerable:!0,get:function(){return I.collectMatches}});Object.defineProperty(o,"resolveOverlaps",{enumerable:!0,get:function(){return I.resolveOverlaps}});Object.defineProperty(o,"applyMatches",{enumerable:!0,get:function(){return I.applyMatches}});Object.defineProperty(o,"PATTERNS",{enumerable:!0,get:function(){return I.PATTERNS}});Object.defineProperty(o,"MAX_BYTES",{enumerable:!0,get:function(){return I.MAX_BYTES}});var P=H();Object.defineProperty(o,"ulidToTraceId",{enumerable:!0,get:function(){return P.ulidToTraceId}});Object.defineProperty(o,"newSpanId",{enumerable:!0,get:function(){return P.newSpanId}});Object.defineProperty(o,"snakeCase",{enumerable:!0,get:function(){return P.snakeCase}});Object.defineProperty(o,"toOtlpValue",{enumerable:!0,get:function(){return P.toOtlpValue}});Object.defineProperty(o,"attrsFromRecord",{enumerable:!0,get:function(){return P.attrsFromRecord}});Object.defineProperty(o,"guardAttrs",{enumerable:!0,get:function(){return P.guardAttrs}});Object.defineProperty(o,"clientAttrs",{enumerable:!0,get:function(){return P.clientAttrs}});Object.defineProperty(o,"buildPayload",{enumerable:!0,get:function(){return P.buildPayload}});Object.defineProperty(o,"mergeBatch",{enumerable:!0,get:function(){return P.mergeBatch}});var Yt=Ee();Object.defineProperty(o,"evaluateGuard",{enumerable:!0,get:function(){return Yt.evaluateGuard}});var $e=X();Object.defineProperty(o,"DiskRetryQueue",{enumerable:!0,get:function(){return $e.DiskRetryQueue}});Object.defineProperty(o,"MemoryRetryQueue",{enumerable:!0,get:function(){return $e.MemoryRetryQueue}});var D=je();Object.defineProperty(o,"DiskTransport",{enumerable:!0,get:function(){return D.DiskTransport}});Object.defineProperty(o,"MemoryTransport",{enumerable:!0,get:function(){return D.MemoryTransport}});Object.defineProperty(o,"postOtlp",{enumerable:!0,get:function(){return D.postOtlp}});Object.defineProperty(o,"envOptionsResolver",{enumerable:!0,get:function(){return D.envOptionsResolver}});Object.defineProperty(o,"parseHeadersEnv",{enumerable:!0,get:function(){return D.parseHeadersEnv}});var Le=re();Object.defineProperty(o,"TraceManager",{enumerable:!0,get:function(){return Le.TraceManager}});Object.defineProperty(o,"generateUlid",{enumerable:!0,get:function(){return Le.generateUlid}});var Ve=Ce();Object.defineProperty(o,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Ve.DiskSessionTraceManager}});Object.defineProperty(o,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Ve.MemorySessionTraceManager}});var ce=Fe();Object.defineProperty(o,"envFilePath",{enumerable:!0,get:function(){return ce.envFilePath}});Object.defineProperty(o,"parseEnvFile",{enumerable:!0,get:function(){return ce.parseEnvFile}});Object.defineProperty(o,"loadEnvFile",{enumerable:!0,get:function(){return ce.loadEnvFile}})});import{realpathSync as Nn}from"node:fs";import{pathToFileURL as Cn}from"node:url";var N=S(T(),1);function Zt(){return(0,N.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function Ke(e=Zt()){(0,N.loadEnvFile)(e)}var Ue=S(T(),1);import Xt from"os";import ue from"path";function Jt(){return process.env.GEMINI_HOME||ue.join(Xt.homedir(),".gemini")}function Wt(){let e=process.env.GEMINI_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;if(e)return e.replace(/\/+$/,"");let t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;if(t)return t.replace(/\/+$/,"")+"/v1/traces"}function Qt(){let e=(0,Ue.parseHeadersEnv)(process.env.GEMINI_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS),t=process.env.GEMINI_PLUGIN_OPTION_API_KEY;return t&&!e["x-pinta-relay-token"]&&(e["x-pinta-relay-token"]=t),e}function Be(){let e=process.env.GEMINI_PLUGIN_DATA||ue.join(Jt(),"pinta-gemini-data");return!process.env.PINTA_RELAY_TOKEN&&process.env.GEMINI_PLUGIN_OPTION_API_KEY&&(process.env.PINTA_RELAY_TOKEN=process.env.GEMINI_PLUGIN_OPTION_API_KEY),{pluginData:e,tracePath:ue.join(e,"trace.json"),endpoint:Wt(),headers:Qt(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function He(e=process.argv){let t=n=>{let r=e.indexOf(n);return r>=0?e[r+1]:void 0};return{agent:t("--agent")||"gemini",event:t("--event")}}function ze(e){let t=e.transcriptPath;if(typeof t=="string"){if(t.includes("/antigravity-cli/brain/"))return"agy";if(t.includes("/antigravity/brain/"))return"antigravity2"}}var v=e=>e==="gemini",en={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},tn={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},Ye=e=>v(e)?en:tn;function Ze(e){return Ye(e).identity}function Xe(e){return Ye(e).gateEvent}var nn=new Set(["AfterModel"]),Je=e=>nn.has(e);function We(e,t,n){if(v(e))return{hook:t||n.hook_event_name||"unknown",session_id:C(n.session_id),cwd:C(n.cwd),tool_name:C(n.tool_name),tool_input:n.tool_input};let r=n.workspacePaths,i=n.toolCall;return{hook:t||"unknown",session_id:C(n.conversationId),cwd:Array.isArray(r)?C(r[0]):void 0,tool_name:i?.name,tool_input:i?.args}}function C(e){return typeof e=="string"?e:void 0}var Qe=S(T(),1),rn=50,sn="pinta-gemini/0.6.0";function et(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n=t.command??t.CommandLine;return typeof n=="string"?n:void 0}function tt(e,t,n){return(0,Qe.evaluateGuard)(e,t,{timeoutMs:rn,token:n??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:sn})}var nt=S(T(),1),L=class extends nt.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-gemini",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var rt=S(T(),1),V=class extends rt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import le from"os";var w=S(T(),1),cn=S(T(),1),it="0.6.0";function on(e){return{skipRedactKeys:new Set([`${e}.hook`,`${e}.agent`,`${e}.tool_name`,`${e}.session_id`,`${e}.transcript_path`,`${e}.transcriptPath`,`${e}.cwd`]),bashContextKeys:new Set([`${e}.tool_input`,`${e}.tool_response`,`${e}.toolCall`])}}function an(e){return[{key:"service.name",value:{stringValue:e}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-gemini"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:it}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:le.userInfo().username}},{key:"host.name",value:{stringValue:le.hostname()}},{key:"host.arch",value:{stringValue:le.arch()}}]}function st(e){let t=Ze(e.agent),n=on(t.prefix),r=[{key:"ingest.type",value:{stringValue:t.ingest}},{key:`${t.prefix}.hook`,value:{stringValue:e.canonical.hook}},{key:`${t.prefix}.agent`,value:{stringValue:e.agent}}];e.product&&r.push({key:`${t.prefix}.product`,value:{stringValue:e.product}}),r.push(...(0,w.attrsFromRecord)(e.event,t.prefix,n));let i=new Set(r.map(s=>s.key));for(let[s,a]of[["session_id",e.canonical.session_id],["cwd",e.canonical.cwd],["tool_name",e.canonical.tool_name]]){let c=`${t.prefix}.${s}`;if(a!=null&&!i.has(c)){let u=(0,w.toOtlpValue)(c,String(a),n);u!==null&&r.push({key:c,value:u})}}return(0,w.buildPayload)({traceId:e.traceId,spanName:`${t.ingest}.${(0,w.snakeCase)(e.canonical.hook)}`,attributes:r,resource:an(t.service),scope:{name:"pinta-gemini",version:it},now:e.now,guard:e.guard})}function ot(e,t,n){if(n&&n.decision==="DENY"){let r=n.userMessage??n.reason??"guard_deny";return v(e)?{decision:"deny",reason:r,systemMessage:n.userMessage??void 0}:{decision:"deny",reason:r}}return!v(e)&&t==="PreToolUse"?{decision:"allow"}:{}}import at from"fs";import un from"path";function ct(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{at.mkdirSync(e.pluginData,{recursive:!0}),at.appendFileSync(un.join(e.pluginData,"invocations.jsonl"),JSON.stringify(t)+`
14
- `)}catch{}}async function ln(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}function dn(e,t,n){return v(e)?t.hook==="BeforeAgent":t.hook==="PreInvocation"&&n.invocationNum===1}async function ut(){let{agent:e,event:t}=He(),n={},r={},i,s=null,a=Be();try{if(r=JSON.parse(await ln()||"{}"),i=We(e,t,r),!Je(i.hook)){let c=new L(a);await c.flush();let u=i.session_id??"unknown",f=new V(a),y=dn(e,i,r)?f.newTrace(u):f.currentTrace(u);if(i.hook===Xe(e)){let U=et(i.tool_input)??(typeof i.tool_input=="string"?i.tool_input:JSON.stringify(i.tool_input??null));s=await tt({spanId:u,toolName:i.tool_name,toolInput:i.tool_input,rawTextFields:{toolInput:U}},a.guardEndpoint,a.headers["x-pinta-relay-token"])}let E=v(e)?void 0:ze(r);await c.send(st({agent:e,canonical:i,event:r,traceId:y,guard:s,product:E})),n=ot(e,t,s)}}catch(c){process.stderr.write(`[pinta-gemini] error: ${c}
15
- `),n={}}ct(a,{ts:new Date().toISOString(),pid:process.pid,agent:e,event:t,argv:process.argv.slice(2),received_payload:r,normalized:i??null,guard:s,decision_returned:n}),process.stdout.write(JSON.stringify(n)+`
16
- `),process.exit(0)}import{opendir as gt,stat as wn}from"node:fs/promises";import{homedir as En}from"node:os";import l from"node:path";import{spawn as dt}from"node:child_process";import{access as pn,copyFile as fn,mkdtemp as gn,stat as pt}from"node:fs/promises";import{constants as mn}from"node:fs";import yn from"node:os";import q from"node:path";var de,hn=["/usr/bin/sqlite3","/opt/homebrew/bin/sqlite3","/usr/local/bin/sqlite3"];async function _n(){for(let t of hn)try{return await pn(t,mn.X_OK),t}catch{}return await new Promise(t=>{let n;try{n=dt("sqlite3",["--version"],{stdio:"ignore"})}catch{t(!1);return}n.on("error",()=>t(!1)),n.on("close",r=>t(r===0))})?"sqlite3":null}async function Pn(){return de===void 0&&(de=await _n()),de}async function vn(e,t,n){await new Promise((r,i)=>{let s=dt(e,[t,`.backup '${n}'`],{stdio:["ignore","ignore","pipe"]}),a="";s.stderr?.on("data",c=>{a+=String(c)}),s.on("error",i),s.on("close",c=>{c===0?r():i(new Error(`sqlite3 .backup exited ${c}${a?`: ${a.trim()}`:""}`))})})}async function bn(e){try{let t=await pt(e);return`${t.mtimeMs}:${t.size}`}catch{return"absent"}}async function lt(e){let t=new Map;for(let n of e)t.set(n,await bn(n));return t}function On(e,t){for(let[n,r]of e)if(t.get(n)!==r)return!1;return!0}async function Tn(e,t,n,r){let i=r.minStableMs??2e3,s=r.maxRetries??3,a=r.now??Date.now,c=r.sleep??(f=>new Promise(y=>setTimeout(y,f))),u=[e,`${e}-wal`,`${e}-shm`];for(let f=1;f<=s;f++){let y=await lt(u);if(y.get(e)==="absent")throw new Error(`snapshot source vanished: ${e}`);let E=0;for(let M of u)try{let _t=await pt(M);E=Math.max(E,_t.mtimeMs)}catch{}if(a()-E<i){await c(i);continue}for(let M of u)y.get(M)!=="absent"&&await fn(M,q.join(t,q.basename(M)));r.onCopied&&await r.onCopied(f);let U=await lt(u);if(On(y,U))return n}throw new Error(`snapshot quiesce-copy did not stabilize after ${s} attempts: ${e}`)}async function ft(e,t={}){let n=t.tmpDirBase??yn.tmpdir(),r=await gn(q.join(n,"pinta-gemini-snap-")),i=q.join(r,q.basename(e.absPath)),s=t.sqlite3Path!==void 0?t.sqlite3Path:await Pn();return s?(await vn(s,e.absPath,i),i):Tn(e.absPath,r,i,t)}var Sn="pinta-gemini",K="antigravity";function kn(){let e=process.env.GEMINI_HOME;return e&&e.length>0?e:l.join(En(),".gemini")}function x(e,t){return l.relative(e,t).split(l.sep).join("/")}function mt(e){return e.endsWith("/.system_generated/logs/transcript.jsonl")||e.endsWith("/.system_generated/logs/transcript_full.jsonl")}function An(e){return e.endsWith(".jsonl")||e.endsWith(".json")}function pe(e){let t=l.extname(e);return t?e.slice(0,-t.length):e}async function yt(){return[kn()]}async function*ht(e){let t;try{t=await gt(e)}catch{return}try{for await(let n of t){let r=l.join(e,n.name);n.isDirectory()?yield*ht(r):n.isFile()&&(yield r)}}catch{return}}async function*j(e){let t;try{t=await gt(e)}catch{return}try{for await(let n of t)yield{name:n.name,isDir:n.isDirectory(),isFile:n.isFile()}}catch{return}}async function*In(e){let t=l.join(e,"tmp");for await(let n of j(t)){if(!n.isDir)continue;let r=n.name,i=l.join(t,r),s=l.join(i,"logs.json");yield{absPath:s,relPath:x(e,s),semantics:"rewritten-doc",projectKey:r};let a=l.join(i,"chats");for await(let c of j(a)){if(!c.isFile||!An(c.name))continue;let u=l.join(a,c.name);yield{absPath:u,relPath:x(e,u),semantics:"rewritten-doc",sessionId:pe(c.name),projectKey:r}}}}async function*xn(e){let t=l.join(e,"antigravity"),n=l.join(t,"conversations");for await(let s of j(n)){if(!s.isFile||!s.name.endsWith(".db"))continue;let a=l.join(n,s.name);yield{absPath:a,relPath:x(e,a),semantics:"database",sessionId:pe(s.name),projectKey:K}}let r=l.join(t,"brain");for await(let s of j(r)){if(!s.isDir)continue;let a=s.name,c=l.join(r,a);for await(let u of ht(c)){let f=x(e,u);yield{absPath:u,relPath:f,semantics:mt(f)?"append-log":"rewritten-doc",sessionId:a,projectKey:K}}}let i=l.join(t,"annotations");for await(let s of j(i)){if(!s.isFile||!s.name.endsWith(".pbtxt"))continue;let a=l.join(i,s.name);yield{absPath:a,relPath:x(e,a),semantics:"rewritten-doc",sessionId:pe(s.name),projectKey:K}}for await(let s of j(t))if(s.isFile&&(s.name.endsWith(".pb")||s.name.endsWith(".pbtxt")||s.name==="installation_id")){let a=l.join(t,s.name);yield{absPath:a,relPath:x(e,a),semantics:"rewritten-doc",projectKey:K}}}async function*jn(e){yield*In(e),yield*xn(e)}async function*Mn(e){let[t]=await yt(),n=e.since?.getTime();for await(let r of jn(t)){let i;try{i=await wn(r.absPath)}catch{continue}i.isFile()&&(n!==void 0&&i.mtime.getTime()<=n||(yield{relPath:r.relPath,absPath:r.absPath,size:i.size,mtime:i.mtime,sessionId:r.sessionId,projectKey:r.projectKey,semantics:r.semantics}))}}function Rn(e){let t=e.split("/");if(t[0]==="tmp")return t[2]==="chats"?"session-log":t[2]==="logs.json"&&t.length===3?"meta":"other";if(t[0]==="antigravity")switch(t[1]){case"conversations":return"session-log";case"brain":return mt(e)?"session-log":"meta";case"annotations":return"meta";default:return"other"}return"other"}var Dn={id:Sn,roots:yt,scan:Mn,classify:Rn,snapshot:e=>ft(e)};Ke();function qn(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===Cn(Nn(e)).href}catch{return!1}}qn()&&ut();export{Dn as lifecycle};
13
+ `),!1}finally{clearTimeout(i)}}var ie=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new $e.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Ge}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await $(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let n=this.queue.readAll();if(n.length===0)return;let{chunks:r,oversize:i}=Ce(n,c=>Y(c.payload),d.MAX_POST_BYTES);i.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${i.length} oversized retry ${i.length===1?"entry":"entries"} (each > ${d.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
14
+ `);let s=[].concat(...r),a=0;for(let c of r){if(!await $((0,qe.mergeBatch)(c.map(l=>l.payload)),t,this.logPrefix))break;a+=c.length}this.queue.rewrite(s.slice(a))}catch(n){process.stderr.write(`[${this.logPrefix}] flush failed: ${n?.message??String(n)}
15
+ `)}finally{this.queue.release()}}dropIfOversized(t){let n=Y(t);return n<=d.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${d.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
16
+ `),!0)}};d.DiskTransport=ie;var se=class{queue=new $e.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(Y(t)>d.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${d.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
17
+ `);return}await $(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let n=this.queue.drain();if(n.length===0)return;let{chunks:r,oversize:i}=Ce(n,Y,d.MAX_POST_BYTES);i.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${i.length} oversized buffered ${i.length===1?"payload":"payloads"} (each > ${d.MAX_POST_BYTES} bytes \u2014 undeliverable)
18
+ `);let s=[].concat(...r),a=0;for(let c of r){if(!await $((0,qe.mergeBatch)(c),t,this.logPrefix))break;a+=c.length}for(let c of s.slice(a))this.queue.enqueue(c)}};d.MemoryTransport=se});var ue=v(M=>{"use strict";var ce=M&&M.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(M,"__esModule",{value:!0});M.TraceManager=void 0;M.generateUlid=Ve;var Le=ce(_("fs")),nn=ce(_("path")),rn=ce(_("crypto")),sn=B(),oe="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ve(){let e=Date.now(),t="",n=e;for(let s=0;s<10;s++)t=oe[n&31]+t,n=Math.floor(n/32);let r=rn.default.randomBytes(10),i="";for(let s=0;s<10;s++)i+=oe[r[s]&31];for(;i.length<16;)i+=oe[0];return t+i}var ae=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ve();return this.save(t),t}currentTrace(){try{let t=Le.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{Le.default.mkdirSync(nn.default.dirname(this.tracePath),{recursive:!0}),(0,sn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
19
+ `)}}};M.TraceManager=ae});var Ue=v(S=>{"use strict";var Xe=S&&S.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(S,"__esModule",{value:!0});S.MemorySessionTraceManager=S.DiskSessionTraceManager=void 0;var Ye=Xe(_("fs")),on=Xe(_("path")),Ke=ue(),an=B(),ze=200,le=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??ze}read(){try{let t=JSON.parse(Ye.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Ye.default.mkdirSync(on.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,an.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,Ke.generateUlid)(),i=this.read();return i[n]=r,this.write(i),r}currentTrace(t){let n=t||"default",r=this.read()[n];return r||this.newTrace(n)}};S.DiskSessionTraceManager=le;var de=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??ze}newTrace(t){let n=t||"default",r=(0,Ke.generateUlid)();if(this.map.set(n,r),this.map.size>this.maxSessions){let i=this.map.keys().next().value;i!==void 0&&this.map.delete(i)}return r}currentTrace(t){let n=t||"default";return this.map.get(n)??this.newTrace(n)}};S.MemorySessionTraceManager=de});var Ze=v(I=>{"use strict";var fe=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.envFilePath=ln;I.parseEnvFile=We;I.loadEnvFile=dn;var cn=fe(_("node:fs")),un=fe(_("node:os")),He=fe(_("node:path"));function ln(e,t,n){let r=n?process.env[n]:void 0,i=r&&r.length>0?r:He.default.join(un.default.homedir(),e);return He.default.join(i,t)}function We(e){let t={};for(let n of e.split(`
20
+ `)){let r=n.trim();if(!r||r.startsWith("#"))continue;let i=r.indexOf("=");if(i<0)continue;let s=r.slice(0,i).trim(),a=r.slice(i+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),s&&(t[s]=a)}return t}function dn(e){let t;try{t=cn.default.readFileSync(e,"utf-8")}catch{return}let n=We(t);for(let[r,i]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=i)}});var w=v(o=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});o.loadEnvFile=o.parseEnvFile=o.envFilePath=o.MemorySessionTraceManager=o.DiskSessionTraceManager=o.generateUlid=o.TraceManager=o.MAX_POST_BYTES=o.parseHeadersEnv=o.envOptionsResolver=o.postOtlp=o.MemoryTransport=o.DiskTransport=o.MemoryRetryQueue=o.DiskRetryQueue=o.evaluateGuard=o.MAX_SPAN_BYTES=o.enforceSpanBudget=o.mergeBatch=o.buildPayload=o.clientAttrs=o.guardAttrs=o.attrsFromRecord=o.toOtlpValue=o.snakeCase=o.newSpanId=o.ulidToTraceId=o.MAX_BYTES=o.PATTERNS=o.applyMatches=o.resolveOverlaps=o.collectMatches=o.truncateTo=o.truncate=o.redact=void 0;var O=W();Object.defineProperty(o,"redact",{enumerable:!0,get:function(){return O.redact}});Object.defineProperty(o,"truncate",{enumerable:!0,get:function(){return O.truncate}});Object.defineProperty(o,"truncateTo",{enumerable:!0,get:function(){return O.truncateTo}});Object.defineProperty(o,"collectMatches",{enumerable:!0,get:function(){return O.collectMatches}});Object.defineProperty(o,"resolveOverlaps",{enumerable:!0,get:function(){return O.resolveOverlaps}});Object.defineProperty(o,"applyMatches",{enumerable:!0,get:function(){return O.applyMatches}});Object.defineProperty(o,"PATTERNS",{enumerable:!0,get:function(){return O.PATTERNS}});Object.defineProperty(o,"MAX_BYTES",{enumerable:!0,get:function(){return O.MAX_BYTES}});var P=J();Object.defineProperty(o,"ulidToTraceId",{enumerable:!0,get:function(){return P.ulidToTraceId}});Object.defineProperty(o,"newSpanId",{enumerable:!0,get:function(){return P.newSpanId}});Object.defineProperty(o,"snakeCase",{enumerable:!0,get:function(){return P.snakeCase}});Object.defineProperty(o,"toOtlpValue",{enumerable:!0,get:function(){return P.toOtlpValue}});Object.defineProperty(o,"attrsFromRecord",{enumerable:!0,get:function(){return P.attrsFromRecord}});Object.defineProperty(o,"guardAttrs",{enumerable:!0,get:function(){return P.guardAttrs}});Object.defineProperty(o,"clientAttrs",{enumerable:!0,get:function(){return P.clientAttrs}});Object.defineProperty(o,"buildPayload",{enumerable:!0,get:function(){return P.buildPayload}});Object.defineProperty(o,"mergeBatch",{enumerable:!0,get:function(){return P.mergeBatch}});Object.defineProperty(o,"enforceSpanBudget",{enumerable:!0,get:function(){return P.enforceSpanBudget}});Object.defineProperty(o,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return P.MAX_SPAN_BYTES}});var fn=Re();Object.defineProperty(o,"evaluateGuard",{enumerable:!0,get:function(){return fn.evaluateGuard}});var Je=re();Object.defineProperty(o,"DiskRetryQueue",{enumerable:!0,get:function(){return Je.DiskRetryQueue}});Object.defineProperty(o,"MemoryRetryQueue",{enumerable:!0,get:function(){return Je.MemoryRetryQueue}});var j=Be();Object.defineProperty(o,"DiskTransport",{enumerable:!0,get:function(){return j.DiskTransport}});Object.defineProperty(o,"MemoryTransport",{enumerable:!0,get:function(){return j.MemoryTransport}});Object.defineProperty(o,"postOtlp",{enumerable:!0,get:function(){return j.postOtlp}});Object.defineProperty(o,"envOptionsResolver",{enumerable:!0,get:function(){return j.envOptionsResolver}});Object.defineProperty(o,"parseHeadersEnv",{enumerable:!0,get:function(){return j.parseHeadersEnv}});Object.defineProperty(o,"MAX_POST_BYTES",{enumerable:!0,get:function(){return j.MAX_POST_BYTES}});var Qe=ue();Object.defineProperty(o,"TraceManager",{enumerable:!0,get:function(){return Qe.TraceManager}});Object.defineProperty(o,"generateUlid",{enumerable:!0,get:function(){return Qe.generateUlid}});var et=Ue();Object.defineProperty(o,"DiskSessionTraceManager",{enumerable:!0,get:function(){return et.DiskSessionTraceManager}});Object.defineProperty(o,"MemorySessionTraceManager",{enumerable:!0,get:function(){return et.MemorySessionTraceManager}});var pe=Ze();Object.defineProperty(o,"envFilePath",{enumerable:!0,get:function(){return pe.envFilePath}});Object.defineProperty(o,"parseEnvFile",{enumerable:!0,get:function(){return pe.parseEnvFile}});Object.defineProperty(o,"loadEnvFile",{enumerable:!0,get:function(){return pe.loadEnvFile}})});import{realpathSync as er}from"node:fs";import{pathToFileURL as tr}from"node:url";var q=k(w(),1);function pn(){return(0,q.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function tt(e=pn()){(0,q.loadEnvFile)(e)}var nt=k(w(),1);import gn from"os";import ge from"path";function mn(){return process.env.GEMINI_HOME||ge.join(gn.homedir(),".gemini")}function hn(){let e=process.env.GEMINI_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;if(e)return e.replace(/\/+$/,"");let t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;if(t)return t.replace(/\/+$/,"")+"/v1/traces"}function yn(){let e=(0,nt.parseHeadersEnv)(process.env.GEMINI_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS),t=process.env.GEMINI_PLUGIN_OPTION_API_KEY;return t&&!e["x-pinta-relay-token"]&&(e["x-pinta-relay-token"]=t),e}function rt(){let e=process.env.GEMINI_PLUGIN_DATA||ge.join(mn(),"pinta-gemini-data");return!process.env.PINTA_RELAY_TOKEN&&process.env.GEMINI_PLUGIN_OPTION_API_KEY&&(process.env.PINTA_RELAY_TOKEN=process.env.GEMINI_PLUGIN_OPTION_API_KEY),{pluginData:e,tracePath:ge.join(e,"trace.json"),endpoint:hn(),headers:yn(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function it(e=process.argv){let t=n=>{let r=e.indexOf(n);return r>=0?e[r+1]:void 0};return{agent:t("--agent")||"gemini",event:t("--event")}}function st(e){let t=e.transcriptPath;if(typeof t=="string"){if(t.includes("/antigravity-cli/brain/"))return"agy";if(t.includes("/antigravity/brain/"))return"antigravity2"}}var b=e=>e==="gemini",_n={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},Pn={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},ot=e=>b(e)?_n:Pn;function at(e){return ot(e).identity}function ct(e){return ot(e).gateEvent}var vn=new Set(["AfterModel"]),ut=e=>vn.has(e);function lt(e,t,n){if(b(e))return{hook:t||n.hook_event_name||"unknown",session_id:C(n.session_id),cwd:C(n.cwd),tool_name:C(n.tool_name),tool_input:n.tool_input};let r=n.workspacePaths,i=n.toolCall;return{hook:t||"unknown",session_id:C(n.conversationId),cwd:Array.isArray(r)?C(r[0]):void 0,tool_name:i?.name,tool_input:i?.args}}function C(e){return typeof e=="string"?e:void 0}var dt=k(w(),1),bn=50,Tn="pinta-gemini/0.7.0";function ft(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n=t.command??t.CommandLine;return typeof n=="string"?n:void 0}function pt(e,t,n){return(0,dt.evaluateGuard)(e,t,{timeoutMs:bn,token:n??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Tn})}var gt=k(w(),1),X=class extends gt.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-gemini",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var mt=k(w(),1),K=class extends mt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import me from"os";var E=k(w(),1),En=k(w(),1),z;function Sn(){if(z===void 0)try{z=me.userInfo().username}catch{z=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return z}var ht="0.7.0";function On(e){return{skipRedactKeys:new Set([`${e}.hook`,`${e}.agent`,`${e}.tool_name`,`${e}.session_id`,`${e}.transcript_path`,`${e}.transcriptPath`,`${e}.cwd`]),bashContextKeys:new Set([`${e}.tool_input`,`${e}.tool_response`,`${e}.toolCall`])}}function wn(e){return[{key:"service.name",value:{stringValue:e}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-gemini"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:ht}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Sn()}},{key:"host.name",value:{stringValue:me.hostname()}},{key:"host.arch",value:{stringValue:me.arch()}}]}function yt(e){let t=at(e.agent),n=On(t.prefix),r=[{key:"ingest.type",value:{stringValue:t.ingest}},{key:`${t.prefix}.hook`,value:{stringValue:e.canonical.hook}},{key:`${t.prefix}.agent`,value:{stringValue:e.agent}}];e.product&&r.push({key:`${t.prefix}.product`,value:{stringValue:e.product}}),r.push(...(0,E.attrsFromRecord)(e.event,t.prefix,n));let i=new Set(r.map(s=>s.key));for(let[s,a]of[["session_id",e.canonical.session_id],["cwd",e.canonical.cwd],["tool_name",e.canonical.tool_name]]){let c=`${t.prefix}.${s}`;if(a!=null&&!i.has(c)){let u=(0,E.toOtlpValue)(c,String(a),n);u!==null&&r.push({key:c,value:u})}}return(0,E.buildPayload)({traceId:e.traceId,spanName:`${t.ingest}.${(0,E.snakeCase)(e.canonical.hook)}`,attributes:r,resource:wn(t.service),scope:{name:"pinta-gemini",version:ht},now:e.now,guard:e.guard})}function he(e,t,n){if(n&&n.decision==="DENY"){let r=n.userMessage??n.reason??"guard_deny";return b(e)?{decision:"deny",reason:r,systemMessage:n.userMessage??void 0}:{decision:"deny",reason:r}}return!b(e)&&t==="PreToolUse"?{decision:"allow"}:{}}import _t from"fs";import An from"path";function Pt(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{_t.mkdirSync(e.pluginData,{recursive:!0}),_t.appendFileSync(An.join(e.pluginData,"invocations.jsonl"),JSON.stringify(t)+`
21
+ `)}catch{}}async function kn(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}function Mn(e,t,n){return b(e)?t.hook==="BeforeAgent":t.hook==="PreInvocation"&&n.invocationNum===1}async function vt(){let{agent:e,event:t}=it(),n={},r={},i,s=null,a=rt();try{if(r=JSON.parse(await kn()||"{}"),i=lt(e,t,r),!ut(i.hook)){let c=new X(a);await c.flush();let u=i.session_id??"unknown",l=new K(a),m=Mn(e,i,r)?l.newTrace(u):l.currentTrace(u);if(i.hook===ct(e)){let A=ft(i.tool_input)??(typeof i.tool_input=="string"?i.tool_input:JSON.stringify(i.tool_input??null));s=await pt({spanId:u,toolName:i.tool_name,method:i.hook,cwd:i.cwd,toolInput:i.tool_input,rawTextFields:{toolInput:A}},a.guardEndpoint,a.headers["x-pinta-relay-token"])}n=he(e,t,s);let f=b(e)?void 0:st(r);await c.send(yt({agent:e,canonical:i,event:r,traceId:m,guard:s,product:f}))}}catch(c){process.stderr.write(`[pinta-gemini] error: ${c}
22
+ `),n=s?he(e,t,s):{}}Pt(a,{ts:new Date().toISOString(),pid:process.pid,agent:e,event:t,argv:process.argv.slice(2),received_payload:r,normalized:i??null,guard:s,decision_returned:n}),process.stdout.write(JSON.stringify(n)+`
23
+ `),process.exit(0)}import{opendir as wt,stat as Vn}from"node:fs/promises";import{homedir as Yn}from"node:os";import p from"node:path";import{spawn as Tt}from"node:child_process";import{access as In,copyFile as jn,mkdtemp as xn,rm as Rn,stat as St}from"node:fs/promises";import{constants as Dn}from"node:fs";import Nn from"node:os";import F from"node:path";var ye,$n=["/usr/bin/sqlite3","/opt/homebrew/bin/sqlite3","/usr/local/bin/sqlite3"];async function qn(){for(let t of $n)try{return await In(t,Dn.X_OK),t}catch{}return await new Promise(t=>{let n;try{n=Tt("sqlite3",["--version"],{stdio:"ignore"})}catch{t(!1);return}n.on("error",()=>t(!1)),n.on("close",r=>t(r===0))})?"sqlite3":null}async function Cn(){return ye===void 0&&(ye=await qn()),ye}async function Fn(e,t,n,r){await new Promise((i,s)=>{let a=Tt(e,[t,`.backup '${n}'`],{stdio:["ignore","ignore","pipe"]}),c="",u=!1,l,m=f=>{u||(u=!0,l&&clearTimeout(l),f())};r>0&&(l=setTimeout(()=>{a.kill("SIGKILL"),m(()=>s(new Error(`sqlite3 .backup timed out after ${r}ms: ${t}`)))},r),l.unref?.()),a.stderr?.on("data",f=>{c+=String(f)}),a.on("error",f=>m(()=>s(f))),a.on("close",f=>{m(()=>{f===0?i():s(new Error(`sqlite3 .backup exited ${f}${c?`: ${c.trim()}`:""}`))})})})}async function Gn(e){try{let t=await St(e);return`${t.mtimeMs}:${t.size}`}catch{return"absent"}}async function bt(e){let t=new Map;for(let n of e)t.set(n,await Gn(n));return t}function Bn(e,t){for(let[n,r]of e)if(t.get(n)!==r)return!1;return!0}async function Ln(e,t,n,r){let i=r.minStableMs??2e3,s=r.maxRetries??3,a=r.now??Date.now,c=r.sleep??(f=>new Promise(A=>setTimeout(A,f))),u=r.overallTimeoutMs??6e4,l=a(),m=[e,`${e}-wal`,`${e}-shm`];for(let f=1;f<=s;f++){if(u>0&&a()-l>u)throw new Error(`snapshot quiesce-copy exceeded overall deadline of ${u}ms: ${e}`);let A=await bt(m);if(A.get(e)==="absent")throw new Error(`snapshot source vanished: ${e}`);let H=0;for(let D of m)try{let It=await St(D);H=Math.max(H,It.mtimeMs)}catch{}if(a()-H<i){await c(i);continue}for(let D of m)A.get(D)!=="absent"&&await jn(D,F.join(t,F.basename(D)));r.onCopied&&await r.onCopied(f);let Mt=await bt(m);if(Bn(A,Mt))return n}throw new Error(`snapshot quiesce-copy did not stabilize after ${s} attempts: ${e}`)}async function Ot(e,t={}){let n=t.tmpDirBase??Nn.tmpdir(),r=await xn(F.join(n,"pinta-gemini-snap-"));try{let i=F.join(r,F.basename(e.absPath)),s=t.sqlite3Path!==void 0?t.sqlite3Path:await Cn();return s?(await Fn(s,e.absPath,i,t.overallTimeoutMs??6e4),i):await Ln(e.absPath,r,i,t)}catch(i){throw await Rn(r,{recursive:!0,force:!0}).catch(()=>{}),i}}var Xn="pinta-gemini",U="antigravity";function Kn(){let e=process.env.GEMINI_HOME;return e&&e.length>0?e:p.join(Yn(),".gemini")}function x(e,t){return p.relative(e,t).split(p.sep).join("/")}function Et(e){return e.endsWith("/.system_generated/logs/transcript.jsonl")||e.endsWith("/.system_generated/logs/transcript_full.jsonl")}function zn(e){return e.endsWith(".jsonl")||e.endsWith(".json")}function _e(e){let t=p.extname(e);return t?e.slice(0,-t.length):e}async function At(){return[Kn()]}async function*kt(e){let t;try{t=await wt(e)}catch{return}try{for await(let n of t){let r=p.join(e,n.name);n.isDirectory()?yield*kt(r):n.isFile()&&(yield r)}}catch{return}}async function*R(e){let t;try{t=await wt(e)}catch{return}try{for await(let n of t)yield{name:n.name,isDir:n.isDirectory(),isFile:n.isFile()}}catch{return}}async function*Un(e){let t=p.join(e,"tmp");for await(let n of R(t)){if(!n.isDir)continue;let r=n.name,i=p.join(t,r),s=p.join(i,"logs.json");yield{absPath:s,relPath:x(e,s),semantics:"rewritten-doc",projectKey:r};let a=p.join(i,"chats");for await(let c of R(a)){if(!c.isFile||!zn(c.name))continue;let u=p.join(a,c.name);yield{absPath:u,relPath:x(e,u),semantics:"rewritten-doc",sessionId:_e(c.name),projectKey:r}}}}async function*Hn(e){let t=p.join(e,"antigravity"),n=p.join(t,"conversations");for await(let s of R(n)){if(!s.isFile||!s.name.endsWith(".db"))continue;let a=p.join(n,s.name);yield{absPath:a,relPath:x(e,a),semantics:"database",sessionId:_e(s.name),projectKey:U}}let r=p.join(t,"brain");for await(let s of R(r)){if(!s.isDir)continue;let a=s.name,c=p.join(r,a);for await(let u of kt(c)){let l=x(e,u);yield{absPath:u,relPath:l,semantics:Et(l)?"append-log":"rewritten-doc",sessionId:a,projectKey:U}}}let i=p.join(t,"annotations");for await(let s of R(i)){if(!s.isFile||!s.name.endsWith(".pbtxt"))continue;let a=p.join(i,s.name);yield{absPath:a,relPath:x(e,a),semantics:"rewritten-doc",sessionId:_e(s.name),projectKey:U}}for await(let s of R(t))if(s.isFile&&(s.name.endsWith(".pb")||s.name.endsWith(".pbtxt")||s.name==="installation_id")){let a=p.join(t,s.name);yield{absPath:a,relPath:x(e,a),semantics:"rewritten-doc",projectKey:U}}}async function*Wn(e){yield*Un(e),yield*Hn(e)}async function*Zn(e){let[t]=await At(),n=e.since?.getTime();for await(let r of Wn(t)){let i;try{i=await Vn(r.absPath)}catch{continue}i.isFile()&&(n!==void 0&&i.mtime.getTime()<=n||(yield{relPath:r.relPath,absPath:r.absPath,size:i.size,mtime:i.mtime,sessionId:r.sessionId,projectKey:r.projectKey,semantics:r.semantics}))}}function Jn(e){let t=e.split("/");if(t[0]==="tmp")return t[2]==="chats"?"session-log":t[2]==="logs.json"&&t.length===3?"meta":"other";if(t[0]==="antigravity")switch(t[1]){case"conversations":return"session-log";case"brain":return Et(e)?"session-log":"meta";case"annotations":return"meta";default:return"other"}return"other"}var Qn={id:Xn,roots:At,scan:Zn,classify:Jn,snapshot:e=>Ot(e)};tt();function nr(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===tr(er(e)).href}catch{return!1}}nr()&&vt();export{Qn as lifecycle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinta-ai/pinta-gemini",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Unified OTLP forwarder + guard adapter for Gemini CLI and Antigravity (agy v1.0.x / 2.0) hooks",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,7 +38,7 @@
38
38
  "demo": "tsx tools/demo-trace.ts"
39
39
  },
40
40
  "devDependencies": {
41
- "@pinta-ai/core": "^0.3.0",
41
+ "@pinta-ai/core": "^0.6.0",
42
42
  "@types/node": "^22.0.0",
43
43
  "esbuild": "^0.24.0",
44
44
  "tsx": "^4.0.0",