@pinta-ai/pinta-cc 1.5.0 → 1.5.1
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/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +23 -0
- package/dist/index.js +10 -10
- package/package.json +2 -2
|
@@ -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.
|
|
4
|
+
"version": "1.5.1",
|
|
5
5
|
"license": "PolyForm-Noncommercial-1.0.0",
|
|
6
6
|
"userConfig": {
|
|
7
7
|
"endpoint": {
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to pinta-cc are documented here.
|
|
4
4
|
|
|
5
|
+
## [1.5.1] - 2026-07-10
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- `@pinta-ai/core` bumped `^0.2.0` → `^0.3.0` (devDependency, bundled into
|
|
10
|
+
`dist/` at build). The upgrade is additive; no adaptor source change was
|
|
11
|
+
needed.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- `pinta.client.rtt_ms` / `pinta.client.op` span attributes on PreToolUse
|
|
16
|
+
spans. `buildOtlpPayload` already forwards its `guard` result into core's
|
|
17
|
+
`buildPayload`, and core `0.3.0` derives the client-call timing from the
|
|
18
|
+
`GuardResult.clientRttMs` it now measures. The manager can only time its own
|
|
19
|
+
handler, so `clientRttMs - durationMs` gives it the transport overhead.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- `tests/core/guard.test.ts` asserted the core `0.2.0` `GuardResult` shape with
|
|
24
|
+
an exhaustive `toEqual` and broke once `clientRttMs` was added. It now matches
|
|
25
|
+
that field by type, since it is a measured wall-clock rather than a value
|
|
26
|
+
echoed from the response body.
|
|
27
|
+
|
|
5
28
|
## [1.3.2] - 2026-06-12
|
|
6
29
|
|
|
7
30
|
### Changed
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
"use strict";var
|
|
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
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
|
|
4
|
-
`))if(n.trim())try{r.push(JSON.parse(n))}catch{}return r}catch{return[]}}rewrite(
|
|
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(`
|
|
5
5
|
`)+`
|
|
6
6
|
`)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
|
|
7
|
-
`)}}tryAcquireLock(){let
|
|
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=
|
|
9
|
-
`),this.rewrite(
|
|
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}`:""}
|
|
10
10
|
`),!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(
|
|
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&&(
|
|
13
|
-
`)}return 0}async function
|
|
14
|
-
`),
|
|
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();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinta-ai/pinta-cc",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "Generic OTLP forwarder for Claude Code hook events",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"license": "PolyForm-Noncommercial-1.0.0",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"prepublishOnly": "npm run build"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@pinta-ai/core": "^0.
|
|
34
|
+
"@pinta-ai/core": "^0.3.0",
|
|
35
35
|
"@types/node": "^22.0.0",
|
|
36
36
|
"esbuild": "^0.24.0",
|
|
37
37
|
"tsx": "^4.0.0",
|