@pinta-ai/pinta-gemini 0.7.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 +21 -21
- package/dist/index.mjs +19 -19
- package/package.json +2 -2
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
|
|
3
|
-
`;g.default.appendFileSync(this.filePath,
|
|
4
|
-
`)}}readAll(){try{let t=g.default.readFileSync(this.filePath,"utf-8"),
|
|
5
|
-
`))if(
|
|
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(
|
|
8
|
-
`)}}tryAcquireLock(){let t=Date.now();try{g.default.mkdirSync(
|
|
9
|
-
`),!1}for(;Date.now()-t<
|
|
10
|
-
`),!1;try{let o=g.default.statSync(this.lockPath);if(Date.now()-o.mtimeMs>3e4){g.default.unlinkSync(this.lockPath);continue}}catch{}let
|
|
11
|
-
`),this.rewrite(t.slice(
|
|
12
|
-
`),!1}return!0}catch(o){return process.stderr.write(`[${
|
|
13
|
-
`),!1}finally{clearTimeout(i)}}var
|
|
14
|
-
`);let o=[].concat(...
|
|
15
|
-
`)}finally{this.queue.release()}}dropIfOversized(t){let
|
|
16
|
-
`),!0)}};l.DiskTransport=
|
|
17
|
-
`);return}await
|
|
18
|
-
`);let o=[].concat(...
|
|
19
|
-
`)}}};
|
|
20
|
-
`)){let n=r.trim();if(!n||n.startsWith("#"))continue;let i=n.indexOf("=");if(i<0)continue;let o=n.slice(0,i).trim(),a=n.slice(i+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),o&&(t[o]=a)}return t}function Xt(e){let t;try{t=Ft.default.readFileSync(e,"utf-8")}catch{return}let r=Ce(t);for(let[n,i]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=i)}});var T=_(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.loadEnvFile=s.parseEnvFile=s.envFilePath=s.MemorySessionTraceManager=s.DiskSessionTraceManager=s.generateUlid=s.TraceManager=s.MAX_POST_BYTES=s.parseHeadersEnv=s.envOptionsResolver=s.postOtlp=s.MemoryTransport=s.DiskTransport=s.MemoryRetryQueue=s.DiskRetryQueue=s.evaluateGuard=s.MAX_SPAN_BYTES=s.enforceSpanBudget=s.mergeBatch=s.buildPayload=s.clientAttrs=s.guardAttrs=s.attrsFromRecord=s.toOtlpValue=s.snakeCase=s.newSpanId=s.ulidToTraceId=s.MAX_BYTES=s.PATTERNS=s.applyMatches=s.resolveOverlaps=s.collectMatches=s.truncateTo=s.truncate=s.redact=void 0;var O=F();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return O.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return O.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return O.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return O.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return O.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return O.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return O.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return O.MAX_BYTES}});var h=Y();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return h.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return h.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return h.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return h.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return h.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return h.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return h.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return h.buildPayload}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return h.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return h.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return h.MAX_SPAN_BYTES}});var Ut=Se();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Ut.evaluateGuard}});var Fe=H();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return Fe.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return Fe.MemoryRetryQueue}});var w=xe();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return w.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return w.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return w.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return w.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return w.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return w.MAX_POST_BYTES}});var Ve=te();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return Ve.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return Ve.generateUlid}});var Ye=Ge();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Ye.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Ye.MemorySessionTraceManager}});var oe=Le();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return oe.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return oe.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return oe.loadEnvFile}})});var x=b(T(),1);function zt(){return(0,x.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function Xe(e=zt()){(0,x.loadEnvFile)(e)}var Ue=b(T(),1);import Kt from"os";import se from"path";function Ht(){return process.env.GEMINI_HOME||se.join(Kt.homedir(),".gemini")}function Zt(){let e=process.env.GEMINI_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;if(e)return e.replace(/\/+$/,"");let t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;if(t)return t.replace(/\/+$/,"")+"/v1/traces"}function Jt(){let e=(0,Ue.parseHeadersEnv)(process.env.GEMINI_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS),t=process.env.GEMINI_PLUGIN_OPTION_API_KEY;return t&&!e["x-pinta-relay-token"]&&(e["x-pinta-relay-token"]=t),e}function ze(){let e=process.env.GEMINI_PLUGIN_DATA||se.join(Ht(),"pinta-gemini-data");return!process.env.PINTA_RELAY_TOKEN&&process.env.GEMINI_PLUGIN_OPTION_API_KEY&&(process.env.PINTA_RELAY_TOKEN=process.env.GEMINI_PLUGIN_OPTION_API_KEY),{pluginData:e,tracePath:se.join(e,"trace.json"),endpoint:Zt(),headers:Jt(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function Ke(e=process.argv){let t=r=>{let n=e.indexOf(r);return n>=0?e[n+1]:void 0};return{agent:t("--agent")||"gemini",event:t("--event")}}function He(e){let t=e.transcriptPath;if(typeof t=="string"){if(t.includes("/antigravity-cli/brain/"))return"agy";if(t.includes("/antigravity/brain/"))return"antigravity2"}}var m=e=>e==="gemini",Wt={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},Qt={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},Ze=e=>m(e)?Wt:Qt;function Je(e){return Ze(e).identity}function We(e){return Ze(e).gateEvent}var er=new Set(["AfterModel"]),Qe=e=>er.has(e);function et(e,t,r){if(m(e))return{hook:t||r.hook_event_name||"unknown",session_id:R(r.session_id),cwd:R(r.cwd),tool_name:R(r.tool_name),tool_input:r.tool_input};let n=r.workspacePaths,i=r.toolCall;return{hook:t||"unknown",session_id:R(r.conversationId),cwd:Array.isArray(n)?R(n[0]):void 0,tool_name:i?.name,tool_input:i?.args}}function R(e){return typeof e=="string"?e:void 0}var tt=b(T(),1),tr=50,rr="pinta-gemini/0.7.0";function rt(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,r=t.command??t.CommandLine;return typeof r=="string"?r:void 0}function nt(e,t,r){return(0,tt.evaluateGuard)(e,t,{timeoutMs:tr,token:r??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:rr})}var it=b(T(),1),G=class extends it.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-gemini",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var ot=b(T(),1),B=class extends ot.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import ae from"os";var S=b(T(),1),sr=b(T(),1),C;function nr(){if(C===void 0)try{C=ae.userInfo().username}catch{C=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return C}var st="0.7.0";function ir(e){return{skipRedactKeys:new Set([`${e}.hook`,`${e}.agent`,`${e}.tool_name`,`${e}.session_id`,`${e}.transcript_path`,`${e}.transcriptPath`,`${e}.cwd`]),bashContextKeys:new Set([`${e}.tool_input`,`${e}.tool_response`,`${e}.toolCall`])}}function or(e){return[{key:"service.name",value:{stringValue:e}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-gemini"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:st}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:nr()}},{key:"host.name",value:{stringValue:ae.hostname()}},{key:"host.arch",value:{stringValue:ae.arch()}}]}function at(e){let t=Je(e.agent),r=ir(t.prefix),n=[{key:"ingest.type",value:{stringValue:t.ingest}},{key:`${t.prefix}.hook`,value:{stringValue:e.canonical.hook}},{key:`${t.prefix}.agent`,value:{stringValue:e.agent}}];e.product&&n.push({key:`${t.prefix}.product`,value:{stringValue:e.product}}),n.push(...(0,S.attrsFromRecord)(e.event,t.prefix,r));let i=new Set(n.map(o=>o.key));for(let[o,a]of[["session_id",e.canonical.session_id],["cwd",e.canonical.cwd],["tool_name",e.canonical.tool_name]]){let u=`${t.prefix}.${o}`;if(a!=null&&!i.has(u)){let c=(0,S.toOtlpValue)(u,String(a),r);c!==null&&n.push({key:u,value:c})}}return(0,S.buildPayload)({traceId:e.traceId,spanName:`${t.ingest}.${(0,S.snakeCase)(e.canonical.hook)}`,attributes:n,resource:or(t.service),scope:{name:"pinta-gemini",version:st},now:e.now,guard:e.guard})}function ue(e,t,r){if(r&&r.decision==="DENY"){let n=r.userMessage??r.reason??"guard_deny";return m(e)?{decision:"deny",reason:n,systemMessage:r.userMessage??void 0}:{decision:"deny",reason:n}}return!m(e)&&t==="PreToolUse"?{decision:"allow"}:{}}import ut from"fs";import ar from"path";function ct(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{ut.mkdirSync(e.pluginData,{recursive:!0}),ut.appendFileSync(ar.join(e.pluginData,"invocations.jsonl"),JSON.stringify(t)+`
|
|
21
|
-
`)}catch{}}async function
|
|
22
|
-
`),
|
|
23
|
-
`),process.exit(0)}
|
|
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
|
|
3
|
-
`;
|
|
4
|
-
`)}}readAll(){try{let t=
|
|
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){
|
|
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{
|
|
9
|
-
`),!1}for(;Date.now()-t<
|
|
10
|
-
`),!1;try{let s=
|
|
11
|
-
`),this.rewrite(t.slice(n))}};T.DiskRetryQueue=
|
|
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
|
|
14
|
-
`);let s=[].concat(...r),a=0;for(let c of r){if(!await
|
|
15
|
-
`)}finally{this.queue.release()}}dropIfOversized(t){let n=
|
|
16
|
-
`),!0)}};
|
|
17
|
-
`);return}await
|
|
18
|
-
`);let s=[].concat(...r),a=0;for(let c of r){if(!await
|
|
19
|
-
`)}}};M.TraceManager=
|
|
20
|
-
`)){let r=n.trim();if(!r||r.startsWith("#"))continue;let i=r.indexOf("=");if(i<0)continue;let s=r.slice(0,i).trim(),a=r.slice(i+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),s&&(t[s]=a)}return t}function dn(e){let t;try{t=cn.default.readFileSync(e,"utf-8")}catch{return}let n=We(t);for(let[r,i]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=i)}});var w=v(o=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});o.loadEnvFile=o.parseEnvFile=o.envFilePath=o.MemorySessionTraceManager=o.DiskSessionTraceManager=o.generateUlid=o.TraceManager=o.MAX_POST_BYTES=o.parseHeadersEnv=o.envOptionsResolver=o.postOtlp=o.MemoryTransport=o.DiskTransport=o.MemoryRetryQueue=o.DiskRetryQueue=o.evaluateGuard=o.MAX_SPAN_BYTES=o.enforceSpanBudget=o.mergeBatch=o.buildPayload=o.clientAttrs=o.guardAttrs=o.attrsFromRecord=o.toOtlpValue=o.snakeCase=o.newSpanId=o.ulidToTraceId=o.MAX_BYTES=o.PATTERNS=o.applyMatches=o.resolveOverlaps=o.collectMatches=o.truncateTo=o.truncate=o.redact=void 0;var O=W();Object.defineProperty(o,"redact",{enumerable:!0,get:function(){return O.redact}});Object.defineProperty(o,"truncate",{enumerable:!0,get:function(){return O.truncate}});Object.defineProperty(o,"truncateTo",{enumerable:!0,get:function(){return O.truncateTo}});Object.defineProperty(o,"collectMatches",{enumerable:!0,get:function(){return O.collectMatches}});Object.defineProperty(o,"resolveOverlaps",{enumerable:!0,get:function(){return O.resolveOverlaps}});Object.defineProperty(o,"applyMatches",{enumerable:!0,get:function(){return O.applyMatches}});Object.defineProperty(o,"PATTERNS",{enumerable:!0,get:function(){return O.PATTERNS}});Object.defineProperty(o,"MAX_BYTES",{enumerable:!0,get:function(){return O.MAX_BYTES}});var P=J();Object.defineProperty(o,"ulidToTraceId",{enumerable:!0,get:function(){return P.ulidToTraceId}});Object.defineProperty(o,"newSpanId",{enumerable:!0,get:function(){return P.newSpanId}});Object.defineProperty(o,"snakeCase",{enumerable:!0,get:function(){return P.snakeCase}});Object.defineProperty(o,"toOtlpValue",{enumerable:!0,get:function(){return P.toOtlpValue}});Object.defineProperty(o,"attrsFromRecord",{enumerable:!0,get:function(){return P.attrsFromRecord}});Object.defineProperty(o,"guardAttrs",{enumerable:!0,get:function(){return P.guardAttrs}});Object.defineProperty(o,"clientAttrs",{enumerable:!0,get:function(){return P.clientAttrs}});Object.defineProperty(o,"buildPayload",{enumerable:!0,get:function(){return P.buildPayload}});Object.defineProperty(o,"mergeBatch",{enumerable:!0,get:function(){return P.mergeBatch}});Object.defineProperty(o,"enforceSpanBudget",{enumerable:!0,get:function(){return P.enforceSpanBudget}});Object.defineProperty(o,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return P.MAX_SPAN_BYTES}});var fn=Re();Object.defineProperty(o,"evaluateGuard",{enumerable:!0,get:function(){return fn.evaluateGuard}});var Je=re();Object.defineProperty(o,"DiskRetryQueue",{enumerable:!0,get:function(){return Je.DiskRetryQueue}});Object.defineProperty(o,"MemoryRetryQueue",{enumerable:!0,get:function(){return Je.MemoryRetryQueue}});var j=Be();Object.defineProperty(o,"DiskTransport",{enumerable:!0,get:function(){return j.DiskTransport}});Object.defineProperty(o,"MemoryTransport",{enumerable:!0,get:function(){return j.MemoryTransport}});Object.defineProperty(o,"postOtlp",{enumerable:!0,get:function(){return j.postOtlp}});Object.defineProperty(o,"envOptionsResolver",{enumerable:!0,get:function(){return j.envOptionsResolver}});Object.defineProperty(o,"parseHeadersEnv",{enumerable:!0,get:function(){return j.parseHeadersEnv}});Object.defineProperty(o,"MAX_POST_BYTES",{enumerable:!0,get:function(){return j.MAX_POST_BYTES}});var Qe=ue();Object.defineProperty(o,"TraceManager",{enumerable:!0,get:function(){return Qe.TraceManager}});Object.defineProperty(o,"generateUlid",{enumerable:!0,get:function(){return Qe.generateUlid}});var et=Ue();Object.defineProperty(o,"DiskSessionTraceManager",{enumerable:!0,get:function(){return et.DiskSessionTraceManager}});Object.defineProperty(o,"MemorySessionTraceManager",{enumerable:!0,get:function(){return et.MemorySessionTraceManager}});var pe=Ze();Object.defineProperty(o,"envFilePath",{enumerable:!0,get:function(){return pe.envFilePath}});Object.defineProperty(o,"parseEnvFile",{enumerable:!0,get:function(){return pe.parseEnvFile}});Object.defineProperty(o,"loadEnvFile",{enumerable:!0,get:function(){return pe.loadEnvFile}})});import{realpathSync as er}from"node:fs";import{pathToFileURL as tr}from"node:url";var q=k(w(),1);function pn(){return(0,q.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function tt(e=pn()){(0,q.loadEnvFile)(e)}var nt=k(w(),1);import gn from"os";import ge from"path";function mn(){return process.env.GEMINI_HOME||ge.join(gn.homedir(),".gemini")}function hn(){let e=process.env.GEMINI_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;if(e)return e.replace(/\/+$/,"");let t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;if(t)return t.replace(/\/+$/,"")+"/v1/traces"}function yn(){let e=(0,nt.parseHeadersEnv)(process.env.GEMINI_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS),t=process.env.GEMINI_PLUGIN_OPTION_API_KEY;return t&&!e["x-pinta-relay-token"]&&(e["x-pinta-relay-token"]=t),e}function rt(){let e=process.env.GEMINI_PLUGIN_DATA||ge.join(mn(),"pinta-gemini-data");return!process.env.PINTA_RELAY_TOKEN&&process.env.GEMINI_PLUGIN_OPTION_API_KEY&&(process.env.PINTA_RELAY_TOKEN=process.env.GEMINI_PLUGIN_OPTION_API_KEY),{pluginData:e,tracePath:ge.join(e,"trace.json"),endpoint:hn(),headers:yn(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function it(e=process.argv){let t=n=>{let r=e.indexOf(n);return r>=0?e[r+1]:void 0};return{agent:t("--agent")||"gemini",event:t("--event")}}function st(e){let t=e.transcriptPath;if(typeof t=="string"){if(t.includes("/antigravity-cli/brain/"))return"agy";if(t.includes("/antigravity/brain/"))return"antigravity2"}}var b=e=>e==="gemini",_n={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},Pn={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},ot=e=>b(e)?_n:Pn;function at(e){return ot(e).identity}function ct(e){return ot(e).gateEvent}var vn=new Set(["AfterModel"]),ut=e=>vn.has(e);function lt(e,t,n){if(b(e))return{hook:t||n.hook_event_name||"unknown",session_id:C(n.session_id),cwd:C(n.cwd),tool_name:C(n.tool_name),tool_input:n.tool_input};let r=n.workspacePaths,i=n.toolCall;return{hook:t||"unknown",session_id:C(n.conversationId),cwd:Array.isArray(r)?C(r[0]):void 0,tool_name:i?.name,tool_input:i?.args}}function C(e){return typeof e=="string"?e:void 0}var dt=k(w(),1),bn=50,Tn="pinta-gemini/0.7.0";function ft(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n=t.command??t.CommandLine;return typeof n=="string"?n:void 0}function pt(e,t,n){return(0,dt.evaluateGuard)(e,t,{timeoutMs:bn,token:n??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Tn})}var gt=k(w(),1),X=class extends gt.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-gemini",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var mt=k(w(),1),K=class extends mt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import me from"os";var E=k(w(),1),En=k(w(),1),z;function Sn(){if(z===void 0)try{z=me.userInfo().username}catch{z=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return z}var ht="0.7.0";function On(e){return{skipRedactKeys:new Set([`${e}.hook`,`${e}.agent`,`${e}.tool_name`,`${e}.session_id`,`${e}.transcript_path`,`${e}.transcriptPath`,`${e}.cwd`]),bashContextKeys:new Set([`${e}.tool_input`,`${e}.tool_response`,`${e}.toolCall`])}}function wn(e){return[{key:"service.name",value:{stringValue:e}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-gemini"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:ht}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Sn()}},{key:"host.name",value:{stringValue:me.hostname()}},{key:"host.arch",value:{stringValue:me.arch()}}]}function yt(e){let t=at(e.agent),n=On(t.prefix),r=[{key:"ingest.type",value:{stringValue:t.ingest}},{key:`${t.prefix}.hook`,value:{stringValue:e.canonical.hook}},{key:`${t.prefix}.agent`,value:{stringValue:e.agent}}];e.product&&r.push({key:`${t.prefix}.product`,value:{stringValue:e.product}}),r.push(...(0,E.attrsFromRecord)(e.event,t.prefix,n));let i=new Set(r.map(s=>s.key));for(let[s,a]of[["session_id",e.canonical.session_id],["cwd",e.canonical.cwd],["tool_name",e.canonical.tool_name]]){let c=`${t.prefix}.${s}`;if(a!=null&&!i.has(c)){let u=(0,E.toOtlpValue)(c,String(a),n);u!==null&&r.push({key:c,value:u})}}return(0,E.buildPayload)({traceId:e.traceId,spanName:`${t.ingest}.${(0,E.snakeCase)(e.canonical.hook)}`,attributes:r,resource:wn(t.service),scope:{name:"pinta-gemini",version:ht},now:e.now,guard:e.guard})}function he(e,t,n){if(n&&n.decision==="DENY"){let r=n.userMessage??n.reason??"guard_deny";return b(e)?{decision:"deny",reason:r,systemMessage:n.userMessage??void 0}:{decision:"deny",reason:r}}return!b(e)&&t==="PreToolUse"?{decision:"allow"}:{}}import _t from"fs";import An from"path";function Pt(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{_t.mkdirSync(e.pluginData,{recursive:!0}),_t.appendFileSync(An.join(e.pluginData,"invocations.jsonl"),JSON.stringify(t)+`
|
|
21
|
-
`)}catch{}}async function
|
|
22
|
-
`),n=s?
|
|
23
|
-
`),process.exit(0)}import{opendir as
|
|
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.
|
|
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",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"demo": "tsx tools/demo-trace.ts"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@pinta-ai/core": "^0.
|
|
41
|
+
"@pinta-ai/core": "^0.7.0",
|
|
42
42
|
"@types/node": "^22.0.0",
|
|
43
43
|
"esbuild": "^0.24.0",
|
|
44
44
|
"tsx": "^4.0.0",
|