@pinta-ai/pinta-cc 1.10.1 → 1.10.3-skax.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.10.1",
4
+ "version": "1.10.3-skax.0",
5
5
  "license": "PolyForm-Noncommercial-1.0.0",
6
6
  "userConfig": {
7
7
  "endpoint": {
package/CHANGELOG.md CHANGED
@@ -2,6 +2,33 @@
2
2
 
3
3
  All notable changes to pinta-cc are documented here.
4
4
 
5
+ ## [1.10.2] - 2026-09-30
6
+
7
+ ### Fixed
8
+
9
+ - Bundle `@pinta-ai/core` `^0.9.2`, preserving ordinary `find -path` and
10
+ `find -print` arguments while retaining mysql-family short-password
11
+ masking (PTA-515). Guard/export ordering is unchanged.
12
+ - Evaluate `PermissionRequest` and emit its native deny decision before local
13
+ telemetry deferral. ALLOW/REVIEW do not grant permission; `PermissionDenied`
14
+ remains observation-only (PTA-583).
15
+ - Register and guard `PostToolBatch` using its original model-facing results,
16
+ including failed calls, and stop denied batches before the next model request.
17
+ Native Claude 2.1.267 ignores a run-stop on `PostToolUseFailure` itself, so
18
+ merely guarding that event would not protect the model (PTA-582).
19
+ - Cover both gates in CJS/ESM process regressions, including REVIEW/disabled,
20
+ one-second completion despite delayed collector ACK, and original-span queueing.
21
+
22
+ ### Compatibility
23
+
24
+ - Batch protection requires synchronous `PostToolBatch` registration and a
25
+ guard/Manager projecting `cc.tool_calls` as output. Managed registration must
26
+ be updated alongside the adapter. Hosts without this event remain unsupported
27
+ for failed-result protection; 2.1.267 is verified, not a minimum-version claim.
28
+ - The existing successful-output gate, observation-only failure event, output
29
+ target metadata, bounded retry queue, and guard fail-open behavior remain.
30
+ A batch is a separate native event and can re-evaluate successful output.
31
+
5
32
  ## [1.10.1] - 2026-09-29
6
33
 
7
34
  ### Fixed
package/README.md CHANGED
@@ -4,16 +4,22 @@ Converts Claude Code hook events into OTLP/HTTP spans and forwards them to any O
4
4
 
5
5
  ## Features
6
6
 
7
- - **OTLP transport**: converts 11 hook event types into OTLP/HTTP `resourceSpans` and sends them via `POST {endpoint}/traces`
7
+ - **OTLP transport**: converts 12 hook event types into OTLP/HTTP `resourceSpans` and sends them via `POST {endpoint}/traces`
8
8
  - **Bronze flattening**: every top-level field of a hook event is flattened into `cc.<key>` span attributes
9
9
  - **ULID per-turn traceId**: `UserPromptSubmit` starts a new ULID-based trace; all subsequent hooks in the same turn share it
10
10
  - **Retry queue**: DENY and transport-failure spans are persisted to `.plugin-data/failed-spans.jsonl` (cap 1000) and flushed by a later eligible telemetry hook
11
11
  - **Vendor-neutral**: any OTel-compatible collector works. Pinta Manager auto-configures the endpoint and token
12
12
  - **Identity at relay**: `member.identity.*` attributes are no longer attached at plugin time. Pinta Manager (or your own pipeline) attaches identity at the forwarding layer
13
- - **Optional guard enforcement**: denies tool input at `PreToolUse` and stops the current run when successful `PostToolUse` output is denied
13
+ - **Optional guard enforcement**: denies tool input at `PreToolUse` and `PermissionRequest`; stops denied successful output at `PostToolUse` and model-facing batch results (including failures) at `PostToolBatch`
14
14
 
15
15
  ## Channels
16
16
 
17
+ Staging builds live on `staging/skax-a`, use the `skax` npm tag, and pin
18
+ Core `0.9.3-skax.0`. Their masked findings distinguish returned content from
19
+ completed inputs, including batch results. Consume them through an isolated
20
+ staging catalog with the coordinated Manager build. Do not merge prerelease
21
+ pins into `main`: marketplace auto-updates read that branch.
22
+
17
23
  | Channel | Install path | Auto-update |
18
24
  |---------|-------------|-------------|
19
25
  | **Pinta Manager v0.2+** | Manager installs and configures automatically | Yes — on manager reconcile |
@@ -84,9 +90,10 @@ The plugin reads OTel env vars directly. `CLAUDE_PLUGIN_OPTION_*` env vars (set
84
90
 
85
91
  ## Tool-output guard and recovery
86
92
 
87
- When `PINTA_GUARD_ENDPOINT` is configured, successful `PostToolUse` events are
88
- evaluated through the same guard as `PreToolUse`. The adapter first builds the
89
- normal redaction-aware OTLP span, including native `tool_response`, and sends
93
+ When `PINTA_GUARD_ENDPOINT` is configured, successful `PostToolUse` and
94
+ `PostToolBatch` events are evaluated through the same guard as `PreToolUse`.
95
+ The adapter first builds the normal redaction-aware OTLP span, including native
96
+ `tool_response` or the batch's `tool_calls` array, and sends
90
97
  that original payload to the guard. It attaches the verdict to the same span
91
98
  before delivery or local deferral, preserving its `traceId`, `spanId`, input and output evidence.
92
99
  Every non-null after-tool verdict adds `pinta.guard.target = "tool_output"`:
@@ -97,6 +104,21 @@ this adapter in managed installations. Older readers can interpret every guard
97
104
  denial as a prevented tool call rather than a completed tool with denied output.
98
105
  The target is retained as original extension metadata.
99
106
 
107
+ **Failed results require `PostToolBatch`.** In native Claude Code 2.1.267,
108
+ `PostToolUseFailure` receives the error but ignores a parsed `continue: false`;
109
+ the next model request still receives that error. `PostToolBatch` runs before
110
+ the next model call, carries model-facing results for all calls (including
111
+ failed calls), and honors the run-stop response. The adapter therefore keeps
112
+ the failure event observation-only and gates the batch without cross-process
113
+ pending-decision state. A batch is a separate native event and may re-evaluate
114
+ successful results already checked at `PostToolUse`.
115
+
116
+ The plugin registers `PostToolBatch`. Managed/direct installations must also
117
+ register this synchronous hook, and the Manager/guard must project
118
+ `cc.tool_calls[].tool_response` as **output**, not interpret the batch's tool
119
+ inputs as new commands. Updating only the adapter is insufficient. Hosts
120
+ without a working batch hook have no failed-result enforcement guarantee.
121
+
100
122
  On an output `DENY`, the hook exits successfully and emits exactly one JSON
101
123
  object before best-effort local persistence:
102
124
 
@@ -111,8 +133,9 @@ to stop the current run, including when a tool completes during streaming.
111
133
  alone is not this run-stop contract. The fixed message never copies tool output
112
134
  or guard-supplied reasons/messages into the conversation.
113
135
 
114
- **Decided DENYs never wait for collector network IO.** Both `PreToolUse` and
115
- `PostToolUse` write their existing native response, attach the guard metadata,
136
+ **Decided DENYs never wait for collector network IO.** `PreToolUse`,
137
+ `PermissionRequest`, `PostToolUse` and `PostToolBatch` write their native
138
+ response, attach the guard metadata,
116
139
  persist the original redacted span using the existing `DiskRetryQueue`, and
117
140
  return without flushing or sending telemetry. Printing JSON first is not
118
141
  sufficient: a host timeout while waiting for a collector can invalidate that
@@ -135,19 +158,23 @@ make resuming/continuing that conversation safe. There is no automatic clearing
135
158
  or persistent session lock.
136
159
 
137
160
  `ALLOW`, `REVIEW`, inactive guarding and existing guard fail-open paths do not
138
- stop the run. `PostToolUseFailure` remains telemetry-only; this change covers
139
- successful tool output, not failed-tool errors. Permission, session, lifecycle
140
- and internal events keep their existing behavior, as does the `PreToolUse`
161
+ stop the run. `PermissionRequest` now evaluates the original permission span
162
+ and emits `hookSpecificOutput.decision = {behavior: "deny", message: ...}` on
163
+ DENY. Other decisions emit nothing: they do not automatically approve a
164
+ native permission request. `PermissionDenied`, session, lifecycle and internal
165
+ events keep their existing observation behavior, as does the `PreToolUse`
141
166
  permission-denial response.
142
167
 
143
168
  Enforcement requires synchronous hooks and a Claude Code host honoring the
144
- documented `PostToolUse` stop contract. The hook must finish within its host
169
+ documented `PostToolUse`/`PostToolBatch` stop contracts. The hook must finish within its host
145
170
  timeout: Claude Code [discards timed-out hook output](https://code.claude.com/docs/en/hooks#timeouts).
146
171
  Guard evaluation and local storage must still fit that deadline; removing
147
172
  collector IO from decided DENYs does not make those operations instantaneous.
148
- No minimum compatible host version is asserted here: adapter subprocess tests
149
- verify emitted JSON and transport, not an end-to-end compatibility matrix of
150
- Claude Code releases.
173
+ The native batch and permission contracts were verified with Claude Code
174
+ 2.1.267 using an isolated HOME, a loopback-only provider, and harmless
175
+ read/failed-command fixtures. This is not a minimum-version claim or proof
176
+ of live policy reachability; that additionally requires the corresponding
177
+ Manager projection, registration and enabled policy.
151
178
 
152
179
  ## Span attribute conventions
153
180
 
@@ -262,7 +289,7 @@ src/
262
289
  │ └── redact.ts # Tier-1 redaction + Tier-3 truncation
263
290
  └── handlers/
264
291
  ├── pre-tool-use.ts # build → guard → permission denial → defer DENY / send otherwise
265
- ├── post-tool-use.ts # successful output: build → guard → run stop → defer DENY / send otherwise
292
+ ├── post-tool-use.ts # success/batch output: build → guard → run stop → defer DENY / send otherwise
266
293
  ├── user-prompt.ts # flush → newTrace → buildOtlpPayload → send → exit 0
267
294
  ├── session.ts
268
295
  ├── subagent.ts
@@ -286,7 +313,7 @@ Each hook invocation spawns a fresh Node process. One hook = one OTLP span = one
286
313
 
287
314
  ## Captured events (11)
288
315
 
289
- PreToolUse, PostToolUse, PostToolUseFailure, UserPromptSubmit, SessionStart, SessionEnd, PermissionRequest, PermissionDenied, SubagentStart, SubagentStop, Stop
316
+ PreToolUse, PostToolUse, PostToolUseFailure, PostToolBatch, UserPromptSubmit, SessionStart, SessionEnd, PermissionRequest, PermissionDenied, SubagentStart, SubagentStop, Stop
290
317
 
291
318
  ## Skipped events (3, exit 0 immediately)
292
319
 
@@ -306,8 +333,9 @@ npm run mock-server # Generic OTLP collector at http://localhost:3000
306
333
 
307
334
  ### Local integration test
308
335
 
309
- `smoke:guard` exercises both built entrypoints with native `PostToolUse` `Read`
310
- stdin payloads and isolated HOME/plugin data. It verifies real guard requests,
336
+ `smoke:guard` exercises both built entrypoints with native `PostToolUse`,
337
+ `PostToolBatch`, `PreToolUse` and `PermissionRequest` stdin payloads and isolated
338
+ HOME/plugin data. It verifies real guard requests,
311
339
  fixed/unchanged DENY JSON and zero collector calls with a 1-second hook deadline
312
340
  and a 4-second collector ACK delay. Both deny paths retain masked original
313
341
  spans in the existing retry queue; later hook processes flush the same IDs and
package/dist/index.js CHANGED
@@ -1,26 +1,32 @@
1
- "use strict";var rn=Object.create;var Ue=Object.defineProperty;var on=Object.getOwnPropertyDescriptor;var sn=Object.getOwnPropertyNames;var an=Object.getPrototypeOf,un=Object.prototype.hasOwnProperty;var S=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var cn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of sn(t))!un.call(e,o)&&o!==n&&Ue(e,o,{get:()=>t[o],enumerable:!(r=on(t,o))||r.enumerable});return e};var p=(e,t,n)=>(n=e!=null?rn(an(e)):{},cn(t||!e||!e.__esModule?Ue(n,"default",{value:e,enumerable:!0}):n,e));var le=S(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});_.PATTERNS=_.MAX_BYTES=void 0;_.truncateTo=Ce;_.truncate=ln;_.collectMatches=Ie;_.resolveOverlaps=Be;_.applyMatches=Le;_.redact=dn;_.MAX_BYTES=102400;function Ce(e,t){let n=Buffer.from(e,"utf-8");return n.length<=t?e:`${n.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${n.length}]`}function ln(e){return Ce(e,_.MAX_BYTES)}_.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function Ie(e,t){let n=[];for(let r of _.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;let o=new RegExp(r.regex.source,r.regex.flags),i;for(;(i=o.exec(e))!==null;){let a=r.captureGroup??0,u=i[a];if(u===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}let c=i.index,l=i.index+i[0].length,g=c+i[0].indexOf(u),w=g+u.length;n.push({start:c,end:l,replaceStart:g,replaceEnd:w,type:r.type}),i.index===o.lastIndex&&o.lastIndex++}}return n}function Be(e){let t=[...e].sort((o,i)=>o.start!==i.start?o.start-i.start:i.end-i.start-(o.end-o.start)),n=[],r=-1;for(let o of t)o.start<r||(n.push(o),r=o.end);return n}function Le(e,t){let n=[...t].sort((o,i)=>i.replaceStart-o.replaceStart),r=e;for(let o of n)r=r.slice(0,o.replaceStart)+`[REDACTED:${o.type}]`+r.slice(o.replaceEnd);return r}function dn(e,t={}){if(e.length===0)return e;let n=Ie(e,t);if(n.length===0)return e;let r=Be(n);return Le(e,r)}});var fe=S(f=>{"use strict";var fn=f&&f.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(f,"__esModule",{value:!0});f.MAX_SPAN_BYTES=void 0;f.ulidToTraceId=qe;f.newSpanId=Ve;f.snakeCase=gn;f.toOtlpValue=Ye;f.attrsFromRecord=_n;f.guardAttrs=ze;f.clientAttrs=Xe;f.enforceSpanBudget=Ke;f.buildPayload=hn;f.attachGuard=He;f.mergeBatch=yn;var pn=fn(require("crypto")),de=le(),mn="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function qe(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let r of e){let o=mn.indexOf(r);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${r}"`);t=t<<5n|BigInt(o)}let n=(1n<<128n)-1n;return t&=n,t.toString(16).padStart(32,"0")}function Ve(){return pn.default.randomBytes(8).toString("hex")}function gn(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var $e=new Set;function K(e,t,n){let r=(0,de.truncate)(t);if((n.skipRedactKeys??$e).has(e))return r;let o=(n.bashContextKeys??$e).has(e)?"bash":void 0;return(0,de.redact)(r,{context:o})}function Ye(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:K(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:K(e,JSON.stringify(t),n)}}catch{return{stringValue:K(e,String(t),n)}}default:return{stringValue:K(e,String(t),n)}}}function _n(e,t,n={}){let r=[];for(let[o,i]of Object.entries(e)){let a=`${t}.${o}`,u=Ye(a,i,n);u!==null&&r.push({key:a,value:u})}return r}function ze(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 Xe(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}f.MAX_SPAN_BYTES=800*1024;function Fe(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Ge=1024;function Ke(e,t=f.MAX_SPAN_BYTES){let n=Fe(e);for(let r=0;r<100&&n>t;r++){let o=null,i=0;for(let c of e.attributes){if(!("stringValue"in c.value))continue;let l=Buffer.byteLength(c.value.stringValue,"utf-8");l>i&&(i=l,o=c.value)}if(o===null||i<=Ge)break;let a=n-t,u=Math.max(Ge,i-a-64);o.stringValue=(0,de.truncateTo)(o.stringValue,u),n=Fe(e)}return e}function hn(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes],o={traceId:qe(e.traceId),spanId:Ve(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};Ke(o);let i={resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[o]}]}]};return He(i,e.guard,e.clientTiming)}function He(e,t,n){let r=e.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return e;t&&r.attributes.push(...ze(t));let o=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return o&&r.attributes.push(...Xe(o)),e}function yn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var Ze=S(A=>{"use strict";Object.defineProperty(A,"__esModule",{value:!0});A.GUARD_STATUS_REFUSED=A.GUARD_BUDGET_HEADER=void 0;A.evaluateGuard=Sn;var En=1e4,Pn="pinta-core";A.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function H(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var vn=new Set(["ALLOW","DENY","REVIEW"]);A.GUARD_STATUS_REFUSED=410;async function Sn(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??En,o=Date.now(),i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let u=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??Pn,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{},...Number.isFinite(r)&&r>0?{[A.GUARD_BUDGET_HEADER]:String(r)}:{}},body:JSON.stringify(e),signal:i.signal});if(u.status===A.GUARD_STATUS_REFUSED)return H(Date.now()-o,"refused");if(u.status!==200)return H(Date.now()-o,"error");let c=await u.json(),l=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!vn.has(c.decision)||!l)return H(Date.now()-o,"error");let g=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??g,clientRttMs:g}}catch(u){let c=u.name,l=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return H(Date.now()-o,l)}finally{clearTimeout(a)}}});var Z=S(F=>{"use strict";var Tn=F&&F.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(F,"__esModule",{value:!0});F.atomicWriteFileSync=bn;var Je=Tn(require("fs"));function bn(e,t){let n=`${e}.${process.pid}.tmp`;Je.default.writeFileSync(n,t),Je.default.renameSync(n,e)}});var ge=S(x=>{"use strict";var We=x&&x.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(x,"__esModule",{value:!0});x.MemoryRetryQueue=x.DiskRetryQueue=void 0;var h=We(require("fs")),J=We(require("path")),On=Z(),W=1e3,An=50,kn=5,pe=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=J.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{h.default.mkdirSync(J.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
2
- `;h.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
3
- `)}}readAll(){try{let t=h.default.readFileSync(this.filePath,"utf-8"),n=[];for(let r of t.split(`
4
- `))if(r.trim())try{let o=JSON.parse(r);Array.isArray(o?.payload?.resourceSpans)&&n.push(o)}catch{}return n}catch{return[]}}rewrite(t){try{if(t.length===0){h.default.existsSync(this.filePath)&&h.default.unlinkSync(this.filePath);return}h.default.mkdirSync(J.default.dirname(this.filePath),{recursive:!0}),(0,On.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
1
+ "use strict";var En=Object.create;var Ve=Object.defineProperty;var Pn=Object.getOwnPropertyDescriptor;var Sn=Object.getOwnPropertyNames;var Tn=Object.getPrototypeOf,bn=Object.prototype.hasOwnProperty;var b=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var On=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Sn(t))!bn.call(e,o)&&o!==n&&Ve(e,o,{get:()=>t[o],enumerable:!(r=Pn(t,o))||r.enumerable});return e};var h=(e,t,n)=>(n=e!=null?En(Tn(e)):{},On(t||!e||!e.__esModule?Ve(n,"default",{value:e,enumerable:!0}):n,e));var Xe=b(pe=>{"use strict";Object.defineProperty(pe,"__esModule",{value:!0});pe.mysqlPasswordRanges=Nn;var kn=new Set(["mysql","mysqldump","mysqladmin","mysqlcheck","mysqlimport","mysqlshow","mariadb","mariadb-dump","mariadb-admin","mariadb-check","mariadb-import","mariadb-show"]),An=new Set(["sh","bash","dash","zsh","ksh"]),wn=new Set(["-u","--user","-h","--host","-P","--port","-D","--database","-S","--socket","-e","--execute","--protocol","--default-character-set","--defaults-file","--defaults-extra-file","--login-path","--init-command","--ssl-ca","--ssl-capath","--ssl-cert","--ssl-key","--ssl-cipher"]),ee=16;function Ge(e,t,n=e.value.length){return{value:e.value.slice(t,n),ranges:e.ranges.slice(t,n)}}function J(e,t,n,r){e.value+=t.value.slice(n,r);for(let o=n;o<r;o++)e.ranges.push(t.ranges[o])}function ze(e){if(e?.literal)return e.value.slice(e.value.lastIndexOf("/")+1).replace(/\.exe$/,"")}function Mn(e){let t=0;for(let n=0;n<=ee;n++){for(;/^[A-Za-z_][A-Za-z0-9_]*=/.test(e[t]?.value??"");)t++;let r=ze(e[t]);if(!r)return;if(["!","if","then","elif","else","while","until","do"].includes(r)){t++;continue}let o={env:["-u","--unset","-C","--chdir"],sudo:["-u","--user","-g","--group","-p","--prompt","-D","--chdir","-R","--chroot","-C","--close-from","-T","--command-timeout"],exec:["-a"],nice:["-n","--adjustment"],timeout:["-s","--signal","-k","--kill-after"]},i={env:["-i","--ignore-environment","-0","--null"],sudo:["-n","-E","-H","-S","-b","-k"],command:["-p"],exec:["-c","-l"],nohup:[],nice:[],time:["-p"],timeout:["--foreground","--preserve-status"]};if(!(r in i))return t;for(t++;e[t]?.value.startsWith("-");){let s=e[t++].value;if(s==="--")break;if(!i[r].includes(s)){if((o[r]??[]).includes(s)){if(!e[t++])return;continue}if(!(o[r]??[]).some(a=>a.startsWith("--")?s.startsWith(a+"="):s.startsWith(a)&&s.length>2)&&!(r==="nice"&&/^-\d+$/.test(s)))return}}if(r==="timeout"&&!/^\d+(?:\.\d+)?[smhd]?$/.test(e[t++]?.value??""))return}}function Ye(e,t){let n=1,r="";for(let o=t;o<e.length;o++){let i=e[o];if(i==="\\"&&r!=="'"){o++;continue}if(r){i===r&&(r="");continue}if(i==="'"||i==='"')r=i;else if(i==="(")n++;else if(i===")"&&--n===0)return o}return e.length}function Rn(e,t,n,r){let o={value:"",ranges:[],start:t,end:t,literal:!0},i="",s=t;for(;s<e.value.length;){let a=e.value[s];if(!i&&/[\s;|&()<>{}]/.test(a))break;if(a===i){i="",s++;continue}if(!i&&(a==="'"||a==='"')){i=a,s++;continue}if(a==="\\"&&i!=="'"){let u=e.value[s+1];if(u===`
2
+ `){s+=2;continue}if(u&&(!i||/[$`"\\]/.test(u))){J(o,e,s+1,s+2),s+=2;continue}}if(i!=="'"&&e.value.startsWith("$(",s)){let u=Ye(e.value,s+2);e.value[s+2]!=="("&&r<ee&&$(Ge(e,s+2,u),n,r+1),J(o,e,s,Math.min(u+1,e.value.length)),o.literal=!1,s=Math.min(u+1,e.value.length);continue}if(a==="`"&&i!=="'"){let u=s+1;for(;u<e.value.length&&e.value[u]!=="`";)u+=e.value[u]==="\\"?2:1;r<ee&&$(Ge(e,s+1,u),n,r+1),J(o,e,s,Math.min(u+1,e.value.length)),o.literal=!1,s=Math.min(u+1,e.value.length);continue}a==="$"&&i!=="'"&&(o.literal=!1),J(o,e,s,s+1),s++}return o.end=s,o}function Dn(e,t,n,r){let o=Mn(t);if(o===void 0)return;let i=ze(t[o]);if(An.has(i)&&r<ee){for(let s=o+1;s<t.length;s++){let a=t[s].value;if(a==="--command"||/^-[a-zA-Z]*c[a-zA-Z]*$/.test(a)){let u=t[s+1];u&&$(u,n,r+1);return}if(!a.startsWith("-")||a==="--")return;(a==="-o"||a==="-O")&&s++}return}if(kn.has(i))for(let s=o+1;s<t.length;s++){let a=t[s];if(a.value==="--")return;if(wn.has(a.value)){s++;continue}a.value.startsWith("-p")&&a.value.length>2&&n.push({start:e.ranges[a.start].start,end:e.ranges[a.end-1].end})}}function $(e,t,n=0){let r=[],o,i=[],s=0,a=()=>{Dn(e,r,t,n),r=[],o=void 0};for(;s<e.value.length;){let u=e.value[s];if(u===`
3
+ `){a(),s++;for(let l of i.splice(0))for(;s<e.value.length;){let d=e.value.indexOf(`
4
+ `,s),f=d<0?e.value.length:d,p=e.value.slice(s,f);if(s=d<0?f:f+1,(l.stripTabs?p.replace(/^\t+/,""):p)===l.delimiter)break}}else if(/\s/.test(u))s++;else if(u==="#"){let l=e.value.indexOf(`
5
+ `,s);s=l<0?e.value.length:l}else if(e.value.startsWith("((",s))a(),s=Math.min(Ye(e.value,s+1)+1,e.value.length);else if(/[;|&(){}]/.test(u))a(),s++;else if(u==="<"||u===">")r.at(-1)?.end===s&&/^\d+$/.test(r.at(-1).value)&&r.pop(),o=/^(?:<<<|<<-?|>>|<&|>&|[<>])/.exec(e.value.slice(s))?.[0]??u,s+=o.length;else{let l=Rn(e,s,t,n);s=l.end,(o==="<<"||o==="<<-")&&i.push({delimiter:l.value,stripTabs:o==="<<-"}),o||r.push(l),o=void 0}}a()}function xn(e,t,n){let r={value:"",ranges:[]};for(let o=t+1;o<n-1;o++){if(e.value[o]!=="\\"){J(r,e,o,o+1);continue}let i=o+(e.value[o+1]==="u"?6:2),s=JSON.parse(`"${e.value.slice(o,i)}"`);r.value+=s;for(let a=0;a<s.length;a++)r.ranges.push({start:e.ranges[o].start,end:e.ranges[i-1].end});o=i-1}return r}function Nn(e){let t={value:e,ranges:Array.from({length:e.length},(r,o)=>({start:o,end:o+1}))},n=[];if(/^\s*[{[]/.test(e)){let r;try{r=JSON.parse(e)}catch{return $(t,n),n}if(r!==null&&typeof r=="object"){let o=/"(?:[^"\\]|\\.)*"/g,i;for(;i=o.exec(e);){let s=JSON.parse(i[0]);if(s!=="command"&&s!=="cmd"&&s!=="CommandLine")continue;let a=/^\s*:\s*/.exec(e.slice(o.lastIndex));if(!a)continue;let u=o.lastIndex+a[0].length;if(e[u]!=='"')continue;o.lastIndex=u;let l=o.exec(e);l?.index===u&&$(xn(t,u,u+l[0].length),n)}}return n}return $(t,n),n}});var ge=b(y=>{"use strict";Object.defineProperty(y,"__esModule",{value:!0});y.PATTERNS=y.MAX_BYTES=void 0;y.truncateTo=Je;y.truncate=Cn;y.collectMatches=We;y.resolveOverlaps=me;y.applyMatches=he;y.createDetectedValueMasker=In;y.redact=Un;var jn=Xe();y.MAX_BYTES=102400;function Je(e,t){let n=Buffer.from(e,"utf-8");return n.length<=t?e:`${n.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${n.length}]`}function Cn(e){return Je(e,y.MAX_BYTES)}y.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function We(e,t){let n=[];for(let r of y.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;if(r.type==="cli_password_short"){for(let{start:s,end:a}of(0,jn.mysqlPasswordRanges)(e))n.push({start:s,end:a,replaceStart:s,replaceEnd:a,type:r.type,replacement:`-p[REDACTED:${r.type}]`});continue}let o=new RegExp(r.regex.source,r.regex.flags),i;for(;(i=o.exec(e))!==null;){let s=r.captureGroup??0,a=i[s];if(a===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}if(/^\[REDACTED(?::[^\]]+)?\]$/i.test(a))continue;let u=i.index,l=i.index+i[0].length,d=u+i[0].indexOf(a),f=d+a.length;n.push({start:u,end:l,replaceStart:d,replaceEnd:f,type:r.type}),i.index===o.lastIndex&&o.lastIndex++}}return n}function me(e){let t=[...e].sort((r,o)=>r.replaceStart-o.replaceStart||o.replaceEnd-r.replaceEnd),n=[];for(let r of t){let o=n[n.length-1];o&&r.replaceStart<o.replaceEnd?(o.replaceEnd=Math.max(o.replaceEnd,r.replaceEnd),o.start=Math.min(o.start,r.start),o.end=Math.max(o.end,r.end)):n.push({...r})}return n}function he(e,t){let n=[...t].sort((o,i)=>i.replaceStart-o.replaceStart),r=e;for(let o of n)r=r.slice(0,o.replaceStart)+(o.replacement??`[REDACTED:${o.type}]`)+r.slice(o.replaceEnd);return r}function In(e){let t=new Map;for(let s of e)s.value.length>0&&!t.has(s.value)&&t.set(s.value,s);let n=[...t.values()],r=n.flatMap(s=>{let a=JSON.stringify(s.value).slice(1,-1);return a===s.value?[s]:[s,{...s,value:a}]}),o=(s,a)=>{let u=[],l=[...s.matchAll(/\[(?:PINTA_)?REDACTED(?::[^\]]+)?\]/gi)];for(let d of a)for(let f=s.indexOf(d.value);f>=0;f=s.indexOf(d.value,f+1))l.some(p=>f>=p.index&&f+d.value.length<=p.index+p[0].length)||u.push({start:f,end:f+d.value.length,replaceStart:f,replaceEnd:f+d.value.length,type:d.type});return he(s,me(u))},i=s=>{if(n.length===0)return s;if(t.has(s))return o(s,n);let a=s.trimStart()[0];if(a==="{"||a==="["||a==='"'){let u=!1;try{JSON.parse(s),u=!0}catch(l){if(!(l instanceof SyntaxError))throw l}if(u)return s.replace(/"(?:\\.|[^"\\])*"|-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/gs,l=>{let d=l.startsWith('"'),f=d?JSON.parse(l):l,p=d?i(f):o(f,n);return p===f?l:JSON.stringify(p)})}return o(s,r)};return i}function Un(e,t={}){if(e.length===0)return e;let n=We(e,t);if(n.length===0)return e;let r=me(n);return he(e,r)}});var Ee=b(g=>{"use strict";var Bn=g&&g.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(g,"__esModule",{value:!0});g.MAX_SPAN_BYTES=void 0;g.ulidToTraceId=et;g.newSpanId=tt;g.snakeCase=qn;g.toOtlpValue=ot;g.attrsFromRecord=Fn;g.guardAttrs=st;g.clientAttrs=it;g.enforceSpanBudget=at;g.buildPayload=Vn;g.attachGuard=ct;g.mergeBatch=Gn;var Ln=Bn(require("crypto")),R=ge(),$n="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function et(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let r of e){let o=$n.indexOf(r);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${r}"`);t=t<<5n|BigInt(o)}let n=(1n<<128n)-1n;return t&=n,t.toString(16).padStart(32,"0")}function tt(){return Ln.default.randomBytes(8).toString("hex")}function qn(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Ke=new Set,ve=new WeakMap,nt=new WeakMap,rt=new WeakMap;function He(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch(t){if(!(t instanceof TypeError))throw t;return String(e)}}function _e(e,t,n){let r=(n.bashContextKeys??Ke).has(e)?"bash":void 0,o=(n.skipRedactKeys??Ke).has(e)?[]:(0,R.collectMatches)(t,{context:r}),i={stringValue:(0,R.truncate)((0,R.applyMatches)(t,(0,R.resolveOverlaps)(o)))};return ve.set(i,{original:t,detections:o.map(s=>({value:t.slice(s.replaceStart,s.replaceEnd),type:s.type}))}),i}function ot(e,t,n={}){if(t==null)return null;let r;switch(typeof t){case"string":r=_e(e,t,n);break;case"boolean":r={boolValue:t};break;case"number":r=Number.isInteger(t)?{intValue:t}:{doubleValue:t};break;case"object":{r=_e(e,He(t)??String(t),n);break}default:r=_e(e,String(t),n)}let o=He(n.outputForKey?.(e,t));return o!==void 0&&nt.set(r,o),r}function Fn(e,t,n={}){let r=[];for(let[o,i]of Object.entries(e)){let s=`${t}.${o}`,a=ot(s,i,n);a!==null&&r.push({key:s,value:a})}return r}function st(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 it(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}}]}g.MAX_SPAN_BYTES=800*1024;function Ze(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Qe=1024;function at(e,t=g.MAX_SPAN_BYTES){let n=Ze(e);for(let r=0;r<100&&n>t;r++){let o=null,i=0;for(let u of e.attributes){if(!("stringValue"in u.value))continue;let l=Buffer.byteLength(u.value.stringValue,"utf-8");l>i&&(i=l,o=u.value)}if(o===null||i<=Qe)break;let s=n-t,a=Math.max(Qe,i-s-64);o.stringValue=(0,R.truncateTo)(o.stringValue,a),n=Ze(e)}return e}function Vn(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),o=[...e.resource,...e.attributes].flatMap(f=>{let p=ve.get(f.value);return p?[p]:[]}).flatMap(f=>f.detections),i=[...e.resource,...e.attributes].flatMap(f=>{let p=nt.get(f.value);return p===void 0?[]:[p]}),s=new Set(o.filter(f=>{let p=(0,R.createDetectedValueMasker)([f]);return i.some(A=>p(A)!==A)}).map(f=>f.value)),a=(0,R.createDetectedValueMasker)(o),u=e.attributes.map(f=>ye(f,a)),l={traceId:et(e.traceId),spanId:tt(),name:a(e.spanName),kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:u},d={resourceSpans:[{resource:{attributes:e.resource.map(f=>ye(f,a))},scopeSpans:[{scope:{name:a(e.scope.name),version:a(e.scope.version)},spans:[l]}]}]};return o.length>0&&(rt.set(d,a),u.push({key:"pinta.facts",value:{stringValue:JSON.stringify({items:[{origin:"attributes",values:o.filter(f=>!s.has(f.value))},{origin:"toolOutput",values:o.filter(f=>s.has(f.value))}].filter(f=>f.values.length>0).map(({origin:f,values:p})=>({category:"DATA_EXFILTRATION",source:"CORE_REDACT",path:"$",secrets:{kinds:["credential"],count:new Set(p.map(A=>A.value)).size,origins:[f],scannedFields:["attributes"],scanner:"core-tier1",truncated:!1,corroboration:["pattern"]}}))})}})),at(l),ct(d,e.guard,e.clientTiming)}function ye(e,t){let n={key:t(e.key),value:{...e.value}},r=n.value;if("stringValue"in r){let o=ve.get(e.value),i=t(o?.original??r.stringValue);r.stringValue=o?(0,R.truncate)(i):i}else if("intValue"in r||"doubleValue"in r){let o=String("intValue"in r?r.intValue:r.doubleValue),i=t(o);i!==o&&(n.value={stringValue:i})}return n}function ct(e,t,n){let r=e.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return e;if(t){let i=st(t),s=rt.get(e);r.attributes.push(...s?i.map(a=>ye(a,s)):i)}let o=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return o&&r.attributes.push(...it(o)),e}function Gn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var lt=b(w=>{"use strict";Object.defineProperty(w,"__esModule",{value:!0});w.GUARD_STATUS_REFUSED=w.GUARD_BUDGET_HEADER=void 0;w.evaluateGuard=Jn;var zn=1e4,Yn="pinta-core";w.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function W(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Xn=new Set(["ALLOW","DENY","REVIEW"]);function ut(e){return e==="timeout"||e==="refused"||e==="error"}w.GUARD_STATUS_REFUSED=410;async function Jn(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??zn,o=Date.now(),i=new AbortController,s=setTimeout(()=>i.abort(),r);try{let a=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??Yn,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{},...Number.isFinite(r)&&r>0?{[w.GUARD_BUDGET_HEADER]:String(r)}:{}},body:JSON.stringify(e),signal:i.signal});if(a.status===w.GUARD_STATUS_REFUSED)return W(Date.now()-o,"refused");if(a.status!==200)return W(Date.now()-o,"error");let u=await a.json(),l=u?.durationMs===void 0||typeof u.durationMs=="number"&&Number.isFinite(u.durationMs);if(!u||!Xn.has(u.decision)||!l)return W(Date.now()-o,"error");let d=u.decision==="ALLOW"?u.failOpenReason:void 0;if(d!=null&&!ut(d))return W(Date.now()-o,"error");let f=Date.now()-o;return{decision:u.decision,reason:u.reason??null,userMessage:u.userMessage??null,durationMs:u.durationMs??f,clientRttMs:f,...ut(d)?{failOpenReason:d}:{}}}catch(a){let u=a.name,l=u==="AbortError"||u==="TimeoutError"?"timeout":"error";return W(Date.now()-o,l)}finally{clearTimeout(s)}}});var te=b(K=>{"use strict";var Wn=K&&K.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(K,"__esModule",{value:!0});K.atomicWriteFileSync=Kn;var ft=Wn(require("fs"));function Kn(e,t){let n=`${e}.${process.pid}.tmp`;ft.default.writeFileSync(n,t),ft.default.renameSync(n,e)}});var Te=b(D=>{"use strict";var dt=D&&D.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(D,"__esModule",{value:!0});D.MemoryRetryQueue=D.DiskRetryQueue=void 0;var v=dt(require("fs")),ne=dt(require("path")),Hn=te(),re=1e3,Zn=50,Qn=5,Pe=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=ne.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{v.default.mkdirSync(ne.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
6
+ `;v.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
7
+ `)}}readAll(){try{let t=v.default.readFileSync(this.filePath,"utf-8"),n=[];for(let r of t.split(`
8
+ `))if(r.trim())try{let o=JSON.parse(r);Array.isArray(o?.payload?.resourceSpans)&&n.push(o)}catch{}return n}catch{return[]}}rewrite(t){try{if(t.length===0){v.default.existsSync(this.filePath)&&v.default.unlinkSync(this.filePath);return}v.default.mkdirSync(ne.default.dirname(this.filePath),{recursive:!0}),(0,Hn.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
5
9
  `)+`
6
10
  `)}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${n}
7
- `)}}tryAcquireLock(){let t=Date.now();try{h.default.mkdirSync(J.default.dirname(this.lockPath),{recursive:!0})}catch(n){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${n}
8
- `),!1}for(;Date.now()-t<An;)try{let n=h.default.openSync(this.lockPath,"wx");return h.default.writeSync(n,String(process.pid)),h.default.closeSync(n),!0}catch(n){if(n?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${n}
9
- `),!1;try{let i=h.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){h.default.unlinkSync(this.lockPath);continue}}catch{}let r=kn,o=Date.now()+r;for(;Date.now()<o;);}return!1}release(){try{h.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=W)return;let n=t.length-W;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
10
- `),this.rewrite(t.slice(n))}};x.DiskRetryQueue=pe;var me=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>W&&this.entries.splice(0,this.entries.length-W)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};x.MemoryRetryQueue=me});var ot=S(d=>{"use strict";Object.defineProperty(d,"__esModule",{value:!0});d.MemoryTransport=d.DiskTransport=d.MAX_POST_BYTES=void 0;d.parseHeadersEnv=nt;d.envOptionsResolver=rt;d.postOtlp=G;var Qe=ge(),et=fe(),wn=5e3;d.MAX_POST_BYTES=900*1024;function Q(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function tt(e,t,n){let r=[],o=[],i=[],a=0;for(let u of e){let c=t(u);if(c>n){o.push(u);continue}i.length>0&&a+c>n&&(r.push(i),i=[],a=0),i.push(u),a+=c}return i.length>0&&r.push(i),{chunks:r,oversize:o}}function nt(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let n of e.split(",")){let[r,...o]=n.split("=");r&&o.length>0&&(t[r.trim()]=o.join("=").trim())}return t}function rt(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,n;return e?n=e.replace(/\/+$/,""):t&&(n=t.replace(/\/+$/,"")+"/v1/traces"),n?{endpoint:n,headers:nt(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function G(e,t,n){let r=new AbortController,o=setTimeout(()=>r.abort(),wn);try{let i=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:r.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(`[${n}] OTLP POST ${i.status} ${t.endpoint}${u}${a?` body=${a}`:""}
11
+ `)}}tryAcquireLock(){let t=Date.now();try{v.default.mkdirSync(ne.default.dirname(this.lockPath),{recursive:!0})}catch(n){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${n}
12
+ `),!1}for(;Date.now()-t<Zn;)try{let n=v.default.openSync(this.lockPath,"wx");return v.default.writeSync(n,String(process.pid)),v.default.closeSync(n),!0}catch(n){if(n?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${n}
13
+ `),!1;try{let i=v.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){v.default.unlinkSync(this.lockPath);continue}}catch{}let r=Qn,o=Date.now()+r;for(;Date.now()<o;);}return!1}release(){try{v.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=re)return;let n=t.length-re;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
14
+ `),this.rewrite(t.slice(n))}};D.DiskRetryQueue=Pe;var Se=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>re&&this.entries.splice(0,this.entries.length-re)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};D.MemoryRetryQueue=Se});var yt=b(m=>{"use strict";Object.defineProperty(m,"__esModule",{value:!0});m.MemoryTransport=m.DiskTransport=m.MAX_POST_BYTES=void 0;m.parseHeadersEnv=gt;m.envOptionsResolver=_t;m.postOtlp=H;var pt=Te(),mt=Ee(),er=5e3;m.MAX_POST_BYTES=900*1024;function oe(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function ht(e,t,n){let r=[],o=[],i=[],s=0;for(let a of e){let u=t(a);if(u>n){o.push(a);continue}i.length>0&&s+u>n&&(r.push(i),i=[],s=0),i.push(a),s+=u}return i.length>0&&r.push(i),{chunks:r,oversize:o}}function gt(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let n of e.split(",")){let[r,...o]=n.split("=");r&&o.length>0&&(t[r.trim()]=o.join("=").trim())}return t}function _t(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,n;return e?n=e.replace(/\/+$/,""):t&&(n=t.replace(/\/+$/,"")+"/v1/traces"),n?{endpoint:n,headers:gt(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function H(e,t,n){let r=new AbortController,o=setTimeout(()=>r.abort(),er);try{let i=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:r.signal});if(!i.ok){let s="";try{s=(await i.text()).slice(0,200)}catch{}let a=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(`[${n}] OTLP POST ${i.status} ${t.endpoint}${a}${s?` body=${s}`:""}
11
15
  `),!1}return!0}catch(i){return process.stderr.write(`[${n}] OTLP POST failed: ${i.message??String(i)}
12
- `),!1}finally{clearTimeout(o)}}var _e=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new Qe.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??rt}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await G(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let n=this.queue.readAll();if(n.length===0)return;let{chunks:r,oversize:o}=tt(n,u=>Q(u.payload),d.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized retry ${o.length===1?"entry":"entries"} (each > ${d.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
13
- `);let i=[].concat(...r),a=0;for(let u of r){if(!await G((0,et.mergeBatch)(u.map(l=>l.payload)),t,this.logPrefix))break;a+=u.length}this.queue.rewrite(i.slice(a))}catch(n){process.stderr.write(`[${this.logPrefix}] flush failed: ${n?.message??String(n)}
14
- `)}finally{this.queue.release()}}dropIfOversized(t){let n=Q(t);return n<=d.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${d.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
15
- `),!0)}};d.DiskTransport=_e;var he=class{queue=new Qe.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(Q(t)>d.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${d.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
16
- `);return}await G(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let n=this.queue.drain();if(n.length===0)return;let{chunks:r,oversize:o}=tt(n,Q,d.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized buffered ${o.length===1?"payload":"payloads"} (each > ${d.MAX_POST_BYTES} bytes \u2014 undeliverable)
17
- `);let i=[].concat(...r),a=0;for(let u of r){if(!await G((0,et.mergeBatch)(u),t,this.logPrefix))break;a+=u.length}for(let u of i.slice(a))this.queue.enqueue(u)}};d.MemoryTransport=he});var ve=S(N=>{"use strict";var Pe=N&&N.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(N,"__esModule",{value:!0});N.TraceManager=void 0;N.generateUlid=st;var it=Pe(require("fs")),xn=Pe(require("path")),Rn=Pe(require("crypto")),Mn=Z(),ye="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function st(){let e=Date.now(),t="",n=e;for(let i=0;i<10;i++)t=ye[n&31]+t,n=Math.floor(n/32);let r=Rn.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=ye[r[i]&31];for(;o.length<16;)o+=ye[0];return t+o}var Ee=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=st();return this.save(t),t}currentTrace(){try{let t=it.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{it.default.mkdirSync(xn.default.dirname(this.tracePath),{recursive:!0}),(0,Mn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
18
- `)}}};N.TraceManager=Ee});var dt=S(R=>{"use strict";var ut=R&&R.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(R,"__esModule",{value:!0});R.MemorySessionTraceManager=R.DiskSessionTraceManager=void 0;var at=ut(require("fs")),Dn=ut(require("path")),ct=ve(),Nn=Z(),lt=200,Se=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??lt}read(){try{let t=JSON.parse(at.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{at.default.mkdirSync(Dn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,Nn.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,ct.generateUlid)(),o=this.read();return o[n]=r,this.write(o),r}currentTrace(t){let n=t||"default",r=this.read()[n];return r||this.newTrace(n)}};R.DiskSessionTraceManager=Se;var Te=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??lt}newTrace(t){let n=t||"default",r=(0,ct.generateUlid)();if(this.map.set(n,r),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return r}currentTrace(t){let n=t||"default";return this.map.get(n)??this.newTrace(n)}};R.MemorySessionTraceManager=Te});var mt=S(j=>{"use strict";var be=j&&j.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(j,"__esModule",{value:!0});j.envFilePath=Cn;j.parseEnvFile=pt;j.loadEnvFile=In;var jn=be(require("node:fs")),Un=be(require("node:os")),ft=be(require("node:path"));function Cn(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:ft.default.join(Un.default.homedir(),e);return ft.default.join(o,t)}function pt(e){let t={};for(let n of e.split(`
19
- `)){let r=n.trim();if(!r||r.startsWith("#"))continue;let o=r.indexOf("=");if(o<0)continue;let i=r.slice(0,o).trim(),a=r.slice(o+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),i&&(t[i]=a)}return t}function In(e){let t;try{t=jn.default.readFileSync(e,"utf-8")}catch{return}let n=pt(t);for(let[r,o]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=o)}});var T=S(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.loadEnvFile=s.parseEnvFile=s.envFilePath=s.MemorySessionTraceManager=s.DiskSessionTraceManager=s.generateUlid=s.TraceManager=s.MAX_POST_BYTES=s.parseHeadersEnv=s.envOptionsResolver=s.postOtlp=s.MemoryTransport=s.DiskTransport=s.MemoryRetryQueue=s.DiskRetryQueue=s.GUARD_BUDGET_HEADER=s.GUARD_STATUS_REFUSED=s.evaluateGuard=s.MAX_SPAN_BYTES=s.enforceSpanBudget=s.mergeBatch=s.attachGuard=s.buildPayload=s.clientAttrs=s.guardAttrs=s.attrsFromRecord=s.toOtlpValue=s.snakeCase=s.newSpanId=s.ulidToTraceId=s.MAX_BYTES=s.PATTERNS=s.applyMatches=s.resolveOverlaps=s.collectMatches=s.truncateTo=s.truncate=s.redact=void 0;var M=le();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return M.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return M.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return M.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return M.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return M.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return M.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return M.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return M.MAX_BYTES}});var y=fe();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return y.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return y.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return y.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return y.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return y.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return y.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return y.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return y.buildPayload}});Object.defineProperty(s,"attachGuard",{enumerable:!0,get:function(){return y.attachGuard}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return y.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return y.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return y.MAX_SPAN_BYTES}});var Oe=Ze();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Oe.evaluateGuard}});Object.defineProperty(s,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return Oe.GUARD_STATUS_REFUSED}});Object.defineProperty(s,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return Oe.GUARD_BUDGET_HEADER}});var gt=ge();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return gt.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return gt.MemoryRetryQueue}});var C=ot();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return C.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return C.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return C.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return C.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return C.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return C.MAX_POST_BYTES}});var _t=ve();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return _t.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return _t.generateUlid}});var ht=dt();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return ht.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return ht.MemorySessionTraceManager}});var Ae=mt();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return Ae.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return Ae.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return Ae.loadEnvFile}})});var q=p(T());function Bn(){return(0,q.envFilePath)(".claude","pinta-cc.env")}function yt(e=Bn()){(0,q.loadEnvFile)(e)}function Et(){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 ke=p(require("path")),Pt=p(T());function vt(){let e=process.env.CLAUDE_PLUGIN_ROOT||process.cwd(),t=process.env.CLAUDE_PLUGIN_DATA||ke.default.join(e,".plugin-data");return{pluginRoot:e,pluginData:t,tracePath:ke.default.join(t,"trace.json")}}function ee(){return(0,Pt.envOptionsResolver)()!==null}function St(e){return e.hook_event_name==="PreToolUse"}function Tt(e){return e.hook_event_name==="PostToolUse"||e.hook_event_name==="PostToolUseFailure"}function bt(e){return e.hook_event_name==="UserPromptSubmit"}function Ot(e){return e.hook_event_name==="SessionStart"||e.hook_event_name==="SessionEnd"}function At(e){return e.hook_event_name==="SubagentStart"||e.hook_event_name==="SubagentStop"}function kt(e){return e.hook_event_name==="Stop"}function wt(e){return e.hook_event_name==="PermissionRequest"||e.hook_event_name==="PermissionDenied"}var Ln=new Set(["Notification","TaskCreated","TaskCompleted"]);function xt(e){return Ln.has(e.hook_event_name)}var Xt=p(T());var Rt=p(T()),$n=1e4,Fn="pinta-cc/1.10.1";function te(e,t){return(0,Rt.evaluateGuard)(e,t,{timeoutMs:$n,token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Fn})}var V=p(T());var Mt=p(T()),ne=class extends Mt.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-cc"})}};var Dt=p(T()),re=class extends Dt.TraceManager{constructor(t){super(t.tracePath)}};var ue=p(require("os"));var Ut=require("node:child_process"),oe=require("node:crypto"),E=p(require("node:fs")),Ct=p(require("node:os")),m=p(require("node:path")),It=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,Gn=/^v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)\s+\(Claude Code\)$/m,qn=2e3,Vn=24*60*60*1e3,Yn=3e4,xe=8,Bt="claude-version.json",I=new Map;function k(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"UNKNOWN"}function P(e){process.stderr.write(`[pinta-cc] CLI version: ${e}
20
- `)}function ie(e){return k(e)==="ENOENT"||k(e)==="ENOTDIR"}function zn(){let e=process.env.CLAUDE_CODE_EXECPATH,t=process.platform==="win32"?["claude.exe","claude.cmd"]:["claude"],n;if(e)n=[e];else{let r=(process.env.PATH??"").split(m.default.delimiter).filter(o=>m.default.isAbsolute(o));try{r.push(m.default.join(Ct.default.homedir(),".local","bin"))}catch(o){P(`native install directory lookup failed (${k(o)})`)}n=r.flatMap(o=>t.map(i=>m.default.join(o,i)))}for(let r of new Set(n))try{let o=E.default.realpathSync(r),i=E.default.statSync(o);if(!i.isFile())continue;return!e&&process.platform!=="win32"&&E.default.accessSync(o,E.default.constants.X_OK),{file:o,fingerprint:(0,oe.createHash)("sha256").update(JSON.stringify([o,i.ino,i.size,i.mtimeMs,i.ctimeMs])).digest("hex")}}catch(o){ie(o)||P(`executable lookup failed (${k(o)})`)}return P(e?"configured executable is unavailable":"no Claude executable found in PATH or ~/.local/bin"),null}function we(e){let t;try{t=JSON.parse(E.default.readFileSync(e,"utf8"))}catch(n){return ie(n)||P(`package metadata could not be read (${n instanceof SyntaxError?"INVALID_JSON":k(n)})`),null}return typeof t!="object"||t===null||!("name"in t)||!("version"in t)||typeof t.name!="string"||typeof t.version!="string"||!It.test(t.version)?null:t.name==="@anthropic-ai/claude-code"||t.name.startsWith("@anthropic-ai/claude-code-")?t.version:null}function Xn(e){let t=m.default.dirname(e),n=m.default.basename(t)===".bin"&&/^claude(?:\.cmd)?$/i.test(m.default.basename(e));for(let r=0;r<6;r++){let o=we(m.default.join(t,"package.json"));if(o)return o;if(m.default.basename(e).toLowerCase()==="claude.cmd"&&r===0){let a=we(m.default.join(t,"node_modules","@anthropic-ai","claude-code","package.json"));if(a)return a}if(n&&m.default.basename(t)==="node_modules"){let a=we(m.default.join(t,"@anthropic-ai","claude-code","package.json"));if(a)return a}let i=m.default.dirname(t);if(i===t)break;t=i}return null}function Kn(e){return typeof e=="object"&&e!==null&&"fingerprint"in e&&typeof e.fingerprint=="string"&&/^[0-9a-f]{64}$/.test(e.fingerprint)&&"version"in e&&(e.version===null||typeof e.version=="string"&&It.test(e.version))&&"checkedAt"in e&&typeof e.checkedAt=="number"&&Number.isFinite(e.checkedAt)}function Nt(e,t){let n=t-e.checkedAt;return n>=0&&n<(e.version===null?Yn:Vn)}function Hn(e){if(!e)return[];let t=m.default.join(e,Bt);try{if(E.default.statSync(t).size>16384)return P("oversized version cache ignored"),[];let n=JSON.parse(E.default.readFileSync(t,"utf8"));if(Array.isArray(n)&&n.length<=xe&&n.every(Kn))return n;P("invalid version cache ignored")}catch(n){ie(n)||P(`version cache read failed (${n instanceof SyntaxError?"INVALID_JSON":k(n)})`)}return[]}function jt(e){for(I.delete(e.fingerprint),I.set(e.fingerprint,e);I.size>xe;){let t=I.keys().next().value;t!==void 0&&I.delete(t)}}function Zn(e,t){if(!e)return;let n=m.default.join(e,Bt),r=`${n}.${process.pid}.${(0,oe.randomUUID)()}.tmp`;try{E.default.mkdirSync(e,{recursive:!0,mode:448}),E.default.writeFileSync(r,JSON.stringify(t),{encoding:"utf8",mode:384,flag:"wx"}),E.default.renameSync(r,n)}catch(o){P(`version cache write failed (${k(o)})`)}finally{try{E.default.unlinkSync(r)}catch(o){ie(o)||P(`temporary version cache cleanup failed (${k(o)})`)}}}function Jn(e){if(/\.(cmd|bat|ps1)$/i.test(e))return P("command shim has no readable Claude package metadata"),null;let t=(0,Ut.spawnSync)(e,["--version"],{encoding:"utf8",stdio:["ignore","pipe","pipe"],shell:!1,windowsHide:!0,timeout:qn,killSignal:"SIGKILL",maxBuffer:4096});if(t.error||t.status!==0)return P(`version probe failed (${t.error?k(t.error):`exit ${t.status??t.signal}`})`),null;let n=Gn.exec(t.stdout.trim())?.[1];return n||(P("version probe did not identify Claude Code"),null)}function Lt(e){let t=zn();if(!t)return"unknown";let n=Xn(t.file);if(n)return n;let r=Date.now(),o=Hn(e),i=[I.get(t.fingerprint),...o].find(u=>u&&u.fingerprint===t.fingerprint&&Nt(u,r));if(i)return jt(i),i.version??"unknown";let a={fingerprint:t.fingerprint,version:Jn(t.file),checkedAt:Date.now()};return jt(a),Zn(e,[...o.filter(u=>u.fingerprint!==a.fingerprint&&Nt(u,a.checkedAt)),a].slice(-xe)),a.version??"unknown"}var D=p(require("node:path"));var b=p(require("node:fs")),Re=p(require("node:path")),Wn=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),Qn=256*1024,er=1024*1024,tr=4096;function U(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Me(e){let t=U(e),n=t?"id"in t?t.id:t.name:e;if(typeof n!="string")return;let r=n.trim();if(!(r.startsWith("{")||r.startsWith("[")))return r.length<=512&&!/[\u0000-\u001f\u007f]/.test(r)&&!Wn.has(r.toLowerCase())?r:void 0}function $t(e,t){delete e.model,t&&(e.model=t.name,!(t.source==="hook.model"&&e.model_source!==void 0)&&(e.model_source!==void 0&&(e.model_original_source=e.model_source),e.model_source=t.source))}function B(e){return typeof e=="string"&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,255}$/.test(e)?e:void 0}function se(e){let t=typeof e=="number"?e:typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T/.test(e)?Date.parse(e):NaN;return Number.isFinite(t)&&t>=0?t:void 0}function Ft(e,t){let n=e.timestamp===void 0?se(t):se(e.timestamp);return n!==void 0&&n<=t?n:void 0}function Gt(e){if(typeof e!="string"||e.length>4096||/[\u0000-\u001f]/.test(e)||!Re.default.isAbsolute(e)||Re.default.extname(e)!==".jsonl")return;let t;try{t=b.default.openSync(e,b.default.constants.O_RDONLY|b.default.constants.O_NONBLOCK|(b.default.constants.O_NOFOLLOW??0));let n=b.default.fstatSync(t);if(!n.isFile()||!Number.isSafeInteger(n.size)||n.size<=0)return;let r=Buffer.alloc(Math.min(n.size,Qn));if(b.default.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),i;if(o>=0)try{i=U(JSON.parse(r.toString("utf8",0,o)))}catch{}let a=Math.max(0,n.size-er),u=n.size<=r.length?r:Buffer.alloc(n.size-a);if(u!==r&&b.default.readSync(t,u,0,u.length,a)!==u.length)return;let c=b.default.fstatSync(t);if(c.size<n.size||c.size===n.size&&c.mtimeMs!==n.mtimeMs)return;let l=a>0?u.indexOf(10)+1:0,g=u.lastIndexOf(10);if(a>0&&l===0||g<l)return;let w=[],O=0;for(;g>l&&O<tr;){let X=u.lastIndexOf(10,g-1),$=Math.max(l,X+1),Ne=u.toString("utf8",$,g).trim();if(Ne){let je=U(JSON.parse(Ne));je&&w.push(je)}g=$-1,O++}return w.reverse(),{first:i,rows:w,complete:a===0&&g<0&&u[u.length-1]===10}}catch{return}finally{if(t!==void 0)try{b.default.closeSync(t)}catch{}}}function qt(e){let t=e[0];return t&&e.every(n=>n?.name===t.name)?t:void 0}var nr=new Set(["PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest","PermissionDenied"]);function rr(e,t){let n=D.default.dirname(e);if(D.default.basename(n)!=="subagents"||D.default.basename(D.default.dirname(n))!==t)return;let r=/^agent-(.+)\.jsonl$/.exec(D.default.basename(e));return B(r?.[1])}function Vt(e,t){let n=Me(e.model);if(n)return{name:n,source:"hook.model"};try{return or(e,t)}catch{return}}function or(e,t){if(!nr.has(e.hook_event_name))return;let n=B(e.session_id),r=B(e.tool_use_id),o=Ft(e,t);if(!n||!r||o===void 0||typeof e.transcript_path!="string")return;let i=rr(e.transcript_path,n),a=e.agent_id===void 0?i:B(e.agent_id);if(e.agent_id!==void 0&&!a||i!==void 0&&i!==a||!a&&e.agent_type!==void 0||D.default.basename(D.default.dirname(e.transcript_path))==="subagents"&&!i)return;let u=Gt(e.transcript_path);if(!u)return;let c=[];for(let l of u.rows){let g=se(l.timestamp);if(l.type!=="assistant"||l.sessionId!==n||g===void 0||g>o)continue;let w=l.agentId===void 0?void 0:B(l.agentId);if(w!==a||l.agentId!==void 0&&!w||l.isSidechain===!0&&!a)continue;let O=U(l.message);if(!O||O.role!==void 0&&O.role!=="assistant"||!Array.isArray(O.content)||!O.content.some($=>U($)?.type==="tool_use"&&U($)?.id===r))continue;let X=Me(O.model);c.push(X?{name:X,source:"transcript.assistant.message"}:void 0)}return qt(c)}var L=p(T()),ae;function ir(){if(ae===void 0)try{ae=ue.default.userInfo().username}catch{ae=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return ae}var Yt="1.10.1",sr=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:sr,bashContextKeys:ar};function cr(e,t){let n=[];n.push({key:"ingest.type",value:{stringValue:"cc"}}),n.push({key:"cc.hook",value:{stringValue:e.hook_event_name}});let r={};for(let[o,i]of Object.entries(e))o!=="hook_event_name"&&(r[o]=i);return $t(r,Vt(e,t)),n.push(...(0,L.attrsFromRecord)(r,"cc",ur)),n}function lr(e){return[{key:"service.name",value:{stringValue:"claude-code"}},{key:"service.version",value:{stringValue:Lt(e)}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-cc"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:Yt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:ir()}},{key:"host.name",value:{stringValue:ue.default.hostname()}},{key:"host.arch",value:{stringValue:ue.default.arch()}}]}function zt(e){let t=e.now??Date.now();return(0,L.buildPayload)({traceId:e.traceId,spanName:`cc.${(0,L.snakeCase)(e.event.hook_event_name)}`,attributes:cr(e.event,t),resource:lr(e.versionCacheDir),scope:{name:"pinta-cc",version:Yt},now:t})}function Y(e,t,n={}){let r=new re(t),o=n.traceMode==="new"?r.newTrace():r.currentTrace();return zt({event:e,traceId:o,versionCacheDir:t.pluginData})}async function z(e,t){if(!ee())return;let n=new ne(t);await n.flush(),await n.send(e)}function ce(e,t){if(!ee())return;let n=Buffer.byteLength(JSON.stringify(e),"utf-8");if(n>V.MAX_POST_BYTES){process.stderr.write(`[pinta-cc] dropping oversized span payload (${n} > ${V.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
21
- `);return}new V.DiskRetryQueue(t.pluginData,"pinta-cc").enqueue(e)}async function v(e,t,n={}){ee()&&await z(Y(e,t,n),t)}async function Kt(e,t){let n=Y(e,t),r=await te(n,process.env.PINTA_GUARD_ENDPOINT);if(r?.decision==="DENY"){let i={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:r.userMessage??r.reason??"guard_deny"}};process.stdout.write(JSON.stringify(i)+`
22
- `)}try{if((0,Xt.attachGuard)(n,r),r?.decision==="DENY")return ce(n,t),0;await z(n,t)}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
23
- `)}return 0}var Ht=p(T());async function Zt(e,t){if(e.hook_event_name==="PostToolUseFailure")return await v(e,t),0;let n=Y(e,t),r=await te(n,process.env.PINTA_GUARD_ENDPOINT);r?.decision==="DENY"&&process.stdout.write(JSON.stringify({continue:!1,stopReason:"Pinta blocked this tool output. Start a new session before continuing."})+`
24
- `);try{if((0,Ht.attachGuard)(n,r),r&&n.resourceSpans[0].scopeSpans[0].spans[0].attributes.push({key:"pinta.guard.target",value:{stringValue:"tool_output"}}),r?.decision==="DENY")return ce(n,t),0;await z(n,t)}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
25
- `)}return 0}async function Jt(e,t){return await v(e,t,{traceMode:"new"}),0}async function Wt(e,t){return await v(e,t),0}async function Qt(e,t){return await v(e,t),0}async function en(e,t){return await v(e,t),0}async function tn(e,t){return await v(e,t),0}async function De(e){return 0}async function dr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function nn(){Et();let e=0;try{let t=vt(),n=await dr(),r=JSON.parse(n);xt(r)?e=await De(r):St(r)?e=await Kt(r,t):Tt(r)?e=await Zt(r,t):bt(r)?e=await Jt(r,t):Ot(r)?e=await Wt(r,t):At(r)?e=await Qt(r,t):kt(r)?e=await en(r,t):wt(r)?e=await tn(r,t):e=await De(r)}catch(t){process.stderr.write(`[pinta-cc] error: ${t}
26
- `),e=0}return e}yt();async function fr(){let e=await nn();process.exit(e)}fr();
16
+ `),!1}finally{clearTimeout(o)}}var be=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new pt.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??_t}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await H(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let n=this.queue.readAll();if(n.length===0)return;let{chunks:r,oversize:o}=ht(n,a=>oe(a.payload),m.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized retry ${o.length===1?"entry":"entries"} (each > ${m.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
17
+ `);let i=[].concat(...r),s=0;for(let a of r){if(!await H((0,mt.mergeBatch)(a.map(l=>l.payload)),t,this.logPrefix))break;s+=a.length}this.queue.rewrite(i.slice(s))}catch(n){process.stderr.write(`[${this.logPrefix}] flush failed: ${n?.message??String(n)}
18
+ `)}finally{this.queue.release()}}dropIfOversized(t){let n=oe(t);return n<=m.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${m.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
19
+ `),!0)}};m.DiskTransport=be;var Oe=class{queue=new pt.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(oe(t)>m.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${m.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
20
+ `);return}await H(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let n=this.queue.drain();if(n.length===0)return;let{chunks:r,oversize:o}=ht(n,oe,m.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized buffered ${o.length===1?"payload":"payloads"} (each > ${m.MAX_POST_BYTES} bytes \u2014 undeliverable)
21
+ `);let i=[].concat(...r),s=0;for(let a of r){if(!await H((0,mt.mergeBatch)(a),t,this.logPrefix))break;s+=a.length}for(let a of i.slice(s))this.queue.enqueue(a)}};m.MemoryTransport=Oe});var Me=b(C=>{"use strict";var we=C&&C.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(C,"__esModule",{value:!0});C.TraceManager=void 0;C.generateUlid=Et;var vt=we(require("fs")),tr=we(require("path")),nr=we(require("crypto")),rr=te(),ke="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Et(){let e=Date.now(),t="",n=e;for(let i=0;i<10;i++)t=ke[n&31]+t,n=Math.floor(n/32);let r=nr.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=ke[r[i]&31];for(;o.length<16;)o+=ke[0];return t+o}var Ae=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Et();return this.save(t),t}currentTrace(){try{let t=vt.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{vt.default.mkdirSync(tr.default.dirname(this.tracePath),{recursive:!0}),(0,rr.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
22
+ `)}}};C.TraceManager=Ae});var Ot=b(x=>{"use strict";var St=x&&x.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(x,"__esModule",{value:!0});x.MemorySessionTraceManager=x.DiskSessionTraceManager=void 0;var Pt=St(require("fs")),or=St(require("path")),Tt=Me(),sr=te(),bt=200,Re=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??bt}read(){try{let t=JSON.parse(Pt.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Pt.default.mkdirSync(or.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,sr.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,Tt.generateUlid)(),o=this.read();return o[n]=r,this.write(o),r}currentTrace(t){let n=t||"default",r=this.read()[n];return r||this.newTrace(n)}};x.DiskSessionTraceManager=Re;var De=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??bt}newTrace(t){let n=t||"default",r=(0,Tt.generateUlid)();if(this.map.set(n,r),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return r}currentTrace(t){let n=t||"default";return this.map.get(n)??this.newTrace(n)}};x.MemorySessionTraceManager=De});var wt=b(I=>{"use strict";var xe=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.envFilePath=cr;I.parseEnvFile=At;I.loadEnvFile=ur;var ir=xe(require("node:fs")),ar=xe(require("node:os")),kt=xe(require("node:path"));function cr(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:kt.default.join(ar.default.homedir(),e);return kt.default.join(o,t)}function At(e){let t={};for(let n of e.split(`
23
+ `)){let r=n.trim();if(!r||r.startsWith("#"))continue;let o=r.indexOf("=");if(o<0)continue;let i=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),i&&(t[i]=s)}return t}function ur(e){let t;try{t=ir.default.readFileSync(e,"utf-8")}catch{return}let n=At(t);for(let[r,o]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=o)}});var O=b(c=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});c.loadEnvFile=c.parseEnvFile=c.envFilePath=c.MemorySessionTraceManager=c.DiskSessionTraceManager=c.generateUlid=c.TraceManager=c.MAX_POST_BYTES=c.parseHeadersEnv=c.envOptionsResolver=c.postOtlp=c.MemoryTransport=c.DiskTransport=c.MemoryRetryQueue=c.DiskRetryQueue=c.GUARD_BUDGET_HEADER=c.GUARD_STATUS_REFUSED=c.evaluateGuard=c.MAX_SPAN_BYTES=c.enforceSpanBudget=c.mergeBatch=c.attachGuard=c.buildPayload=c.clientAttrs=c.guardAttrs=c.attrsFromRecord=c.toOtlpValue=c.snakeCase=c.newSpanId=c.ulidToTraceId=c.MAX_BYTES=c.PATTERNS=c.applyMatches=c.resolveOverlaps=c.collectMatches=c.truncateTo=c.truncate=c.redact=void 0;var N=ge();Object.defineProperty(c,"redact",{enumerable:!0,get:function(){return N.redact}});Object.defineProperty(c,"truncate",{enumerable:!0,get:function(){return N.truncate}});Object.defineProperty(c,"truncateTo",{enumerable:!0,get:function(){return N.truncateTo}});Object.defineProperty(c,"collectMatches",{enumerable:!0,get:function(){return N.collectMatches}});Object.defineProperty(c,"resolveOverlaps",{enumerable:!0,get:function(){return N.resolveOverlaps}});Object.defineProperty(c,"applyMatches",{enumerable:!0,get:function(){return N.applyMatches}});Object.defineProperty(c,"PATTERNS",{enumerable:!0,get:function(){return N.PATTERNS}});Object.defineProperty(c,"MAX_BYTES",{enumerable:!0,get:function(){return N.MAX_BYTES}});var E=Ee();Object.defineProperty(c,"ulidToTraceId",{enumerable:!0,get:function(){return E.ulidToTraceId}});Object.defineProperty(c,"newSpanId",{enumerable:!0,get:function(){return E.newSpanId}});Object.defineProperty(c,"snakeCase",{enumerable:!0,get:function(){return E.snakeCase}});Object.defineProperty(c,"toOtlpValue",{enumerable:!0,get:function(){return E.toOtlpValue}});Object.defineProperty(c,"attrsFromRecord",{enumerable:!0,get:function(){return E.attrsFromRecord}});Object.defineProperty(c,"guardAttrs",{enumerable:!0,get:function(){return E.guardAttrs}});Object.defineProperty(c,"clientAttrs",{enumerable:!0,get:function(){return E.clientAttrs}});Object.defineProperty(c,"buildPayload",{enumerable:!0,get:function(){return E.buildPayload}});Object.defineProperty(c,"attachGuard",{enumerable:!0,get:function(){return E.attachGuard}});Object.defineProperty(c,"mergeBatch",{enumerable:!0,get:function(){return E.mergeBatch}});Object.defineProperty(c,"enforceSpanBudget",{enumerable:!0,get:function(){return E.enforceSpanBudget}});Object.defineProperty(c,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return E.MAX_SPAN_BYTES}});var Ne=lt();Object.defineProperty(c,"evaluateGuard",{enumerable:!0,get:function(){return Ne.evaluateGuard}});Object.defineProperty(c,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return Ne.GUARD_STATUS_REFUSED}});Object.defineProperty(c,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return Ne.GUARD_BUDGET_HEADER}});var Mt=Te();Object.defineProperty(c,"DiskRetryQueue",{enumerable:!0,get:function(){return Mt.DiskRetryQueue}});Object.defineProperty(c,"MemoryRetryQueue",{enumerable:!0,get:function(){return Mt.MemoryRetryQueue}});var q=yt();Object.defineProperty(c,"DiskTransport",{enumerable:!0,get:function(){return q.DiskTransport}});Object.defineProperty(c,"MemoryTransport",{enumerable:!0,get:function(){return q.MemoryTransport}});Object.defineProperty(c,"postOtlp",{enumerable:!0,get:function(){return q.postOtlp}});Object.defineProperty(c,"envOptionsResolver",{enumerable:!0,get:function(){return q.envOptionsResolver}});Object.defineProperty(c,"parseHeadersEnv",{enumerable:!0,get:function(){return q.parseHeadersEnv}});Object.defineProperty(c,"MAX_POST_BYTES",{enumerable:!0,get:function(){return q.MAX_POST_BYTES}});var Rt=Me();Object.defineProperty(c,"TraceManager",{enumerable:!0,get:function(){return Rt.TraceManager}});Object.defineProperty(c,"generateUlid",{enumerable:!0,get:function(){return Rt.generateUlid}});var Dt=Ot();Object.defineProperty(c,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Dt.DiskSessionTraceManager}});Object.defineProperty(c,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Dt.MemorySessionTraceManager}});var je=wt();Object.defineProperty(c,"envFilePath",{enumerable:!0,get:function(){return je.envFilePath}});Object.defineProperty(c,"parseEnvFile",{enumerable:!0,get:function(){return je.parseEnvFile}});Object.defineProperty(c,"loadEnvFile",{enumerable:!0,get:function(){return je.loadEnvFile}})});var Z=h(O());function lr(){return(0,Z.envFilePath)(".claude","pinta-cc.env")}function xt(e=lr()){(0,Z.loadEnvFile)(e)}function Nt(){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 Ce=h(require("path")),jt=h(O());function Ct(){let e=process.env.CLAUDE_PLUGIN_ROOT||process.cwd(),t=process.env.CLAUDE_PLUGIN_DATA||Ce.default.join(e,".plugin-data");return{pluginRoot:e,pluginData:t,tracePath:Ce.default.join(t,"trace.json")}}function se(){return(0,jt.envOptionsResolver)()!==null}function It(e){return e.hook_event_name==="PreToolUse"}function Ut(e){return e.hook_event_name==="PostToolUse"||e.hook_event_name==="PostToolUseFailure"}function Bt(e){return e.hook_event_name==="PostToolBatch"}function Lt(e){return e.hook_event_name==="UserPromptSubmit"}function $t(e){return e.hook_event_name==="SessionStart"||e.hook_event_name==="SessionEnd"}function qt(e){return e.hook_event_name==="SubagentStart"||e.hook_event_name==="SubagentStop"}function Ft(e){return e.hook_event_name==="Stop"}function Vt(e){return e.hook_event_name==="PermissionRequest"||e.hook_event_name==="PermissionDenied"}var fr=new Set(["Notification","TaskCreated","TaskCompleted"]);function Gt(e){return fr.has(e.hook_event_name)}var un=h(O());var zt=h(O()),dr=1e4,pr="pinta-cc/1.10.3-skax.0";function F(e,t){return(0,zt.evaluateGuard)(e,t,{timeoutMs:dr,token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:pr})}var Q=h(O());var Yt=h(O()),ie=class extends Yt.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-cc"})}};var Xt=h(O()),ae=class extends Xt.TraceManager{constructor(t){super(t.tracePath)}};var de=h(require("os"));var Kt=require("node:child_process"),ce=require("node:crypto"),P=h(require("node:fs")),Ht=h(require("node:os")),_=h(require("node:path")),Zt=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,mr=/^v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)\s+\(Claude Code\)$/m,hr=2e3,gr=24*60*60*1e3,_r=3e4,Ue=8,Qt="claude-version.json",V=new Map;function M(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"UNKNOWN"}function S(e){process.stderr.write(`[pinta-cc] CLI version: ${e}
24
+ `)}function ue(e){return M(e)==="ENOENT"||M(e)==="ENOTDIR"}function yr(){let e=process.env.CLAUDE_CODE_EXECPATH,t=process.platform==="win32"?["claude.exe","claude.cmd"]:["claude"],n;if(e)n=[e];else{let r=(process.env.PATH??"").split(_.default.delimiter).filter(o=>_.default.isAbsolute(o));try{r.push(_.default.join(Ht.default.homedir(),".local","bin"))}catch(o){S(`native install directory lookup failed (${M(o)})`)}n=r.flatMap(o=>t.map(i=>_.default.join(o,i)))}for(let r of new Set(n))try{let o=P.default.realpathSync(r),i=P.default.statSync(o);if(!i.isFile())continue;return!e&&process.platform!=="win32"&&P.default.accessSync(o,P.default.constants.X_OK),{file:o,fingerprint:(0,ce.createHash)("sha256").update(JSON.stringify([o,i.ino,i.size,i.mtimeMs,i.ctimeMs])).digest("hex")}}catch(o){ue(o)||S(`executable lookup failed (${M(o)})`)}return S(e?"configured executable is unavailable":"no Claude executable found in PATH or ~/.local/bin"),null}function Ie(e){let t;try{t=JSON.parse(P.default.readFileSync(e,"utf8"))}catch(n){return ue(n)||S(`package metadata could not be read (${n instanceof SyntaxError?"INVALID_JSON":M(n)})`),null}return typeof t!="object"||t===null||!("name"in t)||!("version"in t)||typeof t.name!="string"||typeof t.version!="string"||!Zt.test(t.version)?null:t.name==="@anthropic-ai/claude-code"||t.name.startsWith("@anthropic-ai/claude-code-")?t.version:null}function vr(e){let t=_.default.dirname(e),n=_.default.basename(t)===".bin"&&/^claude(?:\.cmd)?$/i.test(_.default.basename(e));for(let r=0;r<6;r++){let o=Ie(_.default.join(t,"package.json"));if(o)return o;if(_.default.basename(e).toLowerCase()==="claude.cmd"&&r===0){let s=Ie(_.default.join(t,"node_modules","@anthropic-ai","claude-code","package.json"));if(s)return s}if(n&&_.default.basename(t)==="node_modules"){let s=Ie(_.default.join(t,"@anthropic-ai","claude-code","package.json"));if(s)return s}let i=_.default.dirname(t);if(i===t)break;t=i}return null}function Er(e){return typeof e=="object"&&e!==null&&"fingerprint"in e&&typeof e.fingerprint=="string"&&/^[0-9a-f]{64}$/.test(e.fingerprint)&&"version"in e&&(e.version===null||typeof e.version=="string"&&Zt.test(e.version))&&"checkedAt"in e&&typeof e.checkedAt=="number"&&Number.isFinite(e.checkedAt)}function Jt(e,t){let n=t-e.checkedAt;return n>=0&&n<(e.version===null?_r:gr)}function Pr(e){if(!e)return[];let t=_.default.join(e,Qt);try{if(P.default.statSync(t).size>16384)return S("oversized version cache ignored"),[];let n=JSON.parse(P.default.readFileSync(t,"utf8"));if(Array.isArray(n)&&n.length<=Ue&&n.every(Er))return n;S("invalid version cache ignored")}catch(n){ue(n)||S(`version cache read failed (${n instanceof SyntaxError?"INVALID_JSON":M(n)})`)}return[]}function Wt(e){for(V.delete(e.fingerprint),V.set(e.fingerprint,e);V.size>Ue;){let t=V.keys().next().value;t!==void 0&&V.delete(t)}}function Sr(e,t){if(!e)return;let n=_.default.join(e,Qt),r=`${n}.${process.pid}.${(0,ce.randomUUID)()}.tmp`;try{P.default.mkdirSync(e,{recursive:!0,mode:448}),P.default.writeFileSync(r,JSON.stringify(t),{encoding:"utf8",mode:384,flag:"wx"}),P.default.renameSync(r,n)}catch(o){S(`version cache write failed (${M(o)})`)}finally{try{P.default.unlinkSync(r)}catch(o){ue(o)||S(`temporary version cache cleanup failed (${M(o)})`)}}}function Tr(e){if(/\.(cmd|bat|ps1)$/i.test(e))return S("command shim has no readable Claude package metadata"),null;let t=(0,Kt.spawnSync)(e,["--version"],{encoding:"utf8",stdio:["ignore","pipe","pipe"],shell:!1,windowsHide:!0,timeout:hr,killSignal:"SIGKILL",maxBuffer:4096});if(t.error||t.status!==0)return S(`version probe failed (${t.error?M(t.error):`exit ${t.status??t.signal}`})`),null;let n=mr.exec(t.stdout.trim())?.[1];return n||(S("version probe did not identify Claude Code"),null)}function en(e){let t=yr();if(!t)return"unknown";let n=vr(t.file);if(n)return n;let r=Date.now(),o=Pr(e),i=[V.get(t.fingerprint),...o].find(a=>a&&a.fingerprint===t.fingerprint&&Jt(a,r));if(i)return Wt(i),i.version??"unknown";let s={fingerprint:t.fingerprint,version:Tr(t.file),checkedAt:Date.now()};return Wt(s),Sr(e,[...o.filter(a=>a.fingerprint!==s.fingerprint&&Jt(a,s.checkedAt)),s].slice(-Ue)),s.version??"unknown"}var j=h(require("node:path"));var k=h(require("node:fs")),Be=h(require("node:path")),br=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),Or=256*1024,kr=1024*1024,Ar=4096;function U(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Le(e){let t=U(e),n=t?"id"in t?t.id:t.name:e;if(typeof n!="string")return;let r=n.trim();if(!(r.startsWith("{")||r.startsWith("[")))return r.length<=512&&!/[\u0000-\u001f\u007f]/.test(r)&&!br.has(r.toLowerCase())?r:void 0}function tn(e,t){delete e.model,t&&(e.model=t.name,!(t.source==="hook.model"&&e.model_source!==void 0)&&(e.model_source!==void 0&&(e.model_original_source=e.model_source),e.model_source=t.source))}function G(e){return typeof e=="string"&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,255}$/.test(e)?e:void 0}function le(e){let t=typeof e=="number"?e:typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T/.test(e)?Date.parse(e):NaN;return Number.isFinite(t)&&t>=0?t:void 0}function nn(e,t){let n=e.timestamp===void 0?le(t):le(e.timestamp);return n!==void 0&&n<=t?n:void 0}function rn(e){if(typeof e!="string"||e.length>4096||/[\u0000-\u001f]/.test(e)||!Be.default.isAbsolute(e)||Be.default.extname(e)!==".jsonl")return;let t;try{t=k.default.openSync(e,k.default.constants.O_RDONLY|k.default.constants.O_NONBLOCK|(k.default.constants.O_NOFOLLOW??0));let n=k.default.fstatSync(t);if(!n.isFile()||!Number.isSafeInteger(n.size)||n.size<=0)return;let r=Buffer.alloc(Math.min(n.size,Or));if(k.default.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),i;if(o>=0)try{i=U(JSON.parse(r.toString("utf8",0,o)))}catch{}let s=Math.max(0,n.size-kr),a=n.size<=r.length?r:Buffer.alloc(n.size-s);if(a!==r&&k.default.readSync(t,a,0,a.length,s)!==a.length)return;let u=k.default.fstatSync(t);if(u.size<n.size||u.size===n.size&&u.mtimeMs!==n.mtimeMs)return;let l=s>0?a.indexOf(10)+1:0,d=a.lastIndexOf(10);if(s>0&&l===0||d<l)return;let f=[],p=0;for(;d>l&&p<Ar;){let A=a.lastIndexOf(10,d-1),X=Math.max(l,A+1),qe=a.toString("utf8",X,d).trim();if(qe){let Fe=U(JSON.parse(qe));Fe&&f.push(Fe)}d=X-1,p++}return f.reverse(),{first:i,rows:f,complete:s===0&&d<0&&a[a.length-1]===10}}catch{return}finally{if(t!==void 0)try{k.default.closeSync(t)}catch{}}}function on(e){let t=e[0];return t&&e.every(n=>n?.name===t.name)?t:void 0}var wr=new Set(["PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest","PermissionDenied"]);function Mr(e,t){let n=j.default.dirname(e);if(j.default.basename(n)!=="subagents"||j.default.basename(j.default.dirname(n))!==t)return;let r=/^agent-(.+)\.jsonl$/.exec(j.default.basename(e));return G(r?.[1])}function sn(e,t){let n=Le(e.model);if(n)return{name:n,source:"hook.model"};try{return Rr(e,t)}catch{return}}function Rr(e,t){if(!wr.has(e.hook_event_name))return;let n=G(e.session_id),r=G(e.tool_use_id),o=nn(e,t);if(!n||!r||o===void 0||typeof e.transcript_path!="string")return;let i=Mr(e.transcript_path,n),s=e.agent_id===void 0?i:G(e.agent_id);if(e.agent_id!==void 0&&!s||i!==void 0&&i!==s||!s&&e.agent_type!==void 0||j.default.basename(j.default.dirname(e.transcript_path))==="subagents"&&!i)return;let a=rn(e.transcript_path);if(!a)return;let u=[];for(let l of a.rows){let d=le(l.timestamp);if(l.type!=="assistant"||l.sessionId!==n||d===void 0||d>o)continue;let f=l.agentId===void 0?void 0:G(l.agentId);if(f!==s||l.agentId!==void 0&&!f||l.isSidechain===!0&&!s)continue;let p=U(l.message);if(!p||p.role!==void 0&&p.role!=="assistant"||!Array.isArray(p.content)||!p.content.some(X=>U(X)?.type==="tool_use"&&U(X)?.id===r))continue;let A=Le(p.model);u.push(A?{name:A,source:"transcript.assistant.message"}:void 0)}return on(u)}var z=h(O()),fe;function Dr(){if(fe===void 0)try{fe=de.default.userInfo().username}catch{fe=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return fe}var an="1.10.3-skax.0",xr=new Set(["cc.hook","cc.tool_name","cc.tool_use_id","cc.session_id","cc.transcript_path","cc.cwd","cc.permission_mode"]),Nr=new Set(["cc.tool_input","cc.tool_response","cc.tool_calls"]),jr={skipRedactKeys:xr,bashContextKeys:Nr,outputForKey:(e,t)=>{if(e==="cc.error"||e==="cc.error_message")return t;if(e==="cc.tool_calls"&&Array.isArray(t))return t.map(n=>n&&typeof n=="object"&&"tool_response"in n?n.tool_response:void 0);if(!(e!=="cc.tool_response"&&e!=="cc.tool_result"))return t&&typeof t=="object"&&"file"in t&&t.file&&typeof t.file=="object"&&"content"in t.file&&t.file.content!==void 0?t.file.content:t}};function Cr(e,t){let n=[];n.push({key:"ingest.type",value:{stringValue:"cc"}}),n.push({key:"cc.hook",value:{stringValue:e.hook_event_name}});let r={};for(let[o,i]of Object.entries(e))o!=="hook_event_name"&&(r[o]=i);return tn(r,sn(e,t)),n.push(...(0,z.attrsFromRecord)(r,"cc",jr)),n}function Ir(e){return[{key:"service.name",value:{stringValue:"claude-code"}},{key:"service.version",value:{stringValue:en(e)}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-cc"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:an}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Dr()}},{key:"host.name",value:{stringValue:de.default.hostname()}},{key:"host.arch",value:{stringValue:de.default.arch()}}]}function cn(e){let t=e.now??Date.now();return(0,z.buildPayload)({traceId:e.traceId,spanName:`cc.${(0,z.snakeCase)(e.event.hook_event_name)}`,attributes:Cr(e.event,t),resource:Ir(e.versionCacheDir),scope:{name:"pinta-cc",version:an},now:t})}function B(e,t,n={}){let r=new ae(t),o=n.traceMode==="new"?r.newTrace():r.currentTrace();return cn({event:e,traceId:o,versionCacheDir:t.pluginData})}async function L(e,t){if(!se())return;let n=new ie(t);await n.flush(),await n.send(e)}function Y(e,t){if(!se())return;let n=Buffer.byteLength(JSON.stringify(e),"utf-8");if(n>Q.MAX_POST_BYTES){process.stderr.write(`[pinta-cc] dropping oversized span payload (${n} > ${Q.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
25
+ `);return}new Q.DiskRetryQueue(t.pluginData,"pinta-cc").enqueue(e)}async function T(e,t,n={}){se()&&await L(B(e,t,n),t)}async function ln(e,t){let n=B(e,t),r=await F(n,process.env.PINTA_GUARD_ENDPOINT);if(r?.decision==="DENY"){let i={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:r.userMessage??r.reason??"guard_deny"}};process.stdout.write(JSON.stringify(i)+`
26
+ `)}try{if((0,un.attachGuard)(n,r),r?.decision==="DENY")return Y(n,t),0;await L(n,t)}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
27
+ `)}return 0}var fn=h(O());async function dn(e,t){if(e.hook_event_name==="PostToolUseFailure")return await T(e,t),0;let n=B(e,t),r=await F(n,process.env.PINTA_GUARD_ENDPOINT);r?.decision==="DENY"&&process.stdout.write(JSON.stringify({continue:!1,stopReason:"Pinta blocked this tool output. Start a new session before continuing."})+`
28
+ `);try{if((0,fn.attachGuard)(n,r),r&&n.resourceSpans[0].scopeSpans[0].spans[0].attributes.push({key:"pinta.guard.target",value:{stringValue:"tool_output"}}),r?.decision==="DENY")return Y(n,t),0;await L(n,t)}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
29
+ `)}return 0}async function pn(e,t){return await T(e,t,{traceMode:"new"}),0}async function mn(e,t){return await T(e,t),0}async function hn(e,t){return await T(e,t),0}async function gn(e,t){return await T(e,t),0}var _n=h(O());async function yn(e,t){if(e.hook_event_name==="PermissionDenied")return await T(e,t),0;let n=B(e,t),r=await F(n,process.env.PINTA_GUARD_ENDPOINT);r?.decision==="DENY"&&process.stdout.write(JSON.stringify({hookSpecificOutput:{hookEventName:"PermissionRequest",decision:{behavior:"deny",message:r.userMessage??r.reason??"guard_deny"}}})+`
30
+ `);try{if((0,_n.attachGuard)(n,r),r?.decision==="DENY")return Y(n,t),0;await L(n,t)}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
31
+ `)}return 0}async function $e(e){return 0}async function Ur(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function vn(){Nt();let e=0;try{let t=Ct(),n=await Ur(),r=JSON.parse(n);Gt(r)?e=await $e(r):It(r)?e=await ln(r,t):Ut(r)||Bt(r)?e=await dn(r,t):Lt(r)?e=await pn(r,t):$t(r)?e=await mn(r,t):qt(r)?e=await hn(r,t):Ft(r)?e=await gn(r,t):Vt(r)?e=await yn(r,t):e=await $e(r)}catch(t){process.stderr.write(`[pinta-cc] error: ${t}
32
+ `),e=0}return e}xt();async function Br(){let e=await vn();process.exit(e)}Br();
package/dist/index.mjs CHANGED
@@ -1,27 +1,33 @@
1
1
  import{createRequire as __pintaCreateRequire}from 'node:module';const require=__pintaCreateRequire(import.meta.url);
2
- var sn=Object.create;var Ne=Object.defineProperty;var an=Object.getOwnPropertyDescriptor;var cn=Object.getOwnPropertyNames;var un=Object.getPrototypeOf,ln=Object.prototype.hasOwnProperty;var _=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var S=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var fn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of cn(t))!ln.call(e,o)&&o!==n&&Ne(e,o,{get:()=>t[o],enumerable:!(r=an(t,o))||r.enumerable});return e};var O=(e,t,n)=>(n=e!=null?sn(un(e)):{},fn(t||!e||!e.__esModule?Ne(n,"default",{value:e,enumerable:!0}):n,e));var le=S(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.PATTERNS=g.MAX_BYTES=void 0;g.truncateTo=Ie;g.truncate=dn;g.collectMatches=Ce;g.resolveOverlaps=Ue;g.applyMatches=Be;g.redact=pn;g.MAX_BYTES=102400;function Ie(e,t){let n=Buffer.from(e,"utf-8");return n.length<=t?e:`${n.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${n.length}]`}function dn(e){return Ie(e,g.MAX_BYTES)}g.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 Ce(e,t){let n=[];for(let r of g.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;let o=new RegExp(r.regex.source,r.regex.flags),i;for(;(i=o.exec(e))!==null;){let a=r.captureGroup??0,c=i[a];if(c===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}let u=i.index,l=i.index+i[0].length,p=u+i[0].indexOf(c),x=p+c.length;n.push({start:u,end:l,replaceStart:p,replaceEnd:x,type:r.type}),i.index===o.lastIndex&&o.lastIndex++}}return n}function Ue(e){let t=[...e].sort((o,i)=>o.start!==i.start?o.start-i.start:i.end-i.start-(o.end-o.start)),n=[],r=-1;for(let o of t)o.start<r||(n.push(o),r=o.end);return n}function Be(e,t){let n=[...t].sort((o,i)=>i.replaceStart-o.replaceStart),r=e;for(let o of n)r=r.slice(0,o.replaceStart)+`[REDACTED:${o.type}]`+r.slice(o.replaceEnd);return r}function pn(e,t={}){if(e.length===0)return e;let n=Ce(e,t);if(n.length===0)return e;let r=Ue(n);return Be(e,r)}});var de=S(d=>{"use strict";var mn=d&&d.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(d,"__esModule",{value:!0});d.MAX_SPAN_BYTES=void 0;d.ulidToTraceId=Ge;d.newSpanId=qe;d.snakeCase=_n;d.toOtlpValue=Ve;d.attrsFromRecord=yn;d.guardAttrs=Ye;d.clientAttrs=ze;d.enforceSpanBudget=Xe;d.buildPayload=En;d.attachGuard=Ke;d.mergeBatch=Pn;var gn=mn(_("crypto")),fe=le(),hn="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ge(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let r of e){let o=hn.indexOf(r);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${r}"`);t=t<<5n|BigInt(o)}let n=(1n<<128n)-1n;return t&=n,t.toString(16).padStart(32,"0")}function qe(){return gn.default.randomBytes(8).toString("hex")}function _n(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Le=new Set;function Z(e,t,n){let r=(0,fe.truncate)(t);if((n.skipRedactKeys??Le).has(e))return r;let o=(n.bashContextKeys??Le).has(e)?"bash":void 0;return(0,fe.redact)(r,{context:o})}function Ve(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:Z(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:Z(e,JSON.stringify(t),n)}}catch{return{stringValue:Z(e,String(t),n)}}default:return{stringValue:Z(e,String(t),n)}}}function yn(e,t,n={}){let r=[];for(let[o,i]of Object.entries(e)){let a=`${t}.${o}`,c=Ve(a,i,n);c!==null&&r.push({key:a,value:c})}return r}function Ye(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 ze(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}d.MAX_SPAN_BYTES=800*1024;function Fe(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var $e=1024;function Xe(e,t=d.MAX_SPAN_BYTES){let n=Fe(e);for(let r=0;r<100&&n>t;r++){let o=null,i=0;for(let u of e.attributes){if(!("stringValue"in u.value))continue;let l=Buffer.byteLength(u.value.stringValue,"utf-8");l>i&&(i=l,o=u.value)}if(o===null||i<=$e)break;let a=n-t,c=Math.max($e,i-a-64);o.stringValue=(0,fe.truncateTo)(o.stringValue,c),n=Fe(e)}return e}function En(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes],o={traceId:Ge(e.traceId),spanId:qe(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};Xe(o);let i={resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[o]}]}]};return Ke(i,e.guard,e.clientTiming)}function Ke(e,t,n){let r=e.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return e;t&&r.attributes.push(...Ye(t));let o=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return o&&r.attributes.push(...ze(o)),e}function Pn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var He=S(A=>{"use strict";Object.defineProperty(A,"__esModule",{value:!0});A.GUARD_STATUS_REFUSED=A.GUARD_BUDGET_HEADER=void 0;A.evaluateGuard=bn;var vn=1e4,Sn="pinta-core";A.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function J(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Tn=new Set(["ALLOW","DENY","REVIEW"]);A.GUARD_STATUS_REFUSED=410;async function bn(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??vn,o=Date.now(),i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let c=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??Sn,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{},...Number.isFinite(r)&&r>0?{[A.GUARD_BUDGET_HEADER]:String(r)}:{}},body:JSON.stringify(e),signal:i.signal});if(c.status===A.GUARD_STATUS_REFUSED)return J(Date.now()-o,"refused");if(c.status!==200)return J(Date.now()-o,"error");let u=await c.json(),l=u?.durationMs===void 0||typeof u.durationMs=="number"&&Number.isFinite(u.durationMs);if(!u||!Tn.has(u.decision)||!l)return J(Date.now()-o,"error");let p=Date.now()-o;return{decision:u.decision,reason:u.reason??null,userMessage:u.userMessage??null,durationMs:u.durationMs??p,clientRttMs:p}}catch(c){let u=c.name,l=u==="AbortError"||u==="TimeoutError"?"timeout":"error";return J(Date.now()-o,l)}finally{clearTimeout(a)}}});var W=S(G=>{"use strict";var On=G&&G.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(G,"__esModule",{value:!0});G.atomicWriteFileSync=An;var Ze=On(_("fs"));function An(e,t){let n=`${e}.${process.pid}.tmp`;Ze.default.writeFileSync(n,t),Ze.default.renameSync(n,e)}});var ge=S(R=>{"use strict";var Je=R&&R.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(R,"__esModule",{value:!0});R.MemoryRetryQueue=R.DiskRetryQueue=void 0;var h=Je(_("fs")),Q=Je(_("path")),kn=W(),ee=1e3,wn=50,xn=5,pe=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=Q.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{h.default.mkdirSync(Q.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
- `;h.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
4
- `)}}readAll(){try{let t=h.default.readFileSync(this.filePath,"utf-8"),n=[];for(let r of t.split(`
5
- `))if(r.trim())try{let o=JSON.parse(r);Array.isArray(o?.payload?.resourceSpans)&&n.push(o)}catch{}return n}catch{return[]}}rewrite(t){try{if(t.length===0){h.default.existsSync(this.filePath)&&h.default.unlinkSync(this.filePath);return}h.default.mkdirSync(Q.default.dirname(this.filePath),{recursive:!0}),(0,kn.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
2
+ var Sn=Object.create;var qe=Object.defineProperty;var Tn=Object.getOwnPropertyDescriptor;var bn=Object.getOwnPropertyNames;var On=Object.getPrototypeOf,kn=Object.prototype.hasOwnProperty;var v=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var T=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var An=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of bn(t))!kn.call(e,o)&&o!==n&&qe(e,o,{get:()=>t[o],enumerable:!(r=Tn(t,o))||r.enumerable});return e};var k=(e,t,n)=>(n=e!=null?Sn(On(e)):{},An(t||!e||!e.__esModule?qe(n,"default",{value:e,enumerable:!0}):n,e));var Ye=T(pe=>{"use strict";Object.defineProperty(pe,"__esModule",{value:!0});pe.mysqlPasswordRanges=In;var wn=new Set(["mysql","mysqldump","mysqladmin","mysqlcheck","mysqlimport","mysqlshow","mariadb","mariadb-dump","mariadb-admin","mariadb-check","mariadb-import","mariadb-show"]),Mn=new Set(["sh","bash","dash","zsh","ksh"]),Rn=new Set(["-u","--user","-h","--host","-P","--port","-D","--database","-S","--socket","-e","--execute","--protocol","--default-character-set","--defaults-file","--defaults-extra-file","--login-path","--init-command","--ssl-ca","--ssl-capath","--ssl-cert","--ssl-key","--ssl-cipher"]),ne=16;function Ve(e,t,n=e.value.length){return{value:e.value.slice(t,n),ranges:e.ranges.slice(t,n)}}function K(e,t,n,r){e.value+=t.value.slice(n,r);for(let o=n;o<r;o++)e.ranges.push(t.ranges[o])}function Ge(e){if(e?.literal)return e.value.slice(e.value.lastIndexOf("/")+1).replace(/\.exe$/,"")}function Dn(e){let t=0;for(let n=0;n<=ne;n++){for(;/^[A-Za-z_][A-Za-z0-9_]*=/.test(e[t]?.value??"");)t++;let r=Ge(e[t]);if(!r)return;if(["!","if","then","elif","else","while","until","do"].includes(r)){t++;continue}let o={env:["-u","--unset","-C","--chdir"],sudo:["-u","--user","-g","--group","-p","--prompt","-D","--chdir","-R","--chroot","-C","--close-from","-T","--command-timeout"],exec:["-a"],nice:["-n","--adjustment"],timeout:["-s","--signal","-k","--kill-after"]},i={env:["-i","--ignore-environment","-0","--null"],sudo:["-n","-E","-H","-S","-b","-k"],command:["-p"],exec:["-c","-l"],nohup:[],nice:[],time:["-p"],timeout:["--foreground","--preserve-status"]};if(!(r in i))return t;for(t++;e[t]?.value.startsWith("-");){let s=e[t++].value;if(s==="--")break;if(!i[r].includes(s)){if((o[r]??[]).includes(s)){if(!e[t++])return;continue}if(!(o[r]??[]).some(a=>a.startsWith("--")?s.startsWith(a+"="):s.startsWith(a)&&s.length>2)&&!(r==="nice"&&/^-\d+$/.test(s)))return}}if(r==="timeout"&&!/^\d+(?:\.\d+)?[smhd]?$/.test(e[t++]?.value??""))return}}function ze(e,t){let n=1,r="";for(let o=t;o<e.length;o++){let i=e[o];if(i==="\\"&&r!=="'"){o++;continue}if(r){i===r&&(r="");continue}if(i==="'"||i==='"')r=i;else if(i==="(")n++;else if(i===")"&&--n===0)return o}return e.length}function xn(e,t,n,r){let o={value:"",ranges:[],start:t,end:t,literal:!0},i="",s=t;for(;s<e.value.length;){let a=e.value[s];if(!i&&/[\s;|&()<>{}]/.test(a))break;if(a===i){i="",s++;continue}if(!i&&(a==="'"||a==='"')){i=a,s++;continue}if(a==="\\"&&i!=="'"){let u=e.value[s+1];if(u===`
3
+ `){s+=2;continue}if(u&&(!i||/[$`"\\]/.test(u))){K(o,e,s+1,s+2),s+=2;continue}}if(i!=="'"&&e.value.startsWith("$(",s)){let u=ze(e.value,s+2);e.value[s+2]!=="("&&r<ne&&$(Ve(e,s+2,u),n,r+1),K(o,e,s,Math.min(u+1,e.value.length)),o.literal=!1,s=Math.min(u+1,e.value.length);continue}if(a==="`"&&i!=="'"){let u=s+1;for(;u<e.value.length&&e.value[u]!=="`";)u+=e.value[u]==="\\"?2:1;r<ne&&$(Ve(e,s+1,u),n,r+1),K(o,e,s,Math.min(u+1,e.value.length)),o.literal=!1,s=Math.min(u+1,e.value.length);continue}a==="$"&&i!=="'"&&(o.literal=!1),K(o,e,s,s+1),s++}return o.end=s,o}function Nn(e,t,n,r){let o=Dn(t);if(o===void 0)return;let i=Ge(t[o]);if(Mn.has(i)&&r<ne){for(let s=o+1;s<t.length;s++){let a=t[s].value;if(a==="--command"||/^-[a-zA-Z]*c[a-zA-Z]*$/.test(a)){let u=t[s+1];u&&$(u,n,r+1);return}if(!a.startsWith("-")||a==="--")return;(a==="-o"||a==="-O")&&s++}return}if(wn.has(i))for(let s=o+1;s<t.length;s++){let a=t[s];if(a.value==="--")return;if(Rn.has(a.value)){s++;continue}a.value.startsWith("-p")&&a.value.length>2&&n.push({start:e.ranges[a.start].start,end:e.ranges[a.end-1].end})}}function $(e,t,n=0){let r=[],o,i=[],s=0,a=()=>{Nn(e,r,t,n),r=[],o=void 0};for(;s<e.value.length;){let u=e.value[s];if(u===`
4
+ `){a(),s++;for(let l of i.splice(0))for(;s<e.value.length;){let d=e.value.indexOf(`
5
+ `,s),f=d<0?e.value.length:d,p=e.value.slice(s,f);if(s=d<0?f:f+1,(l.stripTabs?p.replace(/^\t+/,""):p)===l.delimiter)break}}else if(/\s/.test(u))s++;else if(u==="#"){let l=e.value.indexOf(`
6
+ `,s);s=l<0?e.value.length:l}else if(e.value.startsWith("((",s))a(),s=Math.min(ze(e.value,s+1)+1,e.value.length);else if(/[;|&(){}]/.test(u))a(),s++;else if(u==="<"||u===">")r.at(-1)?.end===s&&/^\d+$/.test(r.at(-1).value)&&r.pop(),o=/^(?:<<<|<<-?|>>|<&|>&|[<>])/.exec(e.value.slice(s))?.[0]??u,s+=o.length;else{let l=xn(e,s,t,n);s=l.end,(o==="<<"||o==="<<-")&&i.push({delimiter:l.value,stripTabs:o==="<<-"}),o||r.push(l),o=void 0}}a()}function jn(e,t,n){let r={value:"",ranges:[]};for(let o=t+1;o<n-1;o++){if(e.value[o]!=="\\"){K(r,e,o,o+1);continue}let i=o+(e.value[o+1]==="u"?6:2),s=JSON.parse(`"${e.value.slice(o,i)}"`);r.value+=s;for(let a=0;a<s.length;a++)r.ranges.push({start:e.ranges[o].start,end:e.ranges[i-1].end});o=i-1}return r}function In(e){let t={value:e,ranges:Array.from({length:e.length},(r,o)=>({start:o,end:o+1}))},n=[];if(/^\s*[{[]/.test(e)){let r;try{r=JSON.parse(e)}catch{return $(t,n),n}if(r!==null&&typeof r=="object"){let o=/"(?:[^"\\]|\\.)*"/g,i;for(;i=o.exec(e);){let s=JSON.parse(i[0]);if(s!=="command"&&s!=="cmd"&&s!=="CommandLine")continue;let a=/^\s*:\s*/.exec(e.slice(o.lastIndex));if(!a)continue;let u=o.lastIndex+a[0].length;if(e[u]!=='"')continue;o.lastIndex=u;let l=o.exec(e);l?.index===u&&$(jn(t,u,u+l[0].length),n)}}return n}return $(t,n),n}});var ge=T(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.PATTERNS=g.MAX_BYTES=void 0;g.truncateTo=Xe;g.truncate=Un;g.collectMatches=We;g.resolveOverlaps=me;g.applyMatches=he;g.createDetectedValueMasker=Bn;g.redact=Ln;var Cn=Ye();g.MAX_BYTES=102400;function Xe(e,t){let n=Buffer.from(e,"utf-8");return n.length<=t?e:`${n.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${n.length}]`}function Un(e){return Xe(e,g.MAX_BYTES)}g.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 We(e,t){let n=[];for(let r of g.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;if(r.type==="cli_password_short"){for(let{start:s,end:a}of(0,Cn.mysqlPasswordRanges)(e))n.push({start:s,end:a,replaceStart:s,replaceEnd:a,type:r.type,replacement:`-p[REDACTED:${r.type}]`});continue}let o=new RegExp(r.regex.source,r.regex.flags),i;for(;(i=o.exec(e))!==null;){let s=r.captureGroup??0,a=i[s];if(a===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}if(/^\[REDACTED(?::[^\]]+)?\]$/i.test(a))continue;let u=i.index,l=i.index+i[0].length,d=u+i[0].indexOf(a),f=d+a.length;n.push({start:u,end:l,replaceStart:d,replaceEnd:f,type:r.type}),i.index===o.lastIndex&&o.lastIndex++}}return n}function me(e){let t=[...e].sort((r,o)=>r.replaceStart-o.replaceStart||o.replaceEnd-r.replaceEnd),n=[];for(let r of t){let o=n[n.length-1];o&&r.replaceStart<o.replaceEnd?(o.replaceEnd=Math.max(o.replaceEnd,r.replaceEnd),o.start=Math.min(o.start,r.start),o.end=Math.max(o.end,r.end)):n.push({...r})}return n}function he(e,t){let n=[...t].sort((o,i)=>i.replaceStart-o.replaceStart),r=e;for(let o of n)r=r.slice(0,o.replaceStart)+(o.replacement??`[REDACTED:${o.type}]`)+r.slice(o.replaceEnd);return r}function Bn(e){let t=new Map;for(let s of e)s.value.length>0&&!t.has(s.value)&&t.set(s.value,s);let n=[...t.values()],r=n.flatMap(s=>{let a=JSON.stringify(s.value).slice(1,-1);return a===s.value?[s]:[s,{...s,value:a}]}),o=(s,a)=>{let u=[],l=[...s.matchAll(/\[(?:PINTA_)?REDACTED(?::[^\]]+)?\]/gi)];for(let d of a)for(let f=s.indexOf(d.value);f>=0;f=s.indexOf(d.value,f+1))l.some(p=>f>=p.index&&f+d.value.length<=p.index+p[0].length)||u.push({start:f,end:f+d.value.length,replaceStart:f,replaceEnd:f+d.value.length,type:d.type});return he(s,me(u))},i=s=>{if(n.length===0)return s;if(t.has(s))return o(s,n);let a=s.trimStart()[0];if(a==="{"||a==="["||a==='"'){let u=!1;try{JSON.parse(s),u=!0}catch(l){if(!(l instanceof SyntaxError))throw l}if(u)return s.replace(/"(?:\\.|[^"\\])*"|-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/gs,l=>{let d=l.startsWith('"'),f=d?JSON.parse(l):l,p=d?i(f):o(f,n);return p===f?l:JSON.stringify(p)})}return o(s,r)};return i}function Ln(e,t={}){if(e.length===0)return e;let n=We(e,t);if(n.length===0)return e;let r=me(n);return he(e,r)}});var Ee=T(h=>{"use strict";var Fn=h&&h.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(h,"__esModule",{value:!0});h.MAX_SPAN_BYTES=void 0;h.ulidToTraceId=Qe;h.newSpanId=et;h.snakeCase=Vn;h.toOtlpValue=rt;h.attrsFromRecord=Gn;h.guardAttrs=ot;h.clientAttrs=st;h.enforceSpanBudget=it;h.buildPayload=zn;h.attachGuard=at;h.mergeBatch=Yn;var $n=Fn(v("crypto")),D=ge(),qn="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Qe(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let r of e){let o=qn.indexOf(r);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${r}"`);t=t<<5n|BigInt(o)}let n=(1n<<128n)-1n;return t&=n,t.toString(16).padStart(32,"0")}function et(){return $n.default.randomBytes(8).toString("hex")}function Vn(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Ke=new Set,ve=new WeakMap,tt=new WeakMap,nt=new WeakMap;function Je(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch(t){if(!(t instanceof TypeError))throw t;return String(e)}}function _e(e,t,n){let r=(n.bashContextKeys??Ke).has(e)?"bash":void 0,o=(n.skipRedactKeys??Ke).has(e)?[]:(0,D.collectMatches)(t,{context:r}),i={stringValue:(0,D.truncate)((0,D.applyMatches)(t,(0,D.resolveOverlaps)(o)))};return ve.set(i,{original:t,detections:o.map(s=>({value:t.slice(s.replaceStart,s.replaceEnd),type:s.type}))}),i}function rt(e,t,n={}){if(t==null)return null;let r;switch(typeof t){case"string":r=_e(e,t,n);break;case"boolean":r={boolValue:t};break;case"number":r=Number.isInteger(t)?{intValue:t}:{doubleValue:t};break;case"object":{r=_e(e,Je(t)??String(t),n);break}default:r=_e(e,String(t),n)}let o=Je(n.outputForKey?.(e,t));return o!==void 0&&tt.set(r,o),r}function Gn(e,t,n={}){let r=[];for(let[o,i]of Object.entries(e)){let s=`${t}.${o}`,a=rt(s,i,n);a!==null&&r.push({key:s,value:a})}return r}function ot(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 st(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}}]}h.MAX_SPAN_BYTES=800*1024;function He(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Ze=1024;function it(e,t=h.MAX_SPAN_BYTES){let n=He(e);for(let r=0;r<100&&n>t;r++){let o=null,i=0;for(let u of e.attributes){if(!("stringValue"in u.value))continue;let l=Buffer.byteLength(u.value.stringValue,"utf-8");l>i&&(i=l,o=u.value)}if(o===null||i<=Ze)break;let s=n-t,a=Math.max(Ze,i-s-64);o.stringValue=(0,D.truncateTo)(o.stringValue,a),n=He(e)}return e}function zn(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),o=[...e.resource,...e.attributes].flatMap(f=>{let p=ve.get(f.value);return p?[p]:[]}).flatMap(f=>f.detections),i=[...e.resource,...e.attributes].flatMap(f=>{let p=tt.get(f.value);return p===void 0?[]:[p]}),s=new Set(o.filter(f=>{let p=(0,D.createDetectedValueMasker)([f]);return i.some(A=>p(A)!==A)}).map(f=>f.value)),a=(0,D.createDetectedValueMasker)(o),u=e.attributes.map(f=>ye(f,a)),l={traceId:Qe(e.traceId),spanId:et(),name:a(e.spanName),kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:u},d={resourceSpans:[{resource:{attributes:e.resource.map(f=>ye(f,a))},scopeSpans:[{scope:{name:a(e.scope.name),version:a(e.scope.version)},spans:[l]}]}]};return o.length>0&&(nt.set(d,a),u.push({key:"pinta.facts",value:{stringValue:JSON.stringify({items:[{origin:"attributes",values:o.filter(f=>!s.has(f.value))},{origin:"toolOutput",values:o.filter(f=>s.has(f.value))}].filter(f=>f.values.length>0).map(({origin:f,values:p})=>({category:"DATA_EXFILTRATION",source:"CORE_REDACT",path:"$",secrets:{kinds:["credential"],count:new Set(p.map(A=>A.value)).size,origins:[f],scannedFields:["attributes"],scanner:"core-tier1",truncated:!1,corroboration:["pattern"]}}))})}})),it(l),at(d,e.guard,e.clientTiming)}function ye(e,t){let n={key:t(e.key),value:{...e.value}},r=n.value;if("stringValue"in r){let o=ve.get(e.value),i=t(o?.original??r.stringValue);r.stringValue=o?(0,D.truncate)(i):i}else if("intValue"in r||"doubleValue"in r){let o=String("intValue"in r?r.intValue:r.doubleValue),i=t(o);i!==o&&(n.value={stringValue:i})}return n}function at(e,t,n){let r=e.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return e;if(t){let i=ot(t),s=nt.get(e);r.attributes.push(...s?i.map(a=>ye(a,s)):i)}let o=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return o&&r.attributes.push(...st(o)),e}function Yn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var ut=T(w=>{"use strict";Object.defineProperty(w,"__esModule",{value:!0});w.GUARD_STATUS_REFUSED=w.GUARD_BUDGET_HEADER=void 0;w.evaluateGuard=Jn;var Xn=1e4,Wn="pinta-core";w.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function J(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Kn=new Set(["ALLOW","DENY","REVIEW"]);function ct(e){return e==="timeout"||e==="refused"||e==="error"}w.GUARD_STATUS_REFUSED=410;async function Jn(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??Xn,o=Date.now(),i=new AbortController,s=setTimeout(()=>i.abort(),r);try{let a=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??Wn,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{},...Number.isFinite(r)&&r>0?{[w.GUARD_BUDGET_HEADER]:String(r)}:{}},body:JSON.stringify(e),signal:i.signal});if(a.status===w.GUARD_STATUS_REFUSED)return J(Date.now()-o,"refused");if(a.status!==200)return J(Date.now()-o,"error");let u=await a.json(),l=u?.durationMs===void 0||typeof u.durationMs=="number"&&Number.isFinite(u.durationMs);if(!u||!Kn.has(u.decision)||!l)return J(Date.now()-o,"error");let d=u.decision==="ALLOW"?u.failOpenReason:void 0;if(d!=null&&!ct(d))return J(Date.now()-o,"error");let f=Date.now()-o;return{decision:u.decision,reason:u.reason??null,userMessage:u.userMessage??null,durationMs:u.durationMs??f,clientRttMs:f,...ct(d)?{failOpenReason:d}:{}}}catch(a){let u=a.name,l=u==="AbortError"||u==="TimeoutError"?"timeout":"error";return J(Date.now()-o,l)}finally{clearTimeout(s)}}});var re=T(H=>{"use strict";var Hn=H&&H.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(H,"__esModule",{value:!0});H.atomicWriteFileSync=Zn;var lt=Hn(v("fs"));function Zn(e,t){let n=`${e}.${process.pid}.tmp`;lt.default.writeFileSync(n,t),lt.default.renameSync(n,e)}});var Te=T(x=>{"use strict";var ft=x&&x.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(x,"__esModule",{value:!0});x.MemoryRetryQueue=x.DiskRetryQueue=void 0;var y=ft(v("fs")),oe=ft(v("path")),Qn=re(),se=1e3,er=50,tr=5,Pe=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=oe.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{y.default.mkdirSync(oe.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
7
+ `;y.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
8
+ `)}}readAll(){try{let t=y.default.readFileSync(this.filePath,"utf-8"),n=[];for(let r of t.split(`
9
+ `))if(r.trim())try{let o=JSON.parse(r);Array.isArray(o?.payload?.resourceSpans)&&n.push(o)}catch{}return n}catch{return[]}}rewrite(t){try{if(t.length===0){y.default.existsSync(this.filePath)&&y.default.unlinkSync(this.filePath);return}y.default.mkdirSync(oe.default.dirname(this.filePath),{recursive:!0}),(0,Qn.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
6
10
  `)+`
7
11
  `)}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${n}
8
- `)}}tryAcquireLock(){let t=Date.now();try{h.default.mkdirSync(Q.default.dirname(this.lockPath),{recursive:!0})}catch(n){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${n}
9
- `),!1}for(;Date.now()-t<wn;)try{let n=h.default.openSync(this.lockPath,"wx");return h.default.writeSync(n,String(process.pid)),h.default.closeSync(n),!0}catch(n){if(n?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${n}
10
- `),!1;try{let i=h.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){h.default.unlinkSync(this.lockPath);continue}}catch{}let r=xn,o=Date.now()+r;for(;Date.now()<o;);}return!1}release(){try{h.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=ee)return;let n=t.length-ee;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
11
- `),this.rewrite(t.slice(n))}};R.DiskRetryQueue=pe;var me=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>ee&&this.entries.splice(0,this.entries.length-ee)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};R.MemoryRetryQueue=me});var rt=S(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.MemoryTransport=f.DiskTransport=f.MAX_POST_BYTES=void 0;f.parseHeadersEnv=tt;f.envOptionsResolver=nt;f.postOtlp=q;var We=ge(),Qe=de(),Rn=5e3;f.MAX_POST_BYTES=900*1024;function te(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function et(e,t,n){let r=[],o=[],i=[],a=0;for(let c of e){let u=t(c);if(u>n){o.push(c);continue}i.length>0&&a+u>n&&(r.push(i),i=[],a=0),i.push(c),a+=u}return i.length>0&&r.push(i),{chunks:r,oversize:o}}function tt(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let n of e.split(",")){let[r,...o]=n.split("=");r&&o.length>0&&(t[r.trim()]=o.join("=").trim())}return t}function nt(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,n;return e?n=e.replace(/\/+$/,""):t&&(n=t.replace(/\/+$/,"")+"/v1/traces"),n?{endpoint:n,headers:tt(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function q(e,t,n){let r=new AbortController,o=setTimeout(()=>r.abort(),Rn);try{let i=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:r.signal});if(!i.ok){let a="";try{a=(await i.text()).slice(0,200)}catch{}let c=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(`[${n}] OTLP POST ${i.status} ${t.endpoint}${c}${a?` body=${a}`:""}
12
+ `)}}tryAcquireLock(){let t=Date.now();try{y.default.mkdirSync(oe.default.dirname(this.lockPath),{recursive:!0})}catch(n){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${n}
13
+ `),!1}for(;Date.now()-t<er;)try{let n=y.default.openSync(this.lockPath,"wx");return y.default.writeSync(n,String(process.pid)),y.default.closeSync(n),!0}catch(n){if(n?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${n}
14
+ `),!1;try{let i=y.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){y.default.unlinkSync(this.lockPath);continue}}catch{}let r=tr,o=Date.now()+r;for(;Date.now()<o;);}return!1}release(){try{y.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=se)return;let n=t.length-se;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
15
+ `),this.rewrite(t.slice(n))}};x.DiskRetryQueue=Pe;var Se=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>se&&this.entries.splice(0,this.entries.length-se)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};x.MemoryRetryQueue=Se});var _t=T(m=>{"use strict";Object.defineProperty(m,"__esModule",{value:!0});m.MemoryTransport=m.DiskTransport=m.MAX_POST_BYTES=void 0;m.parseHeadersEnv=ht;m.envOptionsResolver=gt;m.postOtlp=Z;var dt=Te(),pt=Ee(),nr=5e3;m.MAX_POST_BYTES=900*1024;function ie(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function mt(e,t,n){let r=[],o=[],i=[],s=0;for(let a of e){let u=t(a);if(u>n){o.push(a);continue}i.length>0&&s+u>n&&(r.push(i),i=[],s=0),i.push(a),s+=u}return i.length>0&&r.push(i),{chunks:r,oversize:o}}function ht(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let n of e.split(",")){let[r,...o]=n.split("=");r&&o.length>0&&(t[r.trim()]=o.join("=").trim())}return t}function gt(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,n;return e?n=e.replace(/\/+$/,""):t&&(n=t.replace(/\/+$/,"")+"/v1/traces"),n?{endpoint:n,headers:ht(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function Z(e,t,n){let r=new AbortController,o=setTimeout(()=>r.abort(),nr);try{let i=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:r.signal});if(!i.ok){let s="";try{s=(await i.text()).slice(0,200)}catch{}let a=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(`[${n}] OTLP POST ${i.status} ${t.endpoint}${a}${s?` body=${s}`:""}
12
16
  `),!1}return!0}catch(i){return process.stderr.write(`[${n}] OTLP POST failed: ${i.message??String(i)}
13
- `),!1}finally{clearTimeout(o)}}var he=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new We.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??nt}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await q(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let n=this.queue.readAll();if(n.length===0)return;let{chunks:r,oversize:o}=et(n,c=>te(c.payload),f.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized retry ${o.length===1?"entry":"entries"} (each > ${f.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
14
- `);let i=[].concat(...r),a=0;for(let c of r){if(!await q((0,Qe.mergeBatch)(c.map(l=>l.payload)),t,this.logPrefix))break;a+=c.length}this.queue.rewrite(i.slice(a))}catch(n){process.stderr.write(`[${this.logPrefix}] flush failed: ${n?.message??String(n)}
15
- `)}finally{this.queue.release()}}dropIfOversized(t){let n=te(t);return n<=f.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${f.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
16
- `),!0)}};f.DiskTransport=he;var _e=class{queue=new We.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(te(t)>f.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${f.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
17
- `);return}await q(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let n=this.queue.drain();if(n.length===0)return;let{chunks:r,oversize:o}=et(n,te,f.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized buffered ${o.length===1?"payload":"payloads"} (each > ${f.MAX_POST_BYTES} bytes \u2014 undeliverable)
18
- `);let i=[].concat(...r),a=0;for(let c of r){if(!await q((0,Qe.mergeBatch)(c),t,this.logPrefix))break;a+=c.length}for(let c of i.slice(a))this.queue.enqueue(c)}};f.MemoryTransport=_e});var ve=S(j=>{"use strict";var Pe=j&&j.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(j,"__esModule",{value:!0});j.TraceManager=void 0;j.generateUlid=it;var ot=Pe(_("fs")),Dn=Pe(_("path")),Mn=Pe(_("crypto")),jn=W(),ye="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function it(){let e=Date.now(),t="",n=e;for(let i=0;i<10;i++)t=ye[n&31]+t,n=Math.floor(n/32);let r=Mn.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=ye[r[i]&31];for(;o.length<16;)o+=ye[0];return t+o}var Ee=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=it();return this.save(t),t}currentTrace(){try{let t=ot.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{ot.default.mkdirSync(Dn.default.dirname(this.tracePath),{recursive:!0}),(0,jn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
19
- `)}}};j.TraceManager=Ee});var lt=S(D=>{"use strict";var at=D&&D.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(D,"__esModule",{value:!0});D.MemorySessionTraceManager=D.DiskSessionTraceManager=void 0;var st=at(_("fs")),Nn=at(_("path")),ct=ve(),In=W(),ut=200,Se=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??ut}read(){try{let t=JSON.parse(st.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{st.default.mkdirSync(Nn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,In.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,ct.generateUlid)(),o=this.read();return o[n]=r,this.write(o),r}currentTrace(t){let n=t||"default",r=this.read()[n];return r||this.newTrace(n)}};D.DiskSessionTraceManager=Se;var Te=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??ut}newTrace(t){let n=t||"default",r=(0,ct.generateUlid)();if(this.map.set(n,r),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return r}currentTrace(t){let n=t||"default";return this.map.get(n)??this.newTrace(n)}};D.MemorySessionTraceManager=Te});var pt=S(N=>{"use strict";var be=N&&N.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(N,"__esModule",{value:!0});N.envFilePath=Bn;N.parseEnvFile=dt;N.loadEnvFile=Ln;var Cn=be(_("node:fs")),Un=be(_("node:os")),ft=be(_("node:path"));function Bn(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:ft.default.join(Un.default.homedir(),e);return ft.default.join(o,t)}function dt(e){let t={};for(let n of e.split(`
20
- `)){let r=n.trim();if(!r||r.startsWith("#"))continue;let o=r.indexOf("=");if(o<0)continue;let i=r.slice(0,o).trim(),a=r.slice(o+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),i&&(t[i]=a)}return t}function Ln(e){let t;try{t=Cn.default.readFileSync(e,"utf-8")}catch{return}let n=dt(t);for(let[r,o]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=o)}});var T=S(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.loadEnvFile=s.parseEnvFile=s.envFilePath=s.MemorySessionTraceManager=s.DiskSessionTraceManager=s.generateUlid=s.TraceManager=s.MAX_POST_BYTES=s.parseHeadersEnv=s.envOptionsResolver=s.postOtlp=s.MemoryTransport=s.DiskTransport=s.MemoryRetryQueue=s.DiskRetryQueue=s.GUARD_BUDGET_HEADER=s.GUARD_STATUS_REFUSED=s.evaluateGuard=s.MAX_SPAN_BYTES=s.enforceSpanBudget=s.mergeBatch=s.attachGuard=s.buildPayload=s.clientAttrs=s.guardAttrs=s.attrsFromRecord=s.toOtlpValue=s.snakeCase=s.newSpanId=s.ulidToTraceId=s.MAX_BYTES=s.PATTERNS=s.applyMatches=s.resolveOverlaps=s.collectMatches=s.truncateTo=s.truncate=s.redact=void 0;var M=le();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return M.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return M.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return M.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return M.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return M.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return M.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return M.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return M.MAX_BYTES}});var y=de();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return y.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return y.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return y.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return y.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return y.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return y.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return y.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return y.buildPayload}});Object.defineProperty(s,"attachGuard",{enumerable:!0,get:function(){return y.attachGuard}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return y.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return y.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return y.MAX_SPAN_BYTES}});var Oe=He();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Oe.evaluateGuard}});Object.defineProperty(s,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return Oe.GUARD_STATUS_REFUSED}});Object.defineProperty(s,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return Oe.GUARD_BUDGET_HEADER}});var mt=ge();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return mt.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return mt.MemoryRetryQueue}});var U=rt();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return U.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return U.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return U.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return U.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return U.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return U.MAX_POST_BYTES}});var gt=ve();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return gt.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return gt.generateUlid}});var ht=lt();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return ht.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return ht.MemorySessionTraceManager}});var Ae=pt();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return Ae.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return Ae.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return Ae.loadEnvFile}})});import{realpathSync as Rr}from"node:fs";import{pathToFileURL as Dr}from"node:url";var V=O(T());function Fn(){return(0,V.envFilePath)(".claude","pinta-cc.env")}function _t(e=Fn()){(0,V.loadEnvFile)(e)}function yt(){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 Pt=O(T());import Et from"path";function vt(){let e=process.env.CLAUDE_PLUGIN_ROOT||process.cwd(),t=process.env.CLAUDE_PLUGIN_DATA||Et.join(e,".plugin-data");return{pluginRoot:e,pluginData:t,tracePath:Et.join(t,"trace.json")}}function ne(){return(0,Pt.envOptionsResolver)()!==null}function St(e){return e.hook_event_name==="PreToolUse"}function Tt(e){return e.hook_event_name==="PostToolUse"||e.hook_event_name==="PostToolUseFailure"}function bt(e){return e.hook_event_name==="UserPromptSubmit"}function Ot(e){return e.hook_event_name==="SessionStart"||e.hook_event_name==="SessionEnd"}function At(e){return e.hook_event_name==="SubagentStart"||e.hook_event_name==="SubagentStop"}function kt(e){return e.hook_event_name==="Stop"}function wt(e){return e.hook_event_name==="PermissionRequest"||e.hook_event_name==="PermissionDenied"}var $n=new Set(["Notification","TaskCreated","TaskCompleted"]);function xt(e){return $n.has(e.hook_event_name)}var zt=O(T());var Rt=O(T()),Gn=1e4,qn="pinta-cc/1.10.1";function re(e,t){return(0,Rt.evaluateGuard)(e,t,{timeoutMs:Gn,token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:qn})}var Y=O(T());var Dt=O(T()),oe=class extends Dt.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-cc"})}};var Mt=O(T()),ie=class extends Mt.TraceManager{constructor(t){super(t.tracePath)}};import Re from"os";import{spawnSync as Vn}from"node:child_process";import{createHash as Yn,randomUUID as zn}from"node:crypto";import v from"node:fs";import Xn from"node:os";import m from"node:path";var It=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,Kn=/^v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)\s+\(Claude Code\)$/m,Hn=2e3,Zn=24*60*60*1e3,Jn=3e4,we=8,Ct="claude-version.json",B=new Map;function k(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"UNKNOWN"}function E(e){process.stderr.write(`[pinta-cc] CLI version: ${e}
21
- `)}function se(e){return k(e)==="ENOENT"||k(e)==="ENOTDIR"}function Wn(){let e=process.env.CLAUDE_CODE_EXECPATH,t=process.platform==="win32"?["claude.exe","claude.cmd"]:["claude"],n;if(e)n=[e];else{let r=(process.env.PATH??"").split(m.delimiter).filter(o=>m.isAbsolute(o));try{r.push(m.join(Xn.homedir(),".local","bin"))}catch(o){E(`native install directory lookup failed (${k(o)})`)}n=r.flatMap(o=>t.map(i=>m.join(o,i)))}for(let r of new Set(n))try{let o=v.realpathSync(r),i=v.statSync(o);if(!i.isFile())continue;return!e&&process.platform!=="win32"&&v.accessSync(o,v.constants.X_OK),{file:o,fingerprint:Yn("sha256").update(JSON.stringify([o,i.ino,i.size,i.mtimeMs,i.ctimeMs])).digest("hex")}}catch(o){se(o)||E(`executable lookup failed (${k(o)})`)}return E(e?"configured executable is unavailable":"no Claude executable found in PATH or ~/.local/bin"),null}function ke(e){let t;try{t=JSON.parse(v.readFileSync(e,"utf8"))}catch(n){return se(n)||E(`package metadata could not be read (${n instanceof SyntaxError?"INVALID_JSON":k(n)})`),null}return typeof t!="object"||t===null||!("name"in t)||!("version"in t)||typeof t.name!="string"||typeof t.version!="string"||!It.test(t.version)?null:t.name==="@anthropic-ai/claude-code"||t.name.startsWith("@anthropic-ai/claude-code-")?t.version:null}function Qn(e){let t=m.dirname(e),n=m.basename(t)===".bin"&&/^claude(?:\.cmd)?$/i.test(m.basename(e));for(let r=0;r<6;r++){let o=ke(m.join(t,"package.json"));if(o)return o;if(m.basename(e).toLowerCase()==="claude.cmd"&&r===0){let a=ke(m.join(t,"node_modules","@anthropic-ai","claude-code","package.json"));if(a)return a}if(n&&m.basename(t)==="node_modules"){let a=ke(m.join(t,"@anthropic-ai","claude-code","package.json"));if(a)return a}let i=m.dirname(t);if(i===t)break;t=i}return null}function er(e){return typeof e=="object"&&e!==null&&"fingerprint"in e&&typeof e.fingerprint=="string"&&/^[0-9a-f]{64}$/.test(e.fingerprint)&&"version"in e&&(e.version===null||typeof e.version=="string"&&It.test(e.version))&&"checkedAt"in e&&typeof e.checkedAt=="number"&&Number.isFinite(e.checkedAt)}function jt(e,t){let n=t-e.checkedAt;return n>=0&&n<(e.version===null?Jn:Zn)}function tr(e){if(!e)return[];let t=m.join(e,Ct);try{if(v.statSync(t).size>16384)return E("oversized version cache ignored"),[];let n=JSON.parse(v.readFileSync(t,"utf8"));if(Array.isArray(n)&&n.length<=we&&n.every(er))return n;E("invalid version cache ignored")}catch(n){se(n)||E(`version cache read failed (${n instanceof SyntaxError?"INVALID_JSON":k(n)})`)}return[]}function Nt(e){for(B.delete(e.fingerprint),B.set(e.fingerprint,e);B.size>we;){let t=B.keys().next().value;t!==void 0&&B.delete(t)}}function nr(e,t){if(!e)return;let n=m.join(e,Ct),r=`${n}.${process.pid}.${zn()}.tmp`;try{v.mkdirSync(e,{recursive:!0,mode:448}),v.writeFileSync(r,JSON.stringify(t),{encoding:"utf8",mode:384,flag:"wx"}),v.renameSync(r,n)}catch(o){E(`version cache write failed (${k(o)})`)}finally{try{v.unlinkSync(r)}catch(o){se(o)||E(`temporary version cache cleanup failed (${k(o)})`)}}}function rr(e){if(/\.(cmd|bat|ps1)$/i.test(e))return E("command shim has no readable Claude package metadata"),null;let t=Vn(e,["--version"],{encoding:"utf8",stdio:["ignore","pipe","pipe"],shell:!1,windowsHide:!0,timeout:Hn,killSignal:"SIGKILL",maxBuffer:4096});if(t.error||t.status!==0)return E(`version probe failed (${t.error?k(t.error):`exit ${t.status??t.signal}`})`),null;let n=Kn.exec(t.stdout.trim())?.[1];return n||(E("version probe did not identify Claude Code"),null)}function Ut(e){let t=Wn();if(!t)return"unknown";let n=Qn(t.file);if(n)return n;let r=Date.now(),o=tr(e),i=[B.get(t.fingerprint),...o].find(c=>c&&c.fingerprint===t.fingerprint&&jt(c,r));if(i)return Nt(i),i.version??"unknown";let a={fingerprint:t.fingerprint,version:rr(t.file),checkedAt:Date.now()};return Nt(a),nr(e,[...o.filter(c=>c.fingerprint!==a.fingerprint&&jt(c,a.checkedAt)),a].slice(-we)),a.version??"unknown"}import C from"node:path";import w from"node:fs";import Bt from"node:path";var or=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),ir=256*1024,sr=1024*1024,ar=4096;function I(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function xe(e){let t=I(e),n=t?"id"in t?t.id:t.name:e;if(typeof n!="string")return;let r=n.trim();if(!(r.startsWith("{")||r.startsWith("[")))return r.length<=512&&!/[\u0000-\u001f\u007f]/.test(r)&&!or.has(r.toLowerCase())?r:void 0}function Lt(e,t){delete e.model,t&&(e.model=t.name,!(t.source==="hook.model"&&e.model_source!==void 0)&&(e.model_source!==void 0&&(e.model_original_source=e.model_source),e.model_source=t.source))}function L(e){return typeof e=="string"&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,255}$/.test(e)?e:void 0}function ae(e){let t=typeof e=="number"?e:typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T/.test(e)?Date.parse(e):NaN;return Number.isFinite(t)&&t>=0?t:void 0}function Ft(e,t){let n=e.timestamp===void 0?ae(t):ae(e.timestamp);return n!==void 0&&n<=t?n:void 0}function $t(e){if(typeof e!="string"||e.length>4096||/[\u0000-\u001f]/.test(e)||!Bt.isAbsolute(e)||Bt.extname(e)!==".jsonl")return;let t;try{t=w.openSync(e,w.constants.O_RDONLY|w.constants.O_NONBLOCK|(w.constants.O_NOFOLLOW??0));let n=w.fstatSync(t);if(!n.isFile()||!Number.isSafeInteger(n.size)||n.size<=0)return;let r=Buffer.alloc(Math.min(n.size,ir));if(w.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),i;if(o>=0)try{i=I(JSON.parse(r.toString("utf8",0,o)))}catch{}let a=Math.max(0,n.size-sr),c=n.size<=r.length?r:Buffer.alloc(n.size-a);if(c!==r&&w.readSync(t,c,0,c.length,a)!==c.length)return;let u=w.fstatSync(t);if(u.size<n.size||u.size===n.size&&u.mtimeMs!==n.mtimeMs)return;let l=a>0?c.indexOf(10)+1:0,p=c.lastIndexOf(10);if(a>0&&l===0||p<l)return;let x=[],b=0;for(;p>l&&b<ar;){let H=c.lastIndexOf(10,p-1),$=Math.max(l,H+1),Me=c.toString("utf8",$,p).trim();if(Me){let je=I(JSON.parse(Me));je&&x.push(je)}p=$-1,b++}return x.reverse(),{first:i,rows:x,complete:a===0&&p<0&&c[c.length-1]===10}}catch{return}finally{if(t!==void 0)try{w.closeSync(t)}catch{}}}function Gt(e){let t=e[0];return t&&e.every(n=>n?.name===t.name)?t:void 0}var cr=new Set(["PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest","PermissionDenied"]);function ur(e,t){let n=C.dirname(e);if(C.basename(n)!=="subagents"||C.basename(C.dirname(n))!==t)return;let r=/^agent-(.+)\.jsonl$/.exec(C.basename(e));return L(r?.[1])}function qt(e,t){let n=xe(e.model);if(n)return{name:n,source:"hook.model"};try{return lr(e,t)}catch{return}}function lr(e,t){if(!cr.has(e.hook_event_name))return;let n=L(e.session_id),r=L(e.tool_use_id),o=Ft(e,t);if(!n||!r||o===void 0||typeof e.transcript_path!="string")return;let i=ur(e.transcript_path,n),a=e.agent_id===void 0?i:L(e.agent_id);if(e.agent_id!==void 0&&!a||i!==void 0&&i!==a||!a&&e.agent_type!==void 0||C.basename(C.dirname(e.transcript_path))==="subagents"&&!i)return;let c=$t(e.transcript_path);if(!c)return;let u=[];for(let l of c.rows){let p=ae(l.timestamp);if(l.type!=="assistant"||l.sessionId!==n||p===void 0||p>o)continue;let x=l.agentId===void 0?void 0:L(l.agentId);if(x!==a||l.agentId!==void 0&&!x||l.isSidechain===!0&&!a)continue;let b=I(l.message);if(!b||b.role!==void 0&&b.role!=="assistant"||!Array.isArray(b.content)||!b.content.some($=>I($)?.type==="tool_use"&&I($)?.id===r))continue;let H=xe(b.model);u.push(H?{name:H,source:"transcript.assistant.message"}:void 0)}return Gt(u)}var F=O(T()),ce;function fr(){if(ce===void 0)try{ce=Re.userInfo().username}catch{ce=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return ce}var Vt="1.10.1",dr=new Set(["cc.hook","cc.tool_name","cc.tool_use_id","cc.session_id","cc.transcript_path","cc.cwd","cc.permission_mode"]),pr=new Set(["cc.tool_input","cc.tool_response"]),mr={skipRedactKeys:dr,bashContextKeys:pr};function gr(e,t){let n=[];n.push({key:"ingest.type",value:{stringValue:"cc"}}),n.push({key:"cc.hook",value:{stringValue:e.hook_event_name}});let r={};for(let[o,i]of Object.entries(e))o!=="hook_event_name"&&(r[o]=i);return Lt(r,qt(e,t)),n.push(...(0,F.attrsFromRecord)(r,"cc",mr)),n}function hr(e){return[{key:"service.name",value:{stringValue:"claude-code"}},{key:"service.version",value:{stringValue:Ut(e)}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-cc"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:Vt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:fr()}},{key:"host.name",value:{stringValue:Re.hostname()}},{key:"host.arch",value:{stringValue:Re.arch()}}]}function Yt(e){let t=e.now??Date.now();return(0,F.buildPayload)({traceId:e.traceId,spanName:`cc.${(0,F.snakeCase)(e.event.hook_event_name)}`,attributes:gr(e.event,t),resource:hr(e.versionCacheDir),scope:{name:"pinta-cc",version:Vt},now:t})}function z(e,t,n={}){let r=new ie(t),o=n.traceMode==="new"?r.newTrace():r.currentTrace();return Yt({event:e,traceId:o,versionCacheDir:t.pluginData})}async function X(e,t){if(!ne())return;let n=new oe(t);await n.flush(),await n.send(e)}function ue(e,t){if(!ne())return;let n=Buffer.byteLength(JSON.stringify(e),"utf-8");if(n>Y.MAX_POST_BYTES){process.stderr.write(`[pinta-cc] dropping oversized span payload (${n} > ${Y.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
22
- `);return}new Y.DiskRetryQueue(t.pluginData,"pinta-cc").enqueue(e)}async function P(e,t,n={}){ne()&&await X(z(e,t,n),t)}async function Xt(e,t){let n=z(e,t),r=await re(n,process.env.PINTA_GUARD_ENDPOINT);if(r?.decision==="DENY"){let i={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:r.userMessage??r.reason??"guard_deny"}};process.stdout.write(JSON.stringify(i)+`
23
- `)}try{if((0,zt.attachGuard)(n,r),r?.decision==="DENY")return ue(n,t),0;await X(n,t)}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
24
- `)}return 0}var Kt=O(T());async function Ht(e,t){if(e.hook_event_name==="PostToolUseFailure")return await P(e,t),0;let n=z(e,t),r=await re(n,process.env.PINTA_GUARD_ENDPOINT);r?.decision==="DENY"&&process.stdout.write(JSON.stringify({continue:!1,stopReason:"Pinta blocked this tool output. Start a new session before continuing."})+`
25
- `);try{if((0,Kt.attachGuard)(n,r),r&&n.resourceSpans[0].scopeSpans[0].spans[0].attributes.push({key:"pinta.guard.target",value:{stringValue:"tool_output"}}),r?.decision==="DENY")return ue(n,t),0;await X(n,t)}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
26
- `)}return 0}async function Zt(e,t){return await P(e,t,{traceMode:"new"}),0}async function Jt(e,t){return await P(e,t),0}async function Wt(e,t){return await P(e,t),0}async function Qt(e,t){return await P(e,t),0}async function en(e,t){return await P(e,t),0}async function De(e){return 0}async function _r(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function tn(){yt();let e=0;try{let t=vt(),n=await _r(),r=JSON.parse(n);xt(r)?e=await De(r):St(r)?e=await Xt(r,t):Tt(r)?e=await Ht(r,t):bt(r)?e=await Zt(r,t):Ot(r)?e=await Jt(r,t):At(r)?e=await Wt(r,t):kt(r)?e=await Qt(r,t):wt(r)?e=await en(r,t):e=await De(r)}catch(t){process.stderr.write(`[pinta-cc] error: ${t}
27
- `),e=0}return e}import{opendir as yr,stat as Er}from"node:fs/promises";import{homedir as Pr}from"node:os";import K from"node:path";var vr="pinta-cc",nn="memory";function Sr(){let e=process.env.CLAUDE_CONFIG_DIR;return e&&e.length>0?e:K.join(Pr(),".claude")}function Tr(){return K.join(Sr(),"projects")}function br(e,t){return K.relative(e,t).split(K.sep).join("/")}function Or(e){return e.endsWith(".jsonl")?"append-log":"rewritten-doc"}function Ar(e){let t=e.split("/");if(t.length<2)return{};let n=t[0],r=t[1];return t.length===2?r.endsWith(".jsonl")?{projectKey:n,sessionId:r.slice(0,-6)}:{projectKey:n}:r===nn?{projectKey:n}:{projectKey:n,sessionId:r}}function kr(e){return e.endsWith(".jsonl")?"session-log":e.split("/")[1]===nn?"memory":e.endsWith(".json")?"meta":"other"}async function rn(){return[Tr()]}async function*on(e,t){let n;try{n=await yr(t)}catch{return}try{for await(let r of n){let o=K.join(t,r.name);r.isDirectory()?yield*on(e,o):r.isFile()&&(yield{absPath:o,relPath:br(e,o)})}}catch{return}}async function*wr(e){let[t]=await rn(),n=e.since?.getTime();for await(let{absPath:r,relPath:o}of on(t,t)){let i;try{i=await Er(r)}catch{continue}if(n!==void 0&&i.mtime.getTime()<=n)continue;let{projectKey:a,sessionId:c}=Ar(o);yield{relPath:o,absPath:r,size:i.size,mtime:i.mtime,sessionId:c,projectKey:a,semantics:Or(o)}}}var xr={id:vr,roots:rn,scan:wr,classify:kr};_t();function Mr(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===Dr(Rr(e)).href}catch{return!1}}async function jr(){let e=await tn();process.exit(e)}Mr()&&jr();export{xr as lifecycle};
17
+ `),!1}finally{clearTimeout(o)}}var be=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new dt.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??gt}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await Z(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let n=this.queue.readAll();if(n.length===0)return;let{chunks:r,oversize:o}=mt(n,a=>ie(a.payload),m.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized retry ${o.length===1?"entry":"entries"} (each > ${m.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
18
+ `);let i=[].concat(...r),s=0;for(let a of r){if(!await Z((0,pt.mergeBatch)(a.map(l=>l.payload)),t,this.logPrefix))break;s+=a.length}this.queue.rewrite(i.slice(s))}catch(n){process.stderr.write(`[${this.logPrefix}] flush failed: ${n?.message??String(n)}
19
+ `)}finally{this.queue.release()}}dropIfOversized(t){let n=ie(t);return n<=m.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${m.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
20
+ `),!0)}};m.DiskTransport=be;var Oe=class{queue=new dt.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(ie(t)>m.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${m.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
21
+ `);return}await Z(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let n=this.queue.drain();if(n.length===0)return;let{chunks:r,oversize:o}=mt(n,ie,m.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized buffered ${o.length===1?"payload":"payloads"} (each > ${m.MAX_POST_BYTES} bytes \u2014 undeliverable)
22
+ `);let i=[].concat(...r),s=0;for(let a of r){if(!await Z((0,pt.mergeBatch)(a),t,this.logPrefix))break;s+=a.length}for(let a of i.slice(s))this.queue.enqueue(a)}};m.MemoryTransport=Oe});var Me=T(I=>{"use strict";var we=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.TraceManager=void 0;I.generateUlid=vt;var yt=we(v("fs")),rr=we(v("path")),or=we(v("crypto")),sr=re(),ke="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function vt(){let e=Date.now(),t="",n=e;for(let i=0;i<10;i++)t=ke[n&31]+t,n=Math.floor(n/32);let r=or.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=ke[r[i]&31];for(;o.length<16;)o+=ke[0];return t+o}var Ae=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=vt();return this.save(t),t}currentTrace(){try{let t=yt.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{yt.default.mkdirSync(rr.default.dirname(this.tracePath),{recursive:!0}),(0,sr.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
23
+ `)}}};I.TraceManager=Ae});var bt=T(N=>{"use strict";var Pt=N&&N.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(N,"__esModule",{value:!0});N.MemorySessionTraceManager=N.DiskSessionTraceManager=void 0;var Et=Pt(v("fs")),ir=Pt(v("path")),St=Me(),ar=re(),Tt=200,Re=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??Tt}read(){try{let t=JSON.parse(Et.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Et.default.mkdirSync(ir.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,ar.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,St.generateUlid)(),o=this.read();return o[n]=r,this.write(o),r}currentTrace(t){let n=t||"default",r=this.read()[n];return r||this.newTrace(n)}};N.DiskSessionTraceManager=Re;var De=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Tt}newTrace(t){let n=t||"default",r=(0,St.generateUlid)();if(this.map.set(n,r),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return r}currentTrace(t){let n=t||"default";return this.map.get(n)??this.newTrace(n)}};N.MemorySessionTraceManager=De});var At=T(C=>{"use strict";var xe=C&&C.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(C,"__esModule",{value:!0});C.envFilePath=lr;C.parseEnvFile=kt;C.loadEnvFile=fr;var cr=xe(v("node:fs")),ur=xe(v("node:os")),Ot=xe(v("node:path"));function lr(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:Ot.default.join(ur.default.homedir(),e);return Ot.default.join(o,t)}function kt(e){let t={};for(let n of e.split(`
24
+ `)){let r=n.trim();if(!r||r.startsWith("#"))continue;let o=r.indexOf("=");if(o<0)continue;let i=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),i&&(t[i]=s)}return t}function fr(e){let t;try{t=cr.default.readFileSync(e,"utf-8")}catch{return}let n=kt(t);for(let[r,o]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=o)}});var b=T(c=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});c.loadEnvFile=c.parseEnvFile=c.envFilePath=c.MemorySessionTraceManager=c.DiskSessionTraceManager=c.generateUlid=c.TraceManager=c.MAX_POST_BYTES=c.parseHeadersEnv=c.envOptionsResolver=c.postOtlp=c.MemoryTransport=c.DiskTransport=c.MemoryRetryQueue=c.DiskRetryQueue=c.GUARD_BUDGET_HEADER=c.GUARD_STATUS_REFUSED=c.evaluateGuard=c.MAX_SPAN_BYTES=c.enforceSpanBudget=c.mergeBatch=c.attachGuard=c.buildPayload=c.clientAttrs=c.guardAttrs=c.attrsFromRecord=c.toOtlpValue=c.snakeCase=c.newSpanId=c.ulidToTraceId=c.MAX_BYTES=c.PATTERNS=c.applyMatches=c.resolveOverlaps=c.collectMatches=c.truncateTo=c.truncate=c.redact=void 0;var j=ge();Object.defineProperty(c,"redact",{enumerable:!0,get:function(){return j.redact}});Object.defineProperty(c,"truncate",{enumerable:!0,get:function(){return j.truncate}});Object.defineProperty(c,"truncateTo",{enumerable:!0,get:function(){return j.truncateTo}});Object.defineProperty(c,"collectMatches",{enumerable:!0,get:function(){return j.collectMatches}});Object.defineProperty(c,"resolveOverlaps",{enumerable:!0,get:function(){return j.resolveOverlaps}});Object.defineProperty(c,"applyMatches",{enumerable:!0,get:function(){return j.applyMatches}});Object.defineProperty(c,"PATTERNS",{enumerable:!0,get:function(){return j.PATTERNS}});Object.defineProperty(c,"MAX_BYTES",{enumerable:!0,get:function(){return j.MAX_BYTES}});var E=Ee();Object.defineProperty(c,"ulidToTraceId",{enumerable:!0,get:function(){return E.ulidToTraceId}});Object.defineProperty(c,"newSpanId",{enumerable:!0,get:function(){return E.newSpanId}});Object.defineProperty(c,"snakeCase",{enumerable:!0,get:function(){return E.snakeCase}});Object.defineProperty(c,"toOtlpValue",{enumerable:!0,get:function(){return E.toOtlpValue}});Object.defineProperty(c,"attrsFromRecord",{enumerable:!0,get:function(){return E.attrsFromRecord}});Object.defineProperty(c,"guardAttrs",{enumerable:!0,get:function(){return E.guardAttrs}});Object.defineProperty(c,"clientAttrs",{enumerable:!0,get:function(){return E.clientAttrs}});Object.defineProperty(c,"buildPayload",{enumerable:!0,get:function(){return E.buildPayload}});Object.defineProperty(c,"attachGuard",{enumerable:!0,get:function(){return E.attachGuard}});Object.defineProperty(c,"mergeBatch",{enumerable:!0,get:function(){return E.mergeBatch}});Object.defineProperty(c,"enforceSpanBudget",{enumerable:!0,get:function(){return E.enforceSpanBudget}});Object.defineProperty(c,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return E.MAX_SPAN_BYTES}});var Ne=ut();Object.defineProperty(c,"evaluateGuard",{enumerable:!0,get:function(){return Ne.evaluateGuard}});Object.defineProperty(c,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return Ne.GUARD_STATUS_REFUSED}});Object.defineProperty(c,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return Ne.GUARD_BUDGET_HEADER}});var wt=Te();Object.defineProperty(c,"DiskRetryQueue",{enumerable:!0,get:function(){return wt.DiskRetryQueue}});Object.defineProperty(c,"MemoryRetryQueue",{enumerable:!0,get:function(){return wt.MemoryRetryQueue}});var q=_t();Object.defineProperty(c,"DiskTransport",{enumerable:!0,get:function(){return q.DiskTransport}});Object.defineProperty(c,"MemoryTransport",{enumerable:!0,get:function(){return q.MemoryTransport}});Object.defineProperty(c,"postOtlp",{enumerable:!0,get:function(){return q.postOtlp}});Object.defineProperty(c,"envOptionsResolver",{enumerable:!0,get:function(){return q.envOptionsResolver}});Object.defineProperty(c,"parseHeadersEnv",{enumerable:!0,get:function(){return q.parseHeadersEnv}});Object.defineProperty(c,"MAX_POST_BYTES",{enumerable:!0,get:function(){return q.MAX_POST_BYTES}});var Mt=Me();Object.defineProperty(c,"TraceManager",{enumerable:!0,get:function(){return Mt.TraceManager}});Object.defineProperty(c,"generateUlid",{enumerable:!0,get:function(){return Mt.generateUlid}});var Rt=bt();Object.defineProperty(c,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Rt.DiskSessionTraceManager}});Object.defineProperty(c,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Rt.MemorySessionTraceManager}});var je=At();Object.defineProperty(c,"envFilePath",{enumerable:!0,get:function(){return je.envFilePath}});Object.defineProperty(c,"parseEnvFile",{enumerable:!0,get:function(){return je.parseEnvFile}});Object.defineProperty(c,"loadEnvFile",{enumerable:!0,get:function(){return je.loadEnvFile}})});import{realpathSync as no}from"node:fs";import{pathToFileURL as ro}from"node:url";var Q=k(b());function dr(){return(0,Q.envFilePath)(".claude","pinta-cc.env")}function Dt(e=dr()){(0,Q.loadEnvFile)(e)}function xt(){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 jt=k(b());import Nt from"path";function It(){let e=process.env.CLAUDE_PLUGIN_ROOT||process.cwd(),t=process.env.CLAUDE_PLUGIN_DATA||Nt.join(e,".plugin-data");return{pluginRoot:e,pluginData:t,tracePath:Nt.join(t,"trace.json")}}function ae(){return(0,jt.envOptionsResolver)()!==null}function Ct(e){return e.hook_event_name==="PreToolUse"}function Ut(e){return e.hook_event_name==="PostToolUse"||e.hook_event_name==="PostToolUseFailure"}function Bt(e){return e.hook_event_name==="PostToolBatch"}function Lt(e){return e.hook_event_name==="UserPromptSubmit"}function Ft(e){return e.hook_event_name==="SessionStart"||e.hook_event_name==="SessionEnd"}function $t(e){return e.hook_event_name==="SubagentStart"||e.hook_event_name==="SubagentStop"}function qt(e){return e.hook_event_name==="Stop"}function Vt(e){return e.hook_event_name==="PermissionRequest"||e.hook_event_name==="PermissionDenied"}var pr=new Set(["Notification","TaskCreated","TaskCompleted"]);function Gt(e){return pr.has(e.hook_event_name)}var cn=k(b());var zt=k(b()),mr=1e4,hr="pinta-cc/1.10.3-skax.0";function V(e,t){return(0,zt.evaluateGuard)(e,t,{timeoutMs:mr,token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:hr})}var ee=k(b());var Yt=k(b()),ce=class extends Yt.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-cc"})}};var Xt=k(b()),ue=class extends Xt.TraceManager{constructor(t){super(t.tracePath)}};import Be from"os";import{spawnSync as gr}from"node:child_process";import{createHash as _r,randomUUID as yr}from"node:crypto";import O from"node:fs";import vr from"node:os";import _ from"node:path";var Jt=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,Er=/^v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)\s+\(Claude Code\)$/m,Pr=2e3,Sr=24*60*60*1e3,Tr=3e4,Ce=8,Ht="claude-version.json",G=new Map;function M(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"UNKNOWN"}function P(e){process.stderr.write(`[pinta-cc] CLI version: ${e}
25
+ `)}function le(e){return M(e)==="ENOENT"||M(e)==="ENOTDIR"}function br(){let e=process.env.CLAUDE_CODE_EXECPATH,t=process.platform==="win32"?["claude.exe","claude.cmd"]:["claude"],n;if(e)n=[e];else{let r=(process.env.PATH??"").split(_.delimiter).filter(o=>_.isAbsolute(o));try{r.push(_.join(vr.homedir(),".local","bin"))}catch(o){P(`native install directory lookup failed (${M(o)})`)}n=r.flatMap(o=>t.map(i=>_.join(o,i)))}for(let r of new Set(n))try{let o=O.realpathSync(r),i=O.statSync(o);if(!i.isFile())continue;return!e&&process.platform!=="win32"&&O.accessSync(o,O.constants.X_OK),{file:o,fingerprint:_r("sha256").update(JSON.stringify([o,i.ino,i.size,i.mtimeMs,i.ctimeMs])).digest("hex")}}catch(o){le(o)||P(`executable lookup failed (${M(o)})`)}return P(e?"configured executable is unavailable":"no Claude executable found in PATH or ~/.local/bin"),null}function Ie(e){let t;try{t=JSON.parse(O.readFileSync(e,"utf8"))}catch(n){return le(n)||P(`package metadata could not be read (${n instanceof SyntaxError?"INVALID_JSON":M(n)})`),null}return typeof t!="object"||t===null||!("name"in t)||!("version"in t)||typeof t.name!="string"||typeof t.version!="string"||!Jt.test(t.version)?null:t.name==="@anthropic-ai/claude-code"||t.name.startsWith("@anthropic-ai/claude-code-")?t.version:null}function Or(e){let t=_.dirname(e),n=_.basename(t)===".bin"&&/^claude(?:\.cmd)?$/i.test(_.basename(e));for(let r=0;r<6;r++){let o=Ie(_.join(t,"package.json"));if(o)return o;if(_.basename(e).toLowerCase()==="claude.cmd"&&r===0){let s=Ie(_.join(t,"node_modules","@anthropic-ai","claude-code","package.json"));if(s)return s}if(n&&_.basename(t)==="node_modules"){let s=Ie(_.join(t,"@anthropic-ai","claude-code","package.json"));if(s)return s}let i=_.dirname(t);if(i===t)break;t=i}return null}function kr(e){return typeof e=="object"&&e!==null&&"fingerprint"in e&&typeof e.fingerprint=="string"&&/^[0-9a-f]{64}$/.test(e.fingerprint)&&"version"in e&&(e.version===null||typeof e.version=="string"&&Jt.test(e.version))&&"checkedAt"in e&&typeof e.checkedAt=="number"&&Number.isFinite(e.checkedAt)}function Wt(e,t){let n=t-e.checkedAt;return n>=0&&n<(e.version===null?Tr:Sr)}function Ar(e){if(!e)return[];let t=_.join(e,Ht);try{if(O.statSync(t).size>16384)return P("oversized version cache ignored"),[];let n=JSON.parse(O.readFileSync(t,"utf8"));if(Array.isArray(n)&&n.length<=Ce&&n.every(kr))return n;P("invalid version cache ignored")}catch(n){le(n)||P(`version cache read failed (${n instanceof SyntaxError?"INVALID_JSON":M(n)})`)}return[]}function Kt(e){for(G.delete(e.fingerprint),G.set(e.fingerprint,e);G.size>Ce;){let t=G.keys().next().value;t!==void 0&&G.delete(t)}}function wr(e,t){if(!e)return;let n=_.join(e,Ht),r=`${n}.${process.pid}.${yr()}.tmp`;try{O.mkdirSync(e,{recursive:!0,mode:448}),O.writeFileSync(r,JSON.stringify(t),{encoding:"utf8",mode:384,flag:"wx"}),O.renameSync(r,n)}catch(o){P(`version cache write failed (${M(o)})`)}finally{try{O.unlinkSync(r)}catch(o){le(o)||P(`temporary version cache cleanup failed (${M(o)})`)}}}function Mr(e){if(/\.(cmd|bat|ps1)$/i.test(e))return P("command shim has no readable Claude package metadata"),null;let t=gr(e,["--version"],{encoding:"utf8",stdio:["ignore","pipe","pipe"],shell:!1,windowsHide:!0,timeout:Pr,killSignal:"SIGKILL",maxBuffer:4096});if(t.error||t.status!==0)return P(`version probe failed (${t.error?M(t.error):`exit ${t.status??t.signal}`})`),null;let n=Er.exec(t.stdout.trim())?.[1];return n||(P("version probe did not identify Claude Code"),null)}function Zt(e){let t=br();if(!t)return"unknown";let n=Or(t.file);if(n)return n;let r=Date.now(),o=Ar(e),i=[G.get(t.fingerprint),...o].find(a=>a&&a.fingerprint===t.fingerprint&&Wt(a,r));if(i)return Kt(i),i.version??"unknown";let s={fingerprint:t.fingerprint,version:Mr(t.file),checkedAt:Date.now()};return Kt(s),wr(e,[...o.filter(a=>a.fingerprint!==s.fingerprint&&Wt(a,s.checkedAt)),s].slice(-Ce)),s.version??"unknown"}import B from"node:path";import R from"node:fs";import Qt from"node:path";var Rr=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),Dr=256*1024,xr=1024*1024,Nr=4096;function U(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Ue(e){let t=U(e),n=t?"id"in t?t.id:t.name:e;if(typeof n!="string")return;let r=n.trim();if(!(r.startsWith("{")||r.startsWith("[")))return r.length<=512&&!/[\u0000-\u001f\u007f]/.test(r)&&!Rr.has(r.toLowerCase())?r:void 0}function en(e,t){delete e.model,t&&(e.model=t.name,!(t.source==="hook.model"&&e.model_source!==void 0)&&(e.model_source!==void 0&&(e.model_original_source=e.model_source),e.model_source=t.source))}function z(e){return typeof e=="string"&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,255}$/.test(e)?e:void 0}function fe(e){let t=typeof e=="number"?e:typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T/.test(e)?Date.parse(e):NaN;return Number.isFinite(t)&&t>=0?t:void 0}function tn(e,t){let n=e.timestamp===void 0?fe(t):fe(e.timestamp);return n!==void 0&&n<=t?n:void 0}function nn(e){if(typeof e!="string"||e.length>4096||/[\u0000-\u001f]/.test(e)||!Qt.isAbsolute(e)||Qt.extname(e)!==".jsonl")return;let t;try{t=R.openSync(e,R.constants.O_RDONLY|R.constants.O_NONBLOCK|(R.constants.O_NOFOLLOW??0));let n=R.fstatSync(t);if(!n.isFile()||!Number.isSafeInteger(n.size)||n.size<=0)return;let r=Buffer.alloc(Math.min(n.size,Dr));if(R.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),i;if(o>=0)try{i=U(JSON.parse(r.toString("utf8",0,o)))}catch{}let s=Math.max(0,n.size-xr),a=n.size<=r.length?r:Buffer.alloc(n.size-s);if(a!==r&&R.readSync(t,a,0,a.length,s)!==a.length)return;let u=R.fstatSync(t);if(u.size<n.size||u.size===n.size&&u.mtimeMs!==n.mtimeMs)return;let l=s>0?a.indexOf(10)+1:0,d=a.lastIndexOf(10);if(s>0&&l===0||d<l)return;let f=[],p=0;for(;d>l&&p<Nr;){let A=a.lastIndexOf(10,d-1),W=Math.max(l,A+1),Fe=a.toString("utf8",W,d).trim();if(Fe){let $e=U(JSON.parse(Fe));$e&&f.push($e)}d=W-1,p++}return f.reverse(),{first:i,rows:f,complete:s===0&&d<0&&a[a.length-1]===10}}catch{return}finally{if(t!==void 0)try{R.closeSync(t)}catch{}}}function rn(e){let t=e[0];return t&&e.every(n=>n?.name===t.name)?t:void 0}var jr=new Set(["PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest","PermissionDenied"]);function Ir(e,t){let n=B.dirname(e);if(B.basename(n)!=="subagents"||B.basename(B.dirname(n))!==t)return;let r=/^agent-(.+)\.jsonl$/.exec(B.basename(e));return z(r?.[1])}function on(e,t){let n=Ue(e.model);if(n)return{name:n,source:"hook.model"};try{return Cr(e,t)}catch{return}}function Cr(e,t){if(!jr.has(e.hook_event_name))return;let n=z(e.session_id),r=z(e.tool_use_id),o=tn(e,t);if(!n||!r||o===void 0||typeof e.transcript_path!="string")return;let i=Ir(e.transcript_path,n),s=e.agent_id===void 0?i:z(e.agent_id);if(e.agent_id!==void 0&&!s||i!==void 0&&i!==s||!s&&e.agent_type!==void 0||B.basename(B.dirname(e.transcript_path))==="subagents"&&!i)return;let a=nn(e.transcript_path);if(!a)return;let u=[];for(let l of a.rows){let d=fe(l.timestamp);if(l.type!=="assistant"||l.sessionId!==n||d===void 0||d>o)continue;let f=l.agentId===void 0?void 0:z(l.agentId);if(f!==s||l.agentId!==void 0&&!f||l.isSidechain===!0&&!s)continue;let p=U(l.message);if(!p||p.role!==void 0&&p.role!=="assistant"||!Array.isArray(p.content)||!p.content.some(W=>U(W)?.type==="tool_use"&&U(W)?.id===r))continue;let A=Ue(p.model);u.push(A?{name:A,source:"transcript.assistant.message"}:void 0)}return rn(u)}var Y=k(b()),de;function Ur(){if(de===void 0)try{de=Be.userInfo().username}catch{de=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return de}var sn="1.10.3-skax.0",Br=new Set(["cc.hook","cc.tool_name","cc.tool_use_id","cc.session_id","cc.transcript_path","cc.cwd","cc.permission_mode"]),Lr=new Set(["cc.tool_input","cc.tool_response","cc.tool_calls"]),Fr={skipRedactKeys:Br,bashContextKeys:Lr,outputForKey:(e,t)=>{if(e==="cc.error"||e==="cc.error_message")return t;if(e==="cc.tool_calls"&&Array.isArray(t))return t.map(n=>n&&typeof n=="object"&&"tool_response"in n?n.tool_response:void 0);if(!(e!=="cc.tool_response"&&e!=="cc.tool_result"))return t&&typeof t=="object"&&"file"in t&&t.file&&typeof t.file=="object"&&"content"in t.file&&t.file.content!==void 0?t.file.content:t}};function $r(e,t){let n=[];n.push({key:"ingest.type",value:{stringValue:"cc"}}),n.push({key:"cc.hook",value:{stringValue:e.hook_event_name}});let r={};for(let[o,i]of Object.entries(e))o!=="hook_event_name"&&(r[o]=i);return en(r,on(e,t)),n.push(...(0,Y.attrsFromRecord)(r,"cc",Fr)),n}function qr(e){return[{key:"service.name",value:{stringValue:"claude-code"}},{key:"service.version",value:{stringValue:Zt(e)}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-cc"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:sn}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Ur()}},{key:"host.name",value:{stringValue:Be.hostname()}},{key:"host.arch",value:{stringValue:Be.arch()}}]}function an(e){let t=e.now??Date.now();return(0,Y.buildPayload)({traceId:e.traceId,spanName:`cc.${(0,Y.snakeCase)(e.event.hook_event_name)}`,attributes:$r(e.event,t),resource:qr(e.versionCacheDir),scope:{name:"pinta-cc",version:sn},now:t})}function L(e,t,n={}){let r=new ue(t),o=n.traceMode==="new"?r.newTrace():r.currentTrace();return an({event:e,traceId:o,versionCacheDir:t.pluginData})}async function F(e,t){if(!ae())return;let n=new ce(t);await n.flush(),await n.send(e)}function X(e,t){if(!ae())return;let n=Buffer.byteLength(JSON.stringify(e),"utf-8");if(n>ee.MAX_POST_BYTES){process.stderr.write(`[pinta-cc] dropping oversized span payload (${n} > ${ee.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
26
+ `);return}new ee.DiskRetryQueue(t.pluginData,"pinta-cc").enqueue(e)}async function S(e,t,n={}){ae()&&await F(L(e,t,n),t)}async function un(e,t){let n=L(e,t),r=await V(n,process.env.PINTA_GUARD_ENDPOINT);if(r?.decision==="DENY"){let i={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:r.userMessage??r.reason??"guard_deny"}};process.stdout.write(JSON.stringify(i)+`
27
+ `)}try{if((0,cn.attachGuard)(n,r),r?.decision==="DENY")return X(n,t),0;await F(n,t)}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
28
+ `)}return 0}var ln=k(b());async function fn(e,t){if(e.hook_event_name==="PostToolUseFailure")return await S(e,t),0;let n=L(e,t),r=await V(n,process.env.PINTA_GUARD_ENDPOINT);r?.decision==="DENY"&&process.stdout.write(JSON.stringify({continue:!1,stopReason:"Pinta blocked this tool output. Start a new session before continuing."})+`
29
+ `);try{if((0,ln.attachGuard)(n,r),r&&n.resourceSpans[0].scopeSpans[0].spans[0].attributes.push({key:"pinta.guard.target",value:{stringValue:"tool_output"}}),r?.decision==="DENY")return X(n,t),0;await F(n,t)}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
30
+ `)}return 0}async function dn(e,t){return await S(e,t,{traceMode:"new"}),0}async function pn(e,t){return await S(e,t),0}async function mn(e,t){return await S(e,t),0}async function hn(e,t){return await S(e,t),0}var gn=k(b());async function _n(e,t){if(e.hook_event_name==="PermissionDenied")return await S(e,t),0;let n=L(e,t),r=await V(n,process.env.PINTA_GUARD_ENDPOINT);r?.decision==="DENY"&&process.stdout.write(JSON.stringify({hookSpecificOutput:{hookEventName:"PermissionRequest",decision:{behavior:"deny",message:r.userMessage??r.reason??"guard_deny"}}})+`
31
+ `);try{if((0,gn.attachGuard)(n,r),r?.decision==="DENY")return X(n,t),0;await F(n,t)}catch(o){process.stderr.write(`[pinta-cc] telemetry emit failed: ${o}
32
+ `)}return 0}async function Le(e){return 0}async function Vr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function yn(){xt();let e=0;try{let t=It(),n=await Vr(),r=JSON.parse(n);Gt(r)?e=await Le(r):Ct(r)?e=await un(r,t):Ut(r)||Bt(r)?e=await fn(r,t):Lt(r)?e=await dn(r,t):Ft(r)?e=await pn(r,t):$t(r)?e=await mn(r,t):qt(r)?e=await hn(r,t):Vt(r)?e=await _n(r,t):e=await Le(r)}catch(t){process.stderr.write(`[pinta-cc] error: ${t}
33
+ `),e=0}return e}import{opendir as Gr,stat as zr}from"node:fs/promises";import{homedir as Yr}from"node:os";import te from"node:path";var Xr="pinta-cc",vn="memory";function Wr(){let e=process.env.CLAUDE_CONFIG_DIR;return e&&e.length>0?e:te.join(Yr(),".claude")}function Kr(){return te.join(Wr(),"projects")}function Jr(e,t){return te.relative(e,t).split(te.sep).join("/")}function Hr(e){return e.endsWith(".jsonl")?"append-log":"rewritten-doc"}function Zr(e){let t=e.split("/");if(t.length<2)return{};let n=t[0],r=t[1];return t.length===2?r.endsWith(".jsonl")?{projectKey:n,sessionId:r.slice(0,-6)}:{projectKey:n}:r===vn?{projectKey:n}:{projectKey:n,sessionId:r}}function Qr(e){return e.endsWith(".jsonl")?"session-log":e.split("/")[1]===vn?"memory":e.endsWith(".json")?"meta":"other"}async function En(){return[Kr()]}async function*Pn(e,t){let n;try{n=await Gr(t)}catch{return}try{for await(let r of n){let o=te.join(t,r.name);r.isDirectory()?yield*Pn(e,o):r.isFile()&&(yield{absPath:o,relPath:Jr(e,o)})}}catch{return}}async function*eo(e){let[t]=await En(),n=e.since?.getTime();for await(let{absPath:r,relPath:o}of Pn(t,t)){let i;try{i=await zr(r)}catch{continue}if(n!==void 0&&i.mtime.getTime()<=n)continue;let{projectKey:s,sessionId:a}=Zr(o);yield{relPath:o,absPath:r,size:i.size,mtime:i.mtime,sessionId:a,projectKey:s,semantics:Hr(o)}}}var to={id:Xr,roots:En,scan:eo,classify:Qr};Dt();function oo(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===ro(no(e)).href}catch{return!1}}async function so(){let e=await yn();process.exit(e)}oo()&&so();export{to as lifecycle};
package/hooks/hooks.json CHANGED
@@ -2,6 +2,7 @@
2
2
  "hooks": {
3
3
  "PreToolUse": [{ "hooks": [{ "type": "command", "command": "node ${CLAUDE_PLUGIN_ROOT}/dist/index.js" }] }],
4
4
  "PostToolUse": [{ "hooks": [{ "type": "command", "command": "node ${CLAUDE_PLUGIN_ROOT}/dist/index.js" }] }],
5
+ "PostToolBatch": [{ "hooks": [{ "type": "command", "command": "node ${CLAUDE_PLUGIN_ROOT}/dist/index.js" }] }],
5
6
  "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "node ${CLAUDE_PLUGIN_ROOT}/dist/index.js" }] }],
6
7
  "SessionStart": [{ "hooks": [{ "type": "command", "command": "node ${CLAUDE_PLUGIN_ROOT}/dist/index.js" }] }],
7
8
  "SessionEnd": [{ "hooks": [{ "type": "command", "command": "node ${CLAUDE_PLUGIN_ROOT}/dist/index.js" }] }],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinta-ai/pinta-cc",
3
- "version": "1.10.1",
3
+ "version": "1.10.3-skax.0",
4
4
  "description": "Generic OTLP forwarder for Claude Code hook events",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
@@ -43,7 +43,7 @@
43
43
  "prepublishOnly": "npm run build"
44
44
  },
45
45
  "devDependencies": {
46
- "@pinta-ai/core": "^0.9.0",
46
+ "@pinta-ai/core": "0.9.3-skax.0",
47
47
  "@types/node": "^22.0.0",
48
48
  "esbuild": "^0.24.0",
49
49
  "tsx": "^4.0.0",