@pinta-ai/pinta-gemini 0.8.0 → 0.9.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,23 +1,23 @@
1
1
  import { createRequire as __pintaCreateRequire } from 'module'; const require = __pintaCreateRequire(import.meta.url);
2
- var ft=Object.create;var le=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&&le(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?le(r,"default",{value:e,enumerable:!0}):r,e));var V=_(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.PATTERNS=f.MAX_BYTES=void 0;f.truncateTo=de;f.truncate=mt;f.collectMatches=fe;f.resolveOverlaps=pe;f.applyMatches=ge;f.redact=Pt;f.MAX_BYTES=102400;function de(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 de(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 fe(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),F=E+u.length;r.push({start:c,end:p,replaceStart:E,replaceEnd:F,type:n.type}),o.index===i.lastIndex&&i.lastIndex++}}return r}function pe(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 ge(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=fe(e,t);if(r.length===0)return e;let n=pe(r);return ge(e,n)}});var X=_(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=me;d.newSpanId=Pe;d.snakeCase=St;d.toOtlpValue=ve;d.attrsFromRecord=Et;d.guardAttrs=Oe;d.clientAttrs=Te;d.enforceSpanBudget=Se;d.buildPayload=bt;d.mergeBatch=kt;var Ot=vt(y("crypto")),Y=V(),Tt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function me(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 Pe(){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 ye=new Set;function j(e,t,r){let n=(0,Y.truncate)(t);if((r.skipRedactKeys??ye).has(e))return n;let i=(r.bashContextKeys??ye).has(e)?"bash":void 0;return(0,Y.redact)(n,{context:i})}function ve(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=ve(a,o,r);u!==null&&n.push({key:a,value:u})}return n}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}}]}d.MAX_SPAN_BYTES=800*1024;function he(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var _e=1024;function Se(e,t=d.MAX_SPAN_BYTES){let r=he(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<=_e)break;let a=r-t,u=Math.max(_e,o-a-64);i.stringValue=(0,Y.truncateTo)(i.stringValue,u),r=he(e)}return e}function bt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...Oe(e.guard));let i=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);i&&n.push(...Te(i));let o={traceId:me(e.traceId),spanId:Pe(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return Se(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 Ee=_(z=>{"use strict";Object.defineProperty(z,"__esModule",{value:!0});z.evaluateGuard=It;var At=1e4,wt="pinta-core";function U(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??"",...r.agentType?{"x-pinta-agent-type":r.agentType}:{}},body:JSON.stringify({input:e}),signal:o.signal});if(u.status!==200)return U(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 U(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 U(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 be=xt(y("fs"));function Rt(e,t){let r=`${e}.${process.pid}.tmp`;be.default.writeFileSync(r,t),be.default.renameSync(r,e)}});var Z=_(P=>{"use strict";var ke=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=ke(y("fs")),D=ke(y("path")),jt=N(),$=1e3,Nt=50,Dt=5,K=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(`
2
+ var vt=Object.create;var ge=Object.defineProperty;var Pt=Object.getOwnPropertyDescriptor;var Ot=Object.getOwnPropertyNames;var St=Object.getPrototypeOf,Tt=Object.prototype.hasOwnProperty;var y=(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 m=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Et=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ot(t))!Tt.call(e,i)&&i!==n&&ge(e,i,{get:()=>t[i],enumerable:!(r=Pt(t,i))||r.enumerable});return e};var b=(e,t,n)=>(n=e!=null?vt(St(e)):{},Et(t||!e||!e.__esModule?ge(n,"default",{value:e,enumerable:!0}):n,e));var X=m(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.PATTERNS=f.MAX_BYTES=void 0;f.truncateTo=ye;f.truncate=bt;f.collectMatches=he;f.resolveOverlaps=_e;f.applyMatches=me;f.redact=At;f.MAX_BYTES=102400;function ye(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 bt(e){return ye(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 he(e,t){let n=[];for(let r of f.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;let i=new RegExp(r.regex.source,r.regex.flags),o;for(;(o=i.exec(e))!==null;){let a=r.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),Y=E+u.length;n.push({start:c,end:p,replaceStart:E,replaceEnd:Y,type:r.type}),o.index===i.lastIndex&&i.lastIndex++}}return n}function _e(e){let t=[...e].sort((i,o)=>i.start!==o.start?i.start-o.start:o.end-o.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 me(e,t){let n=[...t].sort((i,o)=>o.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 At(e,t={}){if(e.length===0)return e;let n=he(e,t);if(n.length===0)return e;let r=_e(n);return me(e,r)}});var z=m(d=>{"use strict";var kt=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=Se;d.newSpanId=Te;d.snakeCase=It;d.toOtlpValue=Ee;d.attrsFromRecord=xt;d.guardAttrs=be;d.clientAttrs=Ae;d.enforceSpanBudget=ke;d.buildPayload=Rt;d.mergeBatch=Nt;var wt=kt(y("crypto")),U=X(),Mt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Se(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=Mt.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 Te(){return wt.default.randomBytes(8).toString("hex")}function It(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var ve=new Set;function j(e,t,n){let r=(0,U.truncate)(t);if((n.skipRedactKeys??ve).has(e))return r;let i=(n.bashContextKeys??ve).has(e)?"bash":void 0;return(0,U.redact)(r,{context:i})}function Ee(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:j(e,t,n)};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),n)}}catch{return{stringValue:j(e,String(t),n)}}default:return{stringValue:j(e,String(t),n)}}}function xt(e,t,n={}){let r=[];for(let[i,o]of Object.entries(e)){let a=`${t}.${i}`,u=Ee(a,o,n);u!==null&&r.push({key:a,value:u})}return r}function be(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 Ae(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 Pe(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Oe=1024;function ke(e,t=d.MAX_SPAN_BYTES){let n=Pe(e);for(let r=0;r<100&&n>t;r++){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<=Oe)break;let a=n-t,u=Math.max(Oe,o-a-64);i.stringValue=(0,U.truncateTo)(i.stringValue,u),n=Pe(e)}return e}function Rt(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes];e.guard&&r.push(...be(e.guard));let i=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);i&&r.push(...Ae(i));let o={traceId:Se(e.traceId),spanId:Te(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};return ke(o),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[o]}]}]}}function Nt(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var we=m(K=>{"use strict";Object.defineProperty(K,"__esModule",{value:!0});K.evaluateGuard=Gt;var jt=1e4,Dt="pinta-core";function H(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var $t=new Set(["ALLOW","DENY","REVIEW"]);async function Gt(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??jt,i=Date.now(),o=new AbortController,a=setTimeout(()=>o.abort(),r);try{let u=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??Dt,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{}},body:JSON.stringify({input:e}),signal:o.signal});if(u.status!==200)return H(Date.now()-i,"error");let c=await u.json(),p=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!$t.has(c.decision)||!p)return H(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 H(Date.now()-i,p)}finally{clearTimeout(a)}}});var D=m(I=>{"use strict";var qt=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.atomicWriteFileSync=Vt;var Me=qt(y("fs"));function Vt(e,t){let n=`${e}.${process.pid}.tmp`;Me.default.writeFileSync(n,t),Me.default.renameSync(n,e)}});var W=m(v=>{"use strict";var Ie=v&&v.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(v,"__esModule",{value:!0});v.MemoryRetryQueue=v.DiskRetryQueue=void 0;var g=Ie(y("fs")),$=Ie(y("path")),Bt=D(),G=1e3,Ct=50,Lt=5,Z=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=$.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{g.default.mkdirSync($.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
+ `;g.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
4
+ `)}}readAll(){try{let t=g.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){g.default.existsSync(this.filePath)&&g.default.unlinkSync(this.filePath);return}g.default.mkdirSync($.default.dirname(this.filePath),{recursive:!0}),(0,Bt.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
6
6
  `)+`
7
- `)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
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=K;var H=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=H});var Re=_(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});l.MemoryTransport=l.DiskTransport=l.MAX_POST_BYTES=void 0;l.parseHeadersEnv=Ie;l.envOptionsResolver=xe;l.postOtlp=I;var Ae=Z(),we=X(),$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 Me(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 Ie(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 xe(){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:Ie(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 J=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new Ae.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??xe}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}=Me(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,we.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=J;var W=class{queue=new Ae.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}=Me(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,we.mergeBatch)(u),t,this.logPrefix))break;a+=u.length}for(let u of o.slice(a))this.queue.enqueue(u)}};l.MemoryTransport=W});var re=_(k=>{"use strict";var te=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.TraceManager=void 0;k.generateUlid=Ne;var je=te(y("fs")),qt=te(y("path")),Gt=te(y("crypto")),Bt=N(),Q="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ne(){let e=Date.now(),t="",r=e;for(let o=0;o<10;o++)t=Q[r&31]+t,r=Math.floor(r/32);let n=Gt.default.randomBytes(10),i="";for(let o=0;o<10;o++)i+=Q[n[o]&31];for(;i.length<16;)i+=Q[0];return t+i}var ee=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ne();return this.save(t),t}currentTrace(){try{let t=je.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){try{je.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=ee});var Be=_(v=>{"use strict";var $e=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 De=$e(y("fs")),Ct=$e(y("path")),qe=re(),Lt=N(),Ge=200,ne=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??Ge}read(){try{let t=JSON.parse(De.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{De.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,qe.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=ne;var ie=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ge}newTrace(t){let r=t||"default",n=(0,qe.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=ie});var Fe=_(A=>{"use strict";var oe=A&&A.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(A,"__esModule",{value:!0});A.envFilePath=Yt;A.parseEnvFile=Le;A.loadEnvFile=Xt;var Ft=oe(y("node:fs")),Vt=oe(y("node:os")),Ce=oe(y("node:path"));function Yt(e,t,r){let n=r?process.env[r]:void 0,i=n&&n.length>0?n:Ce.default.join(Vt.default.homedir(),e);return Ce.default.join(i,t)}function Le(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=Le(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=V();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=X();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=Ee();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Ut.evaluateGuard}});var Ve=Z();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return Ve.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return Ve.MemoryRetryQueue}});var w=Re();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 Ye=re();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return Ye.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return Ye.generateUlid}});var Xe=Be();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Xe.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Xe.MemorySessionTraceManager}});var se=Fe();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return se.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return se.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return se.loadEnvFile}})});var x=b(T(),1);function zt(){return(0,x.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function Ue(e=zt()){(0,x.loadEnvFile)(e)}var ze=b(T(),1);import Kt from"os";import ae from"path";function Ht(){return process.env.GEMINI_HOME||ae.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,ze.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 Ke(){let e=process.env.GEMINI_PLUGIN_DATA||ae.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:ae.join(e,"trace.json"),endpoint:Zt(),headers:Jt(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function He(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 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 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"},Je=e=>m(e)?Wt:Qt;function G(e){return Je(e).identity}function We(e){return Je(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);var tr=50,rr="pinta-gemini/0.8.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,n){return(0,tt.evaluateGuard)(e,t,{timeoutMs:tr,token:r??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:rr,agentType:n?G(n).ingest:void 0})}var it=b(T(),1),B=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),C=class extends ot.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import ue from"os";var S=b(T(),1),sr=b(T(),1),L;function nr(){if(L===void 0)try{L=ue.userInfo().username}catch{L=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return L}var st="0.8.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:ue.hostname()}},{key:"host.arch",value:{stringValue:ue.arch()}}]}function at(e){let t=G(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 ce(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}=He(),r={},n={},i,o=null,a=Ke();try{if(n=JSON.parse(await ur()||"{}"),i=et(e,t,n),!Qe(i.hook)){let u=new B(a);await u.flush();let c=i.session_id??"unknown",p=new C(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"],e)}r=ce(e,t,o);let F=m(e)?void 0:Ze(n);await u.send(at({agent:e,canonical:i,event:n,traceId:E,guard:o,product:F}))}}catch(u){process.stderr.write(`[pinta-gemini] error: ${u}
22
- `),r=o?ce(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)}Ue();lt();
7
+ `)}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${n}
8
+ `)}}tryAcquireLock(){let t=Date.now();try{g.default.mkdirSync($.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<Ct;)try{let n=g.default.openSync(this.lockPath,"wx");return g.default.writeSync(n,String(process.pid)),g.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 o=g.default.statSync(this.lockPath);if(Date.now()-o.mtimeMs>3e4){g.default.unlinkSync(this.lockPath);continue}}catch{}let r=Lt,i=Date.now()+r;for(;Date.now()<i;);}return!1}release(){try{g.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=G)return;let n=t.length-G;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
11
+ `),this.rewrite(t.slice(n))}};v.DiskRetryQueue=Z;var J=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>G&&this.entries.splice(0,this.entries.length-G)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};v.MemoryRetryQueue=J});var $e=m(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});l.MemoryTransport=l.DiskTransport=l.MAX_POST_BYTES=void 0;l.parseHeadersEnv=je;l.envOptionsResolver=De;l.postOtlp=x;var xe=W(),Re=z(),Ft=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 Ne(e,t,n){let r=[],i=[],o=[],a=0;for(let u of e){let c=t(u);if(c>n){i.push(u);continue}o.length>0&&a+c>n&&(r.push(o),o=[],a=0),o.push(u),a+=c}return o.length>0&&r.push(o),{chunks:r,oversize:i}}function je(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 De(){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:je(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function x(e,t,n){let r=new AbortController,i=setTimeout(()=>r.abort(),Ft);try{let o=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:r.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(`[${n}] OTLP POST ${o.status} ${t.endpoint}${u}${a?` body=${a}`:""}
12
+ `),!1}return!0}catch(o){return process.stderr.write(`[${n}] OTLP POST failed: ${o.message??String(o)}
13
+ `),!1}finally{clearTimeout(i)}}var Q=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new xe.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??De}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await x(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}=Ne(n,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(...r),a=0;for(let u of r){if(!await x((0,Re.mergeBatch)(u.map(p=>p.payload)),t,this.logPrefix))break;a+=u.length}this.queue.rewrite(o.slice(a))}catch(n){process.stderr.write(`[${this.logPrefix}] flush failed: ${n?.message??String(n)}
15
+ `)}finally{this.queue.release()}}dropIfOversized(t){let n=q(t);return n<=l.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
16
+ `),!0)}};l.DiskTransport=Q;var ee=class{queue=new xe.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)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 x(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}=Ne(n,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(...r),a=0;for(let u of r){if(!await x((0,Re.mergeBatch)(u),t,this.logPrefix))break;a+=u.length}for(let u of o.slice(a))this.queue.enqueue(u)}};l.MemoryTransport=ee});var ie=m(A=>{"use strict";var re=A&&A.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(A,"__esModule",{value:!0});A.TraceManager=void 0;A.generateUlid=qe;var Ge=re(y("fs")),Yt=re(y("path")),Xt=re(y("crypto")),Ut=D(),te="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function qe(){let e=Date.now(),t="",n=e;for(let o=0;o<10;o++)t=te[n&31]+t,n=Math.floor(n/32);let r=Xt.default.randomBytes(10),i="";for(let o=0;o<10;o++)i+=te[r[o]&31];for(;i.length<16;)i+=te[0];return t+i}var ne=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=qe();return this.save(t),t}currentTrace(){try{let t=Ge.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{Ge.default.mkdirSync(Yt.default.dirname(this.tracePath),{recursive:!0}),(0,Ut.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
19
+ `)}}};A.TraceManager=ne});var Fe=m(P=>{"use strict";var Be=P&&P.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(P,"__esModule",{value:!0});P.MemorySessionTraceManager=P.DiskSessionTraceManager=void 0;var Ve=Be(y("fs")),zt=Be(y("path")),Ce=ie(),Ht=D(),Le=200,oe=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??Le}read(){try{let t=JSON.parse(Ve.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Ve.default.mkdirSync(zt.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,Ht.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,Ce.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)}};P.DiskSessionTraceManager=oe;var se=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Le}newTrace(t){let n=t||"default",r=(0,Ce.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)}};P.MemorySessionTraceManager=se});var Ue=m(k=>{"use strict";var ae=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.envFilePath=Jt;k.parseEnvFile=Xe;k.loadEnvFile=Wt;var Kt=ae(y("node:fs")),Zt=ae(y("node:os")),Ye=ae(y("node:path"));function Jt(e,t,n){let r=n?process.env[n]:void 0,i=r&&r.length>0?r:Ye.default.join(Zt.default.homedir(),e);return Ye.default.join(i,t)}function Xe(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 o=r.slice(0,i).trim(),a=r.slice(i+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),o&&(t[o]=a)}return t}function Wt(e){let t;try{t=Kt.default.readFileSync(e,"utf-8")}catch{return}let n=Xe(t);for(let[r,i]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=i)}});var S=m(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=X();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=z();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 Qt=we();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Qt.evaluateGuard}});var ze=W();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return ze.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return ze.MemoryRetryQueue}});var w=$e();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 He=ie();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return He.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return He.generateUlid}});var Ke=Fe();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Ke.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Ke.MemorySessionTraceManager}});var ue=Ue();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return ue.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return ue.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return ue.loadEnvFile}})});var R=b(S(),1);function en(){return(0,R.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function Ze(e=en()){(0,R.loadEnvFile)(e)}var Je=b(S(),1);import tn from"os";import ce from"path";function nn(){return process.env.GEMINI_HOME||ce.join(tn.homedir(),".gemini")}function rn(){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 on(){let e=(0,Je.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 We(){let e=process.env.GEMINI_PLUGIN_DATA||ce.join(nn(),"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:ce.join(e,"trace.json"),endpoint:rn(),headers:on(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function Qe(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 et(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 _=e=>e==="gemini",sn={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},an={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},tt=e=>_(e)?sn:an;function V(e){return tt(e).identity}function nt(e){return tt(e).gateEvent}var un=new Set(["AfterModel"]),rt=e=>un.has(e);function it(e,t,n){if(_(e))return{hook:t||n.hook_event_name||"unknown",session_id:N(n.session_id),cwd:N(n.cwd),tool_name:N(n.tool_name),tool_input:n.tool_input};let r=n.workspacePaths,i=n.toolCall;return{hook:t||"unknown",session_id:N(n.conversationId),cwd:Array.isArray(r)?N(r[0]):void 0,tool_name:i?.name,tool_input:i?.args}}function N(e){return typeof e=="string"?e:void 0}var ot=b(S(),1);var cn=50,ln="pinta-gemini/0.9.0";function st(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 at(e,t,n,r){return(0,ot.evaluateGuard)(e,t,{timeoutMs:cn,token:n??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:ln,agentType:r?V(r).ingest:void 0})}var ut=b(S(),1),B=class extends ut.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-gemini",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var ct=b(S(),1),C=class extends ct.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import fe from"os";import{execFileSync as dn}from"node:child_process";import L from"node:fs";import M from"node:path";var fn=new Set(["","unknown","undefined","null","n/a","none","-"]);function de(e){let t=typeof e=="string"?e.trim():void 0;return t&&!fn.has(t.toLowerCase())?t:void 0}var pn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function gn(e){let t=de(e);return t&&pn.test(t)?t:void 0}var yn=["cli_version","cliVersion","gemini_version","geminiVersion","agent_version","agentVersion","app_version","appVersion","version"],hn="PINTA_GEMINI_HOST_VERSION";function lt(e){return _(e)?["gemini"]:["antigravity","antigravity-cli"]}function _n(e){let t=e;for(let n=0;n<5;n++){try{let i=L.readFileSync(M.join(t,"package.json"),"utf8"),o=gn(JSON.parse(i).version);if(o)return o}catch{}let r=M.dirname(t);if(r===t)break;t=r}}function dt(e){let t=e;try{t=L.realpathSync(e)}catch{}return _n(M.dirname(t))}function mn(e){if(process.platform==="win32")return;let t=process.ppid;if(!t||t<=1)return;let n;try{n=dn("ps",["-o","command=","-p",String(t)],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return}if(!n)return;let r=lt(e);for(let i of n.split(/\s+/)){if(!i.startsWith("/"))continue;let o=M.basename(i).replace(/\.(js|mjs|cjs)$/,"");if(!r.includes(o))continue;let a=dt(i);if(a)return a}}function vn(e){let t=(process.env.PATH??"").split(M.delimiter).filter(Boolean);if(t.length===0)return;let n=process.platform==="win32"?[".cmd",".exe",""]:[""];for(let r of lt(e))for(let i of t)for(let o of n){let a=M.join(i,r+o);try{L.accessSync(a,L.constants.X_OK)}catch{continue}let u=dt(a);if(u)return u}}var le;function Pn(e){return de(process.env[hn])??mn(e)??vn(e)??null}function ft(e,t){if(t)for(let n of yn){let r=de(t[n]);if(r)return r}return le===void 0&&(le=Pn(e)),le??void 0}var T=b(S(),1),En=b(S(),1),F;function On(){if(F===void 0)try{F=fe.userInfo().username}catch{F=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return F}var pt="0.9.0";function Sn(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 Tn(e,t){return[{key:"service.name",value:{stringValue:e}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{key:"telemetry.sdk.name",value:{stringValue:"pinta-gemini"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:pt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:On()}},{key:"host.name",value:{stringValue:fe.hostname()}},{key:"host.arch",value:{stringValue:fe.arch()}}]}function gt(e){let t=V(e.agent),n=Sn(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,T.attrsFromRecord)(e.event,t.prefix,n));let i=new Set(r.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,T.toOtlpValue)(u,String(a),n);c!==null&&r.push({key:u,value:c})}}return(0,T.buildPayload)({traceId:e.traceId,spanName:`${t.ingest}.${(0,T.snakeCase)(e.canonical.hook)}`,attributes:r,resource:Tn(t.service,ft(e.agent,e.event)),scope:{name:"pinta-gemini",version:pt},now:e.now,guard:e.guard})}function pe(e,t,n){if(n&&n.decision==="DENY"){let r=n.userMessage??n.reason??"guard_deny";return _(e)?{decision:"deny",reason:r,systemMessage:n.userMessage??void 0}:{decision:"deny",reason:r}}return!_(e)&&t==="PreToolUse"?{decision:"allow"}:{}}import yt from"fs";import bn from"path";function ht(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{yt.mkdirSync(e.pluginData,{recursive:!0}),yt.appendFileSync(bn.join(e.pluginData,"invocations.jsonl"),JSON.stringify(t)+`
21
+ `)}catch{}}async function An(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}function kn(e,t,n){return _(e)?t.hook==="BeforeAgent":t.hook==="PreInvocation"&&n.invocationNum===1}async function _t(){let{agent:e,event:t}=Qe(),n={},r={},i,o=null,a=We();try{if(r=JSON.parse(await An()||"{}"),i=it(e,t,r),!rt(i.hook)){let u=new B(a);await u.flush();let c=i.session_id??"unknown",p=new C(a),E=kn(e,i,r)?p.newTrace(c):p.currentTrace(c);if(i.hook===nt(e)){let mt=st(i.tool_input)??(typeof i.tool_input=="string"?i.tool_input:JSON.stringify(i.tool_input??null));o=await at({spanId:c,toolName:i.tool_name,method:i.hook,cwd:i.cwd,toolInput:i.tool_input,rawTextFields:{toolInput:mt}},a.guardEndpoint,a.headers["x-pinta-relay-token"],e)}n=pe(e,t,o);let Y=_(e)?void 0:et(r);await u.send(gt({agent:e,canonical:i,event:r,traceId:E,guard:o,product:Y}))}}catch(u){process.stderr.write(`[pinta-gemini] error: ${u}
22
+ `),n=o?pe(e,t,o):{}}ht(a,{ts:new Date().toISOString(),pid:process.pid,agent:e,event:t,argv:process.argv.slice(2),received_payload:r,normalized:i??null,guard:o,decision_returned:n}),process.stdout.write(JSON.stringify(n)+`
23
+ `),process.exit(0)}Ze();_t();
package/dist/index.mjs CHANGED
@@ -1,23 +1,23 @@
1
1
  import { createRequire as __pintaCreateRequire } from 'module'; const require = __pintaCreateRequire(import.meta.url);
2
- var jt=Object.create;var ve=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&&ve(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?ve(n,"default",{value:e,enumerable:!0}):n,e));var Z=v(h=>{"use strict";Object.defineProperty(h,"__esModule",{value:!0});h.PATTERNS=h.MAX_BYTES=void 0;h.truncateTo=be;h.truncate=qt;h.collectMatches=Te;h.resolveOverlaps=Se;h.applyMatches=Oe;h.redact=Ct;h.MAX_BYTES=102400;function be(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 be(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 Te(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 Se(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 Oe(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=Te(e,t);if(n.length===0)return e;let r=Se(n);return Oe(e,r)}});var Q=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=ke;g.newSpanId=Me;g.snakeCase=Lt;g.toOtlpValue=Ie;g.attrsFromRecord=Vt;g.guardAttrs=je;g.clientAttrs=xe;g.enforceSpanBudget=Re;g.buildPayload=Yt;g.mergeBatch=Xt;var Gt=Ft(_("crypto")),J=Z(),Bt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ke(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 Me(){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 we=new Set;function G(e,t,n){let r=(0,J.truncate)(t);if((n.skipRedactKeys??we).has(e))return r;let i=(n.bashContextKeys??we).has(e)?"bash":void 0;return(0,J.redact)(r,{context:i})}function Ie(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=Ie(a,s,n);c!==null&&r.push({key:a,value:c})}return r}function je(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 xe(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 Ee(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Ae=1024;function Re(e,t=g.MAX_SPAN_BYTES){let n=Ee(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<=Ae)break;let a=n-t,c=Math.max(Ae,s-a-64);i.stringValue=(0,J.truncateTo)(i.stringValue,c),n=Ee(e)}return e}function Yt(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes];e.guard&&r.push(...je(e.guard));let i=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);i&&r.push(...xe(i));let s={traceId:ke(e.traceId),spanId:Me(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};return Re(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 De=v(te=>{"use strict";Object.defineProperty(te,"__esModule",{value:!0});te.evaluateGuard=Ht;var Kt=1e4,zt="pinta-core";function ee(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??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{}},body:JSON.stringify({input:e}),signal:s.signal});if(c.status!==200)return ee(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 ee(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 ee(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 Ne=Wt(_("fs"));function Zt(e,t){let n=`${e}.${process.pid}.tmp`;Ne.default.writeFileSync(n,t),Ne.default.renameSync(n,e)}});var ie=v(T=>{"use strict";var $e=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=$e(_("fs")),L=$e(_("path")),Jt=B(),V=1e3,Qt=50,en=5,ne=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(`
2
+ var Ct=Object.create;var Oe=Object.defineProperty;var Ft=Object.getOwnPropertyDescriptor;var Gt=Object.getOwnPropertyNames;var Bt=Object.getPrototypeOf,Lt=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 b=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Vt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Gt(t))!Lt.call(e,i)&&i!==n&&Oe(e,i,{get:()=>t[i],enumerable:!(r=Ft(t,i))||r.enumerable});return e};var k=(e,t,n)=>(n=e!=null?Ct(Bt(e)):{},Vt(t||!e||!e.__esModule?Oe(n,"default",{value:e,enumerable:!0}):n,e));var Q=b(y=>{"use strict";Object.defineProperty(y,"__esModule",{value:!0});y.PATTERNS=y.MAX_BYTES=void 0;y.truncateTo=Ee;y.truncate=Yt;y.collectMatches=we;y.resolveOverlaps=Ae;y.applyMatches=ke;y.redact=Kt;y.MAX_BYTES=102400;function Ee(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 Yt(e){return Ee(e,y.MAX_BYTES)}y.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 we(e,t){let n=[];for(let r of y.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),d=m+c.length;n.push({start:u,end:l,replaceStart:m,replaceEnd:d,type:r.type}),s.index===i.lastIndex&&i.lastIndex++}}return n}function Ae(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 ke(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 Kt(e,t={}){if(e.length===0)return e;let n=we(e,t);if(n.length===0)return e;let r=Ae(n);return ke(e,r)}});var te=b(g=>{"use strict";var Xt=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=xe;g.newSpanId=Re;g.snakeCase=Ht;g.toOtlpValue=De;g.attrsFromRecord=Wt;g.guardAttrs=Ne;g.clientAttrs=$e;g.enforceSpanBudget=qe;g.buildPayload=Zt;g.mergeBatch=Jt;var zt=Xt(_("crypto")),ee=Q(),Ut="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function xe(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=Ut.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 Re(){return zt.default.randomBytes(8).toString("hex")}function Ht(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Me=new Set;function B(e,t,n){let r=(0,ee.truncate)(t);if((n.skipRedactKeys??Me).has(e))return r;let i=(n.bashContextKeys??Me).has(e)?"bash":void 0;return(0,ee.redact)(r,{context:i})}function De(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:B(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:B(e,JSON.stringify(t),n)}}catch{return{stringValue:B(e,String(t),n)}}default:return{stringValue:B(e,String(t),n)}}}function Wt(e,t,n={}){let r=[];for(let[i,s]of Object.entries(e)){let a=`${t}.${i}`,c=De(a,s,n);c!==null&&r.push({key:a,value:c})}return r}function Ne(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 $e(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 Ie(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var je=1024;function qe(e,t=g.MAX_SPAN_BYTES){let n=Ie(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<=je)break;let a=n-t,c=Math.max(je,s-a-64);i.stringValue=(0,ee.truncateTo)(i.stringValue,c),n=Ie(e)}return e}function Zt(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes];e.guard&&r.push(...Ne(e.guard));let i=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);i&&r.push(...$e(i));let s={traceId:xe(e.traceId),spanId:Re(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};return qe(s),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]}}function Jt(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var Ce=b(re=>{"use strict";Object.defineProperty(re,"__esModule",{value:!0});re.evaluateGuard=nn;var Qt=1e4,en="pinta-core";function ne(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var tn=new Set(["ALLOW","DENY","REVIEW"]);async function nn(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??Qt,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??en,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{}},body:JSON.stringify({input:e}),signal:s.signal});if(c.status!==200)return ne(Date.now()-i,"error");let u=await c.json(),l=u?.durationMs===void 0||typeof u.durationMs=="number"&&Number.isFinite(u.durationMs);if(!u||!tn.has(u.decision)||!l)return ne(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 ne(Date.now()-i,l)}finally{clearTimeout(a)}}});var L=b($=>{"use strict";var rn=$&&$.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty($,"__esModule",{value:!0});$.atomicWriteFileSync=sn;var Fe=rn(_("fs"));function sn(e,t){let n=`${e}.${process.pid}.tmp`;Fe.default.writeFileSync(n,t),Fe.default.renameSync(n,e)}});var oe=b(T=>{"use strict";var Ge=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 h=Ge(_("fs")),V=Ge(_("path")),on=L(),Y=1e3,an=50,cn=5,ie=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=V.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{h.default.mkdirSync(V.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
+ `;h.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
4
+ `)}}readAll(){try{let t=h.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){h.default.existsSync(this.filePath)&&h.default.unlinkSync(this.filePath);return}h.default.mkdirSync(V.default.dirname(this.filePath),{recursive:!0}),(0,on.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();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=ne;var re=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=re});var Le=v(d=>{"use strict";Object.defineProperty(d,"__esModule",{value:!0});d.MemoryTransport=d.DiskTransport=d.MAX_POST_BYTES=void 0;d.parseHeadersEnv=Ge;d.envOptionsResolver=Be;d.postOtlp=$;var qe=ie(),Ce=Q(),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 Fe(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 Ge(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 Be(){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:Ge(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}`:""}
8
+ `)}}tryAcquireLock(){let t=Date.now();try{h.default.mkdirSync(V.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<an;)try{let n=h.default.openSync(this.lockPath,"wx");return h.default.writeSync(n,String(process.pid)),h.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=h.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){h.default.unlinkSync(this.lockPath);continue}}catch{}let r=cn,i=Date.now()+r;for(;Date.now()<i;);}return!1}release(){try{h.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=Y)return;let n=t.length-Y;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
11
+ `),this.rewrite(t.slice(n))}};T.DiskRetryQueue=ie;var se=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>Y&&this.entries.splice(0,this.entries.length-Y)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};T.MemoryRetryQueue=se});var Xe=b(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.MemoryTransport=f.DiskTransport=f.MAX_POST_BYTES=void 0;f.parseHeadersEnv=Ye;f.envOptionsResolver=Ke;f.postOtlp=q;var Be=oe(),Le=te(),un=5e3;f.MAX_POST_BYTES=900*1024;function K(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function Ve(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 Ye(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 Ke(){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:Ye(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function q(e,t,n){let r=new AbortController,i=setTimeout(()=>r.abort(),un);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}`:""}
12
12
  `),!1}return!0}catch(s){return process.stderr.write(`[${n}] OTLP POST failed: ${s.message??String(s)}
13
- `),!1}finally{clearTimeout(i)}}var se=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new qe.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Be}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}=Fe(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,Ce.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=se;var oe=class{queue=new qe.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}=Fe(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,Ce.mergeBatch)(c),t,this.logPrefix))break;a+=c.length}for(let c of s.slice(a))this.queue.enqueue(c)}};d.MemoryTransport=oe});var le=v(M=>{"use strict";var ue=M&&M.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(M,"__esModule",{value:!0});M.TraceManager=void 0;M.generateUlid=Ye;var Ve=ue(_("fs")),nn=ue(_("path")),rn=ue(_("crypto")),sn=B(),ae="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ye(){let e=Date.now(),t="",n=e;for(let s=0;s<10;s++)t=ae[n&31]+t,n=Math.floor(n/32);let r=rn.default.randomBytes(10),i="";for(let s=0;s<10;s++)i+=ae[r[s]&31];for(;i.length<16;)i+=ae[0];return t+i}var ce=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ye();return this.save(t),t}currentTrace(){try{let t=Ve.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{Ve.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=ce});var He=v(S=>{"use strict";var Ke=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 Xe=Ke(_("fs")),on=Ke(_("path")),ze=le(),an=B(),Ue=200,de=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??Ue}read(){try{let t=JSON.parse(Xe.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Xe.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,ze.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=de;var fe=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ue}newTrace(t){let n=t||"default",r=(0,ze.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=fe});var Je=v(I=>{"use strict";var pe=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.envFilePath=ln;I.parseEnvFile=Ze;I.loadEnvFile=dn;var cn=pe(_("node:fs")),un=pe(_("node:os")),We=pe(_("node:path"));function ln(e,t,n){let r=n?process.env[n]:void 0,i=r&&r.length>0?r:We.default.join(un.default.homedir(),e);return We.default.join(i,t)}function Ze(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=Ze(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=Z();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=Q();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=De();Object.defineProperty(o,"evaluateGuard",{enumerable:!0,get:function(){return fn.evaluateGuard}});var Qe=ie();Object.defineProperty(o,"DiskRetryQueue",{enumerable:!0,get:function(){return Qe.DiskRetryQueue}});Object.defineProperty(o,"MemoryRetryQueue",{enumerable:!0,get:function(){return Qe.MemoryRetryQueue}});var j=Le();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 et=le();Object.defineProperty(o,"TraceManager",{enumerable:!0,get:function(){return et.TraceManager}});Object.defineProperty(o,"generateUlid",{enumerable:!0,get:function(){return et.generateUlid}});var tt=He();Object.defineProperty(o,"DiskSessionTraceManager",{enumerable:!0,get:function(){return tt.DiskSessionTraceManager}});Object.defineProperty(o,"MemorySessionTraceManager",{enumerable:!0,get:function(){return tt.MemorySessionTraceManager}});var ge=Je();Object.defineProperty(o,"envFilePath",{enumerable:!0,get:function(){return ge.envFilePath}});Object.defineProperty(o,"parseEnvFile",{enumerable:!0,get:function(){return ge.parseEnvFile}});Object.defineProperty(o,"loadEnvFile",{enumerable:!0,get:function(){return ge.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 nt(e=pn()){(0,q.loadEnvFile)(e)}var rt=k(w(),1);import gn from"os";import me from"path";function mn(){return process.env.GEMINI_HOME||me.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,rt.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 it(){let e=process.env.GEMINI_PLUGIN_DATA||me.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:me.join(e,"trace.json"),endpoint:hn(),headers:yn(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function st(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 ot(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"},at=e=>b(e)?_n:Pn;function X(e){return at(e).identity}function ct(e){return at(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);var bn=50,Tn="pinta-gemini/0.8.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,r){return(0,dt.evaluateGuard)(e,t,{timeoutMs:bn,token:n??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Tn,agentType:r?X(r).ingest:void 0})}var gt=k(w(),1),K=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),z=class extends mt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import he from"os";var E=k(w(),1),En=k(w(),1),U;function Sn(){if(U===void 0)try{U=he.userInfo().username}catch{U=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return U}var ht="0.8.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:he.hostname()}},{key:"host.arch",value:{stringValue:he.arch()}}]}function yt(e){let t=X(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 ye(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}=st(),n={},r={},i,s=null,a=it();try{if(r=JSON.parse(await kn()||"{}"),i=lt(e,t,r),!ut(i.hook)){let c=new K(a);await c.flush();let u=i.session_id??"unknown",l=new z(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"],e)}n=ye(e,t,s);let f=b(e)?void 0:ot(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?ye(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 _e,$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 _e===void 0&&(_e=await qn()),_e}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 W=0;for(let D of m)try{let It=await St(D);W=Math.max(W,It.mtimeMs)}catch{}if(a()-W<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",H="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 Pe(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:Pe(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:Pe(s.name),projectKey:H}}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:H}}}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:Pe(s.name),projectKey:H}}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:H}}}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)};nt();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};
13
+ `),!1}finally{clearTimeout(i)}}var ae=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new Be.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Ke}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await q(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}=Ve(n,c=>K(c.payload),f.MAX_POST_BYTES);i.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${i.length} oversized retry ${i.length===1?"entry":"entries"} (each > ${f.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 q((0,Le.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=K(t);return n<=f.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${f.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
16
+ `),!0)}};f.DiskTransport=ae;var ce=class{queue=new Be.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(K(t)>f.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${f.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
17
+ `);return}await q(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}=Ve(n,K,f.MAX_POST_BYTES);i.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${i.length} oversized buffered ${i.length===1?"payload":"payloads"} (each > ${f.MAX_POST_BYTES} bytes \u2014 undeliverable)
18
+ `);let s=[].concat(...r),a=0;for(let c of r){if(!await q((0,Le.mergeBatch)(c),t,this.logPrefix))break;a+=c.length}for(let c of s.slice(a))this.queue.enqueue(c)}};f.MemoryTransport=ce});var de=b(M=>{"use strict";var fe=M&&M.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(M,"__esModule",{value:!0});M.TraceManager=void 0;M.generateUlid=Ue;var ze=fe(_("fs")),ln=fe(_("path")),fn=fe(_("crypto")),dn=L(),ue="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ue(){let e=Date.now(),t="",n=e;for(let s=0;s<10;s++)t=ue[n&31]+t,n=Math.floor(n/32);let r=fn.default.randomBytes(10),i="";for(let s=0;s<10;s++)i+=ue[r[s]&31];for(;i.length<16;)i+=ue[0];return t+i}var le=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ue();return this.save(t),t}currentTrace(){try{let t=ze.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{ze.default.mkdirSync(ln.default.dirname(this.tracePath),{recursive:!0}),(0,dn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
19
+ `)}}};M.TraceManager=le});var Qe=b(S=>{"use strict";var We=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 He=We(_("fs")),pn=We(_("path")),Ze=de(),gn=L(),Je=200,pe=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??Je}read(){try{let t=JSON.parse(He.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{He.default.mkdirSync(pn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,gn.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,Ze.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=pe;var ge=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Je}newTrace(t){let n=t||"default",r=(0,Ze.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=ge});var nt=b(I=>{"use strict";var me=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.envFilePath=hn;I.parseEnvFile=tt;I.loadEnvFile=_n;var mn=me(_("node:fs")),yn=me(_("node:os")),et=me(_("node:path"));function hn(e,t,n){let r=n?process.env[n]:void 0,i=r&&r.length>0?r:et.default.join(yn.default.homedir(),e);return et.default.join(i,t)}function tt(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 _n(e){let t;try{t=mn.default.readFileSync(e,"utf-8")}catch{return}let n=tt(t);for(let[r,i]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=i)}});var E=b(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=Q();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=te();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 Pn=Ce();Object.defineProperty(o,"evaluateGuard",{enumerable:!0,get:function(){return Pn.evaluateGuard}});var rt=oe();Object.defineProperty(o,"DiskRetryQueue",{enumerable:!0,get:function(){return rt.DiskRetryQueue}});Object.defineProperty(o,"MemoryRetryQueue",{enumerable:!0,get:function(){return rt.MemoryRetryQueue}});var j=Xe();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 it=de();Object.defineProperty(o,"TraceManager",{enumerable:!0,get:function(){return it.TraceManager}});Object.defineProperty(o,"generateUlid",{enumerable:!0,get:function(){return it.generateUlid}});var st=Qe();Object.defineProperty(o,"DiskSessionTraceManager",{enumerable:!0,get:function(){return st.DiskSessionTraceManager}});Object.defineProperty(o,"MemorySessionTraceManager",{enumerable:!0,get:function(){return st.MemorySessionTraceManager}});var ye=nt();Object.defineProperty(o,"envFilePath",{enumerable:!0,get:function(){return ye.envFilePath}});Object.defineProperty(o,"parseEnvFile",{enumerable:!0,get:function(){return ye.parseEnvFile}});Object.defineProperty(o,"loadEnvFile",{enumerable:!0,get:function(){return ye.loadEnvFile}})});import{realpathSync as hr}from"node:fs";import{pathToFileURL as _r}from"node:url";var C=k(E(),1);function vn(){return(0,C.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function ot(e=vn()){(0,C.loadEnvFile)(e)}var at=k(E(),1);import bn from"os";import he from"path";function Tn(){return process.env.GEMINI_HOME||he.join(bn.homedir(),".gemini")}function Sn(){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 On(){let e=(0,at.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 ct(){let e=process.env.GEMINI_PLUGIN_DATA||he.join(Tn(),"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:he.join(e,"trace.json"),endpoint:Sn(),headers:On(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function ut(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 lt(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"},wn={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},ft=e=>v(e)?En:wn;function X(e){return ft(e).identity}function dt(e){return ft(e).gateEvent}var An=new Set(["AfterModel"]),pt=e=>An.has(e);function gt(e,t,n){if(v(e))return{hook:t||n.hook_event_name||"unknown",session_id:F(n.session_id),cwd:F(n.cwd),tool_name:F(n.tool_name),tool_input:n.tool_input};let r=n.workspacePaths,i=n.toolCall;return{hook:t||"unknown",session_id:F(n.conversationId),cwd:Array.isArray(r)?F(r[0]):void 0,tool_name:i?.name,tool_input:i?.args}}function F(e){return typeof e=="string"?e:void 0}var mt=k(E(),1);var kn=50,Mn="pinta-gemini/0.9.0";function yt(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 ht(e,t,n,r){return(0,mt.evaluateGuard)(e,t,{timeoutMs:kn,token:n??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Mn,agentType:r?X(r).ingest:void 0})}var _t=k(E(),1),z=class extends _t.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-gemini",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var Pt=k(E(),1),U=class extends Pt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import ve from"os";import{execFileSync as In}from"node:child_process";import H from"node:fs";import x from"node:path";var jn=new Set(["","unknown","undefined","null","n/a","none","-"]);function Pe(e){let t=typeof e=="string"?e.trim():void 0;return t&&!jn.has(t.toLowerCase())?t:void 0}var xn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function Rn(e){let t=Pe(e);return t&&xn.test(t)?t:void 0}var Dn=["cli_version","cliVersion","gemini_version","geminiVersion","agent_version","agentVersion","app_version","appVersion","version"],Nn="PINTA_GEMINI_HOST_VERSION";function vt(e){return v(e)?["gemini"]:["antigravity","antigravity-cli"]}function $n(e){let t=e;for(let n=0;n<5;n++){try{let i=H.readFileSync(x.join(t,"package.json"),"utf8"),s=Rn(JSON.parse(i).version);if(s)return s}catch{}let r=x.dirname(t);if(r===t)break;t=r}}function bt(e){let t=e;try{t=H.realpathSync(e)}catch{}return $n(x.dirname(t))}function qn(e){if(process.platform==="win32")return;let t=process.ppid;if(!t||t<=1)return;let n;try{n=In("ps",["-o","command=","-p",String(t)],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return}if(!n)return;let r=vt(e);for(let i of n.split(/\s+/)){if(!i.startsWith("/"))continue;let s=x.basename(i).replace(/\.(js|mjs|cjs)$/,"");if(!r.includes(s))continue;let a=bt(i);if(a)return a}}function Cn(e){let t=(process.env.PATH??"").split(x.delimiter).filter(Boolean);if(t.length===0)return;let n=process.platform==="win32"?[".cmd",".exe",""]:[""];for(let r of vt(e))for(let i of t)for(let s of n){let a=x.join(i,r+s);try{H.accessSync(a,H.constants.X_OK)}catch{continue}let c=bt(a);if(c)return c}}var _e;function Fn(e){return Pe(process.env[Nn])??qn(e)??Cn(e)??null}function Tt(e,t){if(t)for(let n of Dn){let r=Pe(t[n]);if(r)return r}return _e===void 0&&(_e=Fn(e)),_e??void 0}var w=k(E(),1),Vn=k(E(),1),W;function Gn(){if(W===void 0)try{W=ve.userInfo().username}catch{W=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return W}var St="0.9.0";function Bn(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 Ln(e,t){return[{key:"service.name",value:{stringValue:e}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{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:Gn()}},{key:"host.name",value:{stringValue:ve.hostname()}},{key:"host.arch",value:{stringValue:ve.arch()}}]}function Ot(e){let t=X(e.agent),n=Bn(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:Ln(t.service,Tt(e.agent,e.event)),scope:{name:"pinta-gemini",version:St},now:e.now,guard:e.guard})}function be(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 Et from"fs";import Yn from"path";function wt(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{Et.mkdirSync(e.pluginData,{recursive:!0}),Et.appendFileSync(Yn.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 Xn(e,t,n){return v(e)?t.hook==="BeforeAgent":t.hook==="PreInvocation"&&n.invocationNum===1}async function At(){let{agent:e,event:t}=ut(),n={},r={},i,s=null,a=ct();try{if(r=JSON.parse(await Kn()||"{}"),i=gt(e,t,r),!pt(i.hook)){let c=new z(a);await c.flush();let u=i.session_id??"unknown",l=new U(a),m=Xn(e,i,r)?l.newTrace(u):l.currentTrace(u);if(i.hook===dt(e)){let A=yt(i.tool_input)??(typeof i.tool_input=="string"?i.tool_input:JSON.stringify(i.tool_input??null));s=await ht({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"],e)}n=be(e,t,s);let d=v(e)?void 0:lt(r);await c.send(Ot({agent:e,canonical:i,event:r,traceId:m,guard:s,product:d}))}}catch(c){process.stderr.write(`[pinta-gemini] error: ${c}
22
+ `),n=s?be(e,t,s):{}}wt(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 xt,stat as or}from"node:fs/promises";import{homedir as ar}from"node:os";import p from"node:path";import{spawn as Mt}from"node:child_process";import{access as zn,copyFile as Un,mkdtemp as Hn,rm as Wn,stat as It}from"node:fs/promises";import{constants as Zn}from"node:fs";import Jn from"node:os";import G from"node:path";var Te,Qn=["/usr/bin/sqlite3","/opt/homebrew/bin/sqlite3","/usr/local/bin/sqlite3"];async function er(){for(let t of Qn)try{return await zn(t,Zn.X_OK),t}catch{}return await new Promise(t=>{let n;try{n=Mt("sqlite3",["--version"],{stdio:"ignore"})}catch{t(!1);return}n.on("error",()=>t(!1)),n.on("close",r=>t(r===0))})?"sqlite3":null}async function tr(){return Te===void 0&&(Te=await er()),Te}async function nr(e,t,n,r){await new Promise((i,s)=>{let a=Mt(e,[t,`.backup '${n}'`],{stdio:["ignore","ignore","pipe"]}),c="",u=!1,l,m=d=>{u||(u=!0,l&&clearTimeout(l),d())};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",d=>{c+=String(d)}),a.on("error",d=>m(()=>s(d))),a.on("close",d=>{m(()=>{d===0?i():s(new Error(`sqlite3 .backup exited ${d}${c?`: ${c.trim()}`:""}`))})})})}async function rr(e){try{let t=await It(e);return`${t.mtimeMs}:${t.size}`}catch{return"absent"}}async function kt(e){let t=new Map;for(let n of e)t.set(n,await rr(n));return t}function ir(e,t){for(let[n,r]of e)if(t.get(n)!==r)return!1;return!0}async function sr(e,t,n,r){let i=r.minStableMs??2e3,s=r.maxRetries??3,a=r.now??Date.now,c=r.sleep??(d=>new Promise(A=>setTimeout(A,d))),u=r.overallTimeoutMs??6e4,l=a(),m=[e,`${e}-wal`,`${e}-shm`];for(let d=1;d<=s;d++){if(u>0&&a()-l>u)throw new Error(`snapshot quiesce-copy exceeded overall deadline of ${u}ms: ${e}`);let A=await kt(m);if(A.get(e)==="absent")throw new Error(`snapshot source vanished: ${e}`);let J=0;for(let N of m)try{let qt=await It(N);J=Math.max(J,qt.mtimeMs)}catch{}if(a()-J<i){await c(i);continue}for(let N of m)A.get(N)!=="absent"&&await Un(N,G.join(t,G.basename(N)));r.onCopied&&await r.onCopied(d);let $t=await kt(m);if(ir(A,$t))return n}throw new Error(`snapshot quiesce-copy did not stabilize after ${s} attempts: ${e}`)}async function jt(e,t={}){let n=t.tmpDirBase??Jn.tmpdir(),r=await Hn(G.join(n,"pinta-gemini-snap-"));try{let i=G.join(r,G.basename(e.absPath)),s=t.sqlite3Path!==void 0?t.sqlite3Path:await tr();return s?(await nr(s,e.absPath,i,t.overallTimeoutMs??6e4),i):await sr(e.absPath,r,i,t)}catch(i){throw await Wn(r,{recursive:!0,force:!0}).catch(()=>{}),i}}var cr="pinta-gemini",Z="antigravity";function ur(){let e=process.env.GEMINI_HOME;return e&&e.length>0?e:p.join(ar(),".gemini")}function R(e,t){return p.relative(e,t).split(p.sep).join("/")}function Rt(e){return e.endsWith("/.system_generated/logs/transcript.jsonl")||e.endsWith("/.system_generated/logs/transcript_full.jsonl")}function lr(e){return e.endsWith(".jsonl")||e.endsWith(".json")}function Se(e){let t=p.extname(e);return t?e.slice(0,-t.length):e}async function Dt(){return[ur()]}async function*Nt(e){let t;try{t=await xt(e)}catch{return}try{for await(let n of t){let r=p.join(e,n.name);n.isDirectory()?yield*Nt(r):n.isFile()&&(yield r)}}catch{return}}async function*D(e){let t;try{t=await xt(e)}catch{return}try{for await(let n of t)yield{name:n.name,isDir:n.isDirectory(),isFile:n.isFile()}}catch{return}}async function*fr(e){let t=p.join(e,"tmp");for await(let n of D(t)){if(!n.isDir)continue;let r=n.name,i=p.join(t,r),s=p.join(i,"logs.json");yield{absPath:s,relPath:R(e,s),semantics:"rewritten-doc",projectKey:r};let a=p.join(i,"chats");for await(let c of D(a)){if(!c.isFile||!lr(c.name))continue;let u=p.join(a,c.name);yield{absPath:u,relPath:R(e,u),semantics:"rewritten-doc",sessionId:Se(c.name),projectKey:r}}}}async function*dr(e){let t=p.join(e,"antigravity"),n=p.join(t,"conversations");for await(let s of D(n)){if(!s.isFile||!s.name.endsWith(".db"))continue;let a=p.join(n,s.name);yield{absPath:a,relPath:R(e,a),semantics:"database",sessionId:Se(s.name),projectKey:Z}}let r=p.join(t,"brain");for await(let s of D(r)){if(!s.isDir)continue;let a=s.name,c=p.join(r,a);for await(let u of Nt(c)){let l=R(e,u);yield{absPath:u,relPath:l,semantics:Rt(l)?"append-log":"rewritten-doc",sessionId:a,projectKey:Z}}}let i=p.join(t,"annotations");for await(let s of D(i)){if(!s.isFile||!s.name.endsWith(".pbtxt"))continue;let a=p.join(i,s.name);yield{absPath:a,relPath:R(e,a),semantics:"rewritten-doc",sessionId:Se(s.name),projectKey:Z}}for await(let s of D(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:R(e,a),semantics:"rewritten-doc",projectKey:Z}}}async function*pr(e){yield*fr(e),yield*dr(e)}async function*gr(e){let[t]=await Dt(),n=e.since?.getTime();for await(let r of pr(t)){let i;try{i=await or(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 mr(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 Rt(e)?"session-log":"meta";case"annotations":return"meta";default:return"other"}return"other"}var yr={id:cr,roots:Dt,scan:gr,classify:mr,snapshot:e=>jt(e)};ot();function Pr(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===_r(hr(e)).href}catch{return!1}}Pr()&&At();export{yr as lifecycle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinta-ai/pinta-gemini",
3
- "version": "0.8.0",
3
+ "version": "0.9.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",