@pinta-ai/pinta-copilot 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,21 +1,21 @@
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(`
1
+ "use strict";var dt=Object.create;var pe=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames;var ht=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var y=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var mt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of gt(t))!yt.call(e,o)&&o!==r&&pe(e,o,{get:()=>t[o],enumerable:!(n=_t(t,o))||n.enumerable});return e};var m=(e,t,r)=>(r=e!=null?dt(ht(e)):{},mt(t||!e||!e.__esModule?pe(r,"default",{value:e,enumerable:!0}):r,e));var X=y(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.PATTERNS=p.MAX_BYTES=void 0;p.truncateTo=de;p.truncate=Pt;p.collectMatches=_e;p.resolveOverlaps=ge;p.applyMatches=he;p.redact=Ot;p.MAX_BYTES=102400;function de(e,t){let r=Buffer.from(e,"utf-8");return r.length<=t?e:`${r.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${r.length}]`}function Pt(e){return de(e,p.MAX_BYTES)}p.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 p.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,g=c+i[0].indexOf(u),Y=g+u.length;r.push({start:c,end:d,replaceStart:g,replaceEnd:Y,type:n.type}),i.index===o.lastIndex&&o.lastIndex++}}return r}function ge(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 he(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 Ot(e,t={}){if(e.length===0)return e;let r=_e(e,t);if(r.length===0)return e;let n=ge(r);return he(e,n)}});var z=y(f=>{"use strict";var St=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=Oe;f.newSpanId=Se;f.snakeCase=Et;f.toOtlpValue=Te;f.attrsFromRecord=bt;f.guardAttrs=ve;f.clientAttrs=Ee;f.enforceSpanBudget=be;f.buildPayload=kt;f.mergeBatch=wt;var Tt=St(require("crypto")),K=X(),vt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Oe(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 Se(){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 D(e,t,r){let n=(0,K.truncate)(t);if((r.skipRedactKeys??ye).has(e))return n;let o=(r.bashContextKeys??ye).has(e)?"bash":void 0;return(0,K.redact)(n,{context:o})}function Te(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 bt(e,t,r={}){let n=[];for(let[o,i]of Object.entries(e)){let a=`${t}.${o}`,u=Te(a,i,r);u!==null&&n.push({key:a,value:u})}return n}function ve(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function Ee(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 me(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Pe=1024;function be(e,t=f.MAX_SPAN_BYTES){let r=me(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<=Pe)break;let a=r-t,u=Math.max(Pe,i-a-64);o.stringValue=(0,K.truncateTo)(o.stringValue,u),r=me(e)}return e}function kt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...ve(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...Ee(o));let i={traceId:Oe(e.traceId),spanId:Se(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return be(i),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[i]}]}]}}function wt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var ke=y(J=>{"use strict";Object.defineProperty(J,"__esModule",{value:!0});J.evaluateGuard=It;var At=1e4,Mt="pinta-core";function Z(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Rt=new Set(["ALLOW","DENY","REVIEW"]);async function It(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??At,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??Mt,"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||!Rt.has(c.decision)||!d)return Z(Date.now()-o,"error");let g=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??g,clientRttMs:g}}catch(u){let c=u.name,d=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return Z(Date.now()-o,d)}finally{clearTimeout(a)}}});var j=y(I=>{"use strict";var Nt=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.atomicWriteFileSync=xt;var we=Nt(require("fs"));function xt(e,t){let r=`${e}.${process.pid}.tmp`;we.default.writeFileSync(r,t),we.default.renameSync(r,e)}});var Q=y(S=>{"use strict";var Ae=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 _=Ae(require("fs")),C=Ae(require("path")),Dt=j(),L=1e3,jt=50,Ct=5,H=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{_.default.mkdirSync(C.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
2
+ `;_.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
3
+ `)}}readAll(){try{let t=_.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){_.default.existsSync(this.filePath)&&_.default.unlinkSync(this.filePath);return}_.default.mkdirSync(C.default.dirname(this.filePath),{recursive:!0}),(0,Dt.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();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}`:""}
7
+ `)}}tryAcquireLock(){let t=Date.now();try{_.default.mkdirSync(C.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<jt;)try{let r=_.default.openSync(this.lockPath,"wx");return _.default.writeSync(r,String(process.pid)),_.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=_.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){_.default.unlinkSync(this.lockPath);continue}}catch{}let n=Ct,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{_.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=L)return;let r=t.length-L;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
10
+ `),this.rewrite(t.slice(r))}};S.DiskRetryQueue=H;var W=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>L&&this.entries.splice(0,this.entries.length-L)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};S.MemoryRetryQueue=W});var De=y(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});l.MemoryTransport=l.DiskTransport=l.MAX_POST_BYTES=void 0;l.parseHeadersEnv=Ne;l.envOptionsResolver=xe;l.postOtlp=N;var Me=Q(),Re=z(),Lt=5e3;l.MAX_POST_BYTES=900*1024;function q(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function Ie(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 Ne(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:Ne(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function N(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Lt);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}`:""}
11
11
  `),!1}return!0}catch(i){return process.stderr.write(`[${r}] OTLP POST failed: ${i.message??String(i)}
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();
12
+ `),!1}finally{clearTimeout(o)}}var ee=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new Me.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??xe}async send(t){let r=this.resolveOptions();if(!r||this.dropIfOversized(t))return;await N(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}=Ie(r,u=>q(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 N((0,Re.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=q(t);return r<=l.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${r} > ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
15
+ `),!0)}};l.DiskTransport=ee;var te=class{queue=new Me.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;if(q(t)>l.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
16
+ `);return}await N(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}=Ie(r,q,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 N((0,Re.mergeBatch)(u),t,this.logPrefix))break;a+=u.length}for(let u of i.slice(a))this.queue.enqueue(u)}};l.MemoryTransport=te});var se=y(b=>{"use strict";var oe=b&&b.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(b,"__esModule",{value:!0});b.TraceManager=void 0;b.generateUlid=Ce;var je=oe(require("fs")),qt=oe(require("path")),Bt=oe(require("crypto")),Vt=j(),re="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ce(){let e=Date.now(),t="",r=e;for(let i=0;i<10;i++)t=re[r&31]+t,r=Math.floor(r/32);let n=Bt.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=re[n[i]&31];for(;o.length<16;)o+=re[0];return t+o}var ne=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ce();return this.save(t),t}currentTrace(){try{let t=je.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){try{je.default.mkdirSync(qt.default.dirname(this.tracePath),{recursive:!0}),(0,Vt.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(r){process.stderr.write(`[pinta-core] trace persistence failed: ${r}
18
+ `)}}};b.TraceManager=ne});var $e=y(T=>{"use strict";var qe=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 Le=qe(require("fs")),$t=qe(require("path")),Be=se(),Ft=j(),Ve=200,ie=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??Ve}read(){try{let t=JSON.parse(Le.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Le.default.mkdirSync($t.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;(0,Ft.atomicWriteFileSync)(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Be.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=ie;var ae=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ve}newTrace(t){let r=t||"default",n=(0,Be.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=ae});var Ge=y(k=>{"use strict";var ue=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.envFilePath=Yt;k.parseEnvFile=Ue;k.loadEnvFile=Xt;var Ut=ue(require("node:fs")),Gt=ue(require("node:os")),Fe=ue(require("node:path"));function Yt(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:Fe.default.join(Gt.default.homedir(),e);return Fe.default.join(o,t)}function Ue(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 Xt(e){let t;try{t=Ut.default.readFileSync(e,"utf-8")}catch{return}let r=Ue(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var M=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 v=X();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return v.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return v.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return v.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return v.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return v.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return v.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return v.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return v.MAX_BYTES}});var h=z();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return h.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return h.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return h.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return h.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return h.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return h.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return h.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return h.buildPayload}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return h.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return h.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return h.MAX_SPAN_BYTES}});var Kt=ke();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Kt.evaluateGuard}});var Ye=Q();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return Ye.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return Ye.MemoryRetryQueue}});var A=De();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 Xe=se();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return Xe.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return Xe.generateUlid}});var Ke=$e();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Ke.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Ke.MemorySessionTraceManager}});var ce=Ge();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return ce.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return ce.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return ce.loadEnvFile}})});var x=m(M());function zt(){return(0,x.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function ze(e=zt()){(0,x.loadEnvFile)(e)}var Ze=m(require("os")),B=m(require("path"));function Zt(){return process.env.COPILOT_HOME||B.default.join(Ze.default.homedir(),".copilot")}function Je(){let e=process.env.COPILOT_PLUGIN_DATA||B.default.join(Zt(),"pinta-copilot-data");return{pluginData:e,tracePath:B.default.join(e,"trace.json")}}function He(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 O(e){return typeof e=="string"?e:void 0}function R(e){return O(e.hook_event_name)??O(e.hookEventName)??O(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function We(e){return O(e.session_id)??O(e.sessionId)}function Qe(e){return O(e.tool_name)??O(e.toolName)}function et(e){return O(e.cwd)??O(e.workingDirectory)}function tt(e){return e.tool_input??e.toolArgs??e.toolInput}var Jt={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 rt(e){let t=R(e);return t?Jt[t.toLowerCase()]??"Unknown":"Unknown"}function nt(e){return e==="PreToolUse"||e==="PermissionRequest"}var Ht=new Set(["report_intent","ask_user"]);function ot(e){return e!==void 0&&Ht.has(e)}function st(e,t){return e==="PreToolUse"?JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}}):e==="PermissionRequest"?JSON.stringify({behavior:"deny",message:t}):null}var $=m(M());function Wt(){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 V=class extends $.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:Wt})}};var it=m(M()),F=class extends it.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var at=m(require("fs")),G=m(require("os")),fe=m(require("path")),w=m(M());var U;function Qt(){if(U===void 0)try{U=G.default.userInfo().username}catch{U=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return U}var ut="0.6.0",er=new Set(["","unknown","undefined","null","n/a","none"]);function P(e){let t=typeof e=="string"?e.trim():void 0;return t&&!er.has(t.toLowerCase())?t:void 0}var tr=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function rr(e){let t=P(e);return t&&tr.test(t)?t:void 0}function nr(e){let t=e?P(e.copilot_version)??P(e.copilotVersion)??P(e.cli_version)??P(e.cliVersion)??P(e.version):void 0;return t||(le===void 0&&(le=or()),le??void 0)}var le;function or(){let e=P(process.env.COPILOT_CLI_BINARY_VERSION)??P(process.env.COPILOT_CLI_VERSION);if(e)return e;let t=P(process.env.COPILOT_CLI_RESOLVED_DIST_DIR);if(t){let r=rr(fe.default.basename(t));if(r)return r;let n=sr(t);if(n)return n}return null}function sr(e){try{let t=at.default.readFileSync(fe.default.join(e,"package.json"),"utf8");return P(JSON.parse(t).version)}catch{return}}var ir=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"]),ar=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),ur={skipRedactKeys:ir,bashContextKeys:ar},cr=new Set(["hook_event_name","hookEventName","hookName"]);function lr(e,t){let r=Object.fromEntries(Object.entries(e).filter(([n])=>!cr.has(n)));return[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:R(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,w.attrsFromRecord)(r,"copilot",ur)]}function fr(e){let t=nr(e);return[{key:"service.name",value:{stringValue:"copilot"}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:ut}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Qt()}},{key:"host.name",value:{stringValue:G.default.hostname()}},{key:"host.arch",value:{stringValue:G.default.arch()}}]}function ct(e){return(0,w.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,w.snakeCase)(R(e.event)??"unknown")}`,attributes:lr(e.event,e.surface),resource:fr(e.event),scope:{name:"pinta-copilot",version:ut},now:e.now,guard:e.guard})}var lt=m(M());function pr(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||50}var dr="pinta-copilot/0.6.0";function ft(e,t){return(0,lt.evaluateGuard)(e,t,{timeoutMs:pr(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:dr})}async function _r(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function pt(){try{let e=Je(),t=He(),r=await _r(),n=JSON.parse(r),o=rt(n),i=We(n),a=new V(e);await a.flush();let u=new F(e),c=o==="UserPromptSubmit"?u.newTrace(i):u.currentTrace(i),d=Qe(n),g=null;if(nt(o)&&!ot(d)){let E=tt(n);g=await ft({spanId:i??"unknown",toolName:d,method:R(n),cwd:et(n),toolInput:E,rawTextFields:{toolInput:typeof E=="string"?E:JSON.stringify(E??null)}},process.env.PINTA_GUARD_ENDPOINT)}if(g?.decision==="DENY"){let E=st(o,g.userMessage??g.reason??"guard_deny");E&&process.stdout.write(E+`
20
+ `)}let Y=ct({event:n,traceId:c,surface:t,guard:g});await a.send(Y)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
21
+ `)}return 0}ze();async function gr(){let e=await pt();process.exit(e)}gr();
package/dist/index.mjs CHANGED
@@ -1,22 +1,22 @@
1
1
  import{createRequire as __pintaCreateRequire}from 'node:module';const require=__pintaCreateRequire(import.meta.url);
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})+`
2
+ var At=Object.create;var _e=Object.defineProperty;var It=Object.getOwnPropertyDescriptor;var Mt=Object.getOwnPropertyNames;var Rt=Object.getPrototypeOf,xt=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 Nt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Mt(t))!xt.call(e,o)&&o!==r&&_e(e,o,{get:()=>t[o],enumerable:!(n=It(t,o))||n.enumerable});return e};var R=(e,t,r)=>(r=e!=null?At(Rt(e)):{},Nt(t||!e||!e.__esModule?_e(r,"default",{value:e,enumerable:!0}):r,e));var Y=_(d=>{"use strict";Object.defineProperty(d,"__esModule",{value:!0});d.PATTERNS=d.MAX_BYTES=void 0;d.truncateTo=Se;d.truncate=Dt;d.collectMatches=Pe;d.resolveOverlaps=Te;d.applyMatches=Oe;d.redact=jt;d.MAX_BYTES=102400;function Se(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 Dt(e){return Se(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 Pe(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 u=n.captureGroup??0,a=s[u];if(a===void 0){s.index===o.lastIndex&&o.lastIndex++;continue}let c=s.index,l=s.index+s[0].length,g=c+s[0].indexOf(a),X=g+a.length;r.push({start:c,end:l,replaceStart:g,replaceEnd:X,type:n.type}),s.index===o.lastIndex&&o.lastIndex++}}return r}function Te(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 Oe(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 jt(e,t={}){if(e.length===0)return e;let r=Pe(e,t);if(r.length===0)return e;let n=Te(r);return Oe(e,n)}});var z=_(f=>{"use strict";var Ct=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=be;f.newSpanId=ke;f.snakeCase=Ft;f.toOtlpValue=Ae;f.attrsFromRecord=$t;f.guardAttrs=Ie;f.clientAttrs=Me;f.enforceSpanBudget=Re;f.buildPayload=Bt;f.mergeBatch=Vt;var Lt=Ct(m("crypto")),K=Y(),qt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function be(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=qt.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 ke(){return Lt.default.randomBytes(8).toString("hex")}function Ft(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Ee=new Set;function j(e,t,r){let n=(0,K.truncate)(t);if((r.skipRedactKeys??Ee).has(e))return n;let o=(r.bashContextKeys??Ee).has(e)?"bash":void 0;return(0,K.redact)(n,{context:o})}function Ae(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:j(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:j(e,JSON.stringify(t),r)}}catch{return{stringValue:j(e,String(t),r)}}default:return{stringValue:j(e,String(t),r)}}}function $t(e,t,r={}){let n=[];for(let[o,s]of Object.entries(e)){let u=`${t}.${o}`,a=Ae(u,s,r);a!==null&&n.push({key:u,value:a})}return n}function Ie(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function Me(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}f.MAX_SPAN_BYTES=800*1024;function ve(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var we=1024;function Re(e,t=f.MAX_SPAN_BYTES){let r=ve(e);for(let n=0;n<100&&r>t;n++){let o=null,s=0;for(let c of e.attributes){if(!("stringValue"in c.value))continue;let l=Buffer.byteLength(c.value.stringValue,"utf-8");l>s&&(s=l,o=c.value)}if(o===null||s<=we)break;let u=r-t,a=Math.max(we,s-u-64);o.stringValue=(0,K.truncateTo)(o.stringValue,a),r=ve(e)}return e}function Bt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...Ie(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...Me(o));let s={traceId:be(e.traceId),spanId:ke(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return Re(s),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]}}function Vt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var xe=_(H=>{"use strict";Object.defineProperty(H,"__esModule",{value:!0});H.evaluateGuard=Yt;var Ut=1e4,Gt="pinta-core";function Z(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Xt=new Set(["ALLOW","DENY","REVIEW"]);async function Yt(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??Ut,o=Date.now(),s=new AbortController,u=setTimeout(()=>s.abort(),n);try{let a=await 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}),signal:s.signal});if(a.status!==200)return Z(Date.now()-o,"error");let c=await a.json(),l=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!Xt.has(c.decision)||!l)return Z(Date.now()-o,"error");let g=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??g,clientRttMs:g}}catch(a){let c=a.name,l=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return Z(Date.now()-o,l)}finally{clearTimeout(u)}}});var C=_(x=>{"use strict";var Kt=x&&x.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(x,"__esModule",{value:!0});x.atomicWriteFileSync=zt;var Ne=Kt(m("fs"));function zt(e,t){let r=`${e}.${process.pid}.tmp`;Ne.default.writeFileSync(r,t),Ne.default.renameSync(r,e)}});var Q=_(T=>{"use strict";var De=T&&T.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(T,"__esModule",{value:!0});T.MemoryRetryQueue=T.DiskRetryQueue=void 0;var h=De(m("fs")),L=De(m("path")),Zt=C(),q=1e3,Ht=50,Jt=5,J=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=L.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{h.default.mkdirSync(L.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
3
  `;h.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
4
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(`
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(L.default.dirname(this.filePath),{recursive:!0}),(0,Zt.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();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}`:""}
8
+ `)}}tryAcquireLock(){let t=Date.now();try{h.default.mkdirSync(L.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<Ht;)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=Jt,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))}};T.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}};T.MemoryRetryQueue=W});var $e=_(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.MemoryTransport=p.DiskTransport=p.MAX_POST_BYTES=void 0;p.parseHeadersEnv=qe;p.envOptionsResolver=Fe;p.postOtlp=N;var je=Q(),Ce=z(),Wt=5e3;p.MAX_POST_BYTES=900*1024;function F(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function Le(e,t,r){let n=[],o=[],s=[],u=0;for(let a of e){let c=t(a);if(c>r){o.push(a);continue}s.length>0&&u+c>r&&(n.push(s),s=[],u=0),s.push(a),u+=c}return s.length>0&&n.push(s),{chunks:n,oversize:o}}function qe(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 Fe(){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:qe(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function N(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Wt);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 u="";try{u=(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}${u?` body=${u}`:""}
12
12
  `),!1}return!0}catch(s){return process.stderr.write(`[${r}] OTLP POST failed: ${s.message??String(s)}
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};
13
+ `),!1}finally{clearTimeout(o)}}var ee=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new je.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Fe}async send(t){let r=this.resolveOptions();if(!r||this.dropIfOversized(t))return;await N(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}=Le(r,a=>F(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),u=0;for(let a of n){if(!await N((0,Ce.mergeBatch)(a.map(l=>l.payload)),t,this.logPrefix))break;u+=a.length}this.queue.rewrite(s.slice(u))}catch(r){process.stderr.write(`[${this.logPrefix}] flush failed: ${r?.message??String(r)}
15
+ `)}finally{this.queue.release()}}dropIfOversized(t){let r=F(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=ee;var te=class{queue=new je.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;if(F(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 N(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}=Le(r,F,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),u=0;for(let a of n){if(!await N((0,Ce.mergeBatch)(a),t,this.logPrefix))break;u+=a.length}for(let a of s.slice(u))this.queue.enqueue(a)}};p.MemoryTransport=te});var se=_(w=>{"use strict";var oe=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(w,"__esModule",{value:!0});w.TraceManager=void 0;w.generateUlid=Ve;var Be=oe(m("fs")),Qt=oe(m("path")),er=oe(m("crypto")),tr=C(),re="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ve(){let e=Date.now(),t="",r=e;for(let s=0;s<10;s++)t=re[r&31]+t,r=Math.floor(r/32);let n=er.default.randomBytes(10),o="";for(let s=0;s<10;s++)o+=re[n[s]&31];for(;o.length<16;)o+=re[0];return t+o}var ne=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ve();return this.save(t),t}currentTrace(){try{let t=Be.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){try{Be.default.mkdirSync(Qt.default.dirname(this.tracePath),{recursive:!0}),(0,tr.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(r){process.stderr.write(`[pinta-core] trace persistence failed: ${r}
19
+ `)}}};w.TraceManager=ne});var Ke=_(O=>{"use strict";var Ge=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 Ue=Ge(m("fs")),rr=Ge(m("path")),Xe=se(),nr=C(),Ye=200,ie=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??Ye}read(){try{let t=JSON.parse(Ue.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Ue.default.mkdirSync(rr.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;(0,nr.atomicWriteFileSync)(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Xe.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=ie;var ae=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ye}newTrace(t){let r=t||"default",n=(0,Xe.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=ae});var He=_(b=>{"use strict";var ue=b&&b.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(b,"__esModule",{value:!0});b.envFilePath=ir;b.parseEnvFile=Ze;b.loadEnvFile=ar;var or=ue(m("node:fs")),sr=ue(m("node:os")),ze=ue(m("node:path"));function ir(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:ze.default.join(sr.default.homedir(),e);return ze.default.join(o,t)}function Ze(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(),u=n.slice(o+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),s&&(t[s]=u)}return t}function ar(e){let t;try{t=or.default.readFileSync(e,"utf-8")}catch{return}let r=Ze(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var I=_(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 E=Y();Object.defineProperty(i,"redact",{enumerable:!0,get:function(){return E.redact}});Object.defineProperty(i,"truncate",{enumerable:!0,get:function(){return E.truncate}});Object.defineProperty(i,"truncateTo",{enumerable:!0,get:function(){return E.truncateTo}});Object.defineProperty(i,"collectMatches",{enumerable:!0,get:function(){return E.collectMatches}});Object.defineProperty(i,"resolveOverlaps",{enumerable:!0,get:function(){return E.resolveOverlaps}});Object.defineProperty(i,"applyMatches",{enumerable:!0,get:function(){return E.applyMatches}});Object.defineProperty(i,"PATTERNS",{enumerable:!0,get:function(){return E.PATTERNS}});Object.defineProperty(i,"MAX_BYTES",{enumerable:!0,get:function(){return E.MAX_BYTES}});var y=z();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 ur=xe();Object.defineProperty(i,"evaluateGuard",{enumerable:!0,get:function(){return ur.evaluateGuard}});var Je=Q();Object.defineProperty(i,"DiskRetryQueue",{enumerable:!0,get:function(){return Je.DiskRetryQueue}});Object.defineProperty(i,"MemoryRetryQueue",{enumerable:!0,get:function(){return Je.MemoryRetryQueue}});var A=$e();Object.defineProperty(i,"DiskTransport",{enumerable:!0,get:function(){return A.DiskTransport}});Object.defineProperty(i,"MemoryTransport",{enumerable:!0,get:function(){return A.MemoryTransport}});Object.defineProperty(i,"postOtlp",{enumerable:!0,get:function(){return A.postOtlp}});Object.defineProperty(i,"envOptionsResolver",{enumerable:!0,get:function(){return A.envOptionsResolver}});Object.defineProperty(i,"parseHeadersEnv",{enumerable:!0,get:function(){return A.parseHeadersEnv}});Object.defineProperty(i,"MAX_POST_BYTES",{enumerable:!0,get:function(){return A.MAX_POST_BYTES}});var We=se();Object.defineProperty(i,"TraceManager",{enumerable:!0,get:function(){return We.TraceManager}});Object.defineProperty(i,"generateUlid",{enumerable:!0,get:function(){return We.generateUlid}});var Qe=Ke();Object.defineProperty(i,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Qe.DiskSessionTraceManager}});Object.defineProperty(i,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Qe.MemorySessionTraceManager}});var ce=He();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 nn}from"node:fs";import{pathToFileURL as on}from"node:url";var D=R(I());function cr(){return(0,D.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function et(e=cr()){(0,D.loadEnvFile)(e)}import lr from"os";import le from"path";function pe(){return process.env.COPILOT_HOME||le.join(lr.homedir(),".copilot")}function tt(){let e=process.env.COPILOT_PLUGIN_DATA||le.join(pe(),"pinta-copilot-data");return{pluginData:e,tracePath:le.join(e,"trace.json")}}function rt(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 P(e){return typeof e=="string"?e:void 0}function M(e){return P(e.hook_event_name)??P(e.hookEventName)??P(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function nt(e){return P(e.session_id)??P(e.sessionId)}function ot(e){return P(e.tool_name)??P(e.toolName)}function st(e){return P(e.cwd)??P(e.workingDirectory)}function it(e){return e.tool_input??e.toolArgs??e.toolInput}var pr={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 at(e){let t=M(e);return t?pr[t.toLowerCase()]??"Unknown":"Unknown"}function ut(e){return e==="PreToolUse"||e==="PermissionRequest"}var fr=new Set(["report_intent","ask_user"]);function ct(e){return e!==void 0&&fr.has(e)}function lt(e,t){return e==="PreToolUse"?JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}}):e==="PermissionRequest"?JSON.stringify({behavior:"deny",message:t}):null}var B=R(I());function dr(){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,B.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var $=class extends B.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:dr})}};var pt=R(I()),V=class extends pt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var k=R(I());import gr from"fs";import de from"os";import ft from"path";var U;function hr(){if(U===void 0)try{U=de.userInfo().username}catch{U=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return U}var dt="0.6.0",mr=new Set(["","unknown","undefined","null","n/a","none"]);function S(e){let t=typeof e=="string"?e.trim():void 0;return t&&!mr.has(t.toLowerCase())?t:void 0}var yr=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function _r(e){let t=S(e);return t&&yr.test(t)?t:void 0}function Sr(e){let t=e?S(e.copilot_version)??S(e.copilotVersion)??S(e.cli_version)??S(e.cliVersion)??S(e.version):void 0;return t||(fe===void 0&&(fe=Pr()),fe??void 0)}var fe;function Pr(){let e=S(process.env.COPILOT_CLI_BINARY_VERSION)??S(process.env.COPILOT_CLI_VERSION);if(e)return e;let t=S(process.env.COPILOT_CLI_RESOLVED_DIST_DIR);if(t){let r=_r(ft.basename(t));if(r)return r;let n=Tr(t);if(n)return n}return null}function Tr(e){try{let t=gr.readFileSync(ft.join(e,"package.json"),"utf8");return S(JSON.parse(t).version)}catch{return}}var Or=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"]),Er=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),vr={skipRedactKeys:Or,bashContextKeys:Er},wr=new Set(["hook_event_name","hookEventName","hookName"]);function br(e,t){let r=Object.fromEntries(Object.entries(e).filter(([n])=>!wr.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",vr)]}function kr(e){let t=Sr(e);return[{key:"service.name",value:{stringValue:"copilot"}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:dt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:hr()}},{key:"host.name",value:{stringValue:de.hostname()}},{key:"host.arch",value:{stringValue:de.arch()}}]}function gt(e){return(0,k.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,k.snakeCase)(M(e.event)??"unknown")}`,attributes:br(e.event,e.surface),resource:kr(e.event),scope:{name:"pinta-copilot",version:dt},now:e.now,guard:e.guard})}var ht=R(I());function Ar(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||50}var Ir="pinta-copilot/0.6.0";function mt(e,t){return(0,ht.evaluateGuard)(e,t,{timeoutMs:Ar(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Ir})}async function Mr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function yt(){try{let e=tt(),t=rt(),r=await Mr(),n=JSON.parse(r),o=at(n),s=nt(n),u=new $(e);await u.flush();let a=new V(e),c=o==="UserPromptSubmit"?a.newTrace(s):a.currentTrace(s),l=ot(n),g=null;if(ut(o)&&!ct(l)){let v=it(n);g=await mt({spanId:s??"unknown",toolName:l,method:M(n),cwd:st(n),toolInput:v,rawTextFields:{toolInput:typeof v=="string"?v:JSON.stringify(v??null)}},process.env.PINTA_GUARD_ENDPOINT)}if(g?.decision==="DENY"){let v=lt(o,g.userMessage??g.reason??"guard_deny");v&&process.stdout.write(v+`
21
+ `)}let X=gt({event:n,traceId:c,surface:t,guard:g});await u.send(X)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
22
+ `)}return 0}import{opendir as Gr,stat as Xr}from"node:fs/promises";import G from"node:path";import{spawn as Pt}from"node:child_process";import{copyFile as ge,mkdtemp as Rr,rm as xr,stat as Nr}from"node:fs/promises";import Dr from"node:os";import he from"node:path";var jr=2e3,Cr=250,_t=3,St=3e4,Lr=3e4,me;function qr(){return me||(me=new Promise(e=>{let t=Pt("sqlite3",["-version"],{stdio:"ignore"});t.once("error",()=>e(!1)),t.once("exit",r=>e(r===0))})),me}function Fr(e){return`'${e.replace(/'/g,"''")}'`}async function $r(e,t){let r=`.backup ${Fr(t)}`;await new Promise((n,o)=>{let s=Pt("sqlite3",[e,r],{stdio:["ignore","ignore","pipe"],timeout:Lr,killSignal:"SIGKILL"}),u="";s.stderr?.on("data",a=>{u+=a.toString()}),s.once("error",o),s.once("exit",a=>{a===0?n():o(new Error(`sqlite3 .backup exited ${a}: ${u.trim()}`))})})}async function ye(e){try{return await Nr(e)}catch{return}}function Tt(e,t){return e===void 0||t===void 0?e===void 0&&t===void 0:e.size===t.size&&e.mtimeMs===t.mtimeMs}function Ot(e){return{wal:`${e}-wal`,shm:`${e}-shm`}}async function Br(e){let{wal:t,shm:r}=Ot(e),n=[e,t,r],o=Date.now(),s=o,u=await Promise.all(n.map(async a=>({path:a,st:await ye(a)})));for(;;){if(Date.now()-s>=jr)return u;if(Date.now()-o>=St)throw new Error(`snapshot: ${e} never quiesced within ${St}ms (actively written?)`);await new Promise(l=>setTimeout(l,Cr));let a=await Promise.all(n.map(async l=>({path:l,st:await ye(l)})));a.every((l,g)=>Tt(l.st,u[g].st))||(s=Date.now()),u=a}}async function Vr(e,t){let{wal:r,shm:n}=Ot(e),o=await Br(e);if(await ge(e,t),o.find(a=>a.path===r)?.st!==void 0&&await ge(r,`${t}-wal`),o.find(a=>a.path===n)?.st!==void 0&&await ge(n,`${t}-shm`),!(await Promise.all([e,r,n].map(async a=>({path:a,st:await ye(a)})))).every((a,c)=>Tt(a.st,o[c].st)))throw new Error(`snapshot: ${e} changed during quiesce-copy (torn-read guard)`)}async function Ur(e,t){let r;for(let n=1;n<=_t;n++)try{await Vr(e,t);return}catch(o){r=o}throw new Error(`snapshot: quiesce-copy of ${e} failed after ${_t} attempts: ${String(r)}`)}async function Et(e,t={}){let r=t.tmpDirBase??Dr.tmpdir(),n=await Rr(he.join(r,"pinta-copilot-snapshot-")),o=he.join(n,he.basename(e.absPath));try{if(await qr())try{return await $r(e.absPath,o),o}catch{}return await Ur(e.absPath,o),o}catch(s){throw await xr(n,{recursive:!0,force:!0}).catch(()=>{}),s}}var Yr="pinta-copilot",vt="events.jsonl",wt="session.db",Kr="rewind-snapshots/backups/";function zr(){return G.join(pe(),"session-state")}function Zr(e,t){return G.relative(e,t).split(G.sep).join("/")}function Hr(e){return e.endsWith(".db-wal")||e.endsWith(".db-shm")}function Jr(e){let[t]=e.split("/");return!t||t===e?{}:{sessionId:t}}function Wr(e,t){let r=e.split("/").length===2;return r&&t===vt?"append-log":r&&t===wt?"database":"rewritten-doc"}function Qr(e){let t=e.split("/"),r=t[t.length-1]??"";return t.length===2&&(r===vt||r===wt)?"session-log":e.includes(Kr)?"other":"meta"}async function bt(){return[zr()]}async function*kt(e,t){let r;try{r=await Gr(t)}catch{return}try{for await(let n of r){let o=G.join(t,n.name);n.isDirectory()?yield*kt(e,o):n.isFile()&&(yield{absPath:o,relPath:Zr(e,o)})}}catch{return}}async function*en(e){let[t]=await bt(),r=e.since?.getTime();for await(let{absPath:n,relPath:o}of kt(t,t)){let s=o.split("/"),u=s[s.length-1]??"";if(Hr(u))continue;let a;try{a=await Xr(n)}catch{continue}r!==void 0&&a.mtime.getTime()<=r||(yield{relPath:o,absPath:n,size:a.size,mtime:a.mtime,...Jr(o),semantics:Wr(o,u)})}}async function tn(e){return Et(e)}var rn={id:Yr,roots:bt,scan:en,classify:Qr,snapshot:tn};et();function sn(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===on(nn(e)).href}catch{return!1}}async function an(){let e=await yt();process.exit(e)}sn()&&an();export{rn as lifecycle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinta-ai/pinta-copilot",
3
- "version": "0.6.0",
3
+ "version": "0.7.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": {