@pinta-ai/pinta-gemini 0.10.0 → 0.12.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/CHANGELOG.md +27 -0
- package/README.md +60 -0
- package/dist/index.js +17 -17
- package/dist/index.mjs +17 -17
- package/docs/SPEC.md +9 -0
- package/package.json +3 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.12.0
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- Truthful scalar `gemini.model` and `antigravity.model` attributes with
|
|
7
|
+
`model_source` provenance. Gemini request models are read from the verified
|
|
8
|
+
nested `llm_request.model` field; conflicting raw values remain available as
|
|
9
|
+
`model_raw`.
|
|
10
|
+
- Regression and built-hook loopback OTLP coverage for model switches,
|
|
11
|
+
concurrent sessions, same-session subagents, missing metadata, raw payload
|
|
12
|
+
preservation, redaction and guard-span identity.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- Omit blank, placeholder, non-string and JSON-prefixed model IDs, including
|
|
16
|
+
malformed or truncated strings starting with `{` or `[` after trimming.
|
|
17
|
+
|
|
18
|
+
### Compatibility
|
|
19
|
+
- Pinta Manager 0.1.11 or later remains the guard-payload compatibility floor;
|
|
20
|
+
the `@pinta-ai/core` dependency remains `^0.8.0`. No new required envelope
|
|
21
|
+
fields, hook registration changes or additional desktop upgrade are needed.
|
|
22
|
+
- Gemini `AfterModel` remains skipped: the verified native translator exposes
|
|
23
|
+
response content/token counts, not actual response model identity, and fires
|
|
24
|
+
per streamed chunk. Current Antigravity native hooks expose no model.
|
|
25
|
+
Unavailable models are omitted; no transcript scans or session-model guesses.
|
|
26
|
+
|
|
27
|
+
Refs PTA-524.
|
package/README.md
CHANGED
|
@@ -64,5 +64,65 @@ npx tsx tools/hook-verify.ts teardown # 원복 (hook 제거, jsonl 보존)
|
|
|
64
64
|
- guard: `PINTA_GUARD_ENDPOINT` POST, 50ms, fail-open. 텔레메트리: `GEMINI_PLUGIN_OPTION_*` > `OTEL_EXPORTER_OTLP_*`.
|
|
65
65
|
- 설정 주입: 호스트가 hook 에 env 를 안 주므로 `~/.gemini/pinta-gemini.env`(어댑터가 읽음)로 주입.
|
|
66
66
|
|
|
67
|
+
## Model telemetry
|
|
68
|
+
|
|
69
|
+
`gemini.model` / `antigravity.model` is a **scalar, host-supplied model ID**,
|
|
70
|
+
not a guessed default. `*.model_source` distinguishes evidence:
|
|
71
|
+
|
|
72
|
+
| Surface | Precedence / source |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| Gemini `BeforeModel`, `BeforeToolSelection` | `llm_request.model` → `requested:llm_request.model`, then top-level `model` → `reported:model` |
|
|
75
|
+
| Gemini response normalization | Explicit `llm_response.modelVersion`, then `llm_response.model` → `response:…`, then the request; **`AfterModel` remains skipped**, preserving streaming span counts |
|
|
76
|
+
| Other Gemini hooks | Top-level scalar `model` only → `reported:model` |
|
|
77
|
+
| Antigravity (agy and 2.0) | Top-level scalar `model`, then `modelId` → `reported:…`; never Gemini's nested fields |
|
|
78
|
+
|
|
79
|
+
The [Gemini hook types](https://github.com/google-gemini/gemini-cli/blob/v0.59.0/packages/core/src/hooks/types.ts)
|
|
80
|
+
expose a model on the **request**, not on ordinary tool/session hooks. The
|
|
81
|
+
[response translator](https://github.com/google-gemini/gemini-cli/blob/v0.59.0/packages/core/src/hooks/hookTranslator.ts)
|
|
82
|
+
currently omits actual response model identity. Before-model hooks are not
|
|
83
|
+
registered by the default installer; this change does not alter registration.
|
|
84
|
+
The verified [Antigravity payloads](./docs/BACKGROUND_RESEARCH.md#f3-확정된-이벤트별-payload-형상-실측-키셋)
|
|
85
|
+
do not expose a model at all, so existing Antigravity hooks normally omit it.
|
|
86
|
+
Explicit fields from host versions that supply them are preserved, not invented.
|
|
87
|
+
|
|
88
|
+
Blank, non-string and placeholder IDs (`unknown`, `undefined`, `null`, `n/a`,
|
|
89
|
+
`none`, `-`, `auto`, `default`) are omitted. Any trimmed string starting with
|
|
90
|
+
`{` or `[` is also omitted, including malformed or truncated JSON-like strings;
|
|
91
|
+
matching closing braces are not required. A conflicting or unusable top-level
|
|
92
|
+
host value is retained as `*.model_raw`; nested raw payloads remain unchanged
|
|
93
|
+
and use the existing redaction pipeline. Requested aliases are not claimed to
|
|
94
|
+
be an actual provider response identity.
|
|
95
|
+
|
|
96
|
+
Resolution is event-local: fixed field checks, **no added I/O, host commands,
|
|
97
|
+
file scans or cache**. A session/transcript path alone cannot disambiguate a
|
|
98
|
+
tool's model call from an earlier turn or same-session subagent. Such missing
|
|
99
|
+
models stay missing, including after switches, resumed sessions, and end hooks.
|
|
100
|
+
|
|
101
|
+
### AfterModel decision
|
|
102
|
+
|
|
103
|
+
Reviewed against Gemini CLI **v0.59.0** and upstream main's response schema on
|
|
104
|
+
2026-09-21. [`fireAfterModelEvent`](https://github.com/google-gemini/gemini-cli/blob/v0.59.0/packages/core/src/hooks/hookEventHandler.ts)
|
|
105
|
+
does **not** give hooks the raw GenAI SDK response: it calls
|
|
106
|
+
[`toHookLLMResponse`](https://github.com/google-gemini/gemini-cli/blob/v0.59.0/packages/core/src/hooks/hookTranslator.ts).
|
|
107
|
+
That translator explicitly constructs only `text`, `candidates` (content parts,
|
|
108
|
+
finish reason, index, safety ratings), and `usageMetadata` (token counts).
|
|
109
|
+
Neither `model` nor `modelVersion` is exposed on `llm_response`; the model field
|
|
110
|
+
that *is* present is `llm_request.model`, which is request evidence only.
|
|
111
|
+
|
|
112
|
+
The [host reference](https://github.com/google-gemini/gemini-cli/blob/v0.59.0/docs/hooks/reference.md#aftermodel)
|
|
113
|
+
says `AfterModel` fires after **each response chunk**, not once per completed
|
|
114
|
+
turn. The existing skip therefore avoids chunk-level span multiplication and
|
|
115
|
+
forwarding request/response content without recovering an additional
|
|
116
|
+
authoritative model identity. It stays in place; no event is renamed or
|
|
117
|
+
fabricated as `AfterAgent`, and hook registration/counts are unchanged.
|
|
118
|
+
|
|
119
|
+
Explicit response-ID support in the pure normalizer is not a claim that today's
|
|
120
|
+
native hook delivers it. If a verified host version does expose an actual
|
|
121
|
+
`model`/`modelVersion`, the appropriate follow-up is a **metadata-only
|
|
122
|
+
`AfterModel` observation**, excluding prompt/response content and using a
|
|
123
|
+
verified request identity for any deduplication. That requires evidence of the
|
|
124
|
+
new payload and coordination of the original hook's runtime classification;
|
|
125
|
+
it is not enabled speculatively here.
|
|
126
|
+
|
|
67
127
|
## 라이선스
|
|
68
128
|
PolyForm Noncommercial 1.0.0
|
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
|
|
2
|
+
var wt=Object.create;var _e=Object.defineProperty;var Mt=Object.getOwnPropertyDescriptor;var Rt=Object.getOwnPropertyNames;var It=Object.getPrototypeOf,xt=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 h=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Nt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Rt(t))!xt.call(e,i)&&i!==n&&_e(e,i,{get:()=>t[i],enumerable:!(r=Mt(t,i))||r.enumerable});return e};var P=(e,t,n)=>(n=e!=null?wt(It(e)):{},Nt(t||!e||!e.__esModule?_e(n,"default",{value:e,enumerable:!0}):n,e));var Z=h(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.PATTERNS=f.MAX_BYTES=void 0;f.truncateTo=he;f.truncate=Dt;f.collectMatches=ve;f.resolveOverlaps=Pe;f.applyMatches=Ee;f.redact=jt;f.MAX_BYTES=102400;function he(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 Dt(e){return he(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 ve(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,A=c+o[0].indexOf(u),H=A+u.length;n.push({start:c,end:p,replaceStart:A,replaceEnd:H,type:r.type}),o.index===i.lastIndex&&i.lastIndex++}}return n}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)),n=[],r=-1;for(let i of t)i.start<r||(n.push(i),r=i.end);return n}function Ee(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 jt(e,t={}){if(e.length===0)return e;let n=ve(e,t);if(n.length===0)return e;let r=Pe(n);return Ee(e,r)}});var J=h(d=>{"use strict";var Gt=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=Ae;d.newSpanId=be;d.snakeCase=qt;d.toOtlpValue=ke;d.attrsFromRecord=Bt;d.guardAttrs=we;d.clientAttrs=Me;d.enforceSpanBudget=Re;d.buildPayload=Ft;d.attachGuard=Ie;d.mergeBatch=Lt;var $t=Gt(y("crypto")),W=Z(),Vt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ae(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let r of e){let i=Vt.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 be(){return $t.default.randomBytes(8).toString("hex")}function qt(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Se=new Set;function G(e,t,n){let r=(0,W.truncate)(t);if((n.skipRedactKeys??Se).has(e))return r;let i=(n.bashContextKeys??Se).has(e)?"bash":void 0;return(0,W.redact)(r,{context:i})}function ke(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 Bt(e,t,n={}){let r=[];for(let[i,o]of Object.entries(e)){let a=`${t}.${i}`,u=ke(a,o,n);u!==null&&r.push({key:a,value:u})}return r}function we(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 Me(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 Oe(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Te=1024;function Re(e,t=d.MAX_SPAN_BYTES){let n=Oe(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<=Te)break;let a=n-t,u=Math.max(Te,o-a-64);i.stringValue=(0,W.truncateTo)(i.stringValue,u),n=Oe(e)}return e}function Ft(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes],i={traceId:Ae(e.traceId),spanId:be(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};Re(i);let o={resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[i]}]}]};return Ie(o,e.guard,e.clientTiming)}function Ie(e,t,n){let r=e.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return e;t&&r.attributes.push(...we(t));let i=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return i&&r.attributes.push(...Me(i)),e}function Lt(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var xe=h(w=>{"use strict";Object.defineProperty(w,"__esModule",{value:!0});w.GUARD_STATUS_REFUSED=void 0;w.evaluateGuard=Xt;var Ct=1e4,Ut="pinta-core";function $(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Yt=new Set(["ALLOW","DENY","REVIEW"]);w.GUARD_STATUS_REFUSED=410;async function Xt(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??Ct,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??Ut,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{}},body:JSON.stringify(e),signal:o.signal});if(u.status===w.GUARD_STATUS_REFUSED)return $(Date.now()-i,"refused");if(u.status!==200)return $(Date.now()-i,"error");let c=await u.json(),p=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!Yt.has(c.decision)||!p)return $(Date.now()-i,"error");let A=Date.now()-i;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??A,clientRttMs:A}}catch(u){let c=u.name,p=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return $(Date.now()-i,p)}finally{clearTimeout(a)}}});var V=h(x=>{"use strict";var zt=x&&x.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(x,"__esModule",{value:!0});x.atomicWriteFileSync=Ht;var Ne=zt(y("fs"));function Ht(e,t){let n=`${e}.${process.pid}.tmp`;Ne.default.writeFileSync(n,t),Ne.default.renameSync(n,e)}});var te=h(E=>{"use strict";var De=E&&E.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(E,"__esModule",{value:!0});E.MemoryRetryQueue=E.DiskRetryQueue=void 0;var g=De(y("fs")),q=De(y("path")),Kt=V(),B=1e3,Zt=50,Wt=5,Q=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=q.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{g.default.mkdirSync(q.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
|
|
3
3
|
`;g.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
|
|
4
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(
|
|
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(q.default.dirname(this.filePath),{recursive:!0}),(0,Kt.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{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 r=
|
|
11
|
-
`),this.rewrite(t.slice(n))}};
|
|
8
|
+
`)}}tryAcquireLock(){let t=Date.now();try{g.default.mkdirSync(q.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<Zt;)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=Wt,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<=B)return;let n=t.length-B;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
|
|
11
|
+
`),this.rewrite(t.slice(n))}};E.DiskRetryQueue=Q;var ee=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>B&&this.entries.splice(0,this.entries.length-B)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};E.MemoryRetryQueue=ee});var Be=h(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});l.MemoryTransport=l.DiskTransport=l.MAX_POST_BYTES=void 0;l.parseHeadersEnv=Ve;l.envOptionsResolver=qe;l.postOtlp=N;var je=te(),Ge=J(),Jt=5e3;l.MAX_POST_BYTES=900*1024;function F(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function $e(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 Ve(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 qe(){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:Ve(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function N(e,t,n){let r=new AbortController,i=setTimeout(()=>r.abort(),Jt);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
12
|
`),!1}return!0}catch(o){return process.stderr.write(`[${n}] OTLP POST failed: ${o.message??String(o)}
|
|
13
|
-
`),!1}finally{clearTimeout(i)}}var
|
|
14
|
-
`);let o=[].concat(...r),a=0;for(let u of r){if(!await
|
|
15
|
-
`)}finally{this.queue.release()}}dropIfOversized(t){let n=
|
|
16
|
-
`),!0)}};l.DiskTransport=
|
|
17
|
-
`);return}await
|
|
18
|
-
`);let o=[].concat(...r),a=0;for(let u of r){if(!await
|
|
19
|
-
`)}}};
|
|
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 tn(e){let t;try{t=Wt.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 nn=we();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return nn.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 x=b(S(),1);function rn(){return(0,x.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function Ze(e=rn()){(0,x.loadEnvFile)(e)}var Je=b(S(),1);import on from"os";import ce from"path";function sn(){return process.env.GEMINI_HOME||ce.join(on.homedir(),".gemini")}function an(){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 un(){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(sn(),"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:an(),headers:un(),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",cn={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},ln={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},tt=e=>_(e)?cn:ln;function V(e){return tt(e).identity}function nt(e){return tt(e).gateEvent}var dn=new Set(["AfterModel"]),rt=e=>dn.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 fn=50,pn="pinta-gemini/0.10.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:fn,token:n??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:pn,agentType:r?V(r).ingest:void 0})}var ut=b(S(),1),q=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 dt}from"node:child_process";import L from"node:fs";import M from"node:path";var gn=new Set(["","unknown","undefined","null","n/a","none","-"]);function de(e){let t=typeof e=="string"?e.trim():void 0;return t&&!gn.has(t.toLowerCase())?t:void 0}var yn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function ft(e){let t=de(e);return t&&yn.test(t)?t:void 0}var hn=["cli_version","cliVersion","gemini_version","geminiVersion","agent_version","agentVersion","app_version","appVersion","version"],_n="PINTA_GEMINI_HOST_VERSION",lt="PINTA_GEMINI_VERSION_PROBE",mn=2e3,vn=/(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/;function pt(e){return _(e)?["gemini"]:["agy","antigravity","antigravity-cli"]}function Pn(e){let t=e;for(let n=0;n<5;n++){try{let i=L.readFileSync(M.join(t,"package.json"),"utf8"),o=ft(JSON.parse(i).version);if(o)return o}catch{}let r=M.dirname(t);if(r===t)break;t=r}}function On(e){if(process.env[lt]==="1")return;let t;try{t=dt(e,["--version"],{encoding:"utf8",timeout:mn,stdio:["ignore","pipe","ignore"],env:{...process.env,[lt]:"1"}})}catch{return}let n=t.split(/\r?\n/,5).map(r=>r.trim()).filter(Boolean);for(let r of n){let i=ft(r);if(i)return i}for(let r of n){let i=vn.exec(r);if(i)return i[1]}}function gt(e){let t=e;try{t=L.realpathSync(e)}catch{}return Pn(M.dirname(t))??On(e)}function Sn(e){if(process.platform==="win32")return;let t=process.ppid;if(!t||t<=1)return;let n;try{n=dt("ps",["-o","command=","-p",String(t)],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return}if(!n)return;let r=pt(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=gt(i);if(a)return a}}function Tn(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 pt(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=gt(a);if(u)return u}}var le;function En(e){return de(process.env[_n])??Sn(e)??Tn(e)??null}function yt(e,t){if(t)for(let n of hn){let r=de(t[n]);if(r)return r}return le===void 0&&(le=En(e)),le??void 0}var T=b(S(),1),wn=b(S(),1),F;function bn(){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 ht="0.10.0";function An(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 kn(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:ht}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:bn()}},{key:"host.name",value:{stringValue:fe.hostname()}},{key:"host.arch",value:{stringValue:fe.arch()}}]}function _t(e){let t=V(e.agent),n=An(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:kn(t.service,yt(e.agent,e.event)),scope:{name:"pinta-gemini",version:ht},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 mt from"fs";import Mn from"path";function vt(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{mt.mkdirSync(e.pluginData,{recursive:!0}),mt.appendFileSync(Mn.join(e.pluginData,"invocations.jsonl"),JSON.stringify(t)+`
|
|
21
|
-
`)}catch{}}async function
|
|
22
|
-
`),n=o?
|
|
23
|
-
`),process.exit(0)}
|
|
13
|
+
`),!1}finally{clearTimeout(i)}}var ne=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new je.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??qe}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await N(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}=$e(n,u=>F(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 N((0,Ge.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=F(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=ne;var re=class{queue=new je.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(F(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 N(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}=$e(n,F,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 N((0,Ge.mergeBatch)(u),t,this.logPrefix))break;a+=u.length}for(let u of o.slice(a))this.queue.enqueue(u)}};l.MemoryTransport=re});var ae=h(b=>{"use strict";var se=b&&b.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(b,"__esModule",{value:!0});b.TraceManager=void 0;b.generateUlid=Le;var Fe=se(y("fs")),Qt=se(y("path")),en=se(y("crypto")),tn=V(),ie="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Le(){let e=Date.now(),t="",n=e;for(let o=0;o<10;o++)t=ie[n&31]+t,n=Math.floor(n/32);let r=en.default.randomBytes(10),i="";for(let o=0;o<10;o++)i+=ie[r[o]&31];for(;i.length<16;)i+=ie[0];return t+i}var oe=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Le();return this.save(t),t}currentTrace(){try{let t=Fe.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{Fe.default.mkdirSync(Qt.default.dirname(this.tracePath),{recursive:!0}),(0,tn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
|
|
19
|
+
`)}}};b.TraceManager=oe});var ze=h(S=>{"use strict";var Ue=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 Ce=Ue(y("fs")),nn=Ue(y("path")),Ye=ae(),rn=V(),Xe=200,ue=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??Xe}read(){try{let t=JSON.parse(Ce.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Ce.default.mkdirSync(nn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,rn.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,Ye.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=ue;var ce=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Xe}newTrace(t){let n=t||"default",r=(0,Ye.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=ce});var Ze=h(k=>{"use strict";var le=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.envFilePath=an;k.parseEnvFile=Ke;k.loadEnvFile=un;var on=le(y("node:fs")),sn=le(y("node:os")),He=le(y("node:path"));function an(e,t,n){let r=n?process.env[n]:void 0,i=r&&r.length>0?r:He.default.join(sn.default.homedir(),e);return He.default.join(i,t)}function Ke(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 un(e){let t;try{t=on.default.readFileSync(e,"utf-8")}catch{return}let n=Ke(t);for(let[r,i]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=i)}});var v=h(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.GUARD_STATUS_REFUSED=s.evaluateGuard=s.MAX_SPAN_BYTES=s.enforceSpanBudget=s.mergeBatch=s.attachGuard=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=Z();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 _=J();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return _.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return _.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return _.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return _.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return _.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return _.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return _.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return _.buildPayload}});Object.defineProperty(s,"attachGuard",{enumerable:!0,get:function(){return _.attachGuard}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return _.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return _.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return _.MAX_SPAN_BYTES}});var We=xe();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return We.evaluateGuard}});Object.defineProperty(s,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return We.GUARD_STATUS_REFUSED}});var Je=te();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return Je.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return Je.MemoryRetryQueue}});var M=Be();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return M.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return M.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return M.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return M.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return M.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return M.MAX_POST_BYTES}});var Qe=ae();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return Qe.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return Qe.generateUlid}});var et=ze();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return et.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return et.MemorySessionTraceManager}});var de=Ze();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return de.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return de.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return de.loadEnvFile}})});var D=P(v(),1);function cn(){return(0,D.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function tt(e=cn()){(0,D.loadEnvFile)(e)}var nt=P(v(),1);import ln from"os";import fe from"path";function dn(){return process.env.GEMINI_HOME||fe.join(ln.homedir(),".gemini")}function fn(){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 pn(){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||fe.join(dn(),"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:fe.join(e,"trace.json"),endpoint:fn(),headers:pn(),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 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 m=e=>e==="gemini",gn={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},mn={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},st=e=>m(e)?gn:mn;function L(e){return st(e).identity}function at(e){return st(e).gateEvent}var yn=new Set(["AfterModel"]),ut=e=>yn.has(e);function ct(e,t,n){if(m(e))return{hook:t||n.hook_event_name||"unknown",session_id:j(n.session_id),cwd:j(n.cwd),tool_name:j(n.tool_name),tool_input:n.tool_input};let r=n.workspacePaths,i=n.toolCall;return{hook:t||"unknown",session_id:j(n.conversationId),cwd:Array.isArray(r)?j(r[0]):void 0,tool_name:i?.name,tool_input:i?.args}}function j(e){return typeof e=="string"?e:void 0}var bt=P(v(),1);var lt=P(v(),1);var C="0.12.0";var _n=50,hn=`pinta-gemini/${C}`;function dt(e,t,n,r){return(0,lt.evaluateGuard)(e,t,{timeoutMs:_n,token:n??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:hn,agentType:r?L(r).ingest:void 0})}var ft=P(v(),1),U=class extends ft.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-gemini",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var pt=P(v(),1),Y=class extends pt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import me from"os";import{execFileSync as mt}from"node:child_process";import X from"node:fs";import R from"node:path";var vn=new Set(["","unknown","undefined","null","n/a","none","-"]);function ge(e){let t=typeof e=="string"?e.trim():void 0;return t&&!vn.has(t.toLowerCase())?t:void 0}var Pn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function yt(e){let t=ge(e);return t&&Pn.test(t)?t:void 0}var En=["cli_version","cliVersion","gemini_version","geminiVersion","agent_version","agentVersion","app_version","appVersion","version"],Sn="PINTA_GEMINI_HOST_VERSION",gt="PINTA_GEMINI_VERSION_PROBE",On=2e3,Tn=/(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/;function _t(e){return m(e)?["gemini"]:["agy","antigravity","antigravity-cli"]}function An(e){let t=e;for(let n=0;n<5;n++){try{let i=X.readFileSync(R.join(t,"package.json"),"utf8"),o=yt(JSON.parse(i).version);if(o)return o}catch{}let r=R.dirname(t);if(r===t)break;t=r}}function bn(e){if(process.env[gt]==="1")return;let t;try{t=mt(e,["--version"],{encoding:"utf8",timeout:On,stdio:["ignore","pipe","ignore"],env:{...process.env,[gt]:"1"}})}catch{return}let n=t.split(/\r?\n/,5).map(r=>r.trim()).filter(Boolean);for(let r of n){let i=yt(r);if(i)return i}for(let r of n){let i=Tn.exec(r);if(i)return i[1]}}function ht(e){let t=e;try{t=X.realpathSync(e)}catch{}return An(R.dirname(t))??bn(e)}function kn(e){if(process.platform==="win32")return;let t=process.ppid;if(!t||t<=1)return;let n;try{n=mt("ps",["-o","command=","-p",String(t)],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return}if(!n)return;let r=_t(e);for(let i of n.split(/\s+/)){if(!i.startsWith("/"))continue;let o=R.basename(i).replace(/\.(js|mjs|cjs)$/,"");if(!r.includes(o))continue;let a=ht(i);if(a)return a}}function wn(e){let t=(process.env.PATH??"").split(R.delimiter).filter(Boolean);if(t.length===0)return;let n=process.platform==="win32"?[".cmd",".exe",""]:[""];for(let r of _t(e))for(let i of t)for(let o of n){let a=R.join(i,r+o);try{X.accessSync(a,X.constants.X_OK)}catch{continue}let u=ht(a);if(u)return u}}var pe;function Mn(e){return ge(process.env[Sn])??kn(e)??wn(e)??null}function vt(e,t){if(t)for(let n of En){let r=ge(t[n]);if(r)return r}return pe===void 0&&(pe=Mn(e)),pe??void 0}var Rn=new Set(["unknown","undefined","null","n/a","none","-","auto","default"]);function In(e){if(typeof e!="string")return;let t=e.trim();if(!(!t||t.startsWith("{")||t.startsWith("[")||Rn.has(t.toLowerCase())))return t}function Pt(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function I(e,t){let n=In(e);return n?{model:n,source:t}:void 0}function xn(e,t,n){if(m(e)){if(t==="AfterModel"){let r=Pt(n.llm_response),i=I(r?.modelVersion,"response:llm_response.modelVersion")??I(r?.model,"response:llm_response.model");if(i)return i}if(t==="BeforeModel"||t==="BeforeToolSelection"||t==="AfterModel"){let r=I(Pt(n.llm_request)?.model,"requested:llm_request.model");if(r)return r}return I(n.model,"reported:model")}return I(n.model,"reported:model")??I(n.modelId,"reported:modelId")}function Et(e,t,n){let r=xn(e,t,n),{model:i,model_source:o,...a}=n;return"model"in n&&i!==r?.model&&(a.model_raw=i),"model_source"in n&&(a.model_source_raw=o),r&&(a.model=r.model,a.model_source=r.source),a}var T=P(v(),1),Gn=P(v(),1),z;function Nn(){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 St=C;function Dn(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 jn(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:Nn()}},{key:"host.name",value:{stringValue:me.hostname()}},{key:"host.arch",value:{stringValue:me.arch()}}]}function Ot(e){let t=L(e.agent),n=Dn(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)(Et(e.agent,e.canonical.hook,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:jn(t.service,vt(e.agent,e.event)),scope:{name:"pinta-gemini",version:St},now:e.now})}function ye(e,t,n){if(n&&n.decision==="DENY"){let r=n.userMessage??n.reason??"guard_deny";return m(e)?{decision:"deny",reason:r,systemMessage:n.userMessage??void 0}:{decision:"deny",reason:r}}return!m(e)&&t==="PreToolUse"?{decision:"allow"}:{}}import Tt from"fs";import $n from"path";function At(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{Tt.mkdirSync(e.pluginData,{recursive:!0}),Tt.appendFileSync($n.join(e.pluginData,"invocations.jsonl"),JSON.stringify(t)+`
|
|
21
|
+
`)}catch{}}async function Vn(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}function qn(e,t,n){return m(e)?t.hook==="BeforeAgent":t.hook==="PreInvocation"&&n.invocationNum===1}async function kt(){let{agent:e,event:t}=it(),n={},r={},i,o=null,a=rt();try{if(r=JSON.parse(await Vn()||"{}"),i=ct(e,t,r),!ut(i.hook)){let u=new U(a);await u.flush();let c=i.session_id??"unknown",p=new Y(a),A=qn(e,i,r)?p.newTrace(c):p.currentTrace(c),H=m(e)?void 0:ot(r),K=Ot({agent:e,canonical:i,event:r,traceId:A,product:H});i.hook===at(e)&&(o=await dt(K,a.guardEndpoint,a.headers["x-pinta-relay-token"],e)),n=ye(e,t,o),(0,bt.attachGuard)(K,o),await u.send(K)}}catch(u){process.stderr.write(`[pinta-gemini] error: ${u}
|
|
22
|
+
`),n=o?ye(e,t,o):{}}At(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)}tt();kt();
|
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
|
|
2
|
+
var Xt=Object.create;var we=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Ht=Object.getOwnPropertyNames;var Wt=Object.getPrototypeOf,Zt=Object.prototype.hasOwnProperty;var P=(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 S=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Jt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ht(t))!Zt.call(e,i)&&i!==n&&we(e,i,{get:()=>t[i],enumerable:!(r=zt(t,i))||r.enumerable});return e};var b=(e,t,n)=>(n=e!=null?Xt(Wt(e)):{},Jt(t||!e||!e.__esModule?we(n,"default",{value:e,enumerable:!0}):n,e));var re=S(y=>{"use strict";Object.defineProperty(y,"__esModule",{value:!0});y.PATTERNS=y.MAX_BYTES=void 0;y.truncateTo=Ae;y.truncate=Qt;y.collectMatches=ke;y.resolveOverlaps=Me;y.applyMatches=Ie;y.redact=en;y.MAX_BYTES=102400;function Ae(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 Ae(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 ke(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),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 Me(e){let t=[...e].sort((i,s)=>i.start!==s.start?i.start-s.start:s.end-s.start-(i.end-i.start)),n=[],r=-1;for(let i of t)i.start<r||(n.push(i),r=i.end);return n}function Ie(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 en(e,t={}){if(e.length===0)return e;let n=ke(e,t);if(n.length===0)return e;let r=Me(n);return Ie(e,r)}});var se=S(p=>{"use strict";var tn=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(p,"__esModule",{value:!0});p.MAX_SPAN_BYTES=void 0;p.ulidToTraceId=De;p.newSpanId=Ne;p.snakeCase=sn;p.toOtlpValue=$e;p.attrsFromRecord=on;p.guardAttrs=qe;p.clientAttrs=Ge;p.enforceSpanBudget=Fe;p.buildPayload=an;p.attachGuard=Ce;p.mergeBatch=cn;var nn=tn(P("crypto")),ie=re(),rn="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function De(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=rn.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 Ne(){return nn.default.randomBytes(8).toString("hex")}function sn(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Re=new Set;function L(e,t,n){let r=(0,ie.truncate)(t);if((n.skipRedactKeys??Re).has(e))return r;let i=(n.bashContextKeys??Re).has(e)?"bash":void 0;return(0,ie.redact)(r,{context:i})}function $e(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:L(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:L(e,JSON.stringify(t),n)}}catch{return{stringValue:L(e,String(t),n)}}default:return{stringValue:L(e,String(t),n)}}}function on(e,t,n={}){let r=[];for(let[i,s]of Object.entries(e)){let a=`${t}.${i}`,c=$e(a,s,n);c!==null&&r.push({key:a,value:c})}return r}function qe(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function Ge(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}p.MAX_SPAN_BYTES=800*1024;function je(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var xe=1024;function Fe(e,t=p.MAX_SPAN_BYTES){let n=je(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<=xe)break;let a=n-t,c=Math.max(xe,s-a-64);i.stringValue=(0,ie.truncateTo)(i.stringValue,c),n=je(e)}return e}function an(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes],i={traceId:De(e.traceId),spanId:Ne(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};Fe(i);let s={resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[i]}]}]};return Ce(s,e.guard,e.clientTiming)}function Ce(e,t,n){let r=e.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return e;t&&r.attributes.push(...qe(t));let i=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return i&&r.attributes.push(...Ge(i)),e}function cn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var Ve=S(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.GUARD_STATUS_REFUSED=void 0;R.evaluateGuard=fn;var un=1e4,ln="pinta-core";function U(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var dn=new Set(["ALLOW","DENY","REVIEW"]);R.GUARD_STATUS_REFUSED=410;async function fn(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??un,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??ln,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{}},body:JSON.stringify(e),signal:s.signal});if(c.status===R.GUARD_STATUS_REFUSED)return U(Date.now()-i,"refused");if(c.status!==200)return U(Date.now()-i,"error");let u=await c.json(),l=u?.durationMs===void 0||typeof u.durationMs=="number"&&Number.isFinite(u.durationMs);if(!u||!dn.has(u.decision)||!l)return U(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 U(Date.now()-i,l)}finally{clearTimeout(a)}}});var Y=S(G=>{"use strict";var pn=G&&G.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(G,"__esModule",{value:!0});G.atomicWriteFileSync=gn;var Be=pn(P("fs"));function gn(e,t){let n=`${e}.${process.pid}.tmp`;Be.default.writeFileSync(n,t),Be.default.renameSync(n,e)}});var ce=S(O=>{"use strict";var Le=O&&O.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(O,"__esModule",{value:!0});O.MemoryRetryQueue=O.DiskRetryQueue=void 0;var h=Le(P("fs")),K=Le(P("path")),mn=Y(),X=1e3,yn=50,hn=5,oe=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=K.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{h.default.mkdirSync(K.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
|
|
3
3
|
`;h.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
|
|
4
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(
|
|
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(K.default.dirname(this.filePath),{recursive:!0}),(0,mn.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{h.default.mkdirSync(
|
|
9
|
-
`),!1}for(;Date.now()-t<
|
|
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=
|
|
11
|
-
`),this.rewrite(t.slice(n))}};
|
|
8
|
+
`)}}tryAcquireLock(){let t=Date.now();try{h.default.mkdirSync(K.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<yn;)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=hn,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<=X)return;let n=t.length-X;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
|
|
11
|
+
`),this.rewrite(t.slice(n))}};O.DiskRetryQueue=oe;var ae=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>X&&this.entries.splice(0,this.entries.length-X)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};O.MemoryRetryQueue=ae});var He=S(d=>{"use strict";Object.defineProperty(d,"__esModule",{value:!0});d.MemoryTransport=d.DiskTransport=d.MAX_POST_BYTES=void 0;d.parseHeadersEnv=Xe;d.envOptionsResolver=ze;d.postOtlp=F;var Ue=ce(),Ye=se(),_n=5e3;d.MAX_POST_BYTES=900*1024;function z(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function Ke(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 Xe(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 ze(){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:Xe(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function F(e,t,n){let r=new AbortController,i=setTimeout(()=>r.abort(),_n);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)}};d.DiskTransport=
|
|
17
|
-
`);return}await
|
|
18
|
-
`);let s=[].concat(...r),a=0;for(let c of r){if(!await
|
|
19
|
-
`)}}};
|
|
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 bn(e){let t;try{t=_n.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 Tn=Ce();Object.defineProperty(o,"evaluateGuard",{enumerable:!0,get:function(){return Tn.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 x=Xe();Object.defineProperty(o,"DiskTransport",{enumerable:!0,get:function(){return x.DiskTransport}});Object.defineProperty(o,"MemoryTransport",{enumerable:!0,get:function(){return x.MemoryTransport}});Object.defineProperty(o,"postOtlp",{enumerable:!0,get:function(){return x.postOtlp}});Object.defineProperty(o,"envOptionsResolver",{enumerable:!0,get:function(){return x.envOptionsResolver}});Object.defineProperty(o,"parseHeadersEnv",{enumerable:!0,get:function(){return x.parseHeadersEnv}});Object.defineProperty(o,"MAX_POST_BYTES",{enumerable:!0,get:function(){return x.MAX_POST_BYTES}});var it=fe();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 br}from"node:fs";import{pathToFileURL as Tr}from"node:url";var C=k(E(),1);function Sn(){return(0,C.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function ot(e=Sn()){(0,C.loadEnvFile)(e)}var at=k(E(),1);import On from"os";import he from"path";function En(){return process.env.GEMINI_HOME||he.join(On.homedir(),".gemini")}function wn(){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 An(){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(En(),"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:wn(),headers:An(),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",kn={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},In={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},dt=e=>v(e)?kn:In;function X(e){return dt(e).identity}function ft(e){return dt(e).gateEvent}var Mn=new Set(["AfterModel"]),pt=e=>Mn.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 xn=50,jn="pinta-gemini/0.10.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:xn,token:n??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:jn,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 bt}from"node:child_process";import H from"node:fs";import j from"node:path";var Rn=new Set(["","unknown","undefined","null","n/a","none","-"]);function Pe(e){let t=typeof e=="string"?e.trim():void 0;return t&&!Rn.has(t.toLowerCase())?t:void 0}var Nn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function Tt(e){let t=Pe(e);return t&&Nn.test(t)?t:void 0}var Dn=["cli_version","cliVersion","gemini_version","geminiVersion","agent_version","agentVersion","app_version","appVersion","version"],$n="PINTA_GEMINI_HOST_VERSION",vt="PINTA_GEMINI_VERSION_PROBE",qn=2e3,Cn=/(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/;function St(e){return v(e)?["gemini"]:["agy","antigravity","antigravity-cli"]}function Fn(e){let t=e;for(let n=0;n<5;n++){try{let i=H.readFileSync(j.join(t,"package.json"),"utf8"),s=Tt(JSON.parse(i).version);if(s)return s}catch{}let r=j.dirname(t);if(r===t)break;t=r}}function Gn(e){if(process.env[vt]==="1")return;let t;try{t=bt(e,["--version"],{encoding:"utf8",timeout:qn,stdio:["ignore","pipe","ignore"],env:{...process.env,[vt]:"1"}})}catch{return}let n=t.split(/\r?\n/,5).map(r=>r.trim()).filter(Boolean);for(let r of n){let i=Tt(r);if(i)return i}for(let r of n){let i=Cn.exec(r);if(i)return i[1]}}function Ot(e){let t=e;try{t=H.realpathSync(e)}catch{}return Fn(j.dirname(t))??Gn(e)}function Bn(e){if(process.platform==="win32")return;let t=process.ppid;if(!t||t<=1)return;let n;try{n=bt("ps",["-o","command=","-p",String(t)],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return}if(!n)return;let r=St(e);for(let i of n.split(/\s+/)){if(!i.startsWith("/"))continue;let s=j.basename(i).replace(/\.(js|mjs|cjs)$/,"");if(!r.includes(s))continue;let a=Ot(i);if(a)return a}}function Vn(e){let t=(process.env.PATH??"").split(j.delimiter).filter(Boolean);if(t.length===0)return;let n=process.platform==="win32"?[".cmd",".exe",""]:[""];for(let r of St(e))for(let i of t)for(let s of n){let a=j.join(i,r+s);try{H.accessSync(a,H.constants.X_OK)}catch{continue}let c=Ot(a);if(c)return c}}var _e;function Ln(e){return Pe(process.env[$n])??Bn(e)??Vn(e)??null}function Et(e,t){if(t)for(let n of Dn){let r=Pe(t[n]);if(r)return r}return _e===void 0&&(_e=Ln(e)),_e??void 0}var w=k(E(),1),zn=k(E(),1),W;function Yn(){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 wt="0.10.0";function Kn(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 Xn(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:wt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Yn()}},{key:"host.name",value:{stringValue:ve.hostname()}},{key:"host.arch",value:{stringValue:ve.arch()}}]}function At(e){let t=X(e.agent),n=Kn(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:Xn(t.service,Et(e.agent,e.event)),scope:{name:"pinta-gemini",version:wt},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 kt from"fs";import Un from"path";function It(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{kt.mkdirSync(e.pluginData,{recursive:!0}),kt.appendFileSync(Un.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 ue=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new Ue.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??ze}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await F(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}=Ke(n,c=>z(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 F((0,Ye.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=z(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=ue;var le=class{queue=new Ue.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(z(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 F(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}=Ke(n,z,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 F((0,Ye.mergeBatch)(c),t,this.logPrefix))break;a+=c.length}for(let c of s.slice(a))this.queue.enqueue(c)}};d.MemoryTransport=le});var ge=S(M=>{"use strict";var pe=M&&M.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(M,"__esModule",{value:!0});M.TraceManager=void 0;M.generateUlid=Ze;var We=pe(P("fs")),Pn=pe(P("path")),vn=pe(P("crypto")),Sn=Y(),de="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ze(){let e=Date.now(),t="",n=e;for(let s=0;s<10;s++)t=de[n&31]+t,n=Math.floor(n/32);let r=vn.default.randomBytes(10),i="";for(let s=0;s<10;s++)i+=de[r[s]&31];for(;i.length<16;)i+=de[0];return t+i}var fe=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ze();return this.save(t),t}currentTrace(){try{let t=We.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{We.default.mkdirSync(Pn.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=fe});var nt=S(w=>{"use strict";var Qe=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(w,"__esModule",{value:!0});w.MemorySessionTraceManager=w.DiskSessionTraceManager=void 0;var Je=Qe(P("fs")),Tn=Qe(P("path")),et=ge(),En=Y(),tt=200,me=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??tt}read(){try{let t=JSON.parse(Je.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Je.default.mkdirSync(Tn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,En.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,et.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)}};w.DiskSessionTraceManager=me;var ye=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??tt}newTrace(t){let n=t||"default",r=(0,et.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)}};w.MemorySessionTraceManager=ye});var st=S(I=>{"use strict";var he=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.envFilePath=wn;I.parseEnvFile=it;I.loadEnvFile=An;var bn=he(P("node:fs")),On=he(P("node:os")),rt=he(P("node:path"));function wn(e,t,n){let r=n?process.env[n]:void 0,i=r&&r.length>0?r:rt.default.join(On.default.homedir(),e);return rt.default.join(i,t)}function it(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 An(e){let t;try{t=bn.default.readFileSync(e,"utf-8")}catch{return}let n=it(t);for(let[r,i]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=i)}});var E=S(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.GUARD_STATUS_REFUSED=o.evaluateGuard=o.MAX_SPAN_BYTES=o.enforceSpanBudget=o.mergeBatch=o.attachGuard=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 A=re();Object.defineProperty(o,"redact",{enumerable:!0,get:function(){return A.redact}});Object.defineProperty(o,"truncate",{enumerable:!0,get:function(){return A.truncate}});Object.defineProperty(o,"truncateTo",{enumerable:!0,get:function(){return A.truncateTo}});Object.defineProperty(o,"collectMatches",{enumerable:!0,get:function(){return A.collectMatches}});Object.defineProperty(o,"resolveOverlaps",{enumerable:!0,get:function(){return A.resolveOverlaps}});Object.defineProperty(o,"applyMatches",{enumerable:!0,get:function(){return A.applyMatches}});Object.defineProperty(o,"PATTERNS",{enumerable:!0,get:function(){return A.PATTERNS}});Object.defineProperty(o,"MAX_BYTES",{enumerable:!0,get:function(){return A.MAX_BYTES}});var v=se();Object.defineProperty(o,"ulidToTraceId",{enumerable:!0,get:function(){return v.ulidToTraceId}});Object.defineProperty(o,"newSpanId",{enumerable:!0,get:function(){return v.newSpanId}});Object.defineProperty(o,"snakeCase",{enumerable:!0,get:function(){return v.snakeCase}});Object.defineProperty(o,"toOtlpValue",{enumerable:!0,get:function(){return v.toOtlpValue}});Object.defineProperty(o,"attrsFromRecord",{enumerable:!0,get:function(){return v.attrsFromRecord}});Object.defineProperty(o,"guardAttrs",{enumerable:!0,get:function(){return v.guardAttrs}});Object.defineProperty(o,"clientAttrs",{enumerable:!0,get:function(){return v.clientAttrs}});Object.defineProperty(o,"buildPayload",{enumerable:!0,get:function(){return v.buildPayload}});Object.defineProperty(o,"attachGuard",{enumerable:!0,get:function(){return v.attachGuard}});Object.defineProperty(o,"mergeBatch",{enumerable:!0,get:function(){return v.mergeBatch}});Object.defineProperty(o,"enforceSpanBudget",{enumerable:!0,get:function(){return v.enforceSpanBudget}});Object.defineProperty(o,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return v.MAX_SPAN_BYTES}});var ot=Ve();Object.defineProperty(o,"evaluateGuard",{enumerable:!0,get:function(){return ot.evaluateGuard}});Object.defineProperty(o,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return ot.GUARD_STATUS_REFUSED}});var at=ce();Object.defineProperty(o,"DiskRetryQueue",{enumerable:!0,get:function(){return at.DiskRetryQueue}});Object.defineProperty(o,"MemoryRetryQueue",{enumerable:!0,get:function(){return at.MemoryRetryQueue}});var j=He();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 ct=ge();Object.defineProperty(o,"TraceManager",{enumerable:!0,get:function(){return ct.TraceManager}});Object.defineProperty(o,"generateUlid",{enumerable:!0,get:function(){return ct.generateUlid}});var ut=nt();Object.defineProperty(o,"DiskSessionTraceManager",{enumerable:!0,get:function(){return ut.DiskSessionTraceManager}});Object.defineProperty(o,"MemorySessionTraceManager",{enumerable:!0,get:function(){return ut.MemorySessionTraceManager}});var _e=st();Object.defineProperty(o,"envFilePath",{enumerable:!0,get:function(){return _e.envFilePath}});Object.defineProperty(o,"parseEnvFile",{enumerable:!0,get:function(){return _e.parseEnvFile}});Object.defineProperty(o,"loadEnvFile",{enumerable:!0,get:function(){return _e.loadEnvFile}})});import{realpathSync as Mr}from"node:fs";import{pathToFileURL as Ir}from"node:url";var C=b(E(),1);function kn(){return(0,C.envFilePath)(".gemini","pinta-gemini.env","GEMINI_HOME")}function lt(e=kn()){(0,C.loadEnvFile)(e)}var dt=b(E(),1);import Mn from"os";import Pe from"path";function In(){return process.env.GEMINI_HOME||Pe.join(Mn.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 jn(){let e=(0,dt.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 ft(){let e=process.env.GEMINI_PLUGIN_DATA||Pe.join(In(),"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:Pe.join(e,"trace.json"),endpoint:Rn(),headers:jn(),guardEndpoint:process.env.PINTA_GUARD_ENDPOINT}}function pt(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 gt(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",xn={identity:{prefix:"gemini",ingest:"gemini",service:"gemini-cli"},gateEvent:"BeforeTool"},Dn={identity:{prefix:"antigravity",ingest:"antigravity",service:"antigravity-cli"},gateEvent:"PreToolUse"},mt=e=>_(e)?xn:Dn;function H(e){return mt(e).identity}function yt(e){return mt(e).gateEvent}var Nn=new Set(["AfterModel"]),ht=e=>Nn.has(e);function _t(e,t,n){if(_(e))return{hook:t||n.hook_event_name||"unknown",session_id:V(n.session_id),cwd:V(n.cwd),tool_name:V(n.tool_name),tool_input:n.tool_input};let r=n.workspacePaths,i=n.toolCall;return{hook:t||"unknown",session_id:V(n.conversationId),cwd:Array.isArray(r)?V(r[0]):void 0,tool_name:i?.name,tool_input:i?.args}}function V(e){return typeof e=="string"?e:void 0}var Nt=b(E(),1);var Pt=b(E(),1);var W="0.12.0";var $n=50,qn=`pinta-gemini/${W}`;function vt(e,t,n,r){return(0,Pt.evaluateGuard)(e,t,{timeoutMs:$n,token:n??process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:qn,agentType:r?H(r).ingest:void 0})}var St=b(E(),1),Z=class extends St.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-gemini",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var Tt=b(E(),1),J=class extends Tt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import Te from"os";import{execFileSync as bt}from"node:child_process";import Q from"node:fs";import x from"node:path";var Gn=new Set(["","unknown","undefined","null","n/a","none","-"]);function Se(e){let t=typeof e=="string"?e.trim():void 0;return t&&!Gn.has(t.toLowerCase())?t:void 0}var Fn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function Ot(e){let t=Se(e);return t&&Fn.test(t)?t:void 0}var Cn=["cli_version","cliVersion","gemini_version","geminiVersion","agent_version","agentVersion","app_version","appVersion","version"],Vn="PINTA_GEMINI_HOST_VERSION",Et="PINTA_GEMINI_VERSION_PROBE",Bn=2e3,Ln=/(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/;function wt(e){return _(e)?["gemini"]:["agy","antigravity","antigravity-cli"]}function Un(e){let t=e;for(let n=0;n<5;n++){try{let i=Q.readFileSync(x.join(t,"package.json"),"utf8"),s=Ot(JSON.parse(i).version);if(s)return s}catch{}let r=x.dirname(t);if(r===t)break;t=r}}function Yn(e){if(process.env[Et]==="1")return;let t;try{t=bt(e,["--version"],{encoding:"utf8",timeout:Bn,stdio:["ignore","pipe","ignore"],env:{...process.env,[Et]:"1"}})}catch{return}let n=t.split(/\r?\n/,5).map(r=>r.trim()).filter(Boolean);for(let r of n){let i=Ot(r);if(i)return i}for(let r of n){let i=Ln.exec(r);if(i)return i[1]}}function At(e){let t=e;try{t=Q.realpathSync(e)}catch{}return Un(x.dirname(t))??Yn(e)}function Kn(e){if(process.platform==="win32")return;let t=process.ppid;if(!t||t<=1)return;let n;try{n=bt("ps",["-o","command=","-p",String(t)],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return}if(!n)return;let r=wt(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=At(i);if(a)return a}}function Xn(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 wt(e))for(let i of t)for(let s of n){let a=x.join(i,r+s);try{Q.accessSync(a,Q.constants.X_OK)}catch{continue}let c=At(a);if(c)return c}}var ve;function zn(e){return Se(process.env[Vn])??Kn(e)??Xn(e)??null}function kt(e,t){if(t)for(let n of Cn){let r=Se(t[n]);if(r)return r}return ve===void 0&&(ve=zn(e)),ve??void 0}var Hn=new Set(["unknown","undefined","null","n/a","none","-","auto","default"]);function Wn(e){if(typeof e!="string")return;let t=e.trim();if(!(!t||t.startsWith("{")||t.startsWith("[")||Hn.has(t.toLowerCase())))return t}function Mt(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function D(e,t){let n=Wn(e);return n?{model:n,source:t}:void 0}function Zn(e,t,n){if(_(e)){if(t==="AfterModel"){let r=Mt(n.llm_response),i=D(r?.modelVersion,"response:llm_response.modelVersion")??D(r?.model,"response:llm_response.model");if(i)return i}if(t==="BeforeModel"||t==="BeforeToolSelection"||t==="AfterModel"){let r=D(Mt(n.llm_request)?.model,"requested:llm_request.model");if(r)return r}return D(n.model,"reported:model")}return D(n.model,"reported:model")??D(n.modelId,"reported:modelId")}function It(e,t,n){let r=Zn(e,t,n),{model:i,model_source:s,...a}=n;return"model"in n&&i!==r?.model&&(a.model_raw=i),"model_source"in n&&(a.model_source_raw=s),r&&(a.model=r.model,a.model_source=r.source),a}var k=b(E(),1),tr=b(E(),1),ee;function Jn(){if(ee===void 0)try{ee=Te.userInfo().username}catch{ee=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return ee}var Rt=W;function Qn(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 er(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:Rt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Jn()}},{key:"host.name",value:{stringValue:Te.hostname()}},{key:"host.arch",value:{stringValue:Te.arch()}}]}function jt(e){let t=H(e.agent),n=Qn(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,k.attrsFromRecord)(It(e.agent,e.canonical.hook,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,k.toOtlpValue)(c,String(a),n);u!==null&&r.push({key:c,value:u})}}return(0,k.buildPayload)({traceId:e.traceId,spanName:`${t.ingest}.${(0,k.snakeCase)(e.canonical.hook)}`,attributes:r,resource:er(t.service,kt(e.agent,e.event)),scope:{name:"pinta-gemini",version:Rt},now:e.now})}function Ee(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 xt from"fs";import nr from"path";function Dt(e,t){if(process.env.PINTA_GEMINI_DEBUG==="1")try{xt.mkdirSync(e.pluginData,{recursive:!0}),xt.appendFileSync(nr.join(e.pluginData,"invocations.jsonl"),JSON.stringify(t)+`
|
|
21
|
+
`)}catch{}}async function rr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}function ir(e,t,n){return _(e)?t.hook==="BeforeAgent":t.hook==="PreInvocation"&&n.invocationNum===1}async function $t(){let{agent:e,event:t}=pt(),n={},r={},i,s=null,a=ft();try{if(r=JSON.parse(await rr()||"{}"),i=_t(e,t,r),!ht(i.hook)){let c=new Z(a);await c.flush();let u=i.session_id??"unknown",l=new J(a),m=ir(e,i,r)?l.newTrace(u):l.currentTrace(u),f=_(e)?void 0:gt(r),T=jt({agent:e,canonical:i,event:r,traceId:m,product:f});i.hook===yt(e)&&(s=await vt(T,a.guardEndpoint,a.headers["x-pinta-relay-token"],e)),n=Ee(e,t,s),(0,Nt.attachGuard)(T,s),await c.send(T)}}catch(c){process.stderr.write(`[pinta-gemini] error: ${c}
|
|
22
|
+
`),n=s?Ee(e,t,s):{}}Dt(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 Vt,stat as _r}from"node:fs/promises";import{homedir as Pr}from"node:os";import g from"node:path";import{spawn as Gt}from"node:child_process";import{access as sr,copyFile as or,mkdtemp as ar,rm as cr,stat as Ft}from"node:fs/promises";import{constants as ur}from"node:fs";import lr from"node:os";import B from"node:path";var be,dr=["/usr/bin/sqlite3","/opt/homebrew/bin/sqlite3","/usr/local/bin/sqlite3"];async function fr(){for(let t of dr)try{return await sr(t,ur.X_OK),t}catch{}return await new Promise(t=>{let n;try{n=Gt("sqlite3",["--version"],{stdio:"ignore"})}catch{t(!1);return}n.on("error",()=>t(!1)),n.on("close",r=>t(r===0))})?"sqlite3":null}async function pr(){return be===void 0&&(be=await fr()),be}async function gr(e,t,n,r){await new Promise((i,s)=>{let a=Gt(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 mr(e){try{let t=await Ft(e);return`${t.mtimeMs}:${t.size}`}catch{return"absent"}}async function qt(e){let t=new Map;for(let n of e)t.set(n,await mr(n));return t}function yr(e,t){for(let[n,r]of e)if(t.get(n)!==r)return!1;return!0}async function hr(e,t,n,r){let i=r.minStableMs??2e3,s=r.maxRetries??3,a=r.now??Date.now,c=r.sleep??(f=>new Promise(T=>setTimeout(T,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 T=await qt(m);if(T.get(e)==="absent")throw new Error(`snapshot source vanished: ${e}`);let ne=0;for(let q of m)try{let Kt=await Ft(q);ne=Math.max(ne,Kt.mtimeMs)}catch{}if(a()-ne<i){await c(i);continue}for(let q of m)T.get(q)!=="absent"&&await or(q,B.join(t,B.basename(q)));r.onCopied&&await r.onCopied(f);let Yt=await qt(m);if(yr(T,Yt))return n}throw new Error(`snapshot quiesce-copy did not stabilize after ${s} attempts: ${e}`)}async function Ct(e,t={}){let n=t.tmpDirBase??lr.tmpdir(),r=await ar(B.join(n,"pinta-gemini-snap-"));try{let i=B.join(r,B.basename(e.absPath)),s=t.sqlite3Path!==void 0?t.sqlite3Path:await pr();return s?(await gr(s,e.absPath,i,t.overallTimeoutMs??6e4),i):await hr(e.absPath,r,i,t)}catch(i){throw await cr(r,{recursive:!0,force:!0}).catch(()=>{}),i}}var vr="pinta-gemini",te="antigravity";function Sr(){let e=process.env.GEMINI_HOME;return e&&e.length>0?e:g.join(Pr(),".gemini")}function N(e,t){return g.relative(e,t).split(g.sep).join("/")}function Bt(e){return e.endsWith("/.system_generated/logs/transcript.jsonl")||e.endsWith("/.system_generated/logs/transcript_full.jsonl")}function Tr(e){return e.endsWith(".jsonl")||e.endsWith(".json")}function Oe(e){let t=g.extname(e);return t?e.slice(0,-t.length):e}async function Lt(){return[Sr()]}async function*Ut(e){let t;try{t=await Vt(e)}catch{return}try{for await(let n of t){let r=g.join(e,n.name);n.isDirectory()?yield*Ut(r):n.isFile()&&(yield r)}}catch{return}}async function*$(e){let t;try{t=await Vt(e)}catch{return}try{for await(let n of t)yield{name:n.name,isDir:n.isDirectory(),isFile:n.isFile()}}catch{return}}async function*Er(e){let t=g.join(e,"tmp");for await(let n of $(t)){if(!n.isDir)continue;let r=n.name,i=g.join(t,r),s=g.join(i,"logs.json");yield{absPath:s,relPath:N(e,s),semantics:"rewritten-doc",projectKey:r};let a=g.join(i,"chats");for await(let c of $(a)){if(!c.isFile||!Tr(c.name))continue;let u=g.join(a,c.name);yield{absPath:u,relPath:N(e,u),semantics:"rewritten-doc",sessionId:Oe(c.name),projectKey:r}}}}async function*br(e){let t=g.join(e,"antigravity"),n=g.join(t,"conversations");for await(let s of $(n)){if(!s.isFile||!s.name.endsWith(".db"))continue;let a=g.join(n,s.name);yield{absPath:a,relPath:N(e,a),semantics:"database",sessionId:Oe(s.name),projectKey:te}}let r=g.join(t,"brain");for await(let s of $(r)){if(!s.isDir)continue;let a=s.name,c=g.join(r,a);for await(let u of Ut(c)){let l=N(e,u);yield{absPath:u,relPath:l,semantics:Bt(l)?"append-log":"rewritten-doc",sessionId:a,projectKey:te}}}let i=g.join(t,"annotations");for await(let s of $(i)){if(!s.isFile||!s.name.endsWith(".pbtxt"))continue;let a=g.join(i,s.name);yield{absPath:a,relPath:N(e,a),semantics:"rewritten-doc",sessionId:Oe(s.name),projectKey:te}}for await(let s of $(t))if(s.isFile&&(s.name.endsWith(".pb")||s.name.endsWith(".pbtxt")||s.name==="installation_id")){let a=g.join(t,s.name);yield{absPath:a,relPath:N(e,a),semantics:"rewritten-doc",projectKey:te}}}async function*Or(e){yield*Er(e),yield*br(e)}async function*wr(e){let[t]=await Lt(),n=e.since?.getTime();for await(let r of Or(t)){let i;try{i=await _r(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 Ar(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 Bt(e)?"session-log":"meta";case"annotations":return"meta";default:return"other"}return"other"}var kr={id:vr,roots:Lt,scan:wr,classify:Ar,snapshot:e=>Ct(e)};lt();function Rr(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===Ir(Mr(e)).href}catch{return!1}}Rr()&&$t();export{kr as lifecycle};
|
package/docs/SPEC.md
CHANGED
|
@@ -164,6 +164,15 @@ guard 평가는 gate 이벤트에서만: gemini=`BeforeTool`, antigravity=`PreTo
|
|
|
164
164
|
### 9.3 Bronze flatten
|
|
165
165
|
모든 top-level 이벤트 필드를 `<prefix>.<key>` 속성으로. 문자열은 redact+truncate(§11). prefix = `gemini` | `antigravity`.
|
|
166
166
|
|
|
167
|
+
`<prefix>.model` is reserved for a non-placeholder scalar model ID. Nested
|
|
168
|
+
Gemini request models are lifted with `model_source=requested:llm_request.model`;
|
|
169
|
+
top-level model fields are reported, not asserted as actual response identity.
|
|
170
|
+
Unsupported/conflicting raw model values move to `model_raw`. No session model
|
|
171
|
+
is inferred from transcript paths, and Antigravity does not reuse Gemini's
|
|
172
|
+
request schema. See [Model telemetry](../README.md#model-telemetry) for evidence,
|
|
173
|
+
precedence and coverage limits. Hook registration and the AfterModel skip are
|
|
174
|
+
unchanged.
|
|
175
|
+
|
|
167
176
|
### 9.4 제품 서브라벨 (best-effort, 실측 기반)
|
|
168
177
|
agy 와 Antigravity 2.0 은 `transcriptPath` 로 구분 가능:
|
|
169
178
|
- agy: `.../antigravity-cli/brain/<id>/.../transcript_full.jsonl`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinta-ai/pinta-gemini",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.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",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"dist",
|
|
16
16
|
"LICENSE",
|
|
17
17
|
"README.md",
|
|
18
|
+
"CHANGELOG.md",
|
|
18
19
|
"docs"
|
|
19
20
|
],
|
|
20
21
|
"repository": {
|
|
@@ -38,7 +39,7 @@
|
|
|
38
39
|
"demo": "tsx tools/demo-trace.ts"
|
|
39
40
|
},
|
|
40
41
|
"devDependencies": {
|
|
41
|
-
"@pinta-ai/core": "^0.
|
|
42
|
+
"@pinta-ai/core": "^0.8.0",
|
|
42
43
|
"@types/node": "^22.0.0",
|
|
43
44
|
"esbuild": "^0.24.0",
|
|
44
45
|
"tsx": "^4.0.0",
|