@pinta-ai/pinta-copilot 0.5.0 → 0.6.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 CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to pinta-copilot are documented here.
4
4
 
5
+ ## [0.5.1] - 2026-07-20
6
+
7
+ ### Changed
8
+
9
+ - `@pinta-ai/core` bumped `^0.3.0` → `^0.5.0` (devDependency, bundled
10
+ into `dist/` at build). Pulls in the oversized-flush fix (pinta-manager#180
11
+ follow-up): the retry queue now flushes in 900 KiB chunks instead of one
12
+ unbounded POST, spans are capped at 800 KiB at build time, and a payload
13
+ that alone exceeds the POST budget is dropped with a diagnostic instead of
14
+ poisoning every later flush. No adaptor source change was needed.
15
+
5
16
  ## [0.4.0] - 2026-07-12
6
17
 
7
18
  ### Changed
package/dist/index.js CHANGED
@@ -1,14 +1,21 @@
1
- "use strict";var Qe=Object.create;var se=Object.defineProperty;var We=Object.getOwnPropertyDescriptor;var et=Object.getOwnPropertyNames;var tt=Object.getPrototypeOf,rt=Object.prototype.hasOwnProperty;var f=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var nt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of et(t))!rt.call(e,o)&&o!==r&&se(e,o,{get:()=>t[o],enumerable:!(n=We(t,o))||n.enumerable});return e};var _=(e,t,r)=>(r=e!=null?Qe(tt(e)):{},nt(t||!e||!e.__esModule?se(r,"default",{value:e,enumerable:!0}):r,e));var G=f(c=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});c.PATTERNS=c.MAX_BYTES=void 0;c.truncate=ot;c.collectMatches=ie;c.resolveOverlaps=ae;c.applyMatches=ue;c.redact=st;c.MAX_BYTES=102400;function ot(e){let t=Buffer.from(e,"utf-8");return t.length<=c.MAX_BYTES?e:`${t.subarray(0,c.MAX_BYTES).toString("utf-8")}\u2026[TRUNCATED:${t.length}]`}c.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function ie(e,t){let r=[];for(let n of c.PATTERNS){if(n.requireContext&&n.requireContext!==t.context)continue;let o=new RegExp(n.regex.source,n.regex.flags),i;for(;(i=o.exec(e))!==null;){let a=n.captureGroup??0,u=i[a];if(u===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}let R=i.index,I=i.index+i[0].length,h=R+i[0].indexOf(u),U=h+u.length;r.push({start:R,end:I,replaceStart:h,replaceEnd:U,type:n.type}),i.index===o.lastIndex&&o.lastIndex++}}return r}function ae(e){let t=[...e].sort((o,i)=>o.start!==i.start?o.start-i.start:i.end-i.start-(o.end-o.start)),r=[],n=-1;for(let o of t)o.start<n||(r.push(o),n=o.end);return r}function ue(e,t){let r=[...t].sort((o,i)=>i.replaceStart-o.replaceStart),n=e;for(let o of r)n=n.slice(0,o.replaceStart)+`[REDACTED:${o.type}]`+n.slice(o.replaceEnd);return n}function st(e,t={}){if(e.length===0)return e;let r=ie(e,t);if(r.length===0)return e;let n=ae(r);return ue(e,n)}});var V=f(p=>{"use strict";var it=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(p,"__esModule",{value:!0});p.ulidToTraceId=pe;p.newSpanId=fe;p.snakeCase=ct;p.toOtlpValue=de;p.attrsFromRecord=lt;p.guardAttrs=ge;p.clientAttrs=he;p.buildPayload=pt;p.mergeBatch=ft;var at=it(require("crypto")),ce=G(),ut="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function pe(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let n of e){let o=ut.indexOf(n);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${n}"`);t=t<<5n|BigInt(o)}let r=(1n<<128n)-1n;return t&=r,t.toString(16).padStart(32,"0")}function fe(){return at.default.randomBytes(8).toString("hex")}function ct(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var le=new Set;function x(e,t,r){let n=(0,ce.truncate)(t);if((r.skipRedactKeys??le).has(e))return n;let o=(r.bashContextKeys??le).has(e)?"bash":void 0;return(0,ce.redact)(n,{context:o})}function de(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:x(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:x(e,JSON.stringify(t),r)}}catch{return{stringValue:x(e,String(t),r)}}default:return{stringValue:x(e,String(t),r)}}}function lt(e,t,r={}){let n=[];for(let[o,i]of Object.entries(e)){let a=`${t}.${o}`,u=de(a,i,r);u!==null&&n.push({key:a,value:u})}return n}function ge(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 he(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}function pt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...ge(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...he(o));let i={traceId:pe(e.traceId),spanId:fe(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[i]}]}]}}function ft(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var ye=f($=>{"use strict";Object.defineProperty($,"__esModule",{value:!0});$.evaluateGuard=_t;var dt=1e4,gt="pinta-core";function _e(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}function ht(e){return new Promise((t,r)=>setTimeout(()=>{let n=new Error("Guard request timed out");n.name="TimeoutError",r(n)},e))}async function _t(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??dt,o=Date.now();try{let i=await Promise.race([fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??gt,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e})}),ht(n)]);if(i.status!==200)return _e(Date.now()-o,"error");let a=await i.json(),u=Date.now()-o;return{decision:a.decision,reason:a.reason,userMessage:a.userMessage??null,durationMs:a.durationMs??u,clientRttMs:u}}catch(i){let a=i.name==="TimeoutError"?"timeout":"error";return _e(Date.now()-o,a)}}});var Z=f(y=>{"use strict";var me=y&&y.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(y,"__esModule",{value:!0});y.MemoryRetryQueue=y.DiskRetryQueue=void 0;var l=me(require("fs")),M=me(require("path")),N=1e3,yt=50,mt=5,K=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=M.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{l.default.mkdirSync(M.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
2
- `;l.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
3
- `)}}readAll(){try{let t=l.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
4
- `))if(n.trim())try{r.push(JSON.parse(n))}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){l.default.existsSync(this.filePath)&&l.default.unlinkSync(this.filePath);return}l.default.mkdirSync(M.default.dirname(this.filePath),{recursive:!0}),l.default.writeFileSync(this.filePath,t.map(r=>JSON.stringify(r)).join(`
1
+ "use strict";var ct=Object.create;var ce=Object.defineProperty;var lt=Object.getOwnPropertyDescriptor;var pt=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,dt=Object.prototype.hasOwnProperty;var y=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var gt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of pt(t))!dt.call(e,o)&&o!==r&&ce(e,o,{get:()=>t[o],enumerable:!(n=lt(t,o))||n.enumerable});return e};var P=(e,t,r)=>(r=e!=null?ct(ft(e)):{},gt(t||!e||!e.__esModule?ce(r,"default",{value:e,enumerable:!0}):r,e));var Y=y(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.PATTERNS=f.MAX_BYTES=void 0;f.truncateTo=le;f.truncate=_t;f.collectMatches=pe;f.resolveOverlaps=fe;f.applyMatches=de;f.redact=ht;f.MAX_BYTES=102400;function le(e,t){let r=Buffer.from(e,"utf-8");return r.length<=t?e:`${r.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${r.length}]`}function _t(e){return le(e,f.MAX_BYTES)}f.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function pe(e,t){let r=[];for(let n of f.PATTERNS){if(n.requireContext&&n.requireContext!==t.context)continue;let o=new RegExp(n.regex.source,n.regex.flags),i;for(;(i=o.exec(e))!==null;){let a=n.captureGroup??0,u=i[a];if(u===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}let c=i.index,d=i.index+i[0].length,_=c+i[0].indexOf(u),G=_+u.length;r.push({start:c,end:d,replaceStart:_,replaceEnd:G,type:n.type}),i.index===o.lastIndex&&o.lastIndex++}}return r}function fe(e){let t=[...e].sort((o,i)=>o.start!==i.start?o.start-i.start:i.end-i.start-(o.end-o.start)),r=[],n=-1;for(let o of t)o.start<n||(r.push(o),n=o.end);return r}function de(e,t){let r=[...t].sort((o,i)=>i.replaceStart-o.replaceStart),n=e;for(let o of r)n=n.slice(0,o.replaceStart)+`[REDACTED:${o.type}]`+n.slice(o.replaceEnd);return n}function ht(e,t={}){if(e.length===0)return e;let r=pe(e,t);if(r.length===0)return e;let n=fe(r);return de(e,n)}});var K=y(p=>{"use strict";var yt=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=ye;p.newSpanId=me;p.snakeCase=St;p.toOtlpValue=Pe;p.attrsFromRecord=Ot;p.guardAttrs=Se;p.clientAttrs=Oe;p.enforceSpanBudget=Te;p.buildPayload=Tt;p.mergeBatch=vt;var mt=yt(require("crypto")),X=Y(),Pt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ye(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let n of e){let o=Pt.indexOf(n);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${n}"`);t=t<<5n|BigInt(o)}let r=(1n<<128n)-1n;return t&=r,t.toString(16).padStart(32,"0")}function me(){return mt.default.randomBytes(8).toString("hex")}function St(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var ge=new Set;function x(e,t,r){let n=(0,X.truncate)(t);if((r.skipRedactKeys??ge).has(e))return n;let o=(r.bashContextKeys??ge).has(e)?"bash":void 0;return(0,X.redact)(n,{context:o})}function Pe(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:x(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:x(e,JSON.stringify(t),r)}}catch{return{stringValue:x(e,String(t),r)}}default:return{stringValue:x(e,String(t),r)}}}function Ot(e,t,r={}){let n=[];for(let[o,i]of Object.entries(e)){let a=`${t}.${o}`,u=Pe(a,i,r);u!==null&&n.push({key:a,value:u})}return n}function Se(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function Oe(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}p.MAX_SPAN_BYTES=800*1024;function _e(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var he=1024;function Te(e,t=p.MAX_SPAN_BYTES){let r=_e(e);for(let n=0;n<100&&r>t;n++){let o=null,i=0;for(let c of e.attributes){if(!("stringValue"in c.value))continue;let d=Buffer.byteLength(c.value.stringValue,"utf-8");d>i&&(i=d,o=c.value)}if(o===null||i<=he)break;let a=r-t,u=Math.max(he,i-a-64);o.stringValue=(0,X.truncateTo)(o.stringValue,u),r=_e(e)}return e}function Tt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...Se(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...Oe(o));let i={traceId:ye(e.traceId),spanId:me(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return Te(i),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[i]}]}]}}function vt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var ve=y(Z=>{"use strict";Object.defineProperty(Z,"__esModule",{value:!0});Z.evaluateGuard=At;var Et=1e4,bt="pinta-core";function z(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var kt=new Set(["ALLOW","DENY","REVIEW"]);async function At(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??Et,o=Date.now(),i=new AbortController,a=setTimeout(()=>i.abort(),n);try{let u=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??bt,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e}),signal:i.signal});if(u.status!==200)return z(Date.now()-o,"error");let c=await u.json(),d=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!kt.has(c.decision)||!d)return z(Date.now()-o,"error");let _=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??_,clientRttMs:_}}catch(u){let c=u.name,d=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return z(Date.now()-o,d)}finally{clearTimeout(a)}}});var D=y(I=>{"use strict";var wt=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.atomicWriteFileSync=Mt;var Ee=wt(require("fs"));function Mt(e,t){let r=`${e}.${process.pid}.tmp`;Ee.default.writeFileSync(r,t),Ee.default.renameSync(r,e)}});var W=y(S=>{"use strict";var be=S&&S.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(S,"__esModule",{value:!0});S.MemoryRetryQueue=S.DiskRetryQueue=void 0;var g=be(require("fs")),j=be(require("path")),It=D(),q=1e3,Rt=50,Nt=5,J=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=j.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{g.default.mkdirSync(j.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
2
+ `;g.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
3
+ `)}}readAll(){try{let t=g.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
4
+ `))if(n.trim())try{let o=JSON.parse(n);Array.isArray(o?.payload?.resourceSpans)&&r.push(o)}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){g.default.existsSync(this.filePath)&&g.default.unlinkSync(this.filePath);return}g.default.mkdirSync(j.default.dirname(this.filePath),{recursive:!0}),(0,It.atomicWriteFileSync)(this.filePath,t.map(r=>JSON.stringify(r)).join(`
5
5
  `)+`
6
6
  `)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
7
- `)}}tryAcquireLock(){let t=Date.now();for(l.default.mkdirSync(M.default.dirname(this.lockPath),{recursive:!0});Date.now()-t<yt;)try{let r=l.default.openSync(this.lockPath,"wx");return l.default.writeSync(r,String(process.pid)),l.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
8
- `),!1;try{let i=l.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){l.default.unlinkSync(this.lockPath);continue}}catch{}let n=mt,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{l.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=N)return;let r=t.length-N;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
9
- `),this.rewrite(t.slice(r))}};y.DiskRetryQueue=K;var B=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>N&&this.entries.splice(0,this.entries.length-N)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};y.MemoryRetryQueue=B});var ve=f(d=>{"use strict";Object.defineProperty(d,"__esModule",{value:!0});d.MemoryTransport=d.DiskTransport=void 0;d.parseHeadersEnv=Te;d.envOptionsResolver=Se;d.postOtlp=k;var Pe=Z(),Oe=V(),Pt=5e3;function Te(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let r of e.split(",")){let[n,...o]=r.split("=");n&&o.length>0&&(t[n.trim()]=o.join("=").trim())}return t}function Se(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:Te(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function k(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Pt);try{let i=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!i.ok){let a="";try{a=(await i.text()).slice(0,200)}catch{}let u=i.status===401||i.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":i.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":i.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${i.status} ${t.endpoint}${u}${a?` body=${a}`:""}
7
+ `)}}tryAcquireLock(){let t=Date.now();try{g.default.mkdirSync(j.default.dirname(this.lockPath),{recursive:!0})}catch(r){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${r}
8
+ `),!1}for(;Date.now()-t<Rt;)try{let r=g.default.openSync(this.lockPath,"wx");return g.default.writeSync(r,String(process.pid)),g.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
9
+ `),!1;try{let i=g.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){g.default.unlinkSync(this.lockPath);continue}}catch{}let n=Nt,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{g.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=q)return;let r=t.length-q;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
10
+ `),this.rewrite(t.slice(r))}};S.DiskRetryQueue=J;var H=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>q&&this.entries.splice(0,this.entries.length-q)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};S.MemoryRetryQueue=H});var Re=y(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});l.MemoryTransport=l.DiskTransport=l.MAX_POST_BYTES=void 0;l.parseHeadersEnv=Me;l.envOptionsResolver=Ie;l.postOtlp=R;var ke=W(),Ae=K(),xt=5e3;l.MAX_POST_BYTES=900*1024;function C(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function we(e,t,r){let n=[],o=[],i=[],a=0;for(let u of e){let c=t(u);if(c>r){o.push(u);continue}i.length>0&&a+c>r&&(n.push(i),i=[],a=0),i.push(u),a+=c}return i.length>0&&n.push(i),{chunks:n,oversize:o}}function Me(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let r of e.split(",")){let[n,...o]=r.split("=");n&&o.length>0&&(t[n.trim()]=o.join("=").trim())}return t}function Ie(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:Me(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function R(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),xt);try{let i=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!i.ok){let a="";try{a=(await i.text()).slice(0,200)}catch{}let u=i.status===401||i.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":i.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":i.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${i.status} ${t.endpoint}${u}${a?` body=${a}`:""}
10
11
  `),!1}return!0}catch(i){return process.stderr.write(`[${r}] OTLP POST failed: ${i.message??String(i)}
11
- `),!1}finally{clearTimeout(o)}}var X=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new Pe.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Se}async send(t){let r=this.resolveOptions();if(!r)return;await k(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let n=(0,Oe.mergeBatch)(r.map(i=>i.payload));await k(n,t,this.logPrefix)&&this.queue.rewrite([])}finally{this.queue.release()}}};d.DiskTransport=X;var J=class{queue=new Pe.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;await k(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let n=(0,Oe.mergeBatch)(r);if(!await k(n,t,this.logPrefix))for(let i of r)this.queue.enqueue(i)}};d.MemoryTransport=J});var W=f(O=>{"use strict";var Q=O&&O.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(O,"__esModule",{value:!0});O.TraceManager=void 0;O.generateUlid=Ee;var Y=Q(require("fs")),Ot=Q(require("path")),Tt=Q(require("crypto")),H="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ee(){let e=Date.now(),t="",r=e;for(let i=0;i<10;i++)t=H[r&31]+t,r=Math.floor(r/32);let n=Tt.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=H[n[i]&31];for(;o.length<16;)o+=H[0];return t+o}var z=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ee();return this.save(t),t}currentTrace(){try{let t=Y.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){Y.default.mkdirSync(Ot.default.dirname(this.tracePath),{recursive:!0}),Y.default.writeFileSync(this.tracePath,JSON.stringify({traceId:t}))}};O.TraceManager=z});var Ae=f(m=>{"use strict";var be=m&&m.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(m,"__esModule",{value:!0});m.MemorySessionTraceManager=m.DiskSessionTraceManager=void 0;var ee=be(require("fs")),St=be(require("path")),ke=W(),we=200,te=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??we}read(){try{let t=JSON.parse(ee.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{ee.default.mkdirSync(St.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;ee.default.writeFileSync(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,ke.generateUlid)(),o=this.read();return o[r]=n,this.write(o),n}currentTrace(t){let r=t||"default",n=this.read()[r];return n||this.newTrace(r)}};m.DiskSessionTraceManager=te;var re=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??we}newTrace(t){let r=t||"default",n=(0,ke.generateUlid)();if(this.map.set(r,n),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return n}currentTrace(t){let r=t||"default";return this.map.get(r)??this.newTrace(r)}};m.MemorySessionTraceManager=re});var xe=f(T=>{"use strict";var ne=T&&T.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(T,"__esModule",{value:!0});T.envFilePath=bt;T.parseEnvFile=Ie;T.loadEnvFile=kt;var vt=ne(require("node:fs")),Et=ne(require("node:os")),Re=ne(require("node:path"));function bt(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:Re.default.join(Et.default.homedir(),e);return Re.default.join(o,t)}function Ie(e){let t={};for(let r of e.split(`
12
- `)){let n=r.trim();if(!n||n.startsWith("#"))continue;let o=n.indexOf("=");if(o<0)continue;let i=n.slice(0,o).trim(),a=n.slice(o+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),i&&(t[i]=a)}return t}function kt(e){let t;try{t=vt.default.readFileSync(e,"utf-8")}catch{return}let r=Ie(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var b=f(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.loadEnvFile=s.parseEnvFile=s.envFilePath=s.MemorySessionTraceManager=s.DiskSessionTraceManager=s.generateUlid=s.TraceManager=s.parseHeadersEnv=s.envOptionsResolver=s.postOtlp=s.MemoryTransport=s.DiskTransport=s.MemoryRetryQueue=s.DiskRetryQueue=s.evaluateGuard=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.truncate=s.redact=void 0;var S=G();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return S.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return S.truncate}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return S.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return S.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return S.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return S.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return S.MAX_BYTES}});var g=V();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return g.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return g.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return g.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return g.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return g.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return g.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return g.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return g.buildPayload}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return g.mergeBatch}});var wt=ye();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return wt.evaluateGuard}});var Me=Z();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return Me.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return Me.MemoryRetryQueue}});var w=ve();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}});var Ne=W();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return Ne.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return Ne.generateUlid}});var De=Ae();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return De.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return De.MemorySessionTraceManager}});var oe=xe();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return oe.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return oe.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return oe.loadEnvFile}})});var A=_(b());function At(){return(0,A.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function je(e=At()){(0,A.loadEnvFile)(e)}var Ce=_(require("os")),D=_(require("path"));function Rt(){return process.env.COPILOT_HOME||D.default.join(Ce.default.homedir(),".copilot")}function qe(){let e=process.env.COPILOT_PLUGIN_DATA||D.default.join(Rt(),"pinta-copilot-data");return{pluginData:e,tracePath:D.default.join(e,"trace.json")}}function Le(e=process.env){return e.COPILOT_AGENT_JOB_ID||e.COPILOT_AGENT_SESSION_ID||e.COPILOT_AGENT_PROMPT?"cloud":e.ELECTRON_RUN_AS_NODE||e.VSCODE_IPC_HOOK||e.VSCODE_PID?"ext":"cli"}function v(e){return typeof e=="string"?e:void 0}function j(e){return v(e.hook_event_name)??v(e.hookEventName)??v(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function Fe(e){return v(e.session_id)??v(e.sessionId)}function Ue(e){return v(e.tool_name)??v(e.toolName)}function Ge(e){return e.tool_input??e.toolArgs??e.toolInput}var It={sessionstart:"SessionStart",sessionend:"SessionEnd",userpromptsubmit:"UserPromptSubmit",userpromptsubmitted:"UserPromptSubmit",pretooluse:"PreToolUse",posttooluse:"PostToolUse",posttoolusefailure:"PostToolUseFailure",stop:"Stop",agentstop:"Stop",subagentstart:"SubagentStart",subagentstop:"SubagentStop",precompact:"PreCompact",notification:"Notification",permissionrequest:"PermissionRequest",erroroccurred:"ErrorOccurred"};function Ve(e){let t=j(e);return t?It[t.toLowerCase()]??"Unknown":"Unknown"}function $e(e){return e==="PreToolUse"||e==="PermissionRequest"}var xt=new Set(["report_intent","ask_user"]);function Ke(e){return e!==void 0&&xt.has(e)}function Be(e,t){return e==="PreToolUse"?JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}}):e==="PermissionRequest"?JSON.stringify({behavior:"deny",message:t}):null}var q=_(b());function Mt(){let e=process.env.COPILOT_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:(0,q.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var C=class extends q.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:Mt})}};var Ze=_(b()),L=class extends Ze.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var F=_(require("os")),E=_(b());var Xe="0.5.0";function Nt(){return process.env.COPILOT_CLI_VERSION||"unknown"}var Dt=new Set(["copilot.hook","copilot.tool_name","copilot.toolName","copilot.tool_use_id","copilot.toolUseId","copilot.session_id","copilot.sessionId","copilot.transcript_path","copilot.transcriptPath","copilot.cwd","copilot.permission_mode","copilot.surface","copilot.agent_id","copilot.agent_type","copilot.agent_name","copilot.agent_display_name","copilot.stop_reason","copilot.notification_type"]),jt=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),Ct={skipRedactKeys:Dt,bashContextKeys:jt},qt=new Set(["hook_event_name","hookEventName","hookName"]);function Lt(e,t){let r=Object.fromEntries(Object.entries(e).filter(([n])=>!qt.has(n)));return[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:j(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,E.attrsFromRecord)(r,"copilot",Ct)]}function Ft(){return[{key:"service.name",value:{stringValue:"copilot"}},{key:"service.version",value:{stringValue:Nt()}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:Xe}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:F.default.userInfo().username}},{key:"host.name",value:{stringValue:F.default.hostname()}},{key:"host.arch",value:{stringValue:F.default.arch()}}]}function Je(e){return(0,E.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,E.snakeCase)(j(e.event)??"unknown")}`,attributes:Lt(e.event,e.surface),resource:Ft(),scope:{name:"pinta-copilot",version:Xe},now:e.now,guard:e.guard})}var Ye=_(b());function Ut(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||50}var Gt="pinta-copilot/0.5.0";function He(e,t){return(0,Ye.evaluateGuard)(e,t,{timeoutMs:Ut(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Gt})}async function Vt(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function ze(){try{let e=qe(),t=Le(),r=await Vt(),n=JSON.parse(r),o=Ve(n),i=Fe(n),a=new C(e);await a.flush();let u=new L(e),R=o==="UserPromptSubmit"?u.newTrace(i):u.currentTrace(i),I=Ue(n),h=null;if($e(o)&&!Ke(I)){let P=Ge(n);h=await He({spanId:i??"unknown",toolName:I,toolInput:P,rawTextFields:{toolInput:typeof P=="string"?P:JSON.stringify(P??null)}},process.env.PINTA_GUARD_ENDPOINT)}let U=Je({event:n,traceId:R,surface:t,guard:h});if(await a.send(U),h?.decision==="DENY"){let P=Be(o,h.userMessage??h.reason??"guard_deny");P&&process.stdout.write(P+`
13
- `)}}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
14
- `)}return 0}je();async function $t(){let e=await ze();process.exit(e)}$t();
12
+ `),!1}finally{clearTimeout(o)}}var Q=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new ke.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Ie}async send(t){let r=this.resolveOptions();if(!r||this.dropIfOversized(t))return;await R(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let{chunks:n,oversize:o}=we(r,u=>C(u.payload),l.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized retry ${o.length===1?"entry":"entries"} (each > ${l.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
13
+ `);let i=[].concat(...n),a=0;for(let u of n){if(!await R((0,Ae.mergeBatch)(u.map(d=>d.payload)),t,this.logPrefix))break;a+=u.length}this.queue.rewrite(i.slice(a))}catch(r){process.stderr.write(`[${this.logPrefix}] flush failed: ${r?.message??String(r)}
14
+ `)}finally{this.queue.release()}}dropIfOversized(t){let r=C(t);return r<=l.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${r} > ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
15
+ `),!0)}};l.DiskTransport=Q;var ee=class{queue=new ke.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;if(C(t)>l.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
16
+ `);return}await R(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let{chunks:n,oversize:o}=we(r,C,l.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized buffered ${o.length===1?"payload":"payloads"} (each > ${l.MAX_POST_BYTES} bytes \u2014 undeliverable)
17
+ `);let i=[].concat(...n),a=0;for(let u of n){if(!await R((0,Ae.mergeBatch)(u),t,this.logPrefix))break;a+=u.length}for(let u of i.slice(a))this.queue.enqueue(u)}};l.MemoryTransport=ee});var oe=y(E=>{"use strict";var ne=E&&E.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(E,"__esModule",{value:!0});E.TraceManager=void 0;E.generateUlid=xe;var Ne=ne(require("fs")),Dt=ne(require("path")),jt=ne(require("crypto")),qt=D(),te="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function xe(){let e=Date.now(),t="",r=e;for(let i=0;i<10;i++)t=te[r&31]+t,r=Math.floor(r/32);let n=jt.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=te[n[i]&31];for(;o.length<16;)o+=te[0];return t+o}var re=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=xe();return this.save(t),t}currentTrace(){try{let t=Ne.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){try{Ne.default.mkdirSync(Dt.default.dirname(this.tracePath),{recursive:!0}),(0,qt.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(r){process.stderr.write(`[pinta-core] trace persistence failed: ${r}
18
+ `)}}};E.TraceManager=re});var Le=y(O=>{"use strict";var je=O&&O.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(O,"__esModule",{value:!0});O.MemorySessionTraceManager=O.DiskSessionTraceManager=void 0;var De=je(require("fs")),Ct=je(require("path")),qe=oe(),Lt=D(),Ce=200,se=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??Ce}read(){try{let t=JSON.parse(De.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{De.default.mkdirSync(Ct.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;(0,Lt.atomicWriteFileSync)(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,qe.generateUlid)(),o=this.read();return o[r]=n,this.write(o),n}currentTrace(t){let r=t||"default",n=this.read()[r];return n||this.newTrace(r)}};O.DiskSessionTraceManager=se;var ie=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ce}newTrace(t){let r=t||"default",n=(0,qe.generateUlid)();if(this.map.set(r,n),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return n}currentTrace(t){let r=t||"default";return this.map.get(r)??this.newTrace(r)}};O.MemorySessionTraceManager=ie});var Fe=y(b=>{"use strict";var ae=b&&b.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(b,"__esModule",{value:!0});b.envFilePath=Ft;b.parseEnvFile=$e;b.loadEnvFile=Vt;var Bt=ae(require("node:fs")),$t=ae(require("node:os")),Be=ae(require("node:path"));function Ft(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:Be.default.join($t.default.homedir(),e);return Be.default.join(o,t)}function $e(e){let t={};for(let r of e.split(`
19
+ `)){let n=r.trim();if(!n||n.startsWith("#"))continue;let o=n.indexOf("=");if(o<0)continue;let i=n.slice(0,o).trim(),a=n.slice(o+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),i&&(t[i]=a)}return t}function Vt(e){let t;try{t=Bt.default.readFileSync(e,"utf-8")}catch{return}let r=$e(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var w=y(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 T=Y();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return T.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return T.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return T.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return T.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return T.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return T.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return T.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return T.MAX_BYTES}});var h=K();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return h.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return h.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return h.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return h.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return h.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return h.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return h.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return h.buildPayload}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return h.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return h.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return h.MAX_SPAN_BYTES}});var Ut=ve();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Ut.evaluateGuard}});var Ve=W();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return Ve.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return Ve.MemoryRetryQueue}});var A=Re();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return A.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return A.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return A.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return A.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return A.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return A.MAX_POST_BYTES}});var Ue=oe();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return Ue.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return Ue.generateUlid}});var Ge=Le();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Ge.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Ge.MemorySessionTraceManager}});var ue=Fe();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 N=P(w());function Gt(){return(0,N.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function Ye(e=Gt()){(0,N.loadEnvFile)(e)}var Xe=P(require("os")),L=P(require("path"));function Yt(){return process.env.COPILOT_HOME||L.default.join(Xe.default.homedir(),".copilot")}function Ke(){let e=process.env.COPILOT_PLUGIN_DATA||L.default.join(Yt(),"pinta-copilot-data");return{pluginData:e,tracePath:L.default.join(e,"trace.json")}}function ze(e=process.env){return e.COPILOT_AGENT_JOB_ID||e.COPILOT_AGENT_SESSION_ID||e.COPILOT_AGENT_PROMPT?"cloud":e.ELECTRON_RUN_AS_NODE||e.VSCODE_IPC_HOOK||e.VSCODE_PID?"ext":"cli"}function m(e){return typeof e=="string"?e:void 0}function M(e){return m(e.hook_event_name)??m(e.hookEventName)??m(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function Ze(e){return m(e.session_id)??m(e.sessionId)}function Je(e){return m(e.tool_name)??m(e.toolName)}function He(e){return m(e.cwd)??m(e.workingDirectory)}function We(e){return e.tool_input??e.toolArgs??e.toolInput}var Xt={sessionstart:"SessionStart",sessionend:"SessionEnd",userpromptsubmit:"UserPromptSubmit",userpromptsubmitted:"UserPromptSubmit",pretooluse:"PreToolUse",posttooluse:"PostToolUse",posttoolusefailure:"PostToolUseFailure",stop:"Stop",agentstop:"Stop",subagentstart:"SubagentStart",subagentstop:"SubagentStop",precompact:"PreCompact",notification:"Notification",permissionrequest:"PermissionRequest",erroroccurred:"ErrorOccurred"};function Qe(e){let t=M(e);return t?Xt[t.toLowerCase()]??"Unknown":"Unknown"}function et(e){return e==="PreToolUse"||e==="PermissionRequest"}var Kt=new Set(["report_intent","ask_user"]);function tt(e){return e!==void 0&&Kt.has(e)}function rt(e,t){return e==="PreToolUse"?JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}}):e==="PermissionRequest"?JSON.stringify({behavior:"deny",message:t}):null}var $=P(w());function zt(){let e=process.env.COPILOT_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:(0,$.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var B=class extends $.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:zt})}};var nt=P(w()),F=class extends nt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var U=P(require("os")),k=P(w());var V;function Zt(){if(V===void 0)try{V=U.default.userInfo().username}catch{V=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return V}var ot="0.6.0";function Jt(){return process.env.COPILOT_CLI_VERSION||"unknown"}var Ht=new Set(["copilot.hook","copilot.tool_name","copilot.toolName","copilot.tool_use_id","copilot.toolUseId","copilot.session_id","copilot.sessionId","copilot.transcript_path","copilot.transcriptPath","copilot.cwd","copilot.permission_mode","copilot.surface","copilot.agent_id","copilot.agent_type","copilot.agent_name","copilot.agent_display_name","copilot.stop_reason","copilot.notification_type"]),Wt=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),Qt={skipRedactKeys:Ht,bashContextKeys:Wt},er=new Set(["hook_event_name","hookEventName","hookName"]);function tr(e,t){let r=Object.fromEntries(Object.entries(e).filter(([n])=>!er.has(n)));return[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:M(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,k.attrsFromRecord)(r,"copilot",Qt)]}function rr(){return[{key:"service.name",value:{stringValue:"copilot"}},{key:"service.version",value:{stringValue:Jt()}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:ot}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Zt()}},{key:"host.name",value:{stringValue:U.default.hostname()}},{key:"host.arch",value:{stringValue:U.default.arch()}}]}function st(e){return(0,k.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,k.snakeCase)(M(e.event)??"unknown")}`,attributes:tr(e.event,e.surface),resource:rr(),scope:{name:"pinta-copilot",version:ot},now:e.now,guard:e.guard})}var it=P(w());function nr(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||50}var or="pinta-copilot/0.6.0";function at(e,t){return(0,it.evaluateGuard)(e,t,{timeoutMs:nr(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:or})}async function sr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function ut(){try{let e=Ke(),t=ze(),r=await sr(),n=JSON.parse(r),o=Qe(n),i=Ze(n),a=new B(e);await a.flush();let u=new F(e),c=o==="UserPromptSubmit"?u.newTrace(i):u.currentTrace(i),d=Je(n),_=null;if(et(o)&&!tt(d)){let v=We(n);_=await at({spanId:i??"unknown",toolName:d,method:M(n),cwd:He(n),toolInput:v,rawTextFields:{toolInput:typeof v=="string"?v:JSON.stringify(v??null)}},process.env.PINTA_GUARD_ENDPOINT)}if(_?.decision==="DENY"){let v=rt(o,_.userMessage??_.reason??"guard_deny");v&&process.stdout.write(v+`
20
+ `)}let G=st({event:n,traceId:c,surface:t,guard:_});await a.send(G)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
21
+ `)}return 0}Ye();async function ir(){let e=await ut();process.exit(e)}ir();
package/dist/index.mjs CHANGED
@@ -1,15 +1,22 @@
1
1
  import{createRequire as __pintaCreateRequire}from 'node:module';const require=__pintaCreateRequire(import.meta.url);
2
- var dt=Object.create;var fe=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames;var ht=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var d=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var m=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var _t=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of gt(t))!yt.call(e,o)&&o!==r&&fe(e,o,{get:()=>t[o],enumerable:!(n=mt(t,o))||n.enumerable});return e};var I=(e,t,r)=>(r=e!=null?dt(ht(e)):{},_t(t||!e||!e.__esModule?fe(r,"default",{value:e,enumerable:!0}):r,e));var $=m(c=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});c.PATTERNS=c.MAX_BYTES=void 0;c.truncate=Pt;c.collectMatches=de;c.resolveOverlaps=me;c.applyMatches=ge;c.redact=St;c.MAX_BYTES=102400;function Pt(e){let t=Buffer.from(e,"utf-8");return t.length<=c.MAX_BYTES?e:`${t.subarray(0,c.MAX_BYTES).toString("utf-8")}\u2026[TRUNCATED:${t.length}]`}c.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function de(e,t){let r=[];for(let n of c.PATTERNS){if(n.requireContext&&n.requireContext!==t.context)continue;let o=new RegExp(n.regex.source,n.regex.flags),s;for(;(s=o.exec(e))!==null;){let a=n.captureGroup??0,u=s[a];if(u===void 0){s.index===o.lastIndex&&o.lastIndex++;continue}let p=s.index,b=s.index+s[0].length,y=p+s[0].indexOf(u),U=y+u.length;r.push({start:p,end:b,replaceStart:y,replaceEnd:U,type:n.type}),s.index===o.lastIndex&&o.lastIndex++}}return r}function me(e){let t=[...e].sort((o,s)=>o.start!==s.start?o.start-s.start:s.end-s.start-(o.end-o.start)),r=[],n=-1;for(let o of t)o.start<n||(r.push(o),n=o.end);return r}function ge(e,t){let r=[...t].sort((o,s)=>s.replaceStart-o.replaceStart),n=e;for(let o of r)n=n.slice(0,o.replaceStart)+`[REDACTED:${o.type}]`+n.slice(o.replaceEnd);return n}function St(e,t={}){if(e.length===0)return e;let r=de(e,t);if(r.length===0)return e;let n=me(r);return ge(e,n)}});var G=m(f=>{"use strict";var Ot=f&&f.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(f,"__esModule",{value:!0});f.ulidToTraceId=_e;f.newSpanId=Pe;f.snakeCase=Et;f.toOtlpValue=Se;f.attrsFromRecord=wt;f.guardAttrs=Oe;f.clientAttrs=Te;f.buildPayload=bt;f.mergeBatch=kt;var Tt=Ot(d("crypto")),he=$(),vt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function _e(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let n of e){let o=vt.indexOf(n);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${n}"`);t=t<<5n|BigInt(o)}let r=(1n<<128n)-1n;return t&=r,t.toString(16).padStart(32,"0")}function Pe(){return Tt.default.randomBytes(8).toString("hex")}function Et(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var ye=new Set;function M(e,t,r){let n=(0,he.truncate)(t);if((r.skipRedactKeys??ye).has(e))return n;let o=(r.bashContextKeys??ye).has(e)?"bash":void 0;return(0,he.redact)(n,{context:o})}function Se(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:M(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:M(e,JSON.stringify(t),r)}}catch{return{stringValue:M(e,String(t),r)}}default:return{stringValue:M(e,String(t),r)}}}function wt(e,t,r={}){let n=[];for(let[o,s]of Object.entries(e)){let a=`${t}.${o}`,u=Se(a,s,r);u!==null&&n.push({key:a,value:u})}return n}function Oe(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function Te(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}function bt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...Oe(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...Te(o));let s={traceId:_e(e.traceId),spanId:Pe(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]}}function kt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var Ee=m(V=>{"use strict";Object.defineProperty(V,"__esModule",{value:!0});V.evaluateGuard=At;var It=1e4,xt="pinta-core";function ve(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}function Rt(e){return new Promise((t,r)=>setTimeout(()=>{let n=new Error("Guard request timed out");n.name="TimeoutError",r(n)},e))}async function At(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??It,o=Date.now();try{let s=await Promise.race([fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??xt,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e})}),Rt(n)]);if(s.status!==200)return ve(Date.now()-o,"error");let a=await s.json(),u=Date.now()-o;return{decision:a.decision,reason:a.reason,userMessage:a.userMessage??null,durationMs:a.durationMs??u,clientRttMs:u}}catch(s){let a=s.name==="TimeoutError"?"timeout":"error";return ve(Date.now()-o,a)}}});var Z=m(_=>{"use strict";var we=_&&_.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(_,"__esModule",{value:!0});_.MemoryRetryQueue=_.DiskRetryQueue=void 0;var l=we(d("fs")),D=we(d("path")),N=1e3,Mt=50,Dt=5,B=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=D.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{l.default.mkdirSync(D.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
- `;l.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
4
- `)}}readAll(){try{let t=l.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
5
- `))if(n.trim())try{r.push(JSON.parse(n))}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){l.default.existsSync(this.filePath)&&l.default.unlinkSync(this.filePath);return}l.default.mkdirSync(D.default.dirname(this.filePath),{recursive:!0}),l.default.writeFileSync(this.filePath,t.map(r=>JSON.stringify(r)).join(`
2
+ var bt=Object.create;var me=Object.defineProperty;var wt=Object.getOwnPropertyDescriptor;var kt=Object.getOwnPropertyNames;var At=Object.getPrototypeOf,Mt=Object.prototype.hasOwnProperty;var m=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var _=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var It=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of kt(t))!Mt.call(e,o)&&o!==r&&me(e,o,{get:()=>t[o],enumerable:!(n=wt(t,o))||n.enumerable});return e};var I=(e,t,r)=>(r=e!=null?bt(At(e)):{},It(t||!e||!e.__esModule?me(r,"default",{value:e,enumerable:!0}):r,e));var X=_(d=>{"use strict";Object.defineProperty(d,"__esModule",{value:!0});d.PATTERNS=d.MAX_BYTES=void 0;d.truncateTo=ye;d.truncate=Rt;d.collectMatches=_e;d.resolveOverlaps=Se;d.applyMatches=Pe;d.redact=xt;d.MAX_BYTES=102400;function ye(e,t){let r=Buffer.from(e,"utf-8");return r.length<=t?e:`${r.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${r.length}]`}function Rt(e){return ye(e,d.MAX_BYTES)}d.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function _e(e,t){let r=[];for(let n of d.PATTERNS){if(n.requireContext&&n.requireContext!==t.context)continue;let o=new RegExp(n.regex.source,n.regex.flags),s;for(;(s=o.exec(e))!==null;){let c=n.captureGroup??0,a=s[c];if(a===void 0){s.index===o.lastIndex&&o.lastIndex++;continue}let u=s.index,l=s.index+s[0].length,g=u+s[0].indexOf(a),G=g+a.length;r.push({start:u,end:l,replaceStart:g,replaceEnd:G,type:n.type}),s.index===o.lastIndex&&o.lastIndex++}}return r}function Se(e){let t=[...e].sort((o,s)=>o.start!==s.start?o.start-s.start:s.end-s.start-(o.end-o.start)),r=[],n=-1;for(let o of t)o.start<n||(r.push(o),n=o.end);return r}function Pe(e,t){let r=[...t].sort((o,s)=>s.replaceStart-o.replaceStart),n=e;for(let o of r)n=n.slice(0,o.replaceStart)+`[REDACTED:${o.type}]`+n.slice(o.replaceEnd);return n}function xt(e,t={}){if(e.length===0)return e;let r=_e(e,t);if(r.length===0)return e;let n=Se(r);return Pe(e,n)}});var K=_(f=>{"use strict";var Nt=f&&f.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(f,"__esModule",{value:!0});f.MAX_SPAN_BYTES=void 0;f.ulidToTraceId=ve;f.newSpanId=be;f.snakeCase=Ct;f.toOtlpValue=we;f.attrsFromRecord=qt;f.guardAttrs=ke;f.clientAttrs=Ae;f.enforceSpanBudget=Me;f.buildPayload=Lt;f.mergeBatch=Ft;var Dt=Nt(m("crypto")),Y=X(),jt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ve(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let n of e){let o=jt.indexOf(n);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${n}"`);t=t<<5n|BigInt(o)}let r=(1n<<128n)-1n;return t&=r,t.toString(16).padStart(32,"0")}function be(){return Dt.default.randomBytes(8).toString("hex")}function Ct(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Te=new Set;function D(e,t,r){let n=(0,Y.truncate)(t);if((r.skipRedactKeys??Te).has(e))return n;let o=(r.bashContextKeys??Te).has(e)?"bash":void 0;return(0,Y.redact)(n,{context:o})}function we(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:D(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:D(e,JSON.stringify(t),r)}}catch{return{stringValue:D(e,String(t),r)}}default:return{stringValue:D(e,String(t),r)}}}function qt(e,t,r={}){let n=[];for(let[o,s]of Object.entries(e)){let c=`${t}.${o}`,a=we(c,s,r);a!==null&&n.push({key:c,value:a})}return n}function ke(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function Ae(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}f.MAX_SPAN_BYTES=800*1024;function Oe(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Ee=1024;function Me(e,t=f.MAX_SPAN_BYTES){let r=Oe(e);for(let n=0;n<100&&r>t;n++){let o=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,o=u.value)}if(o===null||s<=Ee)break;let c=r-t,a=Math.max(Ee,s-c-64);o.stringValue=(0,Y.truncateTo)(o.stringValue,a),r=Oe(e)}return e}function Lt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...ke(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...Ae(o));let s={traceId:ve(e.traceId),spanId:be(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return Me(s),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]}}function Ft(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var Ie=_(Z=>{"use strict";Object.defineProperty(Z,"__esModule",{value:!0});Z.evaluateGuard=Vt;var $t=1e4,Bt="pinta-core";function z(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Ut=new Set(["ALLOW","DENY","REVIEW"]);async function Vt(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??$t,o=Date.now(),s=new AbortController,c=setTimeout(()=>s.abort(),n);try{let a=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??Bt,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e}),signal:s.signal});if(a.status!==200)return z(Date.now()-o,"error");let u=await a.json(),l=u?.durationMs===void 0||typeof u.durationMs=="number"&&Number.isFinite(u.durationMs);if(!u||!Ut.has(u.decision)||!l)return z(Date.now()-o,"error");let g=Date.now()-o;return{decision:u.decision,reason:u.reason??null,userMessage:u.userMessage??null,durationMs:u.durationMs??g,clientRttMs:g}}catch(a){let u=a.name,l=u==="AbortError"||u==="TimeoutError"?"timeout":"error";return z(Date.now()-o,l)}finally{clearTimeout(c)}}});var j=_(R=>{"use strict";var Gt=R&&R.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(R,"__esModule",{value:!0});R.atomicWriteFileSync=Xt;var Re=Gt(m("fs"));function Xt(e,t){let r=`${e}.${process.pid}.tmp`;Re.default.writeFileSync(r,t),Re.default.renameSync(r,e)}});var H=_(P=>{"use strict";var xe=P&&P.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(P,"__esModule",{value:!0});P.MemoryRetryQueue=P.DiskRetryQueue=void 0;var h=xe(m("fs")),C=xe(m("path")),Yt=j(),q=1e3,Kt=50,zt=5,J=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=C.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{h.default.mkdirSync(C.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
+ `;h.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
4
+ `)}}readAll(){try{let t=h.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
5
+ `))if(n.trim())try{let o=JSON.parse(n);Array.isArray(o?.payload?.resourceSpans)&&r.push(o)}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){h.default.existsSync(this.filePath)&&h.default.unlinkSync(this.filePath);return}h.default.mkdirSync(C.default.dirname(this.filePath),{recursive:!0}),(0,Yt.atomicWriteFileSync)(this.filePath,t.map(r=>JSON.stringify(r)).join(`
6
6
  `)+`
7
7
  `)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
8
- `)}}tryAcquireLock(){let t=Date.now();for(l.default.mkdirSync(D.default.dirname(this.lockPath),{recursive:!0});Date.now()-t<Mt;)try{let r=l.default.openSync(this.lockPath,"wx");return l.default.writeSync(r,String(process.pid)),l.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
9
- `),!1;try{let s=l.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){l.default.unlinkSync(this.lockPath);continue}}catch{}let n=Dt,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{l.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=N)return;let r=t.length-N;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
10
- `),this.rewrite(t.slice(r))}};_.DiskRetryQueue=B;var K=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>N&&this.entries.splice(0,this.entries.length-N)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};_.MemoryRetryQueue=K});var Re=m(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.MemoryTransport=g.DiskTransport=void 0;g.parseHeadersEnv=Ie;g.envOptionsResolver=xe;g.postOtlp=x;var be=Z(),ke=G(),Nt=5e3;function Ie(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let r of e.split(",")){let[n,...o]=r.split("=");n&&o.length>0&&(t[n.trim()]=o.join("=").trim())}return t}function xe(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:Ie(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function x(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Nt);try{let s=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!s.ok){let a="";try{a=(await s.text()).slice(0,200)}catch{}let u=s.status===401||s.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":s.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":s.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${s.status} ${t.endpoint}${u}${a?` body=${a}`:""}
8
+ `)}}tryAcquireLock(){let t=Date.now();try{h.default.mkdirSync(C.default.dirname(this.lockPath),{recursive:!0})}catch(r){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${r}
9
+ `),!1}for(;Date.now()-t<Kt;)try{let r=h.default.openSync(this.lockPath,"wx");return h.default.writeSync(r,String(process.pid)),h.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
10
+ `),!1;try{let s=h.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){h.default.unlinkSync(this.lockPath);continue}}catch{}let n=zt,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{h.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=q)return;let r=t.length-q;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
11
+ `),this.rewrite(t.slice(r))}};P.DiskRetryQueue=J;var W=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>q&&this.entries.splice(0,this.entries.length-q)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};P.MemoryRetryQueue=W});var Le=_(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.MemoryTransport=p.DiskTransport=p.MAX_POST_BYTES=void 0;p.parseHeadersEnv=Ce;p.envOptionsResolver=qe;p.postOtlp=x;var Ne=H(),De=K(),Zt=5e3;p.MAX_POST_BYTES=900*1024;function L(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function je(e,t,r){let n=[],o=[],s=[],c=0;for(let a of e){let u=t(a);if(u>r){o.push(a);continue}s.length>0&&c+u>r&&(n.push(s),s=[],c=0),s.push(a),c+=u}return s.length>0&&n.push(s),{chunks:n,oversize:o}}function Ce(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let r of e.split(",")){let[n,...o]=r.split("=");n&&o.length>0&&(t[n.trim()]=o.join("=").trim())}return t}function qe(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:Ce(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function x(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Zt);try{let s=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!s.ok){let c="";try{c=(await s.text()).slice(0,200)}catch{}let a=s.status===401||s.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":s.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":s.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${s.status} ${t.endpoint}${a}${c?` body=${c}`:""}
11
12
  `),!1}return!0}catch(s){return process.stderr.write(`[${r}] OTLP POST failed: ${s.message??String(s)}
12
- `),!1}finally{clearTimeout(o)}}var X=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new be.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??xe}async send(t){let r=this.resolveOptions();if(!r)return;await x(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let n=(0,ke.mergeBatch)(r.map(s=>s.payload));await x(n,t,this.logPrefix)&&this.queue.rewrite([])}finally{this.queue.release()}}};g.DiskTransport=X;var z=class{queue=new be.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;await x(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let n=(0,ke.mergeBatch)(r);if(!await x(n,t,this.logPrefix))for(let s of r)this.queue.enqueue(s)}};g.MemoryTransport=z});var W=m(O=>{"use strict";var Q=O&&O.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(O,"__esModule",{value:!0});O.TraceManager=void 0;O.generateUlid=Ae;var H=Q(d("fs")),jt=Q(d("path")),Ct=Q(d("crypto")),J="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ae(){let e=Date.now(),t="",r=e;for(let s=0;s<10;s++)t=J[r&31]+t,r=Math.floor(r/32);let n=Ct.default.randomBytes(10),o="";for(let s=0;s<10;s++)o+=J[n[s]&31];for(;o.length<16;)o+=J[0];return t+o}var Y=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ae();return this.save(t),t}currentTrace(){try{let t=H.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){H.default.mkdirSync(jt.default.dirname(this.tracePath),{recursive:!0}),H.default.writeFileSync(this.tracePath,JSON.stringify({traceId:t}))}};O.TraceManager=Y});var je=m(P=>{"use strict";var Me=P&&P.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(P,"__esModule",{value:!0});P.MemorySessionTraceManager=P.DiskSessionTraceManager=void 0;var ee=Me(d("fs")),qt=Me(d("path")),De=W(),Ne=200,te=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??Ne}read(){try{let t=JSON.parse(ee.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{ee.default.mkdirSync(qt.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;ee.default.writeFileSync(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,De.generateUlid)(),o=this.read();return o[r]=n,this.write(o),n}currentTrace(t){let r=t||"default",n=this.read()[r];return n||this.newTrace(r)}};P.DiskSessionTraceManager=te;var re=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ne}newTrace(t){let r=t||"default",n=(0,De.generateUlid)();if(this.map.set(r,n),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return n}currentTrace(t){let r=t||"default";return this.map.get(r)??this.newTrace(r)}};P.MemorySessionTraceManager=re});var Fe=m(T=>{"use strict";var ne=T&&T.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(T,"__esModule",{value:!0});T.envFilePath=Ut;T.parseEnvFile=qe;T.loadEnvFile=$t;var Ft=ne(d("node:fs")),Lt=ne(d("node:os")),Ce=ne(d("node:path"));function Ut(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:Ce.default.join(Lt.default.homedir(),e);return Ce.default.join(o,t)}function qe(e){let t={};for(let r of e.split(`
13
- `)){let n=r.trim();if(!n||n.startsWith("#"))continue;let o=n.indexOf("=");if(o<0)continue;let s=n.slice(0,o).trim(),a=n.slice(o+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),s&&(t[s]=a)}return t}function $t(e){let t;try{t=Ft.default.readFileSync(e,"utf-8")}catch{return}let r=qe(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var k=m(i=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});i.loadEnvFile=i.parseEnvFile=i.envFilePath=i.MemorySessionTraceManager=i.DiskSessionTraceManager=i.generateUlid=i.TraceManager=i.parseHeadersEnv=i.envOptionsResolver=i.postOtlp=i.MemoryTransport=i.DiskTransport=i.MemoryRetryQueue=i.DiskRetryQueue=i.evaluateGuard=i.mergeBatch=i.buildPayload=i.clientAttrs=i.guardAttrs=i.attrsFromRecord=i.toOtlpValue=i.snakeCase=i.newSpanId=i.ulidToTraceId=i.MAX_BYTES=i.PATTERNS=i.applyMatches=i.resolveOverlaps=i.collectMatches=i.truncate=i.redact=void 0;var v=$();Object.defineProperty(i,"redact",{enumerable:!0,get:function(){return v.redact}});Object.defineProperty(i,"truncate",{enumerable:!0,get:function(){return v.truncate}});Object.defineProperty(i,"collectMatches",{enumerable:!0,get:function(){return v.collectMatches}});Object.defineProperty(i,"resolveOverlaps",{enumerable:!0,get:function(){return v.resolveOverlaps}});Object.defineProperty(i,"applyMatches",{enumerable:!0,get:function(){return v.applyMatches}});Object.defineProperty(i,"PATTERNS",{enumerable:!0,get:function(){return v.PATTERNS}});Object.defineProperty(i,"MAX_BYTES",{enumerable:!0,get:function(){return v.MAX_BYTES}});var h=G();Object.defineProperty(i,"ulidToTraceId",{enumerable:!0,get:function(){return h.ulidToTraceId}});Object.defineProperty(i,"newSpanId",{enumerable:!0,get:function(){return h.newSpanId}});Object.defineProperty(i,"snakeCase",{enumerable:!0,get:function(){return h.snakeCase}});Object.defineProperty(i,"toOtlpValue",{enumerable:!0,get:function(){return h.toOtlpValue}});Object.defineProperty(i,"attrsFromRecord",{enumerable:!0,get:function(){return h.attrsFromRecord}});Object.defineProperty(i,"guardAttrs",{enumerable:!0,get:function(){return h.guardAttrs}});Object.defineProperty(i,"clientAttrs",{enumerable:!0,get:function(){return h.clientAttrs}});Object.defineProperty(i,"buildPayload",{enumerable:!0,get:function(){return h.buildPayload}});Object.defineProperty(i,"mergeBatch",{enumerable:!0,get:function(){return h.mergeBatch}});var Gt=Ee();Object.defineProperty(i,"evaluateGuard",{enumerable:!0,get:function(){return Gt.evaluateGuard}});var Le=Z();Object.defineProperty(i,"DiskRetryQueue",{enumerable:!0,get:function(){return Le.DiskRetryQueue}});Object.defineProperty(i,"MemoryRetryQueue",{enumerable:!0,get:function(){return Le.MemoryRetryQueue}});var R=Re();Object.defineProperty(i,"DiskTransport",{enumerable:!0,get:function(){return R.DiskTransport}});Object.defineProperty(i,"MemoryTransport",{enumerable:!0,get:function(){return R.MemoryTransport}});Object.defineProperty(i,"postOtlp",{enumerable:!0,get:function(){return R.postOtlp}});Object.defineProperty(i,"envOptionsResolver",{enumerable:!0,get:function(){return R.envOptionsResolver}});Object.defineProperty(i,"parseHeadersEnv",{enumerable:!0,get:function(){return R.parseHeadersEnv}});var Ue=W();Object.defineProperty(i,"TraceManager",{enumerable:!0,get:function(){return Ue.TraceManager}});Object.defineProperty(i,"generateUlid",{enumerable:!0,get:function(){return Ue.generateUlid}});var $e=je();Object.defineProperty(i,"DiskSessionTraceManager",{enumerable:!0,get:function(){return $e.DiskSessionTraceManager}});Object.defineProperty(i,"MemorySessionTraceManager",{enumerable:!0,get:function(){return $e.MemorySessionTraceManager}});var oe=Fe();Object.defineProperty(i,"envFilePath",{enumerable:!0,get:function(){return oe.envFilePath}});Object.defineProperty(i,"parseEnvFile",{enumerable:!0,get:function(){return oe.parseEnvFile}});Object.defineProperty(i,"loadEnvFile",{enumerable:!0,get:function(){return oe.loadEnvFile}})});import{realpathSync as Ir}from"node:fs";import{pathToFileURL as xr}from"node:url";var A=I(k());function Vt(){return(0,A.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function Ge(e=Vt()){(0,A.loadEnvFile)(e)}import Bt from"os";import se from"path";function ie(){return process.env.COPILOT_HOME||se.join(Bt.homedir(),".copilot")}function Ve(){let e=process.env.COPILOT_PLUGIN_DATA||se.join(ie(),"pinta-copilot-data");return{pluginData:e,tracePath:se.join(e,"trace.json")}}function Be(e=process.env){return e.COPILOT_AGENT_JOB_ID||e.COPILOT_AGENT_SESSION_ID||e.COPILOT_AGENT_PROMPT?"cloud":e.ELECTRON_RUN_AS_NODE||e.VSCODE_IPC_HOOK||e.VSCODE_PID?"ext":"cli"}function E(e){return typeof e=="string"?e:void 0}function j(e){return E(e.hook_event_name)??E(e.hookEventName)??E(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function Ke(e){return E(e.session_id)??E(e.sessionId)}function Ze(e){return E(e.tool_name)??E(e.toolName)}function Xe(e){return e.tool_input??e.toolArgs??e.toolInput}var Kt={sessionstart:"SessionStart",sessionend:"SessionEnd",userpromptsubmit:"UserPromptSubmit",userpromptsubmitted:"UserPromptSubmit",pretooluse:"PreToolUse",posttooluse:"PostToolUse",posttoolusefailure:"PostToolUseFailure",stop:"Stop",agentstop:"Stop",subagentstart:"SubagentStart",subagentstop:"SubagentStop",precompact:"PreCompact",notification:"Notification",permissionrequest:"PermissionRequest",erroroccurred:"ErrorOccurred"};function ze(e){let t=j(e);return t?Kt[t.toLowerCase()]??"Unknown":"Unknown"}function He(e){return e==="PreToolUse"||e==="PermissionRequest"}var Zt=new Set(["report_intent","ask_user"]);function Je(e){return e!==void 0&&Zt.has(e)}function Ye(e,t){return e==="PreToolUse"?JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}}):e==="PermissionRequest"?JSON.stringify({behavior:"deny",message:t}):null}var q=I(k());function Xt(){let e=process.env.COPILOT_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:(0,q.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var C=class extends q.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:Xt})}};var Qe=I(k()),F=class extends Qe.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var w=I(k());import ae from"os";var We="0.5.0";function zt(){return process.env.COPILOT_CLI_VERSION||"unknown"}var Ht=new Set(["copilot.hook","copilot.tool_name","copilot.toolName","copilot.tool_use_id","copilot.toolUseId","copilot.session_id","copilot.sessionId","copilot.transcript_path","copilot.transcriptPath","copilot.cwd","copilot.permission_mode","copilot.surface","copilot.agent_id","copilot.agent_type","copilot.agent_name","copilot.agent_display_name","copilot.stop_reason","copilot.notification_type"]),Jt=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),Yt={skipRedactKeys:Ht,bashContextKeys:Jt},Qt=new Set(["hook_event_name","hookEventName","hookName"]);function Wt(e,t){let r=Object.fromEntries(Object.entries(e).filter(([n])=>!Qt.has(n)));return[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:j(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,w.attrsFromRecord)(r,"copilot",Yt)]}function er(){return[{key:"service.name",value:{stringValue:"copilot"}},{key:"service.version",value:{stringValue:zt()}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:We}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:ae.userInfo().username}},{key:"host.name",value:{stringValue:ae.hostname()}},{key:"host.arch",value:{stringValue:ae.arch()}}]}function et(e){return(0,w.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,w.snakeCase)(j(e.event)??"unknown")}`,attributes:Wt(e.event,e.surface),resource:er(),scope:{name:"pinta-copilot",version:We},now:e.now,guard:e.guard})}var tt=I(k());function tr(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||50}var rr="pinta-copilot/0.5.0";function rt(e,t){return(0,tt.evaluateGuard)(e,t,{timeoutMs:tr(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:rr})}async function nr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function nt(){try{let e=Ve(),t=Be(),r=await nr(),n=JSON.parse(r),o=ze(n),s=Ke(n),a=new C(e);await a.flush();let u=new F(e),p=o==="UserPromptSubmit"?u.newTrace(s):u.currentTrace(s),b=Ze(n),y=null;if(He(o)&&!Je(b)){let S=Xe(n);y=await rt({spanId:s??"unknown",toolName:b,toolInput:S,rawTextFields:{toolInput:typeof S=="string"?S:JSON.stringify(S??null)}},process.env.PINTA_GUARD_ENDPOINT)}let U=et({event:n,traceId:p,surface:t,guard:y});if(await a.send(U),y?.decision==="DENY"){let S=Ye(o,y.userMessage??y.reason??"guard_deny");S&&process.stdout.write(S+`
14
- `)}}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
15
- `)}return 0}import{opendir as gr,stat as hr}from"node:fs/promises";import L from"node:path";import{spawn as st}from"node:child_process";import{copyFile as ue,mkdtemp as or,rm as pn,stat as sr}from"node:fs/promises";import ir from"node:os";import ce from"node:path";var ar=2e3,ur=250,ot=3,le;function cr(){return le||(le=new Promise(e=>{let t=st("sqlite3",["-version"],{stdio:"ignore"});t.once("error",()=>e(!1)),t.once("exit",r=>e(r===0))})),le}function lr(e){return`'${e.replace(/'/g,"''")}'`}async function pr(e,t){let r=`.backup ${lr(t)}`;await new Promise((n,o)=>{let s=st("sqlite3",[e,r],{stdio:["ignore","ignore","pipe"]}),a="";s.stderr?.on("data",u=>{a+=u.toString()}),s.once("error",o),s.once("exit",u=>{u===0?n():o(new Error(`sqlite3 .backup exited ${u}: ${a.trim()}`))})})}async function pe(e){try{return await sr(e)}catch{return}}function it(e,t){return e===void 0||t===void 0?e===void 0&&t===void 0:e.size===t.size&&e.mtimeMs===t.mtimeMs}function at(e){return{wal:`${e}-wal`,shm:`${e}-shm`}}async function fr(e){let{wal:t,shm:r}=at(e),n=[e,t,r],o=Date.now(),s=await Promise.all(n.map(async a=>({path:a,st:await pe(a)})));for(;;){if(Date.now()-o>=ar)return s;await new Promise(p=>setTimeout(p,ur));let a=await Promise.all(n.map(async p=>({path:p,st:await pe(p)})));a.every((p,b)=>it(p.st,s[b].st))||(o=Date.now()),s=a}}async function dr(e,t){let{wal:r,shm:n}=at(e),o=await fr(e);if(await ue(e,t),o.find(u=>u.path===r)?.st!==void 0&&await ue(r,`${t}-wal`),o.find(u=>u.path===n)?.st!==void 0&&await ue(n,`${t}-shm`),!(await Promise.all([e,r,n].map(async u=>({path:u,st:await pe(u)})))).every((u,p)=>it(u.st,o[p].st)))throw new Error(`snapshot: ${e} changed during quiesce-copy (torn-read guard)`)}async function mr(e,t){let r;for(let n=1;n<=ot;n++)try{await dr(e,t);return}catch(o){r=o}throw new Error(`snapshot: quiesce-copy of ${e} failed after ${ot} attempts: ${String(r)}`)}async function ut(e,t={}){let r=t.tmpDirBase??ir.tmpdir(),n=await or(ce.join(r,"pinta-copilot-snapshot-")),o=ce.join(n,ce.basename(e.absPath));if(await cr())try{return await pr(e.absPath,o),o}catch{}return await mr(e.absPath,o),o}var yr="pinta-copilot",ct="events.jsonl",lt="session.db",_r="rewind-snapshots/backups/";function Pr(){return L.join(ie(),"session-state")}function Sr(e,t){return L.relative(e,t).split(L.sep).join("/")}function Or(e){return e.endsWith(".db-wal")||e.endsWith(".db-shm")}function Tr(e){let[t]=e.split("/");return!t||t===e?{}:{sessionId:t}}function vr(e,t){let r=e.split("/").length===2;return r&&t===ct?"append-log":r&&t===lt?"database":"rewritten-doc"}function Er(e){let t=e.split("/"),r=t[t.length-1]??"";return t.length===2&&(r===ct||r===lt)?"session-log":e.includes(_r)?"other":"meta"}async function pt(){return[Pr()]}async function*ft(e,t){let r;try{r=await gr(t)}catch{return}try{for await(let n of r){let o=L.join(t,n.name);n.isDirectory()?yield*ft(e,o):n.isFile()&&(yield{absPath:o,relPath:Sr(e,o)})}}catch{return}}async function*wr(e){let[t]=await pt(),r=e.since?.getTime();for await(let{absPath:n,relPath:o}of ft(t,t)){let s=o.split("/"),a=s[s.length-1]??"";if(Or(a))continue;let u;try{u=await hr(n)}catch{continue}r!==void 0&&u.mtime.getTime()<=r||(yield{relPath:o,absPath:n,size:u.size,mtime:u.mtime,...Tr(o),semantics:vr(o,a)})}}async function br(e){return ut(e)}var kr={id:yr,roots:pt,scan:wr,classify:Er,snapshot:br};Ge();function Rr(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===xr(Ir(e)).href}catch{return!1}}async function Ar(){let e=await nt();process.exit(e)}Rr()&&Ar();export{kr as lifecycle};
13
+ `),!1}finally{clearTimeout(o)}}var Q=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new Ne.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??qe}async send(t){let r=this.resolveOptions();if(!r||this.dropIfOversized(t))return;await x(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let{chunks:n,oversize:o}=je(r,a=>L(a.payload),p.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized retry ${o.length===1?"entry":"entries"} (each > ${p.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
14
+ `);let s=[].concat(...n),c=0;for(let a of n){if(!await x((0,De.mergeBatch)(a.map(l=>l.payload)),t,this.logPrefix))break;c+=a.length}this.queue.rewrite(s.slice(c))}catch(r){process.stderr.write(`[${this.logPrefix}] flush failed: ${r?.message??String(r)}
15
+ `)}finally{this.queue.release()}}dropIfOversized(t){let r=L(t);return r<=p.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${r} > ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
16
+ `),!0)}};p.DiskTransport=Q;var ee=class{queue=new Ne.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;if(L(t)>p.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
17
+ `);return}await x(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let{chunks:n,oversize:o}=je(r,L,p.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized buffered ${o.length===1?"payload":"payloads"} (each > ${p.MAX_POST_BYTES} bytes \u2014 undeliverable)
18
+ `);let s=[].concat(...n),c=0;for(let a of n){if(!await x((0,De.mergeBatch)(a),t,this.logPrefix))break;c+=a.length}for(let a of s.slice(c))this.queue.enqueue(a)}};p.MemoryTransport=ee});var oe=_(v=>{"use strict";var ne=v&&v.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(v,"__esModule",{value:!0});v.TraceManager=void 0;v.generateUlid=$e;var Fe=ne(m("fs")),Jt=ne(m("path")),Wt=ne(m("crypto")),Ht=j(),te="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function $e(){let e=Date.now(),t="",r=e;for(let s=0;s<10;s++)t=te[r&31]+t,r=Math.floor(r/32);let n=Wt.default.randomBytes(10),o="";for(let s=0;s<10;s++)o+=te[n[s]&31];for(;o.length<16;)o+=te[0];return t+o}var re=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=$e();return this.save(t),t}currentTrace(){try{let t=Fe.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){try{Fe.default.mkdirSync(Jt.default.dirname(this.tracePath),{recursive:!0}),(0,Ht.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(r){process.stderr.write(`[pinta-core] trace persistence failed: ${r}
19
+ `)}}};v.TraceManager=re});var Xe=_(T=>{"use strict";var Ue=T&&T.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(T,"__esModule",{value:!0});T.MemorySessionTraceManager=T.DiskSessionTraceManager=void 0;var Be=Ue(m("fs")),Qt=Ue(m("path")),Ve=oe(),er=j(),Ge=200,se=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??Ge}read(){try{let t=JSON.parse(Be.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Be.default.mkdirSync(Qt.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;(0,er.atomicWriteFileSync)(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Ve.generateUlid)(),o=this.read();return o[r]=n,this.write(o),n}currentTrace(t){let r=t||"default",n=this.read()[r];return n||this.newTrace(r)}};T.DiskSessionTraceManager=se;var ie=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ge}newTrace(t){let r=t||"default",n=(0,Ve.generateUlid)();if(this.map.set(r,n),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return n}currentTrace(t){let r=t||"default";return this.map.get(r)??this.newTrace(r)}};T.MemorySessionTraceManager=ie});var ze=_(b=>{"use strict";var ae=b&&b.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(b,"__esModule",{value:!0});b.envFilePath=nr;b.parseEnvFile=Ke;b.loadEnvFile=or;var tr=ae(m("node:fs")),rr=ae(m("node:os")),Ye=ae(m("node:path"));function nr(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:Ye.default.join(rr.default.homedir(),e);return Ye.default.join(o,t)}function Ke(e){let t={};for(let r of e.split(`
20
+ `)){let n=r.trim();if(!n||n.startsWith("#"))continue;let o=n.indexOf("=");if(o<0)continue;let s=n.slice(0,o).trim(),c=n.slice(o+1).trim();(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),s&&(t[s]=c)}return t}function or(e){let t;try{t=tr.default.readFileSync(e,"utf-8")}catch{return}let r=Ke(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var A=_(i=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});i.loadEnvFile=i.parseEnvFile=i.envFilePath=i.MemorySessionTraceManager=i.DiskSessionTraceManager=i.generateUlid=i.TraceManager=i.MAX_POST_BYTES=i.parseHeadersEnv=i.envOptionsResolver=i.postOtlp=i.MemoryTransport=i.DiskTransport=i.MemoryRetryQueue=i.DiskRetryQueue=i.evaluateGuard=i.MAX_SPAN_BYTES=i.enforceSpanBudget=i.mergeBatch=i.buildPayload=i.clientAttrs=i.guardAttrs=i.attrsFromRecord=i.toOtlpValue=i.snakeCase=i.newSpanId=i.ulidToTraceId=i.MAX_BYTES=i.PATTERNS=i.applyMatches=i.resolveOverlaps=i.collectMatches=i.truncateTo=i.truncate=i.redact=void 0;var O=X();Object.defineProperty(i,"redact",{enumerable:!0,get:function(){return O.redact}});Object.defineProperty(i,"truncate",{enumerable:!0,get:function(){return O.truncate}});Object.defineProperty(i,"truncateTo",{enumerable:!0,get:function(){return O.truncateTo}});Object.defineProperty(i,"collectMatches",{enumerable:!0,get:function(){return O.collectMatches}});Object.defineProperty(i,"resolveOverlaps",{enumerable:!0,get:function(){return O.resolveOverlaps}});Object.defineProperty(i,"applyMatches",{enumerable:!0,get:function(){return O.applyMatches}});Object.defineProperty(i,"PATTERNS",{enumerable:!0,get:function(){return O.PATTERNS}});Object.defineProperty(i,"MAX_BYTES",{enumerable:!0,get:function(){return O.MAX_BYTES}});var y=K();Object.defineProperty(i,"ulidToTraceId",{enumerable:!0,get:function(){return y.ulidToTraceId}});Object.defineProperty(i,"newSpanId",{enumerable:!0,get:function(){return y.newSpanId}});Object.defineProperty(i,"snakeCase",{enumerable:!0,get:function(){return y.snakeCase}});Object.defineProperty(i,"toOtlpValue",{enumerable:!0,get:function(){return y.toOtlpValue}});Object.defineProperty(i,"attrsFromRecord",{enumerable:!0,get:function(){return y.attrsFromRecord}});Object.defineProperty(i,"guardAttrs",{enumerable:!0,get:function(){return y.guardAttrs}});Object.defineProperty(i,"clientAttrs",{enumerable:!0,get:function(){return y.clientAttrs}});Object.defineProperty(i,"buildPayload",{enumerable:!0,get:function(){return y.buildPayload}});Object.defineProperty(i,"mergeBatch",{enumerable:!0,get:function(){return y.mergeBatch}});Object.defineProperty(i,"enforceSpanBudget",{enumerable:!0,get:function(){return y.enforceSpanBudget}});Object.defineProperty(i,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return y.MAX_SPAN_BYTES}});var sr=Ie();Object.defineProperty(i,"evaluateGuard",{enumerable:!0,get:function(){return sr.evaluateGuard}});var Ze=H();Object.defineProperty(i,"DiskRetryQueue",{enumerable:!0,get:function(){return Ze.DiskRetryQueue}});Object.defineProperty(i,"MemoryRetryQueue",{enumerable:!0,get:function(){return Ze.MemoryRetryQueue}});var k=Le();Object.defineProperty(i,"DiskTransport",{enumerable:!0,get:function(){return k.DiskTransport}});Object.defineProperty(i,"MemoryTransport",{enumerable:!0,get:function(){return k.MemoryTransport}});Object.defineProperty(i,"postOtlp",{enumerable:!0,get:function(){return k.postOtlp}});Object.defineProperty(i,"envOptionsResolver",{enumerable:!0,get:function(){return k.envOptionsResolver}});Object.defineProperty(i,"parseHeadersEnv",{enumerable:!0,get:function(){return k.parseHeadersEnv}});Object.defineProperty(i,"MAX_POST_BYTES",{enumerable:!0,get:function(){return k.MAX_POST_BYTES}});var Je=oe();Object.defineProperty(i,"TraceManager",{enumerable:!0,get:function(){return Je.TraceManager}});Object.defineProperty(i,"generateUlid",{enumerable:!0,get:function(){return Je.generateUlid}});var We=Xe();Object.defineProperty(i,"DiskSessionTraceManager",{enumerable:!0,get:function(){return We.DiskSessionTraceManager}});Object.defineProperty(i,"MemorySessionTraceManager",{enumerable:!0,get:function(){return We.MemorySessionTraceManager}});var ce=ze();Object.defineProperty(i,"envFilePath",{enumerable:!0,get:function(){return ce.envFilePath}});Object.defineProperty(i,"parseEnvFile",{enumerable:!0,get:function(){return ce.parseEnvFile}});Object.defineProperty(i,"loadEnvFile",{enumerable:!0,get:function(){return ce.loadEnvFile}})});import{realpathSync as zr}from"node:fs";import{pathToFileURL as Zr}from"node:url";var N=I(A());function ir(){return(0,N.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function He(e=ir()){(0,N.loadEnvFile)(e)}import ar from"os";import ue from"path";function le(){return process.env.COPILOT_HOME||ue.join(ar.homedir(),".copilot")}function Qe(){let e=process.env.COPILOT_PLUGIN_DATA||ue.join(le(),"pinta-copilot-data");return{pluginData:e,tracePath:ue.join(e,"trace.json")}}function et(e=process.env){return e.COPILOT_AGENT_JOB_ID||e.COPILOT_AGENT_SESSION_ID||e.COPILOT_AGENT_PROMPT?"cloud":e.ELECTRON_RUN_AS_NODE||e.VSCODE_IPC_HOOK||e.VSCODE_PID?"ext":"cli"}function S(e){return typeof e=="string"?e:void 0}function M(e){return S(e.hook_event_name)??S(e.hookEventName)??S(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function tt(e){return S(e.session_id)??S(e.sessionId)}function rt(e){return S(e.tool_name)??S(e.toolName)}function nt(e){return S(e.cwd)??S(e.workingDirectory)}function ot(e){return e.tool_input??e.toolArgs??e.toolInput}var cr={sessionstart:"SessionStart",sessionend:"SessionEnd",userpromptsubmit:"UserPromptSubmit",userpromptsubmitted:"UserPromptSubmit",pretooluse:"PreToolUse",posttooluse:"PostToolUse",posttoolusefailure:"PostToolUseFailure",stop:"Stop",agentstop:"Stop",subagentstart:"SubagentStart",subagentstop:"SubagentStop",precompact:"PreCompact",notification:"Notification",permissionrequest:"PermissionRequest",erroroccurred:"ErrorOccurred"};function st(e){let t=M(e);return t?cr[t.toLowerCase()]??"Unknown":"Unknown"}function it(e){return e==="PreToolUse"||e==="PermissionRequest"}var ur=new Set(["report_intent","ask_user"]);function at(e){return e!==void 0&&ur.has(e)}function ct(e,t){return e==="PreToolUse"?JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}}):e==="PermissionRequest"?JSON.stringify({behavior:"deny",message:t}):null}var $=I(A());function lr(){let e=process.env.COPILOT_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:(0,$.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var F=class extends $.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:lr})}};var ut=I(A()),B=class extends ut.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var w=I(A());import pe from"os";var U;function pr(){if(U===void 0)try{U=pe.userInfo().username}catch{U=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return U}var lt="0.6.0";function fr(){return process.env.COPILOT_CLI_VERSION||"unknown"}var dr=new Set(["copilot.hook","copilot.tool_name","copilot.toolName","copilot.tool_use_id","copilot.toolUseId","copilot.session_id","copilot.sessionId","copilot.transcript_path","copilot.transcriptPath","copilot.cwd","copilot.permission_mode","copilot.surface","copilot.agent_id","copilot.agent_type","copilot.agent_name","copilot.agent_display_name","copilot.stop_reason","copilot.notification_type"]),gr=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),hr={skipRedactKeys:dr,bashContextKeys:gr},mr=new Set(["hook_event_name","hookEventName","hookName"]);function yr(e,t){let r=Object.fromEntries(Object.entries(e).filter(([n])=>!mr.has(n)));return[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:M(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,w.attrsFromRecord)(r,"copilot",hr)]}function _r(){return[{key:"service.name",value:{stringValue:"copilot"}},{key:"service.version",value:{stringValue:fr()}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:lt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:pr()}},{key:"host.name",value:{stringValue:pe.hostname()}},{key:"host.arch",value:{stringValue:pe.arch()}}]}function pt(e){return(0,w.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,w.snakeCase)(M(e.event)??"unknown")}`,attributes:yr(e.event,e.surface),resource:_r(),scope:{name:"pinta-copilot",version:lt},now:e.now,guard:e.guard})}var ft=I(A());function Sr(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||50}var Pr="pinta-copilot/0.6.0";function dt(e,t){return(0,ft.evaluateGuard)(e,t,{timeoutMs:Sr(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Pr})}async function Tr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function gt(){try{let e=Qe(),t=et(),r=await Tr(),n=JSON.parse(r),o=st(n),s=tt(n),c=new F(e);await c.flush();let a=new B(e),u=o==="UserPromptSubmit"?a.newTrace(s):a.currentTrace(s),l=rt(n),g=null;if(it(o)&&!at(l)){let E=ot(n);g=await dt({spanId:s??"unknown",toolName:l,method:M(n),cwd:nt(n),toolInput:E,rawTextFields:{toolInput:typeof E=="string"?E:JSON.stringify(E??null)}},process.env.PINTA_GUARD_ENDPOINT)}if(g?.decision==="DENY"){let E=ct(o,g.userMessage??g.reason??"guard_deny");E&&process.stdout.write(E+`
21
+ `)}let G=pt({event:n,traceId:u,surface:t,guard:g});await c.send(G)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
22
+ `)}return 0}import{opendir as jr,stat as Cr}from"node:fs/promises";import V from"node:path";import{spawn as yt}from"node:child_process";import{copyFile as fe,mkdtemp as Or,rm as Er,stat as vr}from"node:fs/promises";import br from"node:os";import de from"node:path";var wr=2e3,kr=250,ht=3,mt=3e4,Ar=3e4,ge;function Mr(){return ge||(ge=new Promise(e=>{let t=yt("sqlite3",["-version"],{stdio:"ignore"});t.once("error",()=>e(!1)),t.once("exit",r=>e(r===0))})),ge}function Ir(e){return`'${e.replace(/'/g,"''")}'`}async function Rr(e,t){let r=`.backup ${Ir(t)}`;await new Promise((n,o)=>{let s=yt("sqlite3",[e,r],{stdio:["ignore","ignore","pipe"],timeout:Ar,killSignal:"SIGKILL"}),c="";s.stderr?.on("data",a=>{c+=a.toString()}),s.once("error",o),s.once("exit",a=>{a===0?n():o(new Error(`sqlite3 .backup exited ${a}: ${c.trim()}`))})})}async function he(e){try{return await vr(e)}catch{return}}function _t(e,t){return e===void 0||t===void 0?e===void 0&&t===void 0:e.size===t.size&&e.mtimeMs===t.mtimeMs}function St(e){return{wal:`${e}-wal`,shm:`${e}-shm`}}async function xr(e){let{wal:t,shm:r}=St(e),n=[e,t,r],o=Date.now(),s=o,c=await Promise.all(n.map(async a=>({path:a,st:await he(a)})));for(;;){if(Date.now()-s>=wr)return c;if(Date.now()-o>=mt)throw new Error(`snapshot: ${e} never quiesced within ${mt}ms (actively written?)`);await new Promise(l=>setTimeout(l,kr));let a=await Promise.all(n.map(async l=>({path:l,st:await he(l)})));a.every((l,g)=>_t(l.st,c[g].st))||(s=Date.now()),c=a}}async function Nr(e,t){let{wal:r,shm:n}=St(e),o=await xr(e);if(await fe(e,t),o.find(a=>a.path===r)?.st!==void 0&&await fe(r,`${t}-wal`),o.find(a=>a.path===n)?.st!==void 0&&await fe(n,`${t}-shm`),!(await Promise.all([e,r,n].map(async a=>({path:a,st:await he(a)})))).every((a,u)=>_t(a.st,o[u].st)))throw new Error(`snapshot: ${e} changed during quiesce-copy (torn-read guard)`)}async function Dr(e,t){let r;for(let n=1;n<=ht;n++)try{await Nr(e,t);return}catch(o){r=o}throw new Error(`snapshot: quiesce-copy of ${e} failed after ${ht} attempts: ${String(r)}`)}async function Pt(e,t={}){let r=t.tmpDirBase??br.tmpdir(),n=await Or(de.join(r,"pinta-copilot-snapshot-")),o=de.join(n,de.basename(e.absPath));try{if(await Mr())try{return await Rr(e.absPath,o),o}catch{}return await Dr(e.absPath,o),o}catch(s){throw await Er(n,{recursive:!0,force:!0}).catch(()=>{}),s}}var qr="pinta-copilot",Tt="events.jsonl",Ot="session.db",Lr="rewind-snapshots/backups/";function Fr(){return V.join(le(),"session-state")}function $r(e,t){return V.relative(e,t).split(V.sep).join("/")}function Br(e){return e.endsWith(".db-wal")||e.endsWith(".db-shm")}function Ur(e){let[t]=e.split("/");return!t||t===e?{}:{sessionId:t}}function Vr(e,t){let r=e.split("/").length===2;return r&&t===Tt?"append-log":r&&t===Ot?"database":"rewritten-doc"}function Gr(e){let t=e.split("/"),r=t[t.length-1]??"";return t.length===2&&(r===Tt||r===Ot)?"session-log":e.includes(Lr)?"other":"meta"}async function Et(){return[Fr()]}async function*vt(e,t){let r;try{r=await jr(t)}catch{return}try{for await(let n of r){let o=V.join(t,n.name);n.isDirectory()?yield*vt(e,o):n.isFile()&&(yield{absPath:o,relPath:$r(e,o)})}}catch{return}}async function*Xr(e){let[t]=await Et(),r=e.since?.getTime();for await(let{absPath:n,relPath:o}of vt(t,t)){let s=o.split("/"),c=s[s.length-1]??"";if(Br(c))continue;let a;try{a=await Cr(n)}catch{continue}r!==void 0&&a.mtime.getTime()<=r||(yield{relPath:o,absPath:n,size:a.size,mtime:a.mtime,...Ur(o),semantics:Vr(o,c)})}}async function Yr(e){return Pt(e)}var Kr={id:qr,roots:Et,scan:Xr,classify:Gr,snapshot:Yr};He();function Jr(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===Zr(zr(e)).href}catch{return!1}}async function Wr(){let e=await gt();process.exit(e)}Jr()&&Wr();export{Kr as lifecycle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinta-ai/pinta-copilot",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Generic OTLP forwarder + guard for GitHub Copilot hook events (CLI + VS Code extension)",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
@@ -40,7 +40,7 @@
40
40
  "prepublishOnly": "npm run build"
41
41
  },
42
42
  "devDependencies": {
43
- "@pinta-ai/core": "^0.3.0",
43
+ "@pinta-ai/core": "^0.6.0",
44
44
  "@types/node": "^22.0.0",
45
45
  "esbuild": "^0.24.0",
46
46
  "tsx": "^4.0.0",