@pinta-ai/pinta-cc 1.5.1 → 1.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pinta-cc",
3
3
  "description": "Generic OTLP forwarder for Claude Code hook events. Converts hook events into OTLP/HTTP spans and sends them to any OpenTelemetry-compatible collector.",
4
- "version": "1.5.1",
4
+ "version": "1.7.0",
5
5
  "license": "PolyForm-Noncommercial-1.0.0",
6
6
  "userConfig": {
7
7
  "endpoint": {
package/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to pinta-cc are documented here.
4
4
 
5
+ ## [1.6.1] - 2026-07-20
6
+
7
+ ### Changed
8
+
9
+ - `@pinta-ai/core` bumped `^0.3.0` → `^0.5.0` (devDependency, bundled
10
+ into `dist/` at build). Pulls in the oversized-flush fix (pinta-manager#180
11
+ follow-up): the retry queue now flushes in 900 KiB chunks instead of one
12
+ unbounded POST, spans are capped at 800 KiB at build time, and a payload
13
+ that alone exceeds the POST budget is dropped with a diagnostic instead of
14
+ poisoning every later flush. No adaptor source change was needed.
15
+
5
16
  ## [1.5.1] - 2026-07-10
6
17
 
7
18
  ### Changed
package/dist/index.js CHANGED
@@ -1,14 +1,22 @@
1
- "use strict";var it=Object.create;var ne=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var ct=Object.getPrototypeOf,lt=Object.prototype.hasOwnProperty;var d=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var pt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ut(t))!lt.call(e,o)&&o!==r&&ne(e,o,{get:()=>t[o],enumerable:!(n=at(t,o))||n.enumerable});return e};var m=(e,t,r)=>(r=e!=null?it(ct(e)):{},pt(t||!e||!e.__esModule?ne(r,"default",{value:e,enumerable:!0}):r,e));var N=d(u=>{"use strict";Object.defineProperty(u,"__esModule",{value:!0});u.PATTERNS=u.MAX_BYTES=void 0;u.truncate=ft;u.collectMatches=oe;u.resolveOverlaps=se;u.applyMatches=ie;u.redact=dt;u.MAX_BYTES=102400;function ft(e){let t=Buffer.from(e,"utf-8");return t.length<=u.MAX_BYTES?e:`${t.subarray(0,u.MAX_BYTES).toString("utf-8")}\u2026[TRUNCATED:${t.length}]`}u.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 oe(e,t){let r=[];for(let n of u.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,f=i[a];if(f===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}let te=i.index,ot=i.index+i[0].length,re=te+i[0].indexOf(f),st=re+f.length;r.push({start:te,end:ot,replaceStart:re,replaceEnd:st,type:n.type}),i.index===o.lastIndex&&o.lastIndex++}}return r}function se(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 ie(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 dt(e,t={}){if(e.length===0)return e;let r=oe(e,t);if(r.length===0)return e;let n=se(r);return ie(e,n)}});var C=d(p=>{"use strict";var mt=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(p,"__esModule",{value:!0});p.ulidToTraceId=ce;p.newSpanId=le;p.snakeCase=ht;p.toOtlpValue=pe;p.attrsFromRecord=yt;p.guardAttrs=fe;p.clientAttrs=de;p.buildPayload=vt;p.mergeBatch=Pt;var _t=mt(require("crypto")),ae=N(),gt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ce(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=gt.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 le(){return _t.default.randomBytes(8).toString("hex")}function ht(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var ue=new Set;function x(e,t,r){let n=(0,ae.truncate)(t);if((r.skipRedactKeys??ue).has(e))return n;let o=(r.bashContextKeys??ue).has(e)?"bash":void 0;return(0,ae.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 yt(e,t,r={}){let n=[];for(let[o,i]of Object.entries(e)){let a=`${t}.${o}`,f=pe(a,i,r);f!==null&&n.push({key:a,value:f})}return n}function fe(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 de(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}function vt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...fe(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...de(o));let i={traceId:ce(e.traceId),spanId:le(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[i]}]}]}}function Pt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var _e=d(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});U.evaluateGuard=Ot;var Et=1e4,Tt="pinta-core";function me(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}function St(e){return new Promise((t,r)=>setTimeout(()=>{let n=new Error("Guard request timed out");n.name="TimeoutError",r(n)},e))}async function Ot(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??Et,o=Date.now();try{let i=await Promise.race([fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??Tt,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e})}),St(n)]);if(i.status!==200)return me(Date.now()-o,"error");let a=await i.json(),f=Date.now()-o;return{decision:a.decision,reason:a.reason,userMessage:a.userMessage??null,durationMs:a.durationMs??f,clientRttMs:f}}catch(i){let a=i.name==="TimeoutError"?"timeout":"error";return me(Date.now()-o,a)}}});var B=d(h=>{"use strict";var ge=h&&h.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(h,"__esModule",{value:!0});h.MemoryRetryQueue=h.DiskRetryQueue=void 0;var c=ge(require("fs")),A=ge(require("path")),R=1e3,bt=50,kt=5,L=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=A.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{c.default.mkdirSync(A.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
2
- `;c.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
3
- `)}}readAll(){try{let t=c.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
4
- `))if(n.trim())try{r.push(JSON.parse(n))}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){c.default.existsSync(this.filePath)&&c.default.unlinkSync(this.filePath);return}c.default.mkdirSync(A.default.dirname(this.filePath),{recursive:!0}),c.default.writeFileSync(this.filePath,t.map(r=>JSON.stringify(r)).join(`
1
+ "use strict";var ht=Object.create;var ue=Object.defineProperty;var yt=Object.getOwnPropertyDescriptor;var Pt=Object.getOwnPropertyNames;var vt=Object.getPrototypeOf,Et=Object.prototype.hasOwnProperty;var h=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var St=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Pt(t))!Et.call(e,o)&&o!==r&&ue(e,o,{get:()=>t[o],enumerable:!(n=yt(t,o))||n.enumerable});return e};var y=(e,t,r)=>(r=e!=null?ht(vt(e)):{},St(t||!e||!e.__esModule?ue(r,"default",{value:e,enumerable:!0}):r,e));var $=h(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.PATTERNS=f.MAX_BYTES=void 0;f.truncateTo=ce;f.truncate=Tt;f.collectMatches=le;f.resolveOverlaps=pe;f.applyMatches=fe;f.redact=Ot;f.MAX_BYTES=102400;function ce(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 Tt(e){return ce(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 le(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,g=i.index+i[0].length,A=c+i[0].indexOf(u),gt=A+u.length;r.push({start:c,end:g,replaceStart:A,replaceEnd:gt,type:n.type}),i.index===o.lastIndex&&o.lastIndex++}}return r}function pe(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 fe(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=le(e,t);if(r.length===0)return e;let n=pe(r);return fe(e,n)}});var V=h(p=>{"use strict";var bt=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=ge;p.newSpanId=he;p.snakeCase=wt;p.toOtlpValue=ye;p.attrsFromRecord=xt;p.guardAttrs=Pe;p.clientAttrs=ve;p.enforceSpanBudget=Ee;p.buildPayload=Mt;p.mergeBatch=jt;var kt=bt(require("crypto")),Y=$(),At="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ge(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=At.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 he(){return kt.default.randomBytes(8).toString("hex")}function wt(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var de=new Set;function R(e,t,r){let n=(0,Y.truncate)(t);if((r.skipRedactKeys??de).has(e))return n;let o=(r.bashContextKeys??de).has(e)?"bash":void 0;return(0,Y.redact)(n,{context:o})}function ye(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:R(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:R(e,JSON.stringify(t),r)}}catch{return{stringValue:R(e,String(t),r)}}default:return{stringValue:R(e,String(t),r)}}}function xt(e,t,r={}){let n=[];for(let[o,i]of Object.entries(e)){let a=`${t}.${o}`,u=ye(a,i,r);u!==null&&n.push({key:a,value:u})}return n}function Pe(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 ve(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 me=1024;function Ee(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 g=Buffer.byteLength(c.value.stringValue,"utf-8");g>i&&(i=g,o=c.value)}if(o===null||i<=me)break;let a=r-t,u=Math.max(me,i-a-64);o.stringValue=(0,Y.truncateTo)(o.stringValue,u),r=_e(e)}return e}function Mt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...Pe(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...ve(o));let i={traceId:ge(e.traceId),spanId:he(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return Ee(i),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[i]}]}]}}function jt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var Se=h(X=>{"use strict";Object.defineProperty(X,"__esModule",{value:!0});X.evaluateGuard=Nt;var Rt=1e4,Dt="pinta-core";function G(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var It=new Set(["ALLOW","DENY","REVIEW"]);async function Nt(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??Rt,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??Dt,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e}),signal:i.signal});if(u.status!==200)return G(Date.now()-o,"error");let c=await u.json(),g=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!It.has(c.decision)||!g)return G(Date.now()-o,"error");let A=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??A,clientRttMs:A}}catch(u){let c=u.name,g=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return G(Date.now()-o,g)}finally{clearTimeout(a)}}});var D=h(w=>{"use strict";var Ct=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(w,"__esModule",{value:!0});w.atomicWriteFileSync=Bt;var Te=Ct(require("fs"));function Bt(e,t){let r=`${e}.${process.pid}.tmp`;Te.default.writeFileSync(r,t),Te.default.renameSync(r,e)}});var Z=h(P=>{"use strict";var Oe=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 _=Oe(require("fs")),I=Oe(require("path")),Ut=D(),N=1e3,Lt=50,qt=5,K=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=I.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{_.default.mkdirSync(I.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(I.default.dirname(this.filePath),{recursive:!0}),(0,Ut.atomicWriteFileSync)(this.filePath,t.map(r=>JSON.stringify(r)).join(`
5
5
  `)+`
6
6
  `)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
7
- `)}}tryAcquireLock(){let t=Date.now();for(c.default.mkdirSync(A.default.dirname(this.lockPath),{recursive:!0});Date.now()-t<bt;)try{let r=c.default.openSync(this.lockPath,"wx");return c.default.writeSync(r,String(process.pid)),c.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
8
- `),!1;try{let i=c.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){c.default.unlinkSync(this.lockPath);continue}}catch{}let n=kt,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{c.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=R)return;let r=t.length-R;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
9
- `),this.rewrite(t.slice(r))}};h.DiskRetryQueue=L;var q=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>R&&this.entries.splice(0,this.entries.length-R)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};h.MemoryRetryQueue=q});var Ee=d(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});_.MemoryTransport=_.DiskTransport=void 0;_.parseHeadersEnv=ve;_.envOptionsResolver=Pe;_.postOtlp=O;var he=B(),ye=C(),wt=5e3;function ve(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 Pe(){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:ve(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function O(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),wt);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 f=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}${f}${a?` body=${a}`:""}
7
+ `)}}tryAcquireLock(){let t=Date.now();try{_.default.mkdirSync(I.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<Lt;)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=qt,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<=N)return;let r=t.length-N;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
10
+ `),this.rewrite(t.slice(r))}};P.DiskRetryQueue=K;var z=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>N&&this.entries.splice(0,this.entries.length-N)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};P.MemoryRetryQueue=z});var Me=h(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});l.MemoryTransport=l.DiskTransport=l.MAX_POST_BYTES=void 0;l.parseHeadersEnv=we;l.envOptionsResolver=xe;l.postOtlp=x;var be=Z(),ke=V(),Ft=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 Ae(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 we(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:we(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function x(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Ft);try{let i=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!i.ok){let a="";try{a=(await i.text()).slice(0,200)}catch{}let u=i.status===401||i.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":i.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":i.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${i.status} ${t.endpoint}${u}${a?` body=${a}`:""}
10
11
  `),!1}return!0}catch(i){return process.stderr.write(`[${r}] OTLP POST failed: ${i.message??String(i)}
11
- `),!1}finally{clearTimeout(o)}}var F=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new he.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Pe}async send(t){let r=this.resolveOptions();if(!r)return;await O(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let n=(0,ye.mergeBatch)(r.map(i=>i.payload));await O(n,t,this.logPrefix)&&this.queue.rewrite([])}finally{this.queue.release()}}};_.DiskTransport=F;var G=class{queue=new he.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;await O(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let n=(0,ye.mergeBatch)(r);if(!await O(n,t,this.logPrefix))for(let i of r)this.queue.enqueue(i)}};_.MemoryTransport=G});var Y=d(v=>{"use strict";var X=v&&v.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(v,"__esModule",{value:!0});v.TraceManager=void 0;v.generateUlid=Te;var V=X(require("fs")),xt=X(require("path")),At=X(require("crypto")),$="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Te(){let e=Date.now(),t="",r=e;for(let i=0;i<10;i++)t=$[r&31]+t,r=Math.floor(r/32);let n=At.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=$[n[i]&31];for(;o.length<16;)o+=$[0];return t+o}var K=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Te();return this.save(t),t}currentTrace(){try{let t=V.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){V.default.mkdirSync(xt.default.dirname(this.tracePath),{recursive:!0}),V.default.writeFileSync(this.tracePath,JSON.stringify({traceId:t}))}};v.TraceManager=K});var ke=d(y=>{"use strict";var Se=y&&y.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(y,"__esModule",{value:!0});y.MemorySessionTraceManager=y.DiskSessionTraceManager=void 0;var Z=Se(require("fs")),Rt=Se(require("path")),Oe=Y(),be=200,J=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??be}read(){try{let t=JSON.parse(Z.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Z.default.mkdirSync(Rt.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;Z.default.writeFileSync(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Oe.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)}};y.DiskSessionTraceManager=J;var z=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??be}newTrace(t){let r=t||"default",n=(0,Oe.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)}};y.MemorySessionTraceManager=z});var Ae=d(P=>{"use strict";var H=P&&P.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(P,"__esModule",{value:!0});P.envFilePath=Dt;P.parseEnvFile=xe;P.loadEnvFile=It;var jt=H(require("node:fs")),Mt=H(require("node:os")),we=H(require("node:path"));function Dt(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:we.default.join(Mt.default.homedir(),e);return we.default.join(o,t)}function xe(e){let t={};for(let r of e.split(`
12
- `)){let n=r.trim();if(!n||n.startsWith("#"))continue;let o=n.indexOf("=");if(o<0)continue;let i=n.slice(0,o).trim(),a=n.slice(o+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),i&&(t[i]=a)}return t}function It(e){let t;try{t=jt.default.readFileSync(e,"utf-8")}catch{return}let r=xe(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var T=d(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.loadEnvFile=s.parseEnvFile=s.envFilePath=s.MemorySessionTraceManager=s.DiskSessionTraceManager=s.generateUlid=s.TraceManager=s.parseHeadersEnv=s.envOptionsResolver=s.postOtlp=s.MemoryTransport=s.DiskTransport=s.MemoryRetryQueue=s.DiskRetryQueue=s.evaluateGuard=s.mergeBatch=s.buildPayload=s.clientAttrs=s.guardAttrs=s.attrsFromRecord=s.toOtlpValue=s.snakeCase=s.newSpanId=s.ulidToTraceId=s.MAX_BYTES=s.PATTERNS=s.applyMatches=s.resolveOverlaps=s.collectMatches=s.truncate=s.redact=void 0;var E=N();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return E.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return E.truncate}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return E.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return E.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return E.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return E.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return E.MAX_BYTES}});var g=C();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return g.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return g.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return g.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return g.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return g.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return g.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return g.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return g.buildPayload}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return g.mergeBatch}});var Nt=_e();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Nt.evaluateGuard}});var Re=B();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return Re.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return Re.MemoryRetryQueue}});var b=Ee();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return b.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return b.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return b.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return b.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return b.parseHeadersEnv}});var je=Y();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return je.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return je.generateUlid}});var Me=ke();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Me.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Me.MemorySessionTraceManager}});var W=Ae();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return W.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return W.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return W.loadEnvFile}})});var k=m(T());function Ct(){return(0,k.envFilePath)(".claude","pinta-cc.env")}function De(e=Ct()){(0,k.loadEnvFile)(e)}function Ie(){process.env.CLAUDE_PLUGIN_OPTION_ENDPOINT&&!process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT&&(process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=process.env.CLAUDE_PLUGIN_OPTION_ENDPOINT),process.env.CLAUDE_PLUGIN_OPTION_API_KEY&&!process.env.OTEL_EXPORTER_OTLP_HEADERS&&(process.env.OTEL_EXPORTER_OTLP_HEADERS=`x-pinta-relay-token=${process.env.CLAUDE_PLUGIN_OPTION_API_KEY}`),!process.env.PINTA_RELAY_TOKEN&&process.env.CLAUDE_PLUGIN_OPTION_API_KEY&&(process.env.PINTA_RELAY_TOKEN=process.env.CLAUDE_PLUGIN_OPTION_API_KEY)}var Q=m(require("path"));function Ne(){let e=process.env.CLAUDE_PLUGIN_ROOT||process.cwd(),t=process.env.CLAUDE_PLUGIN_DATA||Q.default.join(e,".plugin-data");return{pluginRoot:e,pluginData:t,tracePath:Q.default.join(t,"trace.json")}}function Ce(e){return e.hook_event_name==="PreToolUse"}function Ue(e){return e.hook_event_name==="PostToolUse"||e.hook_event_name==="PostToolUseFailure"}function Le(e){return e.hook_event_name==="UserPromptSubmit"}function qe(e){return e.hook_event_name==="SessionStart"||e.hook_event_name==="SessionEnd"}function Be(e){return e.hook_event_name==="SubagentStart"||e.hook_event_name==="SubagentStop"}function Fe(e){return e.hook_event_name==="Stop"}function Ge(e){return e.hook_event_name==="PermissionRequest"||e.hook_event_name==="PermissionDenied"}var Ut=new Set(["Notification","TaskCreated","TaskCompleted"]);function Ve(e){return Ut.has(e.hook_event_name)}var $e=m(T()),Lt=1e4,qt="pinta-cc/1.5.1";function Ke(e,t){return(0,$e.evaluateGuard)(e,t,{timeoutMs:Lt,token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:qt})}var Xe=m(T()),j=class extends Xe.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-cc"})}};var Ye=m(T()),M=class extends Ye.TraceManager{constructor(t){super(t.tracePath)}};var Ze=m(require("fs")),I=m(require("os")),w=m(require("path")),S=m(T()),Je="1.5.1",D=null;function Bt(){return D!==null||(D=Gt()??"unknown"),D}var Ft=6;function Gt(){let e=process.env.CLAUDE_CODE_EXECPATH;if(!e)return null;let t=w.default.dirname(e),r=w.default.parse(t).root;for(let n=0;n<Ft&&t!==r;n++){let o=w.default.join(t,"package.json");try{let i=Ze.default.readFileSync(o,"utf-8"),a=JSON.parse(i);if(typeof a.name=="string"&&a.name.startsWith("@anthropic-ai/claude-code")&&typeof a.version=="string")return a.version}catch{}t=w.default.dirname(t)}return null}var Vt=new Set(["cc.hook","cc.tool_name","cc.tool_use_id","cc.session_id","cc.transcript_path","cc.cwd","cc.permission_mode"]),$t=new Set(["cc.tool_input","cc.tool_response"]),Kt={skipRedactKeys:Vt,bashContextKeys:$t};function Xt(e){let t=[];t.push({key:"ingest.type",value:{stringValue:"cc"}}),t.push({key:"cc.hook",value:{stringValue:e.hook_event_name}});let r={};for(let[n,o]of Object.entries(e))n!=="hook_event_name"&&(r[n]=o);return t.push(...(0,S.attrsFromRecord)(r,"cc",Kt)),t}function Yt(){return[{key:"service.name",value:{stringValue:"claude-code"}},{key:"service.version",value:{stringValue:Bt()}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-cc"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:Je}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:I.default.userInfo().username}},{key:"host.name",value:{stringValue:I.default.hostname()}},{key:"host.arch",value:{stringValue:I.default.arch()}}]}function ze(e){return(0,S.buildPayload)({traceId:e.traceId,spanName:`cc.${(0,S.snakeCase)(e.event.hook_event_name)}`,attributes:Xt(e.event),resource:Yt(),scope:{name:"pinta-cc",version:Je},now:e.now,guard:e.guard})}async function l(e,t,r={}){let n=new j(t);await n.flush();let o=new M(t),i=r.traceMode==="new"?o.newTrace():o.currentTrace(),a=ze({event:e,traceId:i,guard:r.guard});await n.send(a)}async function He(e,t){let r=typeof e.tool_input=="string"?e.tool_input:JSON.stringify(e.tool_input),n=await Ke({spanId:e.session_id??"unknown",toolName:e.tool_name,toolInput:e.tool_input,rawTextFields:{toolInput:r}},process.env.PINTA_GUARD_ENDPOINT);if(await l(e,t,{guard:n}),n?.decision==="DENY"){let i={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:n.userMessage??n.reason??"guard_deny"}};process.stdout.write(JSON.stringify(i)+`
13
- `)}return 0}async function We(e,t){return await l(e,t),0}async function Qe(e,t){return await l(e,t,{traceMode:"new"}),0}async function et(e,t){return await l(e,t),0}async function tt(e,t){return await l(e,t),0}async function rt(e,t){return await l(e,t),0}async function nt(e,t){return await l(e,t),0}async function ee(e){return 0}De();async function Zt(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function Jt(){Ie();let e=0;try{let t=Ne(),r=await Zt(),n=JSON.parse(r);Ve(n)?e=await ee(n):Ce(n)?e=await He(n,t):Ue(n)?e=await We(n,t):Le(n)?e=await Qe(n,t):qe(n)?e=await et(n,t):Be(n)?e=await tt(n,t):Fe(n)?e=await rt(n,t):Ge(n)?e=await nt(n,t):e=await ee(n)}catch(t){process.stderr.write(`[pinta-cc] error: ${t}
14
- `),e=0}process.exit(e)}Jt();
12
+ `),!1}finally{clearTimeout(o)}}var J=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new be.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??xe}async send(t){let r=this.resolveOptions();if(!r||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}=Ae(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 x((0,ke.mergeBatch)(u.map(g=>g.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=J;var W=class{queue=new be.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;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 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}=Ae(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 x((0,ke.mergeBatch)(u),t,this.logPrefix))break;a+=u.length}for(let u of i.slice(a))this.queue.enqueue(u)}};l.MemoryTransport=W});var te=h(S=>{"use strict";var ee=S&&S.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(S,"__esModule",{value:!0});S.TraceManager=void 0;S.generateUlid=Re;var je=ee(require("fs")),$t=ee(require("path")),Yt=ee(require("crypto")),Vt=D(),H="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Re(){let e=Date.now(),t="",r=e;for(let i=0;i<10;i++)t=H[r&31]+t,r=Math.floor(r/32);let n=Yt.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=H[n[i]&31];for(;o.length<16;)o+=H[0];return t+o}var Q=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Re();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($t.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
+ `)}}};S.TraceManager=Q});var Be=h(v=>{"use strict";var Ie=v&&v.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(v,"__esModule",{value:!0});v.MemorySessionTraceManager=v.DiskSessionTraceManager=void 0;var De=Ie(require("fs")),Gt=Ie(require("path")),Ne=te(),Xt=D(),Ce=200,re=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(Gt.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;(0,Xt.atomicWriteFileSync)(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Ne.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)}};v.DiskSessionTraceManager=re;var ne=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ce}newTrace(t){let r=t||"default",n=(0,Ne.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)}};v.MemorySessionTraceManager=ne});var qe=h(T=>{"use strict";var oe=T&&T.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(T,"__esModule",{value:!0});T.envFilePath=Zt;T.parseEnvFile=Le;T.loadEnvFile=Jt;var Kt=oe(require("node:fs")),zt=oe(require("node:os")),Ue=oe(require("node:path"));function Zt(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:Ue.default.join(zt.default.homedir(),e);return Ue.default.join(o,t)}function Le(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 Jt(e){let t;try{t=Kt.default.readFileSync(e,"utf-8")}catch{return}let r=Le(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var b=h(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.loadEnvFile=s.parseEnvFile=s.envFilePath=s.MemorySessionTraceManager=s.DiskSessionTraceManager=s.generateUlid=s.TraceManager=s.MAX_POST_BYTES=s.parseHeadersEnv=s.envOptionsResolver=s.postOtlp=s.MemoryTransport=s.DiskTransport=s.MemoryRetryQueue=s.DiskRetryQueue=s.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 E=$();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return E.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return E.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return E.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return E.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return E.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return E.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return E.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return E.MAX_BYTES}});var m=V();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return m.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return m.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return m.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return m.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return m.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return m.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return m.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return m.buildPayload}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return m.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return m.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return m.MAX_SPAN_BYTES}});var Wt=Se();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Wt.evaluateGuard}});var Fe=Z();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return Fe.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return Fe.MemoryRetryQueue}});var O=Me();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return O.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return O.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return O.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return O.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return O.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return O.MAX_POST_BYTES}});var $e=te();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return $e.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return $e.generateUlid}});var Ye=Be();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Ye.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Ye.MemorySessionTraceManager}});var se=qe();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return se.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return se.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return se.loadEnvFile}})});var M=y(b());function Ht(){return(0,M.envFilePath)(".claude","pinta-cc.env")}function Ve(e=Ht()){(0,M.loadEnvFile)(e)}function Ge(){process.env.CLAUDE_PLUGIN_OPTION_ENDPOINT&&!process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT&&(process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=process.env.CLAUDE_PLUGIN_OPTION_ENDPOINT),process.env.CLAUDE_PLUGIN_OPTION_API_KEY&&!process.env.OTEL_EXPORTER_OTLP_HEADERS&&(process.env.OTEL_EXPORTER_OTLP_HEADERS=`x-pinta-relay-token=${process.env.CLAUDE_PLUGIN_OPTION_API_KEY}`),!process.env.PINTA_RELAY_TOKEN&&process.env.CLAUDE_PLUGIN_OPTION_API_KEY&&(process.env.PINTA_RELAY_TOKEN=process.env.CLAUDE_PLUGIN_OPTION_API_KEY)}var ie=y(require("path"));function Xe(){let e=process.env.CLAUDE_PLUGIN_ROOT||process.cwd(),t=process.env.CLAUDE_PLUGIN_DATA||ie.default.join(e,".plugin-data");return{pluginRoot:e,pluginData:t,tracePath:ie.default.join(t,"trace.json")}}function Ke(e){return e.hook_event_name==="PreToolUse"}function ze(e){return e.hook_event_name==="PostToolUse"||e.hook_event_name==="PostToolUseFailure"}function Ze(e){return e.hook_event_name==="UserPromptSubmit"}function Je(e){return e.hook_event_name==="SessionStart"||e.hook_event_name==="SessionEnd"}function We(e){return e.hook_event_name==="SubagentStart"||e.hook_event_name==="SubagentStop"}function He(e){return e.hook_event_name==="Stop"}function Qe(e){return e.hook_event_name==="PermissionRequest"||e.hook_event_name==="PermissionDenied"}var Qt=new Set(["Notification","TaskCreated","TaskCompleted"]);function et(e){return Qt.has(e.hook_event_name)}var tt=y(b()),er=1e4,tr="pinta-cc/1.7.0";function rt(e,t){return(0,tt.evaluateGuard)(e,t,{timeoutMs:er,token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:tr})}var nt=y(b()),B=class extends nt.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-cc"})}};var ot=y(b()),U=class extends ot.TraceManager{constructor(t){super(t.tracePath)}};var st=y(require("fs")),F=y(require("os")),j=y(require("path")),k=y(b()),L;function rr(){if(L===void 0)try{L=F.default.userInfo().username}catch{L=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return L}var it="1.7.0",q=null;function nr(){return q!==null||(q=sr()??"unknown"),q}var or=6;function sr(){let e=process.env.CLAUDE_CODE_EXECPATH;if(!e)return null;let t=j.default.dirname(e),r=j.default.parse(t).root;for(let n=0;n<or&&t!==r;n++){let o=j.default.join(t,"package.json");try{let i=st.default.readFileSync(o,"utf-8"),a=JSON.parse(i);if(typeof a.name=="string"&&a.name.startsWith("@anthropic-ai/claude-code")&&typeof a.version=="string")return a.version}catch{}t=j.default.dirname(t)}return null}var ir=new Set(["cc.hook","cc.tool_name","cc.tool_use_id","cc.session_id","cc.transcript_path","cc.cwd","cc.permission_mode"]),ar=new Set(["cc.tool_input","cc.tool_response"]),ur={skipRedactKeys:ir,bashContextKeys:ar};function cr(e){let t=[];t.push({key:"ingest.type",value:{stringValue:"cc"}}),t.push({key:"cc.hook",value:{stringValue:e.hook_event_name}});let r={};for(let[n,o]of Object.entries(e))n!=="hook_event_name"&&(r[n]=o);return t.push(...(0,k.attrsFromRecord)(r,"cc",ur)),t}function lr(){return[{key:"service.name",value:{stringValue:"claude-code"}},{key:"service.version",value:{stringValue:nr()}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-cc"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:it}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:rr()}},{key:"host.name",value:{stringValue:F.default.hostname()}},{key:"host.arch",value:{stringValue:F.default.arch()}}]}function at(e){return(0,k.buildPayload)({traceId:e.traceId,spanName:`cc.${(0,k.snakeCase)(e.event.hook_event_name)}`,attributes:cr(e.event),resource:lr(),scope:{name:"pinta-cc",version:it},now:e.now,guard:e.guard})}async function d(e,t,r={}){let n=new B(t);await n.flush();let o=new U(t),i=r.traceMode==="new"?o.newTrace():o.currentTrace(),a=at({event:e,traceId:i,guard:r.guard});await n.send(a)}async function ut(e,t){let r=typeof e.tool_input=="string"?e.tool_input:JSON.stringify(e.tool_input),n=await rt({spanId:e.session_id??"unknown",toolName:e.tool_name,method:e.hook_event_name,cwd:e.cwd,toolInput:e.tool_input,rawTextFields:{toolInput:r}},process.env.PINTA_GUARD_ENDPOINT);if(n?.decision==="DENY"){let i={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:n.userMessage??n.reason??"guard_deny"}};process.stdout.write(JSON.stringify(i)+`
20
+ `)}try{await d(e,t,{guard:n})}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
21
+ `)}return 0}async function ct(e,t){return await d(e,t),0}async function lt(e,t){return await d(e,t,{traceMode:"new"}),0}async function pt(e,t){return await d(e,t),0}async function ft(e,t){return await d(e,t),0}async function dt(e,t){return await d(e,t),0}async function _t(e,t){return await d(e,t),0}async function ae(e){return 0}async function pr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function mt(){Ge();let e=0;try{let t=Xe(),r=await pr(),n=JSON.parse(r);et(n)?e=await ae(n):Ke(n)?e=await ut(n,t):ze(n)?e=await ct(n,t):Ze(n)?e=await lt(n,t):Je(n)?e=await pt(n,t):We(n)?e=await ft(n,t):He(n)?e=await dt(n,t):Qe(n)?e=await _t(n,t):e=await ae(n)}catch(t){process.stderr.write(`[pinta-cc] error: ${t}
22
+ `),e=0}return e}Ve();async function fr(){let e=await mt();process.exit(e)}fr();
package/dist/index.mjs ADDED
@@ -0,0 +1,23 @@
1
+ import{createRequire as __pintaCreateRequire}from 'node:module';const require=__pintaCreateRequire(import.meta.url);
2
+ var Et=Object.create;var ue=Object.defineProperty;var Tt=Object.getOwnPropertyDescriptor;var St=Object.getOwnPropertyNames;var Ot=Object.getPrototypeOf,bt=Object.prototype.hasOwnProperty;var _=(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 y=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var kt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of St(t))!bt.call(e,o)&&o!==r&&ue(e,o,{get:()=>t[o],enumerable:!(n=Tt(t,o))||n.enumerable});return e};var w=(e,t,r)=>(r=e!=null?Et(Ot(e)):{},kt(t||!e||!e.__esModule?ue(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=At;f.collectMatches=pe;f.resolveOverlaps=fe;f.applyMatches=de;f.redact=wt;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 At(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),s;for(;(s=o.exec(e))!==null;){let a=n.captureGroup??0,c=s[a];if(c===void 0){s.index===o.lastIndex&&o.lastIndex++;continue}let u=s.index,h=s.index+s[0].length,A=u+s[0].indexOf(c),vt=A+c.length;r.push({start:u,end:h,replaceStart:A,replaceEnd:vt,type:n.type}),s.index===o.lastIndex&&o.lastIndex++}}return r}function fe(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 de(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 wt(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 V=y(p=>{"use strict";var xt=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=he;p.newSpanId=ye;p.snakeCase=Rt;p.toOtlpValue=Pe;p.attrsFromRecord=It;p.guardAttrs=ve;p.clientAttrs=Ee;p.enforceSpanBudget=Te;p.buildPayload=Dt;p.mergeBatch=Nt;var Mt=xt(_("crypto")),G=Y(),jt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function he(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 ye(){return Mt.default.randomBytes(8).toString("hex")}function Rt(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var me=new Set;function I(e,t,r){let n=(0,G.truncate)(t);if((r.skipRedactKeys??me).has(e))return n;let o=(r.bashContextKeys??me).has(e)?"bash":void 0;return(0,G.redact)(n,{context:o})}function Pe(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:I(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:I(e,JSON.stringify(t),r)}}catch{return{stringValue:I(e,String(t),r)}}default:return{stringValue:I(e,String(t),r)}}}function It(e,t,r={}){let n=[];for(let[o,s]of Object.entries(e)){let a=`${t}.${o}`,c=Pe(a,s,r);c!==null&&n.push({key:a,value:c})}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}}]}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 ge=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,s=0;for(let u of e.attributes){if(!("stringValue"in u.value))continue;let h=Buffer.byteLength(u.value.stringValue,"utf-8");h>s&&(s=h,o=u.value)}if(o===null||s<=ge)break;let a=r-t,c=Math.max(ge,s-a-64);o.stringValue=(0,G.truncateTo)(o.stringValue,c),r=_e(e)}return e}function Dt(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 s={traceId:he(e.traceId),spanId:ye(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return Te(s),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]}}function Nt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var Se=y(K=>{"use strict";Object.defineProperty(K,"__esModule",{value:!0});K.evaluateGuard=Lt;var Ct=1e4,Ut="pinta-core";function X(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Bt=new Set(["ALLOW","DENY","REVIEW"]);async function Lt(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??Ct,o=Date.now(),s=new AbortController,a=setTimeout(()=>s.abort(),n);try{let c=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??Ut,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e}),signal:s.signal});if(c.status!==200)return X(Date.now()-o,"error");let u=await c.json(),h=u?.durationMs===void 0||typeof u.durationMs=="number"&&Number.isFinite(u.durationMs);if(!u||!Bt.has(u.decision)||!h)return X(Date.now()-o,"error");let A=Date.now()-o;return{decision:u.decision,reason:u.reason??null,userMessage:u.userMessage??null,durationMs:u.durationMs??A,clientRttMs:A}}catch(c){let u=c.name,h=u==="AbortError"||u==="TimeoutError"?"timeout":"error";return X(Date.now()-o,h)}finally{clearTimeout(a)}}});var D=y(x=>{"use strict";var Ft=x&&x.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(x,"__esModule",{value:!0});x.atomicWriteFileSync=qt;var Oe=Ft(_("fs"));function qt(e,t){let r=`${e}.${process.pid}.tmp`;Oe.default.writeFileSync(r,t),Oe.default.renameSync(r,e)}});var Z=y(P=>{"use strict";var be=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 m=be(_("fs")),N=be(_("path")),$t=D(),C=1e3,Yt=50,Gt=5,z=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=N.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{m.default.mkdirSync(N.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
+ `;m.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
4
+ `)}}readAll(){try{let t=m.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){m.default.existsSync(this.filePath)&&m.default.unlinkSync(this.filePath);return}m.default.mkdirSync(N.default.dirname(this.filePath),{recursive:!0}),(0,$t.atomicWriteFileSync)(this.filePath,t.map(r=>JSON.stringify(r)).join(`
6
+ `)+`
7
+ `)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
8
+ `)}}tryAcquireLock(){let t=Date.now();try{m.default.mkdirSync(N.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<Yt;)try{let r=m.default.openSync(this.lockPath,"wx");return m.default.writeSync(r,String(process.pid)),m.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=m.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){m.default.unlinkSync(this.lockPath);continue}}catch{}let n=Gt,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{m.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=C)return;let r=t.length-C;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
11
+ `),this.rewrite(t.slice(r))}};P.DiskRetryQueue=z;var W=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>C&&this.entries.splice(0,this.entries.length-C)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};P.MemoryRetryQueue=W});var je=y(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});l.MemoryTransport=l.DiskTransport=l.MAX_POST_BYTES=void 0;l.parseHeadersEnv=xe;l.envOptionsResolver=Me;l.postOtlp=M;var ke=Z(),Ae=V(),Vt=5e3;l.MAX_POST_BYTES=900*1024;function U(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function we(e,t,r){let n=[],o=[],s=[],a=0;for(let c of e){let u=t(c);if(u>r){o.push(c);continue}s.length>0&&a+u>r&&(n.push(s),s=[],a=0),s.push(c),a+=u}return s.length>0&&n.push(s),{chunks:n,oversize:o}}function xe(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 Me(){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:xe(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function M(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Vt);try{let s=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!s.ok){let a="";try{a=(await s.text()).slice(0,200)}catch{}let c=s.status===401||s.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":s.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":s.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${s.status} ${t.endpoint}${c}${a?` body=${a}`:""}
12
+ `),!1}return!0}catch(s){return process.stderr.write(`[${r}] OTLP POST failed: ${s.message??String(s)}
13
+ `),!1}finally{clearTimeout(o)}}var J=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new ke.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Me}async send(t){let r=this.resolveOptions();if(!r||this.dropIfOversized(t))return;await M(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,c=>U(c.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)
14
+ `);let s=[].concat(...n),a=0;for(let c of n){if(!await M((0,Ae.mergeBatch)(c.map(h=>h.payload)),t,this.logPrefix))break;a+=c.length}this.queue.rewrite(s.slice(a))}catch(r){process.stderr.write(`[${this.logPrefix}] flush failed: ${r?.message??String(r)}
15
+ `)}finally{this.queue.release()}}dropIfOversized(t){let r=U(t);return r<=l.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${r} > ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
16
+ `),!0)}};l.DiskTransport=J;var H=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(U(t)>l.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
17
+ `);return}await M(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,U,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)
18
+ `);let s=[].concat(...n),a=0;for(let c of n){if(!await M((0,Ae.mergeBatch)(c),t,this.logPrefix))break;a+=c.length}for(let c of s.slice(a))this.queue.enqueue(c)}};l.MemoryTransport=H});var re=y(T=>{"use strict";var te=T&&T.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(T,"__esModule",{value:!0});T.TraceManager=void 0;T.generateUlid=Ie;var Re=te(_("fs")),Xt=te(_("path")),Kt=te(_("crypto")),zt=D(),Q="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ie(){let e=Date.now(),t="",r=e;for(let s=0;s<10;s++)t=Q[r&31]+t,r=Math.floor(r/32);let n=Kt.default.randomBytes(10),o="";for(let s=0;s<10;s++)o+=Q[n[s]&31];for(;o.length<16;)o+=Q[0];return t+o}var ee=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ie();return this.save(t),t}currentTrace(){try{let t=Re.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){try{Re.default.mkdirSync(Xt.default.dirname(this.tracePath),{recursive:!0}),(0,zt.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(r){process.stderr.write(`[pinta-core] trace persistence failed: ${r}
19
+ `)}}};T.TraceManager=ee});var Be=y(v=>{"use strict";var Ne=v&&v.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(v,"__esModule",{value:!0});v.MemorySessionTraceManager=v.DiskSessionTraceManager=void 0;var De=Ne(_("fs")),Wt=Ne(_("path")),Ce=re(),Zt=D(),Ue=200,ne=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??Ue}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(Wt.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;(0,Zt.atomicWriteFileSync)(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Ce.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)}};v.DiskSessionTraceManager=ne;var oe=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ue}newTrace(t){let r=t||"default",n=(0,Ce.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)}};v.MemorySessionTraceManager=oe});var qe=y(S=>{"use strict";var se=S&&S.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(S,"__esModule",{value:!0});S.envFilePath=Qt;S.parseEnvFile=Fe;S.loadEnvFile=er;var Jt=se(_("node:fs")),Ht=se(_("node:os")),Le=se(_("node:path"));function Qt(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:Le.default.join(Ht.default.homedir(),e);return Le.default.join(o,t)}function Fe(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(),a=n.slice(o+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),s&&(t[s]=a)}return t}function er(e){let t;try{t=Jt.default.readFileSync(e,"utf-8")}catch{return}let r=Fe(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var b=y(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 g=V();Object.defineProperty(i,"ulidToTraceId",{enumerable:!0,get:function(){return g.ulidToTraceId}});Object.defineProperty(i,"newSpanId",{enumerable:!0,get:function(){return g.newSpanId}});Object.defineProperty(i,"snakeCase",{enumerable:!0,get:function(){return g.snakeCase}});Object.defineProperty(i,"toOtlpValue",{enumerable:!0,get:function(){return g.toOtlpValue}});Object.defineProperty(i,"attrsFromRecord",{enumerable:!0,get:function(){return g.attrsFromRecord}});Object.defineProperty(i,"guardAttrs",{enumerable:!0,get:function(){return g.guardAttrs}});Object.defineProperty(i,"clientAttrs",{enumerable:!0,get:function(){return g.clientAttrs}});Object.defineProperty(i,"buildPayload",{enumerable:!0,get:function(){return g.buildPayload}});Object.defineProperty(i,"mergeBatch",{enumerable:!0,get:function(){return g.mergeBatch}});Object.defineProperty(i,"enforceSpanBudget",{enumerable:!0,get:function(){return g.enforceSpanBudget}});Object.defineProperty(i,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return g.MAX_SPAN_BYTES}});var tr=Se();Object.defineProperty(i,"evaluateGuard",{enumerable:!0,get:function(){return tr.evaluateGuard}});var $e=Z();Object.defineProperty(i,"DiskRetryQueue",{enumerable:!0,get:function(){return $e.DiskRetryQueue}});Object.defineProperty(i,"MemoryRetryQueue",{enumerable:!0,get:function(){return $e.MemoryRetryQueue}});var O=je();Object.defineProperty(i,"DiskTransport",{enumerable:!0,get:function(){return O.DiskTransport}});Object.defineProperty(i,"MemoryTransport",{enumerable:!0,get:function(){return O.MemoryTransport}});Object.defineProperty(i,"postOtlp",{enumerable:!0,get:function(){return O.postOtlp}});Object.defineProperty(i,"envOptionsResolver",{enumerable:!0,get:function(){return O.envOptionsResolver}});Object.defineProperty(i,"parseHeadersEnv",{enumerable:!0,get:function(){return O.parseHeadersEnv}});Object.defineProperty(i,"MAX_POST_BYTES",{enumerable:!0,get:function(){return O.MAX_POST_BYTES}});var Ye=re();Object.defineProperty(i,"TraceManager",{enumerable:!0,get:function(){return Ye.TraceManager}});Object.defineProperty(i,"generateUlid",{enumerable:!0,get:function(){return Ye.generateUlid}});var Ge=Be();Object.defineProperty(i,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Ge.DiskSessionTraceManager}});Object.defineProperty(i,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Ge.MemorySessionTraceManager}});var ie=qe();Object.defineProperty(i,"envFilePath",{enumerable:!0,get:function(){return ie.envFilePath}});Object.defineProperty(i,"parseEnvFile",{enumerable:!0,get:function(){return ie.parseEnvFile}});Object.defineProperty(i,"loadEnvFile",{enumerable:!0,get:function(){return ie.loadEnvFile}})});import{realpathSync as xr}from"node:fs";import{pathToFileURL as Mr}from"node:url";var j=w(b());function rr(){return(0,j.envFilePath)(".claude","pinta-cc.env")}function Ve(e=rr()){(0,j.loadEnvFile)(e)}function Xe(){process.env.CLAUDE_PLUGIN_OPTION_ENDPOINT&&!process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT&&(process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=process.env.CLAUDE_PLUGIN_OPTION_ENDPOINT),process.env.CLAUDE_PLUGIN_OPTION_API_KEY&&!process.env.OTEL_EXPORTER_OTLP_HEADERS&&(process.env.OTEL_EXPORTER_OTLP_HEADERS=`x-pinta-relay-token=${process.env.CLAUDE_PLUGIN_OPTION_API_KEY}`),!process.env.PINTA_RELAY_TOKEN&&process.env.CLAUDE_PLUGIN_OPTION_API_KEY&&(process.env.PINTA_RELAY_TOKEN=process.env.CLAUDE_PLUGIN_OPTION_API_KEY)}import Ke from"path";function ze(){let e=process.env.CLAUDE_PLUGIN_ROOT||process.cwd(),t=process.env.CLAUDE_PLUGIN_DATA||Ke.join(e,".plugin-data");return{pluginRoot:e,pluginData:t,tracePath:Ke.join(t,"trace.json")}}function We(e){return e.hook_event_name==="PreToolUse"}function Ze(e){return e.hook_event_name==="PostToolUse"||e.hook_event_name==="PostToolUseFailure"}function Je(e){return e.hook_event_name==="UserPromptSubmit"}function He(e){return e.hook_event_name==="SessionStart"||e.hook_event_name==="SessionEnd"}function Qe(e){return e.hook_event_name==="SubagentStart"||e.hook_event_name==="SubagentStop"}function et(e){return e.hook_event_name==="Stop"}function tt(e){return e.hook_event_name==="PermissionRequest"||e.hook_event_name==="PermissionDenied"}var nr=new Set(["Notification","TaskCreated","TaskCompleted"]);function rt(e){return nr.has(e.hook_event_name)}var nt=w(b()),or=1e4,sr="pinta-cc/1.7.0";function ot(e,t){return(0,nt.evaluateGuard)(e,t,{timeoutMs:or,token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:sr})}var st=w(b()),B=class extends st.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-cc"})}};var it=w(b()),L=class extends it.TraceManager{constructor(t){super(t.tracePath)}};var k=w(b());import ir from"fs";import ae from"os";import F from"path";var q;function ar(){if(q===void 0)try{q=ae.userInfo().username}catch{q=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return q}var at="1.7.0",$=null;function cr(){return $!==null||($=lr()??"unknown"),$}var ur=6;function lr(){let e=process.env.CLAUDE_CODE_EXECPATH;if(!e)return null;let t=F.dirname(e),r=F.parse(t).root;for(let n=0;n<ur&&t!==r;n++){let o=F.join(t,"package.json");try{let s=ir.readFileSync(o,"utf-8"),a=JSON.parse(s);if(typeof a.name=="string"&&a.name.startsWith("@anthropic-ai/claude-code")&&typeof a.version=="string")return a.version}catch{}t=F.dirname(t)}return null}var pr=new Set(["cc.hook","cc.tool_name","cc.tool_use_id","cc.session_id","cc.transcript_path","cc.cwd","cc.permission_mode"]),fr=new Set(["cc.tool_input","cc.tool_response"]),dr={skipRedactKeys:pr,bashContextKeys:fr};function mr(e){let t=[];t.push({key:"ingest.type",value:{stringValue:"cc"}}),t.push({key:"cc.hook",value:{stringValue:e.hook_event_name}});let r={};for(let[n,o]of Object.entries(e))n!=="hook_event_name"&&(r[n]=o);return t.push(...(0,k.attrsFromRecord)(r,"cc",dr)),t}function _r(){return[{key:"service.name",value:{stringValue:"claude-code"}},{key:"service.version",value:{stringValue:cr()}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-cc"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:at}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:ar()}},{key:"host.name",value:{stringValue:ae.hostname()}},{key:"host.arch",value:{stringValue:ae.arch()}}]}function ct(e){return(0,k.buildPayload)({traceId:e.traceId,spanName:`cc.${(0,k.snakeCase)(e.event.hook_event_name)}`,attributes:mr(e.event),resource:_r(),scope:{name:"pinta-cc",version:at},now:e.now,guard:e.guard})}async function d(e,t,r={}){let n=new B(t);await n.flush();let o=new L(t),s=r.traceMode==="new"?o.newTrace():o.currentTrace(),a=ct({event:e,traceId:s,guard:r.guard});await n.send(a)}async function ut(e,t){let r=typeof e.tool_input=="string"?e.tool_input:JSON.stringify(e.tool_input),n=await ot({spanId:e.session_id??"unknown",toolName:e.tool_name,method:e.hook_event_name,cwd:e.cwd,toolInput:e.tool_input,rawTextFields:{toolInput:r}},process.env.PINTA_GUARD_ENDPOINT);if(n?.decision==="DENY"){let s={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:n.userMessage??n.reason??"guard_deny"}};process.stdout.write(JSON.stringify(s)+`
21
+ `)}try{await d(e,t,{guard:n})}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
22
+ `)}return 0}async function lt(e,t){return await d(e,t),0}async function pt(e,t){return await d(e,t,{traceMode:"new"}),0}async function ft(e,t){return await d(e,t),0}async function dt(e,t){return await d(e,t),0}async function mt(e,t){return await d(e,t),0}async function _t(e,t){return await d(e,t),0}async function ce(e){return 0}async function gr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function gt(){Xe();let e=0;try{let t=ze(),r=await gr(),n=JSON.parse(r);rt(n)?e=await ce(n):We(n)?e=await ut(n,t):Ze(n)?e=await lt(n,t):Je(n)?e=await pt(n,t):He(n)?e=await ft(n,t):Qe(n)?e=await dt(n,t):et(n)?e=await mt(n,t):tt(n)?e=await _t(n,t):e=await ce(n)}catch(t){process.stderr.write(`[pinta-cc] error: ${t}
23
+ `),e=0}return e}import{opendir as hr,stat as yr}from"node:fs/promises";import{homedir as Pr}from"node:os";import R from"node:path";var vr="pinta-cc",ht="memory";function Er(){let e=process.env.CLAUDE_CONFIG_DIR;return e&&e.length>0?e:R.join(Pr(),".claude")}function Tr(){return R.join(Er(),"projects")}function Sr(e,t){return R.relative(e,t).split(R.sep).join("/")}function Or(e){return e.endsWith(".jsonl")?"append-log":"rewritten-doc"}function br(e){let t=e.split("/");if(t.length<2)return{};let r=t[0],n=t[1];return t.length===2?n.endsWith(".jsonl")?{projectKey:r,sessionId:n.slice(0,-6)}:{projectKey:r}:n===ht?{projectKey:r}:{projectKey:r,sessionId:n}}function kr(e){return e.endsWith(".jsonl")?"session-log":e.split("/")[1]===ht?"memory":e.endsWith(".json")?"meta":"other"}async function yt(){return[Tr()]}async function*Pt(e,t){let r;try{r=await hr(t)}catch{return}try{for await(let n of r){let o=R.join(t,n.name);n.isDirectory()?yield*Pt(e,o):n.isFile()&&(yield{absPath:o,relPath:Sr(e,o)})}}catch{return}}async function*Ar(e){let[t]=await yt(),r=e.since?.getTime();for await(let{absPath:n,relPath:o}of Pt(t,t)){let s;try{s=await yr(n)}catch{continue}if(r!==void 0&&s.mtime.getTime()<=r)continue;let{projectKey:a,sessionId:c}=br(o);yield{relPath:o,absPath:n,size:s.size,mtime:s.mtime,sessionId:c,projectKey:a,semantics:Or(o)}}}var wr={id:vr,roots:yt,scan:Ar,classify:kr};Ve();function jr(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===Mr(xr(e)).href}catch{return!1}}async function Rr(){let e=await gt();process.exit(e)}jr()&&Rr();export{wr as lifecycle};
package/package.json CHANGED
@@ -1,8 +1,14 @@
1
1
  {
2
2
  "name": "@pinta-ai/pinta-cc",
3
- "version": "1.5.1",
3
+ "version": "1.7.0",
4
4
  "description": "Generic OTLP forwarder for Claude Code hook events",
5
5
  "main": "dist/index.js",
6
+ "exports": {
7
+ ".": {
8
+ "import": "./dist/index.mjs",
9
+ "require": "./dist/index.js"
10
+ }
11
+ },
6
12
  "license": "PolyForm-Noncommercial-1.0.0",
7
13
  "files": [
8
14
  "dist",
@@ -23,15 +29,18 @@
23
29
  "scripts": {
24
30
  "bump": "node scripts/bump.mjs",
25
31
  "typecheck": "tsc --noEmit",
26
- "build": "tsc --noEmit && esbuild src/index.ts --bundle --platform=node --format=cjs --target=node18 --minify --outfile=dist/index.js",
32
+ "build": "tsc --noEmit && npm run build:cjs && npm run build:esm",
33
+ "build:cjs": "esbuild src/index.ts --bundle --platform=node --format=cjs --target=node18 --minify --outfile=dist/index.js",
34
+ "build:esm": "esbuild src/index.mts --bundle --platform=node --format=esm --target=node18 --minify --banner:js=\"import{createRequire as __pintaCreateRequire}from 'node:module';const require=__pintaCreateRequire(import.meta.url);\" --outfile=dist/index.mjs",
27
35
  "dev": "tsc --watch",
28
36
  "test": "vitest run",
29
37
  "test:watch": "vitest",
38
+ "smoke:import": "node scripts/smoke-import.mjs",
30
39
  "mock-server": "npx tsx tools/mock-server.ts",
31
40
  "prepublishOnly": "npm run build"
32
41
  },
33
42
  "devDependencies": {
34
- "@pinta-ai/core": "^0.3.0",
43
+ "@pinta-ai/core": "^0.6.0",
35
44
  "@types/node": "^22.0.0",
36
45
  "esbuild": "^0.24.0",
37
46
  "tsx": "^4.0.0",