@pinta-ai/pinta-copilot 0.10.0 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,8 +2,66 @@
2
2
 
3
3
  All notable changes to pinta-copilot are documented here.
4
4
 
5
- ## [Unreleased]
5
+ ## [0.10.2] - 2026-09-30
6
6
 
7
+ ### Fixed
8
+
9
+ - Bundle `@pinta-ai/core` `^0.9.2`, which limits attached short-password
10
+ masking to mysql-family executables instead of ordinary `find -path` and
11
+ `find -print` arguments (PTA-515). Guard/export ordering is unchanged.
12
+ - Emit top-level `permissionDecision` for native camelCase `preToolUse`.
13
+ Copilot CLI 1.0.88 ignores the previous nested PascalCase envelope and
14
+ executes the tool despite a guard DENY. Keep the nested `PreToolUse`
15
+ contract and choose only from the explicit event/binding (PTA-591).
16
+ - Preserve the internal `ask_user` exemption for the documented PascalCase
17
+ `AskUserQuestion` alias without exempting arbitrary case variants or MCP
18
+ tool names (PTA-593).
19
+ - Add red-before-green hook and CJS/ESM subprocess regressions for both gaps.
20
+
21
+ ### Compatibility
22
+
23
+ - Native failed-result protection remains unsupported: Copilot 1.0.88 ignores
24
+ attempted stop/replacement output from `PostToolUseFailure`. Document this
25
+ separately from ordinary nonzero shell exits, which use successful
26
+ `PostToolUse` and its existing replacement gate (PTA-592).
27
+ - Existing REVIEW/disabled/fail-open behavior, successful-output replacement,
28
+ original-span queueing and no-collector-IO-after-DENY guarantees remain.
29
+
30
+ ## [0.10.1] - 2026-09-29
31
+
32
+ ### Fixed
33
+
34
+ - Evaluate successful `PostToolUse` results with the same guard and original
35
+ redaction-aware OTLP payload used for telemetry.
36
+ - Withhold denied CLI/SDK/cloud results using the supported `modifiedResult`
37
+ contract; stop VS Code Local runs using `continue: false`. Native result
38
+ shape takes precedence over environment-only surface detection.
39
+ - Use fixed English messages, never untrusted result text or guard reasons.
40
+ - Finish every decided DENY without network telemetry. Persist the original
41
+ redacted span in the existing retry queue for the next eligible hook, so a
42
+ delayed collector cannot cause the host to time out and discard the denial.
43
+ This also protects existing before-tool and permission denials. Telemetry
44
+ disabled/guard-only mode does not retain a queued span.
45
+ - Preserve original evidence and span identity, adding
46
+ `pinta.guard.target = "tool_output"` rather than claiming that an already
47
+ executed tool was prevented. Apply the existing payload redaction context
48
+ equally to native `toolArgs`/`toolResult` casing.
49
+ - Add CJS/ESM native-stdin regressions and ordering/error-path coverage.
50
+
51
+ ### Compatibility
52
+
53
+ - Requires the host's synchronous successful-output hook contract; completion
54
+ before host timeout is still necessary. Before-tool/permission gating,
55
+ internal tools, failed-tool telemetry, ALLOW/REVIEW and guard fail-open
56
+ behavior remain unchanged. No policy thresholds change.
57
+ - A Local stop does not clear its transcript or make resume safe; start a new
58
+ session. No persistent session quarantine or automatic context clearing is
59
+ introduced.
60
+ - Denied-span backend visibility is deferred until a later telemetry hook;
61
+ after a stopped run this may be a new session.
62
+ - Roll out the corresponding guard-runtime projection update to Manager and
63
+ backend first, so native result casing and output-versus-execution outcomes
64
+ are interpreted correctly.
7
65
  ## [0.10.0] - 2026-09-30
8
66
 
9
67
  ### Changed
package/README.md CHANGED
@@ -1,15 +1,17 @@
1
1
  # pinta-copilot — OTLP forwarder + guard for GitHub Copilot hooks
2
2
 
3
- Converts **GitHub Copilot** hook events into OTLP/HTTP spans and forwards them to any OpenTelemetry-compatible collector, with an optional external **guard** that can allow/deny tool calls. Vendor-neutral. No Pinta CLI dependency. Identity is attached at the relay layer.
3
+ Converts **GitHub Copilot** hook events into OTLP/HTTP spans and forwards them to any OpenTelemetry-compatible collector, with an optional external **guard** for tool calls and their returned contents. Vendor-neutral. No Pinta CLI dependency. Identity is attached at the relay layer.
4
4
 
5
5
  A **single adapter + a single hook file** covers two surfaces:
6
6
 
7
7
  | Surface | Hook source | Guard | Notes |
8
8
  |---|---|---|---|
9
- | **Copilot CLI** | `~/.copilot/hooks/pinta-copilot.json` | `preToolUse` **+** `permissionRequest` | `preToolUse` is **fail-closed** |
10
- | **VS Code extension** (in-editor Copilot Chat) | same `~/.copilot/hooks/` file | `preToolUse` | `preToolUse` is fail-open |
9
+ | **Copilot CLI / SDK** | `~/.copilot/hooks/pinta-copilot.json` | `preToolUse`, `permissionRequest`, `postToolUse` | Denied successful output is replaced before the model receives it |
10
+ | **VS Code Local harness** (in-editor Copilot Chat) | same `~/.copilot/hooks/` file | `PreToolUse`, `PostToolUse` | Denied successful output stops the current run |
11
11
 
12
- > Cloud agent (`.github/hooks/`) is out of scope for now.
12
+ > Automatic cloud hook installation (`.github/hooks/`) remains out of scope.
13
+ > When registered there, the output response uses the Copilot CLI/SDK contract.
14
+ > VS Code Agent Host Copilot also uses that contract, not the Local harness one.
13
15
 
14
16
  ## Why it works with no VS Code setup
15
17
 
@@ -17,7 +19,7 @@ The VS Code Copilot extension reads the **same** `~/.copilot/hooks/` file the CL
17
19
 
18
20
  ## ⚠️ Fail-closed safety
19
21
 
20
- Copilot's **CLI `preToolUse` hook is fail-closed**: a non-zero exit, crash, or timeout *denies* the tool — and a crashing hook blocks `report_intent`/`ask_user` too, bricking the whole agent turn. This adapter therefore **always exits 0** on every path; transport and guard failures are absorbed (telemetry fail-open). Do not patch in code paths that can throw past the top-level handler.
22
+ Copilot's **CLI `preToolUse` command errors are fail-closed**: a non-zero exit or crash can deny the tool and disrupt internal control tools. Timeouts are a separate host boundary and can fail open. This adapter therefore **always exits 0** on every path; transport and guard failures are reported on stderr rather than thrown past the top-level handler. Guard timeout/error behavior remains fail-open.
21
23
 
22
24
  ## Install
23
25
 
@@ -48,18 +50,94 @@ PINTA_GUARD_ENDPOINT=https://your-relay.example.com/guard
48
50
  |---|---|
49
51
  | `COPILOT_PLUGIN_OPTION_ENDPOINT` | Full OTLP/HTTP traces URL. **Namespaced to avoid colliding with Copilot's native OTel** (`OTEL_EXPORTER_OTLP_*`). The standard `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` / `OTEL_EXPORTER_OTLP_ENDPOINT` are honored as a lower-priority fallback. |
50
52
  | `COPILOT_PLUGIN_OPTION_HEADERS` | `key=val,key=val` request headers (auth). Falls back to `OTEL_EXPORTER_OTLP_HEADERS`. |
51
- | `PINTA_GUARD_ENDPOINT` | Optional. POST'd on `preToolUse`/`permissionRequest`; a `DENY` response blocks the tool. |
53
+ | `PINTA_GUARD_ENDPOINT` | Optional. POST'd before tool execution and on successful `postToolUse`. `DENY` gates the call or its returned output, respectively. |
52
54
  | `COPILOT_HOME` | Overrides `~/.copilot` for hook + env-file paths. |
53
55
 
54
56
  ## Guard (allow / deny + reason)
55
57
 
56
- On `preToolUse` (all surfaces) and `permissionRequest` (CLI only) the adapter queries `PINTA_GUARD_ENDPOINT`. A `DENY` is emitted in the surface-appropriate format and the reason is shown to the model/user:
58
+ On `preToolUse` (all surfaces) and `permissionRequest` (CLI only) the adapter queries `PINTA_GUARD_ENDPOINT`. A `DENY` is emitted in the registration's protocol format and the reason is shown to the model/user:
57
59
 
58
- - `preToolUse` → `{ "hookSpecificOutput": { "hookEventName": "PreToolUse", "permissionDecision": "deny", "permissionDecisionReason": "<reason>" } }`
60
+ - Native camelCase `preToolUse` → `{ "permissionDecision": "deny", "permissionDecisionReason": "<reason>" }`
61
+ - PascalCase `PreToolUse` → `{ "hookSpecificOutput": { "hookEventName": "PreToolUse", "permissionDecision": "deny", "permissionDecisionReason": "<reason>" } }`
59
62
  - `permissionRequest` → `{ "behavior": "deny", "message": "<reason>" }`
60
63
 
64
+ Copilot CLI 1.0.88 ignores the nested PascalCase denial on a native camelCase
65
+ hook. The adapter selects the response from the explicit event discriminator
66
+ or trusted per-hook `PINTA_COPILOT_EVENT` binding, not from tool-input contents.
67
+ Preserve the registered spelling in that binding.
68
+
61
69
  Guard is **fail-open** (no endpoint / timeout / error → allow), so it never breaks a session.
62
70
 
71
+ Once a `DENY` is decided, the hook does **not** wait for collector IO. It emits
72
+ the enforcement response, appends the original redacted span to the existing
73
+ local retry queue, and finishes. This applies to before-tool, permission, and
74
+ after-tool denials: otherwise a collector delay can cause the host to time out
75
+ and discard even an already-written denial. The next eligible telemetry hook
76
+ flushes the queued span with its original IDs and evidence. Backend visibility
77
+ can therefore be delayed until that hook; a stopped run may need a new session
78
+ to trigger delivery. No span is queued when telemetry is disabled. Local
79
+ persistence failures are reported without discarding the enforcement response.
80
+
81
+ ### Successful tool-output enforcement
82
+
83
+ Before-tool hooks cannot inspect contents that the tool has not returned yet.
84
+ `PostToolUse` now sends the original redaction-aware OTLP payload to the same
85
+ guard. On `DENY`, the adapter emits the host's supported response and defers
86
+ network telemetry as described above:
87
+
88
+ - **Copilot CLI/SDK/cloud:** `modifiedResult` with `resultType: "success"` and
89
+ a fixed, safe `textResultForLlm` replaces the denied result.
90
+ - **VS Code Local:** `continue: false` with a fixed `stopReason` stops the run.
91
+
92
+ The native `tool_result`/`toolResult` shape takes precedence over inherited
93
+ editor environment variables; Copilot SDK sessions inside VS Code must not
94
+ receive a Local-only stop response. Local `tool_response` uses the stop
95
+ contract. Both snake_case and camelCase input forms are supported; response
96
+ keys use the documented casing.
97
+
98
+ Keep the generated hook registration's per-command
99
+ `env: { "PINTA_COPILOT_EVENT": "PostToolUse" }` binding. Some native Copilot
100
+ payloads omit every event-name field. The installer and Manager bind each
101
+ registered event explicitly; custom registrations must do the same, using the
102
+ matching name for each hook, **not one global value for all events**. Without
103
+ either a discriminator or that binding, the event remains unknown and cannot
104
+ be guarded. Tool-result contents are not used to guess the firing event.
105
+
106
+ No untrusted output or guard-supplied reason is echoed into either response.
107
+ The original masked/truncated input and output remain on the same telemetry
108
+ span and `spanId`, together with the verdict and
109
+ `pinta.guard.target = "tool_output"`. The tool **already ran**: withholding a
110
+ result or stopping a run does not undo its effects. For the Local stop path,
111
+ the result may remain in the transcript; start a new session, not a resumed
112
+ tainted conversation.
113
+
114
+ `ALLOW`, `REVIEW`, inactive guarding and existing fail-open behavior are
115
+ unchanged. Internal control tools `report_intent`, `ask_user` and its documented
116
+ PascalCase alias `AskUserQuestion` remain telemetry-only. Arbitrary case variants
117
+ or similarly named MCP tools are not exempt.
118
+
119
+ **Native failed-result enforcement is unsupported.** `PostToolUseFailure`
120
+ remains telemetry-only, not a protected phase. In native Copilot CLI 1.0.88,
121
+ the failure hook fires for a failed `view`, but both `continue: false` and
122
+ `modifiedResult` are ignored and the original error reaches the next model
123
+ request. The hook's `error` may also be less complete than the model-facing
124
+ result. A future supported host failure-result/batch contract is required;
125
+ printing a denial alone would falsely claim protection.
126
+
127
+ Ordinary shell exit status 1 is a different case: Copilot delivers that
128
+ result through successful `PostToolUse`, so it is eligible for the existing
129
+ successful-result gate. Native hook phase, not a guessed exit-code pattern,
130
+ determines which contract applies.
131
+
132
+ Enforcement requires synchronous hooks, a host honoring the documented
133
+ [Copilot result-replacement](https://docs.github.com/en/copilot/reference/hooks-reference#posttooluse-output)
134
+ or [VS Code Local stop](https://code.visualstudio.com/docs/agents/reference/hooks-reference)
135
+ contract, and completion within the host timeout. Added context, a
136
+ PreToolUse-shaped denial, or exit code 2 alone is not output withholding.
137
+ Deploy the corresponding guard-runtime projection update to Manager and
138
+ backend before rolling out these adapters: older readers can miss native
139
+ camelCase result fields or confuse output denial with a prevented tool call.
140
+
63
141
  ## Span conventions
64
142
 
65
143
  | Attribute | Value |
@@ -70,6 +148,7 @@ Guard is **fail-open** (no endpoint / timeout / error → allow), so it never br
70
148
  | `copilot.model` | Exact host-reported model ID, when attributable; never a placeholder |
71
149
  | `copilot.model_source` | Evidence for the model value (see below) |
72
150
  | `copilot.<key>` | Every other top-level field (Bronze flattening, raw key preserved) |
151
+ | `pinta.guard.target` | `tool_output` for a non-null successful after-tool verdict; absent on before-tool gates |
73
152
  | `service.name` | `"copilot"` · `telemetry.sdk.name` `"pinta-copilot"` |
74
153
 
75
154
  ### CLI ↔ ext payload differences (absorbed by the adapter)
@@ -161,6 +240,11 @@ npm run smoke:model # built CJS/ESM hooks -> isolated loopback collector
161
240
  npm run mock-server # local OTLP collector
162
241
  ```
163
242
 
243
+ The integration suite exercises both built CJS/ESM entrypoints against a
244
+ loopback guard and collector: native/legacy result casing, CLI/cloud/Local
245
+ contracts, retained original evidence, nonblocking verdicts and transport
246
+ failures. Hook unit tests also pin denial-before-telemetry ordering.
247
+
164
248
  `smoke:model` runs fresh hook processes with isolated HOME/plugin data and no
165
249
  manager/guard calls. It covers supplied, missing, placeholder, correlated,
166
250
  cross-session/subagent, future, partial and oversized transcript cases. Local
package/dist/index.js CHANGED
@@ -1,21 +1,26 @@
1
- "use strict";var qt=Object.create;var Me=Object.defineProperty;var Bt=Object.getOwnPropertyDescriptor;var Gt=Object.getOwnPropertyNames;var Ft=Object.getPrototypeOf,$t=Object.prototype.hasOwnProperty;var E=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Yt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Gt(t))!$t.call(e,o)&&o!==n&&Me(e,o,{get:()=>t[o],enumerable:!(r=Bt(t,o))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?qt(Ft(e)):{},Yt(t||!e||!e.__esModule?Me(n,"default",{value:e,enumerable:!0}):n,e));var ue=E(h=>{"use strict";Object.defineProperty(h,"__esModule",{value:!0});h.PATTERNS=h.MAX_BYTES=void 0;h.truncateTo=Ie;h.truncate=zt;h.collectMatches=De;h.resolveOverlaps=xe;h.applyMatches=Ne;h.redact=Xt;h.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 zt(e){return Ie(e,h.MAX_BYTES)}h.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function De(e,t){let n=[];for(let r of h.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 u=r.captureGroup??0,a=i[u];if(a===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}let c=i.index,l=i.index+i[0].length,f=c+i[0].indexOf(a),m=f+a.length;n.push({start:c,end:l,replaceStart:f,replaceEnd:m,type:r.type}),i.index===o.lastIndex&&o.lastIndex++}}return n}function xe(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 Ne(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 Xt(e,t={}){if(e.length===0)return e;let n=De(e,t);if(n.length===0)return e;let r=xe(n);return Ne(e,r)}});var le=E(_=>{"use strict";var Kt=_&&_.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(_,"__esModule",{value:!0});_.MAX_SPAN_BYTES=void 0;_.ulidToTraceId=Le;_.newSpanId=Ve;_.snakeCase=Jt;_.toOtlpValue=qe;_.attrsFromRecord=Wt;_.guardAttrs=Be;_.clientAttrs=Ge;_.enforceSpanBudget=Fe;_.buildPayload=Qt;_.attachGuard=$e;_.mergeBatch=en;var Ht=Kt(require("crypto")),ce=ue(),Zt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Le(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=Zt.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 Ht.default.randomBytes(8).toString("hex")}function Jt(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var je=new Set;function X(e,t,n){let r=(0,ce.truncate)(t);if((n.skipRedactKeys??je).has(e))return r;let o=(n.bashContextKeys??je).has(e)?"bash":void 0;return(0,ce.redact)(r,{context:o})}function qe(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:X(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:X(e,JSON.stringify(t),n)}}catch{return{stringValue:X(e,String(t),n)}}default:return{stringValue:X(e,String(t),n)}}}function Wt(e,t,n={}){let r=[];for(let[o,i]of Object.entries(e)){let u=`${t}.${o}`,a=qe(u,i,n);a!==null&&r.push({key:u,value:a})}return r}function Be(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 Ge(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}}]}_.MAX_SPAN_BYTES=800*1024;function Ce(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Ue=1024;function Fe(e,t=_.MAX_SPAN_BYTES){let n=Ce(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<=Ue)break;let u=n-t,a=Math.max(Ue,i-u-64);o.stringValue=(0,ce.truncateTo)(o.stringValue,a),n=Ce(e)}return e}function Qt(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes],o={traceId:Le(e.traceId),spanId:Ve(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};Fe(o);let i={resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[o]}]}]};return $e(i,e.guard,e.clientTiming)}function $e(e,t,n){let r=e.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return e;t&&r.attributes.push(...Be(t));let o=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return o&&r.attributes.push(...Ge(o)),e}function en(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var Ye=E(A=>{"use strict";Object.defineProperty(A,"__esModule",{value:!0});A.GUARD_STATUS_REFUSED=A.GUARD_BUDGET_HEADER=void 0;A.evaluateGuard=on;var tn=1e4,nn="pinta-core";A.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function K(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var rn=new Set(["ALLOW","DENY","REVIEW"]);A.GUARD_STATUS_REFUSED=410;async function on(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??tn,o=Date.now(),i=new AbortController,u=setTimeout(()=>i.abort(),r);try{let a=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??nn,"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(a.status===A.GUARD_STATUS_REFUSED)return K(Date.now()-o,"refused");if(a.status!==200)return K(Date.now()-o,"error");let c=await a.json(),l=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!rn.has(c.decision)||!l)return K(Date.now()-o,"error");let f=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??f,clientRttMs:f}}catch(a){let c=a.name,l=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return K(Date.now()-o,l)}finally{clearTimeout(u)}}});var H=E(G=>{"use strict";var sn=G&&G.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(G,"__esModule",{value:!0});G.atomicWriteFileSync=an;var ze=sn(require("fs"));function an(e,t){let n=`${e}.${process.pid}.tmp`;ze.default.writeFileSync(n,t),ze.default.renameSync(n,e)}});var pe=E(k=>{"use strict";var Xe=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.MemoryRetryQueue=k.DiskRetryQueue=void 0;var S=Xe(require("fs")),Z=Xe(require("path")),un=H(),J=1e3,cn=50,ln=5,de=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=Z.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{S.default.mkdirSync(Z.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
2
- `;S.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
3
- `)}}readAll(){try{let t=S.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){S.default.existsSync(this.filePath)&&S.default.unlinkSync(this.filePath);return}S.default.mkdirSync(Z.default.dirname(this.filePath),{recursive:!0}),(0,un.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
1
+ "use strict";var Zt=Object.create;var xe=Object.defineProperty;var Jt=Object.getOwnPropertyDescriptor;var Wt=Object.getOwnPropertyNames;var Qt=Object.getPrototypeOf,en=Object.prototype.hasOwnProperty;var E=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var tn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Wt(t))!en.call(e,o)&&o!==n&&xe(e,o,{get:()=>t[o],enumerable:!(r=Jt(t,o))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?Zt(Qt(e)):{},tn(t||!e||!e.__esModule?xe(n,"default",{value:e,enumerable:!0}):n,e));var Le=E(de=>{"use strict";Object.defineProperty(de,"__esModule",{value:!0});de.mysqlPasswordRanges=ln;var nn=new Set(["mysql","mysqldump","mysqladmin","mysqlcheck","mysqlimport","mysqlshow","mariadb","mariadb-dump","mariadb-admin","mariadb-check","mariadb-import","mariadb-show"]),rn=new Set(["sh","bash","dash","zsh","ksh"]),on=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"]),J=16;function je(e,t,n=e.value.length){return{value:e.value.slice(t,n),ranges:e.ranges.slice(t,n)}}function F(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 Ue(e){if(e?.literal)return e.value.slice(e.value.lastIndexOf("/")+1).replace(/\.exe$/,"")}function sn(e){let t=0;for(let n=0;n<=J;n++){for(;/^[A-Za-z_][A-Za-z0-9_]*=/.test(e[t]?.value??"");)t++;let r=Ue(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 Ce(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 an(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 c=e.value[s+1];if(c===`
2
+ `){s+=2;continue}if(c&&(!i||/[$`"\\]/.test(c))){F(o,e,s+1,s+2),s+=2;continue}}if(i!=="'"&&e.value.startsWith("$(",s)){let c=Ce(e.value,s+2);e.value[s+2]!=="("&&r<J&&V(je(e,s+2,c),n,r+1),F(o,e,s,Math.min(c+1,e.value.length)),o.literal=!1,s=Math.min(c+1,e.value.length);continue}if(a==="`"&&i!=="'"){let c=s+1;for(;c<e.value.length&&e.value[c]!=="`";)c+=e.value[c]==="\\"?2:1;r<J&&V(je(e,s+1,c),n,r+1),F(o,e,s,Math.min(c+1,e.value.length)),o.literal=!1,s=Math.min(c+1,e.value.length);continue}a==="$"&&i!=="'"&&(o.literal=!1),F(o,e,s,s+1),s++}return o.end=s,o}function un(e,t,n,r){let o=sn(t);if(o===void 0)return;let i=Ue(t[o]);if(rn.has(i)&&r<J){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 c=t[s+1];c&&V(c,n,r+1);return}if(!a.startsWith("-")||a==="--")return;(a==="-o"||a==="-O")&&s++}return}if(nn.has(i))for(let s=o+1;s<t.length;s++){let a=t[s];if(a.value==="--")return;if(on.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 V(e,t,n=0){let r=[],o,i=[],s=0,a=()=>{un(e,r,t,n),r=[],o=void 0};for(;s<e.value.length;){let c=e.value[s];if(c===`
3
+ `){a(),s++;for(let l of i.splice(0))for(;s<e.value.length;){let d=e.value.indexOf(`
4
+ `,s),h=d<0?e.value.length:d,y=e.value.slice(s,h);if(s=d<0?h:h+1,(l.stripTabs?y.replace(/^\t+/,""):y)===l.delimiter)break}}else if(/\s/.test(c))s++;else if(c==="#"){let l=e.value.indexOf(`
5
+ `,s);s=l<0?e.value.length:l}else if(e.value.startsWith("((",s))a(),s=Math.min(Ce(e.value,s+1)+1,e.value.length);else if(/[;|&(){}]/.test(c))a(),s++;else if(c==="<"||c===">")r.at(-1)?.end===s&&/^\d+$/.test(r.at(-1).value)&&r.pop(),o=/^(?:<<<|<<-?|>>|<&|>&|[<>])/.exec(e.value.slice(s))?.[0]??c,s+=o.length;else{let l=an(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 cn(e,t,n){let r={value:"",ranges:[]};for(let o=t+1;o<n-1;o++){if(e.value[o]!=="\\"){F(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 ln(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 V(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 c=o.lastIndex+a[0].length;if(e[c]!=='"')continue;o.lastIndex=c;let l=o.exec(e);l?.index===c&&V(cn(t,c,c+l[0].length),n)}}return n}return V(t,n),n}});var fe=E(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});_.PATTERNS=_.MAX_BYTES=void 0;_.truncateTo=qe;_.truncate=fn;_.collectMatches=Ve;_.resolveOverlaps=Be;_.applyMatches=$e;_.redact=pn;var dn=Le();_.MAX_BYTES=102400;function qe(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 fn(e){return qe(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 Ve(e,t){let n=[];for(let r of _.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;if(r.type==="cli_password_short"){for(let{start:s,end:a}of(0,dn.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}let c=i.index,l=i.index+i[0].length,d=c+i[0].indexOf(a),h=d+a.length;n.push({start:c,end:l,replaceStart:d,replaceEnd:h,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 $e(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 pn(e,t={}){if(e.length===0)return e;let n=Ve(e,t);if(n.length===0)return e;let r=Be(n);return $e(e,r)}});var me=E(m=>{"use strict";var mn=m&&m.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(m,"__esModule",{value:!0});m.MAX_SPAN_BYTES=void 0;m.ulidToTraceId=ze;m.newSpanId=Xe;m.snakeCase=_n;m.toOtlpValue=He;m.attrsFromRecord=yn;m.guardAttrs=Ke;m.clientAttrs=Ze;m.enforceSpanBudget=Je;m.buildPayload=Sn;m.attachGuard=We;m.mergeBatch=Tn;var hn=mn(require("crypto")),pe=fe(),gn="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ze(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=gn.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 Xe(){return hn.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 Ge=new Set;function W(e,t,n){let r=(0,pe.truncate)(t);if((n.skipRedactKeys??Ge).has(e))return r;let o=(n.bashContextKeys??Ge).has(e)?"bash":void 0;return(0,pe.redact)(r,{context:o})}function He(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:W(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:W(e,JSON.stringify(t),n)}}catch{return{stringValue:W(e,String(t),n)}}default:return{stringValue:W(e,String(t),n)}}}function yn(e,t,n={}){let r=[];for(let[o,i]of Object.entries(e)){let s=`${t}.${o}`,a=He(s,i,n);a!==null&&r.push({key:s,value:a})}return r}function Ke(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function 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}}]}m.MAX_SPAN_BYTES=800*1024;function Fe(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Ye=1024;function Je(e,t=m.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<=Ye)break;let s=n-t,a=Math.max(Ye,i-s-64);o.stringValue=(0,pe.truncateTo)(o.stringValue,a),n=Fe(e)}return e}function Sn(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes],o={traceId:ze(e.traceId),spanId:Xe(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};Je(o);let i={resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[o]}]}]};return We(i,e.guard,e.clientTiming)}function We(e,t,n){let r=e.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return e;t&&r.attributes.push(...Ke(t));let o=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return o&&r.attributes.push(...Ze(o)),e}function Tn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var Qe=E(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.GUARD_STATUS_REFUSED=R.GUARD_BUDGET_HEADER=void 0;R.evaluateGuard=vn;var On=1e4,En="pinta-core";R.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function Q(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Pn=new Set(["ALLOW","DENY","REVIEW"]);R.GUARD_STATUS_REFUSED=410;async function vn(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??On,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??En,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{},...Number.isFinite(r)&&r>0?{[R.GUARD_BUDGET_HEADER]:String(r)}:{}},body:JSON.stringify(e),signal:i.signal});if(a.status===R.GUARD_STATUS_REFUSED)return Q(Date.now()-o,"refused");if(a.status!==200)return Q(Date.now()-o,"error");let c=await a.json(),l=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!Pn.has(c.decision)||!l)return Q(Date.now()-o,"error");let d=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??d,clientRttMs:d}}catch(a){let c=a.name,l=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return Q(Date.now()-o,l)}finally{clearTimeout(s)}}});var ee=E(Y=>{"use strict";var bn=Y&&Y.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Y,"__esModule",{value:!0});Y.atomicWriteFileSync=An;var et=bn(require("fs"));function An(e,t){let n=`${e}.${process.pid}.tmp`;et.default.writeFileSync(n,t),et.default.renameSync(n,e)}});var _e=E(I=>{"use strict";var tt=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.MemoryRetryQueue=I.DiskRetryQueue=void 0;var T=tt(require("fs")),te=tt(require("path")),Rn=ee(),ne=1e3,wn=50,kn=5,he=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=te.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{T.default.mkdirSync(te.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
6
+ `;T.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
7
+ `)}}readAll(){try{let t=T.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){T.default.existsSync(this.filePath)&&T.default.unlinkSync(this.filePath);return}T.default.mkdirSync(te.default.dirname(this.filePath),{recursive:!0}),(0,Rn.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{S.default.mkdirSync(Z.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<cn;)try{let n=S.default.openSync(this.lockPath,"wx");return S.default.writeSync(n,String(process.pid)),S.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=S.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){S.default.unlinkSync(this.lockPath);continue}}catch{}let r=ln,o=Date.now()+r;for(;Date.now()<o;);}return!1}release(){try{S.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=J)return;let n=t.length-J;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
10
- `),this.rewrite(t.slice(n))}};k.DiskRetryQueue=de;var fe=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>J&&this.entries.splice(0,this.entries.length-J)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};k.MemoryRetryQueue=fe});var Qe=E(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.MemoryTransport=p.DiskTransport=p.MAX_POST_BYTES=void 0;p.parseHeadersEnv=Je;p.envOptionsResolver=We;p.postOtlp=F;var Ke=pe(),He=le(),dn=5e3;p.MAX_POST_BYTES=900*1024;function W(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function Ze(e,t,n){let r=[],o=[],i=[],u=0;for(let a of e){let c=t(a);if(c>n){o.push(a);continue}i.length>0&&u+c>n&&(r.push(i),i=[],u=0),i.push(a),u+=c}return i.length>0&&r.push(i),{chunks:r,oversize:o}}function Je(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 We(){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:Je(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function F(e,t,n){let r=new AbortController,o=setTimeout(()=>r.abort(),dn);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 u="";try{u=(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}${u?` body=${u}`:""}
11
+ `)}}tryAcquireLock(){let t=Date.now();try{T.default.mkdirSync(te.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<wn;)try{let n=T.default.openSync(this.lockPath,"wx");return T.default.writeSync(n,String(process.pid)),T.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=T.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){T.default.unlinkSync(this.lockPath);continue}}catch{}let r=kn,o=Date.now()+r;for(;Date.now()<o;);}return!1}release(){try{T.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=ne)return;let n=t.length-ne;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
14
+ `),this.rewrite(t.slice(n))}};I.DiskRetryQueue=he;var ge=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>ne&&this.entries.splice(0,this.entries.length-ne)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};I.MemoryRetryQueue=ge});var at=E(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.MemoryTransport=p.DiskTransport=p.MAX_POST_BYTES=void 0;p.parseHeadersEnv=st;p.envOptionsResolver=it;p.postOtlp=z;var nt=_e(),rt=me(),Mn=5e3;p.MAX_POST_BYTES=900*1024;function re(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function ot(e,t,n){let r=[],o=[],i=[],s=0;for(let a of e){let c=t(a);if(c>n){o.push(a);continue}i.length>0&&s+c>n&&(r.push(i),i=[],s=0),i.push(a),s+=c}return i.length>0&&r.push(i),{chunks:r,oversize:o}}function st(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 it(){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:st(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function z(e,t,n){let r=new AbortController,o=setTimeout(()=>r.abort(),Mn);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 Ke.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??We}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await F(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}=Ze(n,a=>W(a.payload),p.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized retry ${o.length===1?"entry":"entries"} (each > ${p.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
13
- `);let i=[].concat(...r),u=0;for(let a of r){if(!await F((0,He.mergeBatch)(a.map(l=>l.payload)),t,this.logPrefix))break;u+=a.length}this.queue.rewrite(i.slice(u))}catch(n){process.stderr.write(`[${this.logPrefix}] flush failed: ${n?.message??String(n)}
14
- `)}finally{this.queue.release()}}dropIfOversized(t){let n=W(t);return n<=p.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
15
- `),!0)}};p.DiskTransport=_e;var me=class{queue=new Ke.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(W(t)>p.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
16
- `);return}await F(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}=Ze(n,W,p.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized buffered ${o.length===1?"payload":"payloads"} (each > ${p.MAX_POST_BYTES} bytes \u2014 undeliverable)
17
- `);let i=[].concat(...r),u=0;for(let a of r){if(!await F((0,He.mergeBatch)(a),t,this.logPrefix))break;u+=a.length}for(let a of i.slice(u))this.queue.enqueue(a)}};p.MemoryTransport=me});var Se=E(D=>{"use strict";var ye=D&&D.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(D,"__esModule",{value:!0});D.TraceManager=void 0;D.generateUlid=tt;var et=ye(require("fs")),fn=ye(require("path")),pn=ye(require("crypto")),_n=H(),ge="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function tt(){let e=Date.now(),t="",n=e;for(let i=0;i<10;i++)t=ge[n&31]+t,n=Math.floor(n/32);let r=pn.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=ge[r[i]&31];for(;o.length<16;)o+=ge[0];return t+o}var he=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=tt();return this.save(t),t}currentTrace(){try{let t=et.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{et.default.mkdirSync(fn.default.dirname(this.tracePath),{recursive:!0}),(0,_n.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
18
- `)}}};D.TraceManager=he});var it=E(M=>{"use strict";var rt=M&&M.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(M,"__esModule",{value:!0});M.MemorySessionTraceManager=M.DiskSessionTraceManager=void 0;var nt=rt(require("fs")),mn=rt(require("path")),ot=Se(),gn=H(),st=200,Te=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??st}read(){try{let t=JSON.parse(nt.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{nt.default.mkdirSync(mn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,gn.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,ot.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)}};M.DiskSessionTraceManager=Te;var Ee=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??st}newTrace(t){let n=t||"default",r=(0,ot.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)}};M.MemorySessionTraceManager=Ee});var ct=E(x=>{"use strict";var Oe=x&&x.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(x,"__esModule",{value:!0});x.envFilePath=Sn;x.parseEnvFile=ut;x.loadEnvFile=Tn;var hn=Oe(require("node:fs")),yn=Oe(require("node:os")),at=Oe(require("node:path"));function Sn(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:at.default.join(yn.default.homedir(),e);return at.default.join(o,t)}function ut(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(),u=r.slice(o+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),i&&(t[i]=u)}return t}function Tn(e){let t;try{t=hn.default.readFileSync(e,"utf-8")}catch{return}let n=ut(t);for(let[r,o]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=o)}});var N=E(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 I=ue();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return I.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return I.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return I.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return I.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return I.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return I.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return I.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return I.MAX_BYTES}});var T=le();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return T.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return T.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return T.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return T.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return T.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return T.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return T.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return T.buildPayload}});Object.defineProperty(s,"attachGuard",{enumerable:!0,get:function(){return T.attachGuard}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return T.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return T.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return T.MAX_SPAN_BYTES}});var Pe=Ye();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Pe.evaluateGuard}});Object.defineProperty(s,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return Pe.GUARD_STATUS_REFUSED}});Object.defineProperty(s,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return Pe.GUARD_BUDGET_HEADER}});var lt=pe();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return lt.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return lt.MemoryRetryQueue}});var L=Qe();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return L.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return L.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return L.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return L.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return L.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return L.MAX_POST_BYTES}});var dt=Se();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return dt.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return dt.generateUlid}});var ft=it();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return ft.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return ft.MemorySessionTraceManager}});var be=ct();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return be.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return be.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return be.loadEnvFile}})});var $=g(N());function En(){return(0,$.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function pt(e=En()){(0,$.loadEnvFile)(e)}var _t=g(require("os")),Q=g(require("path"));function ve(){return process.env.COPILOT_HOME||Q.default.join(_t.default.homedir(),".copilot")}function mt(){let e=process.env.COPILOT_PLUGIN_DATA||Q.default.join(ve(),"pinta-copilot-data");return{pluginData:e,tracePath:Q.default.join(e,"trace.json")}}function gt(e=process.env){return e.COPILOT_AGENT_JOB_ID||e.COPILOT_AGENT_SESSION_ID||e.COPILOT_AGENT_PROMPT?"cloud":e.ELECTRON_RUN_AS_NODE||e.VSCODE_IPC_HOOK||e.VSCODE_PID?"ext":"cli"}var Ut=g(N());function j(e){return typeof e=="string"?e:void 0}function ee(e){return j(e.hook_event_name)??j(e.hookEventName)??j(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function ht(e){return j(e.session_id)??j(e.sessionId)}function yt(e){return j(e.tool_name)??j(e.toolName)}var On={sessionstart:"SessionStart",sessionend:"SessionEnd",userpromptsubmit:"UserPromptSubmit",userpromptsubmitted:"UserPromptSubmit",pretooluse:"PreToolUse",posttooluse:"PostToolUse",posttoolusefailure:"PostToolUseFailure",stop:"Stop",agentstop:"Stop",subagentstart:"SubagentStart",subagentstop:"SubagentStop",precompact:"PreCompact",notification:"Notification",permissionrequest:"PermissionRequest",erroroccurred:"ErrorOccurred"};function te(e){let t=ee(e);return t?On[t.toLowerCase()]??"Unknown":"Unknown"}function St(e){return e==="PreToolUse"||e==="PermissionRequest"}var Pn=new Set(["report_intent","ask_user"]);function Tt(e){return e!==void 0&&Pn.has(e)}function Et(e,t){return e==="PreToolUse"?JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}}):e==="PermissionRequest"?JSON.stringify({behavior:"deny",message:t}):null}var re=g(N());function bn(){let e=process.env.COPILOT_PLUGIN_OPTION_ENDPOINT||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:(0,re.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var ne=class extends re.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:bn})}};var Ot=g(N()),oe=class extends Ot.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var Dt=g(require("fs")),ae=g(require("os")),ke=g(require("path"));var se="0.10.0";var C=g(N());var Mt=g(require("node:path"));var O=g(require("node:fs")),Ae=g(require("node:path")),vn=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),An=256*1024,Rn=1024*1024,wn=4096;function P(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Y(e){let t=P(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)&&!vn.has(r.toLowerCase())?r:void 0}function Pt(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 Re(e){return typeof e=="string"&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,255}$/.test(e)?e:void 0}function z(e,t){let n=t.filter(r=>e[r]!==void 0).map(r=>Re(e[r]));return n.length>0&&n[0]!==void 0&&n.every(r=>r===n[0])?n[0]:void 0}function V(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 bt(e,t){let n=e.timestamp===void 0?V(t):V(e.timestamp);return n!==void 0&&n<=t?n:void 0}function vt(e){if(typeof e!="string"||e.length>4096||/[\u0000-\u001f]/.test(e)||!Ae.default.isAbsolute(e)||Ae.default.extname(e)!==".jsonl")return;let t;try{t=O.default.openSync(e,O.default.constants.O_RDONLY|O.default.constants.O_NONBLOCK|(O.default.constants.O_NOFOLLOW??0));let n=O.default.fstatSync(t);if(!n.isFile()||!Number.isSafeInteger(n.size)||n.size<=0)return;let r=Buffer.alloc(Math.min(n.size,An));if(O.default.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),i;if(o>=0)try{i=P(JSON.parse(r.toString("utf8",0,o)))}catch{}let u=Math.max(0,n.size-Rn),a=n.size<=r.length?r:Buffer.alloc(n.size-u);if(a!==r&&O.default.readSync(t,a,0,a.length,u)!==a.length)return;let c=O.default.fstatSync(t);if(c.size<n.size||c.size===n.size&&c.mtimeMs!==n.mtimeMs)return;let l=u>0?a.indexOf(10)+1:0,f=a.lastIndexOf(10);if(u>0&&l===0||f<l)return;let m=[],R=0;for(;f>l&&R<wn;){let U=a.lastIndexOf(10,f-1),q=Math.max(l,U+1),d=a.toString("utf8",q,f).trim();if(d){let y=P(JSON.parse(d));y&&m.push(y)}f=q-1,R++}return m.reverse(),{first:i,rows:m,complete:u===0&&f<0&&a[a.length-1]===10}}catch{return}finally{if(t!==void 0)try{O.default.closeSync(t)}catch{}}}function At(e){let t=e[0];return t&&e.every(n=>n?.name===t.name)?t:void 0}var kn=new Set(["PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest"]),Rt=["agent_id","agentId"],wt=["turn_id","turnId"];function Mn(e,t,n){let r=[e.transcript_path,e.transcriptPath].filter(o=>o!==void 0);return r.length?r.every(o=>o===r[0])?r[0]:void 0:n==="cli"&&/^[A-Za-z0-9_-]{1,128}$/.test(t)?Mt.default.join(ve(),"session-state",t,"events.jsonl"):void 0}function kt(e,t){return e.agentId!==void 0&&e.agentId!==null?Re(e.agentId)===t&&t!==void 0:t===void 0&&P(e.data)?.parentToolCallId==null}function It(e,t,n){let r=Y(e.model);if(r)return{name:r,source:"hook.model"};try{return In(e,t,n)}catch{return}}function In(e,t,n){let r=te(e),o=z(e,["tool_use_id","toolUseId","tool_call_id","toolCallId"]),i=r==="SessionStart"&&e.source==="startup";if(!i&&(!kn.has(r)||!o))return;let u=z(e,["session_id","sessionId"]),a=z(e,Rt),c=z(e,wt),l=bt(e,n);if(!u||l===void 0||Rt.some(d=>e[d]!==void 0)&&!a||wt.some(d=>e[d]!==void 0)&&!c||!a&&["agent_name","agentName","agent_type","agentType"].some(d=>e[d]!==void 0))return;let f=vt(Mn(e,u,t)),m=f?.first,R=P(m?.data),U=V(m?.timestamp);if(!f||m?.type!=="session.start"||R?.sessionId!==u||U===void 0||U>l||f.rows.some(d=>d.type==="session.start"&&P(d.data)?.sessionId!==u))return;if(i){if(a||!f.complete||e.timestamp===void 0)return;let d=Y(R.selectedModel),y=U;for(let w of f.rows){if(w.type!=="session.model_change"||!kt(w,void 0))continue;let v=V(w.timestamp);if(v===void 0)return;if(v>l||v<y)continue;let B=Y(P(w.data)?.newModel);if(v===y&&B!==d)return;d=B,y=v}return d?{name:d,source:"transcript.session.selected"}:void 0}let q=[];for(let d of f.rows){let y=P(d.data),w=V(d.timestamp);if(!y||w===void 0||w>l||w<U||!kt(d,a)||c!==void 0&&y.turnId!==c)continue;let v=!1;if(d.type==="assistant.message"?v=Array.isArray(y.toolRequests)&&y.toolRequests.some(Vt=>P(Vt)?.toolCallId===o):(d.type==="tool.execution_start"||d.type==="tool.execution_complete")&&(v=y.toolCallId===o),!v)continue;let B=Y(y.model);q.push(B?{name:B,source:`transcript.${d.type}`}:void 0)}return At(q)}var ie;function Dn(){if(ie===void 0)try{ie=ae.default.userInfo().username}catch{ie=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return ie}var xt=se,xn=new Set(["","unknown","undefined","null","n/a","none"]);function b(e){let t=typeof e=="string"?e.trim():void 0;return t&&!xn.has(t.toLowerCase())?t:void 0}var Nn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function jn(e){let t=b(e);return t&&Nn.test(t)?t:void 0}function Cn(e){let t=e?b(e.copilot_version)??b(e.copilotVersion)??b(e.cli_version)??b(e.cliVersion)??b(e.version):void 0;return t||(we===void 0&&(we=Un()),we??void 0)}var we;function Un(){let e=b(process.env.COPILOT_CLI_BINARY_VERSION)??b(process.env.COPILOT_CLI_VERSION);if(e)return e;let t=b(process.env.COPILOT_CLI_RESOLVED_DIST_DIR);if(t){let n=jn(ke.default.basename(t));if(n)return n;let r=Ln(t);if(r)return r}return null}function Ln(e){try{let t=Dt.default.readFileSync(ke.default.join(e,"package.json"),"utf8");return b(JSON.parse(t).version)}catch{return}}var Vn=new Set(["copilot.hook","copilot.tool_name","copilot.toolName","copilot.tool_use_id","copilot.toolUseId","copilot.session_id","copilot.sessionId","copilot.transcript_path","copilot.transcriptPath","copilot.cwd","copilot.permission_mode","copilot.surface","copilot.agent_id","copilot.agent_type","copilot.agent_name","copilot.agent_display_name","copilot.stop_reason","copilot.notification_type"]),qn=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),Bn={skipRedactKeys:Vn,bashContextKeys:qn},Gn=new Set(["hook_event_name","hookEventName","hookName"]);function Fn(e,t,n){let r=Object.fromEntries(Object.entries(e).filter(([o])=>!Gn.has(o)));return Pt(r,It(e,t,n)),[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:ee(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,C.attrsFromRecord)(r,"copilot",Bn)]}function $n(e){let t=Cn(e);return[{key:"service.name",value:{stringValue:"copilot"}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:xt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Dn()}},{key:"host.name",value:{stringValue:ae.default.hostname()}},{key:"host.arch",value:{stringValue:ae.default.arch()}}]}function Nt(e){let t=e.now??Date.now();return(0,C.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,C.snakeCase)(ee(e.event)??"unknown")}`,attributes:Fn(e.event,e.surface,t),resource:$n(e.event),scope:{name:"pinta-copilot",version:xt},now:t})}var jt=g(N());function Yn(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||100}var zn=`pinta-copilot/${se}`;function Ct(e,t){return(0,jt.evaluateGuard)(e,t,{timeoutMs:Yn(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:zn})}async function Xn(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function Lt(){try{let e=mt(),t=gt(),n=await Xn(),r=JSON.parse(n),o=te(r),i=ht(r),u=new ne(e);await u.flush();let a=new oe(e),c=o==="UserPromptSubmit"?a.newTrace(i):a.currentTrace(i),l=Nt({event:r,traceId:c,surface:t}),f=yt(r),m=null;if(St(o)&&!Tt(f)&&(m=await Ct(l,process.env.PINTA_GUARD_ENDPOINT)),m?.decision==="DENY"){let R=Et(o,m.userMessage??m.reason??"guard_deny");R&&process.stdout.write(R+`
20
- `)}(0,Ut.attachGuard)(l,m),await u.send(l)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
21
- `)}return 0}pt();async function Kn(){let e=await Lt();process.exit(e)}Kn();
16
+ `),!1}finally{clearTimeout(o)}}var ye=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new nt.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??it}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}=ot(n,a=>re(a.payload),p.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized retry ${o.length===1?"entry":"entries"} (each > ${p.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
17
+ `);let i=[].concat(...r),s=0;for(let a of r){if(!await z((0,rt.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=re(t);return n<=p.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
19
+ `),!0)}};p.DiskTransport=ye;var Se=class{queue=new nt.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(re(t)>p.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
20
+ `);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}=ot(n,re,p.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized buffered ${o.length===1?"payload":"payloads"} (each > ${p.MAX_POST_BYTES} bytes \u2014 undeliverable)
21
+ `);let i=[].concat(...r),s=0;for(let a of r){if(!await z((0,rt.mergeBatch)(a),t,this.logPrefix))break;s+=a.length}for(let a of i.slice(s))this.queue.enqueue(a)}};p.MemoryTransport=Se});var Pe=E(j=>{"use strict";var Ee=j&&j.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(j,"__esModule",{value:!0});j.TraceManager=void 0;j.generateUlid=ct;var ut=Ee(require("fs")),In=Ee(require("path")),Dn=Ee(require("crypto")),Nn=ee(),Te="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ct(){let e=Date.now(),t="",n=e;for(let i=0;i<10;i++)t=Te[n&31]+t,n=Math.floor(n/32);let r=Dn.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=Te[r[i]&31];for(;o.length<16;)o+=Te[0];return t+o}var Oe=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=ct();return this.save(t),t}currentTrace(){try{let t=ut.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{ut.default.mkdirSync(In.default.dirname(this.tracePath),{recursive:!0}),(0,Nn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
22
+ `)}}};j.TraceManager=Oe});var mt=E(D=>{"use strict";var dt=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 lt=dt(require("fs")),xn=dt(require("path")),ft=Pe(),jn=ee(),pt=200,ve=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??pt}read(){try{let t=JSON.parse(lt.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{lt.default.mkdirSync(xn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,jn.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,ft.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=ve;var be=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??pt}newTrace(t){let n=t||"default",r=(0,ft.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=be});var _t=E(U=>{"use strict";var Ae=U&&U.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(U,"__esModule",{value:!0});U.envFilePath=Ln;U.parseEnvFile=gt;U.loadEnvFile=qn;var Un=Ae(require("node:fs")),Cn=Ae(require("node:os")),ht=Ae(require("node:path"));function Ln(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:ht.default.join(Cn.default.homedir(),e);return ht.default.join(o,t)}function gt(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 qn(e){let t;try{t=Un.default.readFileSync(e,"utf-8")}catch{return}let n=gt(t);for(let[r,o]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=o)}});var C=E(u=>{"use strict";Object.defineProperty(u,"__esModule",{value:!0});u.loadEnvFile=u.parseEnvFile=u.envFilePath=u.MemorySessionTraceManager=u.DiskSessionTraceManager=u.generateUlid=u.TraceManager=u.MAX_POST_BYTES=u.parseHeadersEnv=u.envOptionsResolver=u.postOtlp=u.MemoryTransport=u.DiskTransport=u.MemoryRetryQueue=u.DiskRetryQueue=u.GUARD_BUDGET_HEADER=u.GUARD_STATUS_REFUSED=u.evaluateGuard=u.MAX_SPAN_BYTES=u.enforceSpanBudget=u.mergeBatch=u.attachGuard=u.buildPayload=u.clientAttrs=u.guardAttrs=u.attrsFromRecord=u.toOtlpValue=u.snakeCase=u.newSpanId=u.ulidToTraceId=u.MAX_BYTES=u.PATTERNS=u.applyMatches=u.resolveOverlaps=u.collectMatches=u.truncateTo=u.truncate=u.redact=void 0;var N=fe();Object.defineProperty(u,"redact",{enumerable:!0,get:function(){return N.redact}});Object.defineProperty(u,"truncate",{enumerable:!0,get:function(){return N.truncate}});Object.defineProperty(u,"truncateTo",{enumerable:!0,get:function(){return N.truncateTo}});Object.defineProperty(u,"collectMatches",{enumerable:!0,get:function(){return N.collectMatches}});Object.defineProperty(u,"resolveOverlaps",{enumerable:!0,get:function(){return N.resolveOverlaps}});Object.defineProperty(u,"applyMatches",{enumerable:!0,get:function(){return N.applyMatches}});Object.defineProperty(u,"PATTERNS",{enumerable:!0,get:function(){return N.PATTERNS}});Object.defineProperty(u,"MAX_BYTES",{enumerable:!0,get:function(){return N.MAX_BYTES}});var O=me();Object.defineProperty(u,"ulidToTraceId",{enumerable:!0,get:function(){return O.ulidToTraceId}});Object.defineProperty(u,"newSpanId",{enumerable:!0,get:function(){return O.newSpanId}});Object.defineProperty(u,"snakeCase",{enumerable:!0,get:function(){return O.snakeCase}});Object.defineProperty(u,"toOtlpValue",{enumerable:!0,get:function(){return O.toOtlpValue}});Object.defineProperty(u,"attrsFromRecord",{enumerable:!0,get:function(){return O.attrsFromRecord}});Object.defineProperty(u,"guardAttrs",{enumerable:!0,get:function(){return O.guardAttrs}});Object.defineProperty(u,"clientAttrs",{enumerable:!0,get:function(){return O.clientAttrs}});Object.defineProperty(u,"buildPayload",{enumerable:!0,get:function(){return O.buildPayload}});Object.defineProperty(u,"attachGuard",{enumerable:!0,get:function(){return O.attachGuard}});Object.defineProperty(u,"mergeBatch",{enumerable:!0,get:function(){return O.mergeBatch}});Object.defineProperty(u,"enforceSpanBudget",{enumerable:!0,get:function(){return O.enforceSpanBudget}});Object.defineProperty(u,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return O.MAX_SPAN_BYTES}});var Re=Qe();Object.defineProperty(u,"evaluateGuard",{enumerable:!0,get:function(){return Re.evaluateGuard}});Object.defineProperty(u,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return Re.GUARD_STATUS_REFUSED}});Object.defineProperty(u,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return Re.GUARD_BUDGET_HEADER}});var yt=_e();Object.defineProperty(u,"DiskRetryQueue",{enumerable:!0,get:function(){return yt.DiskRetryQueue}});Object.defineProperty(u,"MemoryRetryQueue",{enumerable:!0,get:function(){return yt.MemoryRetryQueue}});var B=at();Object.defineProperty(u,"DiskTransport",{enumerable:!0,get:function(){return B.DiskTransport}});Object.defineProperty(u,"MemoryTransport",{enumerable:!0,get:function(){return B.MemoryTransport}});Object.defineProperty(u,"postOtlp",{enumerable:!0,get:function(){return B.postOtlp}});Object.defineProperty(u,"envOptionsResolver",{enumerable:!0,get:function(){return B.envOptionsResolver}});Object.defineProperty(u,"parseHeadersEnv",{enumerable:!0,get:function(){return B.parseHeadersEnv}});Object.defineProperty(u,"MAX_POST_BYTES",{enumerable:!0,get:function(){return B.MAX_POST_BYTES}});var St=Pe();Object.defineProperty(u,"TraceManager",{enumerable:!0,get:function(){return St.TraceManager}});Object.defineProperty(u,"generateUlid",{enumerable:!0,get:function(){return St.generateUlid}});var Tt=mt();Object.defineProperty(u,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Tt.DiskSessionTraceManager}});Object.defineProperty(u,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Tt.MemorySessionTraceManager}});var we=_t();Object.defineProperty(u,"envFilePath",{enumerable:!0,get:function(){return we.envFilePath}});Object.defineProperty(u,"parseEnvFile",{enumerable:!0,get:function(){return we.parseEnvFile}});Object.defineProperty(u,"loadEnvFile",{enumerable:!0,get:function(){return we.loadEnvFile}})});var X=g(C());function Vn(){return(0,X.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function Ot(e=Vn()){(0,X.loadEnvFile)(e)}var Et=g(require("os")),oe=g(require("path"));function ke(){return process.env.COPILOT_HOME||oe.default.join(Et.default.homedir(),".copilot")}function Pt(){let e=process.env.COPILOT_PLUGIN_DATA||oe.default.join(ke(),"pinta-copilot-data");return{pluginData:e,tracePath:oe.default.join(e,"trace.json")}}function vt(e=process.env){return e.COPILOT_AGENT_JOB_ID||e.COPILOT_AGENT_SESSION_ID||e.COPILOT_AGENT_PROMPT?"cloud":e.ELECTRON_RUN_AS_NODE||e.VSCODE_IPC_HOOK||e.VSCODE_PID?"ext":"cli"}var Xt=g(C());function L(e){return typeof e=="string"?e:void 0}function H(e){return L(e.hook_event_name)??L(e.hookEventName)??L(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function bt(e){return L(e.session_id)??L(e.sessionId)}function At(e){return L(e.tool_name)??L(e.toolName)}var Bn={sessionstart:"SessionStart",sessionend:"SessionEnd",userpromptsubmit:"UserPromptSubmit",userpromptsubmitted:"UserPromptSubmit",pretooluse:"PreToolUse",posttooluse:"PostToolUse",posttoolusefailure:"PostToolUseFailure",stop:"Stop",agentstop:"Stop",subagentstart:"SubagentStart",subagentstop:"SubagentStop",precompact:"PreCompact",notification:"Notification",permissionrequest:"PermissionRequest",erroroccurred:"ErrorOccurred"};function se(e){let t=H(e);return t?Bn[t.toLowerCase()]??"Unknown":"Unknown"}function Rt(e){return e==="PreToolUse"||e==="PermissionRequest"||e==="PostToolUse"}var $n=new Set(["report_intent","ask_user","AskUserQuestion"]);function wt(e){return e!==void 0&&$n.has(e)}var Gn="Pinta AI withheld this tool output because it matched a blocking policy. The tool already ran. Do not retry this operation to bypass the block.",Fn="Pinta AI stopped this run because a tool output matched a blocking policy. The tool already ran and its original output may remain in the transcript. Review the incident and start a new session instead of resuming this one.";function kt(e,t,n="cli",r){if(e==="PreToolUse"){let o={permissionDecision:"deny",permissionDecisionReason:t};return r&&H(r)==="preToolUse"?JSON.stringify(o):JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",...o}})}if(e==="PermissionRequest")return JSON.stringify({behavior:"deny",message:t});if(e==="PostToolUse"){let o=r!==void 0&&("tool_result"in r||"toolResult"in r),i=r!==void 0&&"tool_response"in r;return JSON.stringify(!o&&(i||n==="ext")?{continue:!1,stopReason:Fn}:{modifiedResult:{resultType:"success",textResultForLlm:Gn}})}return null}var w=g(C());function Mt(){let e=process.env.COPILOT_PLUGIN_OPTION_ENDPOINT||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:(0,w.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var ie=class extends w.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:Mt})}};function It(e,t){if(!Mt())return;let n=Buffer.byteLength(JSON.stringify(e),"utf-8");if(n>w.MAX_POST_BYTES){process.stderr.write(`[pinta-copilot] dropping oversized span payload (${n} > ${w.MAX_POST_BYTES} bytes) - undeliverable, not queued
24
+ `);return}new w.DiskRetryQueue(t.pluginData,"pinta-copilot").enqueue(e)}var Dt=g(C()),ae=class extends Dt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var $t=g(require("fs")),le=g(require("os")),Ne=g(require("path"));var ue="0.10.2";var q=g(C());var Vt=g(require("node:path"));var P=g(require("node:fs")),Me=g(require("node:path")),Yn=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),zn=256*1024,Xn=1024*1024,Hn=4096;function v(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function K(e){let t=v(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)&&!Yn.has(r.toLowerCase())?r:void 0}function Nt(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 Ie(e){return typeof e=="string"&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,255}$/.test(e)?e:void 0}function Z(e,t){let n=t.filter(r=>e[r]!==void 0).map(r=>Ie(e[r]));return n.length>0&&n[0]!==void 0&&n.every(r=>r===n[0])?n[0]:void 0}function $(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 xt(e,t){let n=e.timestamp===void 0?$(t):$(e.timestamp);return n!==void 0&&n<=t?n:void 0}function jt(e){if(typeof e!="string"||e.length>4096||/[\u0000-\u001f]/.test(e)||!Me.default.isAbsolute(e)||Me.default.extname(e)!==".jsonl")return;let t;try{t=P.default.openSync(e,P.default.constants.O_RDONLY|P.default.constants.O_NONBLOCK|(P.default.constants.O_NOFOLLOW??0));let n=P.default.fstatSync(t);if(!n.isFile()||!Number.isSafeInteger(n.size)||n.size<=0)return;let r=Buffer.alloc(Math.min(n.size,zn));if(P.default.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),i;if(o>=0)try{i=v(JSON.parse(r.toString("utf8",0,o)))}catch{}let s=Math.max(0,n.size-Xn),a=n.size<=r.length?r:Buffer.alloc(n.size-s);if(a!==r&&P.default.readSync(t,a,0,a.length,s)!==a.length)return;let c=P.default.fstatSync(t);if(c.size<n.size||c.size===n.size&&c.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 h=[],y=0;for(;d>l&&y<Hn;){let k=a.lastIndexOf(10,d-1),x=Math.max(l,k+1),f=a.toString("utf8",x,d).trim();if(f){let S=v(JSON.parse(f));S&&h.push(S)}d=x-1,y++}return h.reverse(),{first:i,rows:h,complete:s===0&&d<0&&a[a.length-1]===10}}catch{return}finally{if(t!==void 0)try{P.default.closeSync(t)}catch{}}}function Ut(e){let t=e[0];return t&&e.every(n=>n?.name===t.name)?t:void 0}var Kn=new Set(["PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest"]),Ct=["agent_id","agentId"],Lt=["turn_id","turnId"];function Zn(e,t,n){let r=[e.transcript_path,e.transcriptPath].filter(o=>o!==void 0);return r.length?r.every(o=>o===r[0])?r[0]:void 0:n==="cli"&&/^[A-Za-z0-9_-]{1,128}$/.test(t)?Vt.default.join(ke(),"session-state",t,"events.jsonl"):void 0}function qt(e,t){return e.agentId!==void 0&&e.agentId!==null?Ie(e.agentId)===t&&t!==void 0:t===void 0&&v(e.data)?.parentToolCallId==null}function Bt(e,t,n){let r=K(e.model);if(r)return{name:r,source:"hook.model"};try{return Jn(e,t,n)}catch{return}}function Jn(e,t,n){let r=se(e),o=Z(e,["tool_use_id","toolUseId","tool_call_id","toolCallId"]),i=r==="SessionStart"&&e.source==="startup";if(!i&&(!Kn.has(r)||!o))return;let s=Z(e,["session_id","sessionId"]),a=Z(e,Ct),c=Z(e,Lt),l=xt(e,n);if(!s||l===void 0||Ct.some(f=>e[f]!==void 0)&&!a||Lt.some(f=>e[f]!==void 0)&&!c||!a&&["agent_name","agentName","agent_type","agentType"].some(f=>e[f]!==void 0))return;let d=jt(Zn(e,s,t)),h=d?.first,y=v(h?.data),k=$(h?.timestamp);if(!d||h?.type!=="session.start"||y?.sessionId!==s||k===void 0||k>l||d.rows.some(f=>f.type==="session.start"&&v(f.data)?.sessionId!==s))return;if(i){if(a||!d.complete||e.timestamp===void 0)return;let f=K(y.selectedModel),S=k;for(let M of d.rows){if(M.type!=="session.model_change"||!qt(M,void 0))continue;let A=$(M.timestamp);if(A===void 0)return;if(A>l||A<S)continue;let G=K(v(M.data)?.newModel);if(A===S&&G!==f)return;f=G,S=A}return f?{name:f,source:"transcript.session.selected"}:void 0}let x=[];for(let f of d.rows){let S=v(f.data),M=$(f.timestamp);if(!S||M===void 0||M>l||M<k||!qt(f,a)||c!==void 0&&S.turnId!==c)continue;let A=!1;if(f.type==="assistant.message"?A=Array.isArray(S.toolRequests)&&S.toolRequests.some(Kt=>v(Kt)?.toolCallId===o):(f.type==="tool.execution_start"||f.type==="tool.execution_complete")&&(A=S.toolCallId===o),!A)continue;let G=K(S.model);x.push(G?{name:G,source:`transcript.${f.type}`}:void 0)}return Ut(x)}var ce;function Wn(){if(ce===void 0)try{ce=le.default.userInfo().username}catch{ce=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return ce}var Gt=ue,Qn=new Set(["","unknown","undefined","null","n/a","none"]);function b(e){let t=typeof e=="string"?e.trim():void 0;return t&&!Qn.has(t.toLowerCase())?t:void 0}var er=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function tr(e){let t=b(e);return t&&er.test(t)?t:void 0}function nr(e){let t=e?b(e.copilot_version)??b(e.copilotVersion)??b(e.cli_version)??b(e.cliVersion)??b(e.version):void 0;return t||(De===void 0&&(De=rr()),De??void 0)}var De;function rr(){let e=b(process.env.COPILOT_CLI_BINARY_VERSION)??b(process.env.COPILOT_CLI_VERSION);if(e)return e;let t=b(process.env.COPILOT_CLI_RESOLVED_DIST_DIR);if(t){let n=tr(Ne.default.basename(t));if(n)return n;let r=or(t);if(r)return r}return null}function or(e){try{let t=$t.default.readFileSync(Ne.default.join(e,"package.json"),"utf8");return b(JSON.parse(t).version)}catch{return}}var sr=new Set(["copilot.hook","copilot.tool_name","copilot.toolName","copilot.tool_use_id","copilot.toolUseId","copilot.session_id","copilot.sessionId","copilot.transcript_path","copilot.transcriptPath","copilot.cwd","copilot.permission_mode","copilot.surface","copilot.agent_id","copilot.agent_type","copilot.agent_name","copilot.agent_display_name","copilot.stop_reason","copilot.notification_type"]),ir=new Set(["copilot.tool_input","copilot.toolInput","copilot.toolArgs","copilot.tool_response","copilot.tool_result","copilot.toolResult"]),ar={skipRedactKeys:sr,bashContextKeys:ir},ur=new Set(["hook_event_name","hookEventName","hookName"]);function cr(e,t,n){let r=Object.fromEntries(Object.entries(e).filter(([o])=>!ur.has(o)));return Nt(r,Bt(e,t,n)),[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:H(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,q.attrsFromRecord)(r,"copilot",ar)]}function lr(e){let t=nr(e);return[{key:"service.name",value:{stringValue:"copilot"}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:Gt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Wn()}},{key:"host.name",value:{stringValue:le.default.hostname()}},{key:"host.arch",value:{stringValue:le.default.arch()}}]}function Ft(e){let t=e.now??Date.now();return(0,q.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,q.snakeCase)(H(e.event)??"unknown")}`,attributes:cr(e.event,e.surface,t),resource:lr(e.event),scope:{name:"pinta-copilot",version:Gt},now:t})}var Yt=g(C());function dr(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||100}var fr=`pinta-copilot/${ue}`;function zt(e,t){return(0,Yt.evaluateGuard)(e,t,{timeoutMs:dr(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:fr})}async function pr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function Ht(){try{let e=Pt(),t=vt(),n=await pr(),r=JSON.parse(n),o=se(r),i=bt(r),s=new ae(e),a=o==="UserPromptSubmit"?s.newTrace(i):s.currentTrace(i),c=Ft({event:r,traceId:a,surface:t}),l=At(r),d=null;if(Rt(o)&&!wt(l)&&(d=await zt(c,process.env.PINTA_GUARD_ENDPOINT)),d?.decision==="DENY"){let y=kt(o,d.userMessage??d.reason??"guard_deny",t,r);y&&process.stdout.write(y+`
25
+ `)}if((0,Xt.attachGuard)(c,d),d&&o==="PostToolUse")for(let y of c.resourceSpans)for(let k of y.scopeSpans)for(let x of k.spans)x.attributes.push({key:"pinta.guard.target",value:{stringValue:"tool_output"}});if(d?.decision==="DENY")return It(c,e),0;let h=new ie(e);await h.flush(),await h.send(c)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
26
+ `)}return 0}Ot();async function mr(){let e=await Ht();process.exit(e)}mr();
package/dist/index.mjs CHANGED
@@ -1,22 +1,27 @@
1
1
  import{createRequire as __pintaCreateRequire}from 'node:module';const require=__pintaCreateRequire(import.meta.url);
2
- var Qt=Object.create;var Ne=Object.defineProperty;var en=Object.getOwnPropertyDescriptor;var tn=Object.getOwnPropertyNames;var nn=Object.getPrototypeOf,rn=Object.prototype.hasOwnProperty;var S=(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 E=(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 tn(t))!rn.call(e,o)&&o!==n&&Ne(e,o,{get:()=>t[o],enumerable:!(r=en(t,o))||r.enumerable});return e};var U=(e,t,n)=>(n=e!=null?Qt(nn(e)):{},on(t||!e||!e.__esModule?Ne(n,"default",{value:e,enumerable:!0}):n,e));var ce=E(h=>{"use strict";Object.defineProperty(h,"__esModule",{value:!0});h.PATTERNS=h.MAX_BYTES=void 0;h.truncateTo=je;h.truncate=sn;h.collectMatches=Ce;h.resolveOverlaps=Le;h.applyMatches=Ue;h.redact=an;h.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 sn(e){return je(e,h.MAX_BYTES)}h.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 h.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;let o=new RegExp(r.regex.source,r.regex.flags),s;for(;(s=o.exec(e))!==null;){let u=r.captureGroup??0,a=s[u];if(a===void 0){s.index===o.lastIndex&&o.lastIndex++;continue}let c=s.index,l=s.index+s[0].length,f=c+s[0].indexOf(a),g=f+a.length;n.push({start:c,end:l,replaceStart:f,replaceEnd:g,type:r.type}),s.index===o.lastIndex&&o.lastIndex++}}return n}function Le(e){let t=[...e].sort((o,s)=>o.start!==s.start?o.start-s.start:s.end-s.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 Ue(e,t){let n=[...t].sort((o,s)=>s.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 an(e,t={}){if(e.length===0)return e;let n=Ce(e,t);if(n.length===0)return e;let r=Le(n);return Ue(e,r)}});var de=E(m=>{"use strict";var un=m&&m.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(m,"__esModule",{value:!0});m.MAX_SPAN_BYTES=void 0;m.ulidToTraceId=Ve;m.newSpanId=$e;m.snakeCase=dn;m.toOtlpValue=Ge;m.attrsFromRecord=fn;m.guardAttrs=Ye;m.clientAttrs=ze;m.enforceSpanBudget=Xe;m.buildPayload=pn;m.attachGuard=Ke;m.mergeBatch=mn;var cn=un(S("crypto")),le=ce(),ln="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ve(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=ln.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 $e(){return cn.default.randomBytes(8).toString("hex")}function dn(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var qe=new Set;function H(e,t,n){let r=(0,le.truncate)(t);if((n.skipRedactKeys??qe).has(e))return r;let o=(n.bashContextKeys??qe).has(e)?"bash":void 0;return(0,le.redact)(r,{context:o})}function Ge(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:H(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:H(e,JSON.stringify(t),n)}}catch{return{stringValue:H(e,String(t),n)}}default:return{stringValue:H(e,String(t),n)}}}function fn(e,t,n={}){let r=[];for(let[o,s]of Object.entries(e)){let u=`${t}.${o}`,a=Ge(u,s,n);a!==null&&r.push({key:u,value:a})}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}}]}m.MAX_SPAN_BYTES=800*1024;function Fe(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Be=1024;function Xe(e,t=m.MAX_SPAN_BYTES){let n=Fe(e);for(let r=0;r<100&&n>t;r++){let o=null,s=0;for(let c of e.attributes){if(!("stringValue"in c.value))continue;let l=Buffer.byteLength(c.value.stringValue,"utf-8");l>s&&(s=l,o=c.value)}if(o===null||s<=Be)break;let u=n-t,a=Math.max(Be,s-u-64);o.stringValue=(0,le.truncateTo)(o.stringValue,a),n=Fe(e)}return e}function pn(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes],o={traceId:Ve(e.traceId),spanId:$e(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};Xe(o);let s={resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[o]}]}]};return Ke(s,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 mn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var He=E(b=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});b.GUARD_STATUS_REFUSED=b.GUARD_BUDGET_HEADER=void 0;b.evaluateGuard=yn;var gn=1e4,hn="pinta-core";b.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function Z(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var _n=new Set(["ALLOW","DENY","REVIEW"]);b.GUARD_STATUS_REFUSED=410;async function yn(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??gn,o=Date.now(),s=new AbortController,u=setTimeout(()=>s.abort(),r);try{let a=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??hn,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{},...Number.isFinite(r)&&r>0?{[b.GUARD_BUDGET_HEADER]:String(r)}:{}},body:JSON.stringify(e),signal:s.signal});if(a.status===b.GUARD_STATUS_REFUSED)return Z(Date.now()-o,"refused");if(a.status!==200)return Z(Date.now()-o,"error");let c=await a.json(),l=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!_n.has(c.decision)||!l)return Z(Date.now()-o,"error");let f=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??f,clientRttMs:f}}catch(a){let c=a.name,l=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return Z(Date.now()-o,l)}finally{clearTimeout(u)}}});var W=E($=>{"use strict";var Sn=$&&$.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty($,"__esModule",{value:!0});$.atomicWriteFileSync=Tn;var Ze=Sn(S("fs"));function Tn(e,t){let n=`${e}.${process.pid}.tmp`;Ze.default.writeFileSync(n,t),Ze.default.renameSync(n,e)}});var me=E(k=>{"use strict";var We=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.MemoryRetryQueue=k.DiskRetryQueue=void 0;var y=We(S("fs")),J=We(S("path")),En=W(),Q=1e3,Pn=50,On=5,fe=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{y.default.mkdirSync(J.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
- `;y.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
4
- `)}}readAll(){try{let t=y.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){y.default.existsSync(this.filePath)&&y.default.unlinkSync(this.filePath);return}y.default.mkdirSync(J.default.dirname(this.filePath),{recursive:!0}),(0,En.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
2
+ var ln=Object.create;var qe=Object.defineProperty;var dn=Object.getOwnPropertyDescriptor;var fn=Object.getOwnPropertyNames;var pn=Object.getPrototypeOf,mn=Object.prototype.hasOwnProperty;var T=(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 P=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var hn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of fn(t))!mn.call(e,s)&&s!==n&&qe(e,s,{get:()=>t[s],enumerable:!(r=dn(t,s))||r.enumerable});return e};var $=(e,t,n)=>(n=e!=null?ln(pn(e)):{},hn(t||!e||!e.__esModule?qe(n,"default",{value:e,enumerable:!0}):n,e));var Fe=P(fe=>{"use strict";Object.defineProperty(fe,"__esModule",{value:!0});fe.mysqlPasswordRanges=On;var gn=new Set(["mysql","mysqldump","mysqladmin","mysqlcheck","mysqlimport","mysqlshow","mariadb","mariadb-dump","mariadb-admin","mariadb-check","mariadb-import","mariadb-show"]),yn=new Set(["sh","bash","dash","zsh","ksh"]),_n=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"]),Q=16;function Ue(e,t,n=e.value.length){return{value:e.value.slice(t,n),ranges:e.ranges.slice(t,n)}}function z(e,t,n,r){e.value+=t.value.slice(n,r);for(let s=n;s<r;s++)e.ranges.push(t.ranges[s])}function $e(e){if(e?.literal)return e.value.slice(e.value.lastIndexOf("/")+1).replace(/\.exe$/,"")}function Sn(e){let t=0;for(let n=0;n<=Q;n++){for(;/^[A-Za-z_][A-Za-z0-9_]*=/.test(e[t]?.value??"");)t++;let r=$e(e[t]);if(!r)return;if(["!","if","then","elif","else","while","until","do"].includes(r)){t++;continue}let s={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 o=e[t++].value;if(o==="--")break;if(!i[r].includes(o)){if((s[r]??[]).includes(o)){if(!e[t++])return;continue}if(!(s[r]??[]).some(a=>a.startsWith("--")?o.startsWith(a+"="):o.startsWith(a)&&o.length>2)&&!(r==="nice"&&/^-\d+$/.test(o)))return}}if(r==="timeout"&&!/^\d+(?:\.\d+)?[smhd]?$/.test(e[t++]?.value??""))return}}function Be(e,t){let n=1,r="";for(let s=t;s<e.length;s++){let i=e[s];if(i==="\\"&&r!=="'"){s++;continue}if(r){i===r&&(r="");continue}if(i==="'"||i==='"')r=i;else if(i==="(")n++;else if(i===")"&&--n===0)return s}return e.length}function Tn(e,t,n,r){let s={value:"",ranges:[],start:t,end:t,literal:!0},i="",o=t;for(;o<e.value.length;){let a=e.value[o];if(!i&&/[\s;|&()<>{}]/.test(a))break;if(a===i){i="",o++;continue}if(!i&&(a==="'"||a==='"')){i=a,o++;continue}if(a==="\\"&&i!=="'"){let c=e.value[o+1];if(c===`
3
+ `){o+=2;continue}if(c&&(!i||/[$`"\\]/.test(c))){z(s,e,o+1,o+2),o+=2;continue}}if(i!=="'"&&e.value.startsWith("$(",o)){let c=Be(e.value,o+2);e.value[o+2]!=="("&&r<Q&&B(Ue(e,o+2,c),n,r+1),z(s,e,o,Math.min(c+1,e.value.length)),s.literal=!1,o=Math.min(c+1,e.value.length);continue}if(a==="`"&&i!=="'"){let c=o+1;for(;c<e.value.length&&e.value[c]!=="`";)c+=e.value[c]==="\\"?2:1;r<Q&&B(Ue(e,o+1,c),n,r+1),z(s,e,o,Math.min(c+1,e.value.length)),s.literal=!1,o=Math.min(c+1,e.value.length);continue}a==="$"&&i!=="'"&&(s.literal=!1),z(s,e,o,o+1),o++}return s.end=o,s}function En(e,t,n,r){let s=Sn(t);if(s===void 0)return;let i=$e(t[s]);if(yn.has(i)&&r<Q){for(let o=s+1;o<t.length;o++){let a=t[o].value;if(a==="--command"||/^-[a-zA-Z]*c[a-zA-Z]*$/.test(a)){let c=t[o+1];c&&B(c,n,r+1);return}if(!a.startsWith("-")||a==="--")return;(a==="-o"||a==="-O")&&o++}return}if(gn.has(i))for(let o=s+1;o<t.length;o++){let a=t[o];if(a.value==="--")return;if(_n.has(a.value)){o++;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 B(e,t,n=0){let r=[],s,i=[],o=0,a=()=>{En(e,r,t,n),r=[],s=void 0};for(;o<e.value.length;){let c=e.value[o];if(c===`
4
+ `){a(),o++;for(let l of i.splice(0))for(;o<e.value.length;){let d=e.value.indexOf(`
5
+ `,o),h=d<0?e.value.length:d,y=e.value.slice(o,h);if(o=d<0?h:h+1,(l.stripTabs?y.replace(/^\t+/,""):y)===l.delimiter)break}}else if(/\s/.test(c))o++;else if(c==="#"){let l=e.value.indexOf(`
6
+ `,o);o=l<0?e.value.length:l}else if(e.value.startsWith("((",o))a(),o=Math.min(Be(e.value,o+1)+1,e.value.length);else if(/[;|&(){}]/.test(c))a(),o++;else if(c==="<"||c===">")r.at(-1)?.end===o&&/^\d+$/.test(r.at(-1).value)&&r.pop(),s=/^(?:<<<|<<-?|>>|<&|>&|[<>])/.exec(e.value.slice(o))?.[0]??c,o+=s.length;else{let l=Tn(e,o,t,n);o=l.end,(s==="<<"||s==="<<-")&&i.push({delimiter:l.value,stripTabs:s==="<<-"}),s||r.push(l),s=void 0}}a()}function Pn(e,t,n){let r={value:"",ranges:[]};for(let s=t+1;s<n-1;s++){if(e.value[s]!=="\\"){z(r,e,s,s+1);continue}let i=s+(e.value[s+1]==="u"?6:2),o=JSON.parse(`"${e.value.slice(s,i)}"`);r.value+=o;for(let a=0;a<o.length;a++)r.ranges.push({start:e.ranges[s].start,end:e.ranges[i-1].end});s=i-1}return r}function On(e){let t={value:e,ranges:Array.from({length:e.length},(r,s)=>({start:s,end:s+1}))},n=[];if(/^\s*[{[]/.test(e)){let r;try{r=JSON.parse(e)}catch{return B(t,n),n}if(r!==null&&typeof r=="object"){let s=/"(?:[^"\\]|\\.)*"/g,i;for(;i=s.exec(e);){let o=JSON.parse(i[0]);if(o!=="command"&&o!=="cmd"&&o!=="CommandLine")continue;let a=/^\s*:\s*/.exec(e.slice(s.lastIndex));if(!a)continue;let c=s.lastIndex+a[0].length;if(e[c]!=='"')continue;s.lastIndex=c;let l=s.exec(e);l?.index===c&&B(Pn(t,c,c+l[0].length),n)}}return n}return B(t,n),n}});var pe=P(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.PATTERNS=g.MAX_BYTES=void 0;g.truncateTo=Ve;g.truncate=bn;g.collectMatches=Ge;g.resolveOverlaps=ze;g.applyMatches=Ye;g.redact=wn;var vn=Fe();g.MAX_BYTES=102400;function Ve(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 bn(e){return Ve(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 Ge(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:o,end:a}of(0,vn.mysqlPasswordRanges)(e))n.push({start:o,end:a,replaceStart:o,replaceEnd:a,type:r.type,replacement:`-p[REDACTED:${r.type}]`});continue}let s=new RegExp(r.regex.source,r.regex.flags),i;for(;(i=s.exec(e))!==null;){let o=r.captureGroup??0,a=i[o];if(a===void 0){i.index===s.lastIndex&&s.lastIndex++;continue}let c=i.index,l=i.index+i[0].length,d=c+i[0].indexOf(a),h=d+a.length;n.push({start:c,end:l,replaceStart:d,replaceEnd:h,type:r.type}),i.index===s.lastIndex&&s.lastIndex++}}return n}function ze(e){let t=[...e].sort((s,i)=>s.start!==i.start?s.start-i.start:i.end-i.start-(s.end-s.start)),n=[],r=-1;for(let s of t)s.start<r||(n.push(s),r=s.end);return n}function Ye(e,t){let n=[...t].sort((s,i)=>i.replaceStart-s.replaceStart),r=e;for(let s of n)r=r.slice(0,s.replaceStart)+(s.replacement??`[REDACTED:${s.type}]`)+r.slice(s.replaceEnd);return r}function wn(e,t={}){if(e.length===0)return e;let n=Ge(e,t);if(n.length===0)return e;let r=ze(n);return Ye(e,r)}});var he=P(m=>{"use strict";var An=m&&m.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(m,"__esModule",{value:!0});m.MAX_SPAN_BYTES=void 0;m.ulidToTraceId=We;m.newSpanId=Ze;m.snakeCase=In;m.toOtlpValue=Je;m.attrsFromRecord=Mn;m.guardAttrs=Qe;m.clientAttrs=et;m.enforceSpanBudget=tt;m.buildPayload=Dn;m.attachGuard=nt;m.mergeBatch=Nn;var Rn=An(T("crypto")),me=pe(),kn="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function We(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let r of e){let s=kn.indexOf(r);if(s<0)throw new Error(`ulidToTraceId: invalid Crockford char "${r}"`);t=t<<5n|BigInt(s)}let n=(1n<<128n)-1n;return t&=n,t.toString(16).padStart(32,"0")}function Ze(){return Rn.default.randomBytes(8).toString("hex")}function In(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Xe=new Set;function ee(e,t,n){let r=(0,me.truncate)(t);if((n.skipRedactKeys??Xe).has(e))return r;let s=(n.bashContextKeys??Xe).has(e)?"bash":void 0;return(0,me.redact)(r,{context:s})}function Je(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:ee(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:ee(e,JSON.stringify(t),n)}}catch{return{stringValue:ee(e,String(t),n)}}default:return{stringValue:ee(e,String(t),n)}}}function Mn(e,t,n={}){let r=[];for(let[s,i]of Object.entries(e)){let o=`${t}.${s}`,a=Je(o,i,n);a!==null&&r.push({key:o,value:a})}return r}function Qe(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 et(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}}]}m.MAX_SPAN_BYTES=800*1024;function Ke(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var He=1024;function tt(e,t=m.MAX_SPAN_BYTES){let n=Ke(e);for(let r=0;r<100&&n>t;r++){let s=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,s=c.value)}if(s===null||i<=He)break;let o=n-t,a=Math.max(He,i-o-64);s.stringValue=(0,me.truncateTo)(s.stringValue,a),n=Ke(e)}return e}function Dn(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes],s={traceId:We(e.traceId),spanId:Ze(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};tt(s);let i={resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]};return nt(i,e.guard,e.clientTiming)}function nt(e,t,n){let r=e.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return e;t&&r.attributes.push(...Qe(t));let s=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return s&&r.attributes.push(...et(s)),e}function Nn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var rt=P(w=>{"use strict";Object.defineProperty(w,"__esModule",{value:!0});w.GUARD_STATUS_REFUSED=w.GUARD_BUDGET_HEADER=void 0;w.evaluateGuard=Ln;var xn=1e4,jn="pinta-core";w.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function te(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Cn=new Set(["ALLOW","DENY","REVIEW"]);w.GUARD_STATUS_REFUSED=410;async function Ln(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??xn,s=Date.now(),i=new AbortController,o=setTimeout(()=>i.abort(),r);try{let a=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??jn,"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 te(Date.now()-s,"refused");if(a.status!==200)return te(Date.now()-s,"error");let c=await a.json(),l=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!Cn.has(c.decision)||!l)return te(Date.now()-s,"error");let d=Date.now()-s;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??d,clientRttMs:d}}catch(a){let c=a.name,l=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return te(Date.now()-s,l)}finally{clearTimeout(o)}}});var ne=P(Y=>{"use strict";var qn=Y&&Y.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Y,"__esModule",{value:!0});Y.atomicWriteFileSync=Un;var st=qn(T("fs"));function Un(e,t){let n=`${e}.${process.pid}.tmp`;st.default.writeFileSync(n,t),st.default.renameSync(n,e)}});var _e=P(M=>{"use strict";var ot=M&&M.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(M,"__esModule",{value:!0});M.MemoryRetryQueue=M.DiskRetryQueue=void 0;var S=ot(T("fs")),re=ot(T("path")),$n=ne(),se=1e3,Bn=50,Fn=5,ge=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=re.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{S.default.mkdirSync(re.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
7
+ `;S.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
8
+ `)}}readAll(){try{let t=S.default.readFileSync(this.filePath,"utf-8"),n=[];for(let r of t.split(`
9
+ `))if(r.trim())try{let s=JSON.parse(r);Array.isArray(s?.payload?.resourceSpans)&&n.push(s)}catch{}return n}catch{return[]}}rewrite(t){try{if(t.length===0){S.default.existsSync(this.filePath)&&S.default.unlinkSync(this.filePath);return}S.default.mkdirSync(re.default.dirname(this.filePath),{recursive:!0}),(0,$n.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{y.default.mkdirSync(J.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<Pn;)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}
10
- `),!1;try{let s=y.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){y.default.unlinkSync(this.lockPath);continue}}catch{}let r=On,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<=Q)return;let n=t.length-Q;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
11
- `),this.rewrite(t.slice(n))}};k.DiskRetryQueue=fe;var pe=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>Q&&this.entries.splice(0,this.entries.length-Q)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};k.MemoryRetryQueue=pe});var rt=E(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.MemoryTransport=p.DiskTransport=p.MAX_POST_BYTES=void 0;p.parseHeadersEnv=tt;p.envOptionsResolver=nt;p.postOtlp=G;var Je=me(),Qe=de(),vn=5e3;p.MAX_POST_BYTES=900*1024;function ee(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function et(e,t,n){let r=[],o=[],s=[],u=0;for(let a of e){let c=t(a);if(c>n){o.push(a);continue}s.length>0&&u+c>n&&(r.push(s),s=[],u=0),s.push(a),u+=c}return s.length>0&&r.push(s),{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 G(e,t,n){let r=new AbortController,o=setTimeout(()=>r.abort(),vn);try{let s=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:r.signal});if(!s.ok){let u="";try{u=(await s.text()).slice(0,200)}catch{}let a=s.status===401||s.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":s.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":s.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${n}] OTLP POST ${s.status} ${t.endpoint}${a}${u?` body=${u}`:""}
12
- `),!1}return!0}catch(s){return process.stderr.write(`[${n}] OTLP POST failed: ${s.message??String(s)}
13
- `),!1}finally{clearTimeout(o)}}var ge=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new Je.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 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}=et(n,a=>ee(a.payload),p.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized retry ${o.length===1?"entry":"entries"} (each > ${p.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
14
- `);let s=[].concat(...r),u=0;for(let a of r){if(!await G((0,Qe.mergeBatch)(a.map(l=>l.payload)),t,this.logPrefix))break;u+=a.length}this.queue.rewrite(s.slice(u))}catch(n){process.stderr.write(`[${this.logPrefix}] flush failed: ${n?.message??String(n)}
15
- `)}finally{this.queue.release()}}dropIfOversized(t){let n=ee(t);return n<=p.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
16
- `),!0)}};p.DiskTransport=ge;var he=class{queue=new Je.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(ee(t)>p.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
17
- `);return}await 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}=et(n,ee,p.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized buffered ${o.length===1?"payload":"payloads"} (each > ${p.MAX_POST_BYTES} bytes \u2014 undeliverable)
18
- `);let s=[].concat(...r),u=0;for(let a of r){if(!await G((0,Qe.mergeBatch)(a),t,this.logPrefix))break;u+=a.length}for(let a of s.slice(u))this.queue.enqueue(a)}};p.MemoryTransport=he});var Te=E(D=>{"use strict";var Se=D&&D.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(D,"__esModule",{value:!0});D.TraceManager=void 0;D.generateUlid=st;var ot=Se(S("fs")),bn=Se(S("path")),wn=Se(S("crypto")),An=W(),_e="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function st(){let e=Date.now(),t="",n=e;for(let s=0;s<10;s++)t=_e[n&31]+t,n=Math.floor(n/32);let r=wn.default.randomBytes(10),o="";for(let s=0;s<10;s++)o+=_e[r[s]&31];for(;o.length<16;)o+=_e[0];return t+o}var ye=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=st();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(bn.default.dirname(this.tracePath),{recursive:!0}),(0,An.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
19
- `)}}};D.TraceManager=ye});var lt=E(M=>{"use strict";var at=M&&M.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(M,"__esModule",{value:!0});M.MemorySessionTraceManager=M.DiskSessionTraceManager=void 0;var it=at(S("fs")),Rn=at(S("path")),ut=Te(),kn=W(),ct=200,Ee=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??ct}read(){try{let t=JSON.parse(it.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{it.default.mkdirSync(Rn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,kn.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,ut.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)}};M.DiskSessionTraceManager=Ee;var Pe=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??ct}newTrace(t){let n=t||"default",r=(0,ut.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)}};M.MemorySessionTraceManager=Pe});var pt=E(x=>{"use strict";var Oe=x&&x.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(x,"__esModule",{value:!0});x.envFilePath=Dn;x.parseEnvFile=ft;x.loadEnvFile=xn;var Mn=Oe(S("node:fs")),In=Oe(S("node:os")),dt=Oe(S("node:path"));function Dn(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:dt.default.join(In.default.homedir(),e);return dt.default.join(o,t)}function ft(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 s=r.slice(0,o).trim(),u=r.slice(o+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),s&&(t[s]=u)}return t}function xn(e){let t;try{t=Mn.default.readFileSync(e,"utf-8")}catch{return}let n=ft(t);for(let[r,o]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=o)}});var N=E(i=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});i.loadEnvFile=i.parseEnvFile=i.envFilePath=i.MemorySessionTraceManager=i.DiskSessionTraceManager=i.generateUlid=i.TraceManager=i.MAX_POST_BYTES=i.parseHeadersEnv=i.envOptionsResolver=i.postOtlp=i.MemoryTransport=i.DiskTransport=i.MemoryRetryQueue=i.DiskRetryQueue=i.GUARD_BUDGET_HEADER=i.GUARD_STATUS_REFUSED=i.evaluateGuard=i.MAX_SPAN_BYTES=i.enforceSpanBudget=i.mergeBatch=i.attachGuard=i.buildPayload=i.clientAttrs=i.guardAttrs=i.attrsFromRecord=i.toOtlpValue=i.snakeCase=i.newSpanId=i.ulidToTraceId=i.MAX_BYTES=i.PATTERNS=i.applyMatches=i.resolveOverlaps=i.collectMatches=i.truncateTo=i.truncate=i.redact=void 0;var I=ce();Object.defineProperty(i,"redact",{enumerable:!0,get:function(){return I.redact}});Object.defineProperty(i,"truncate",{enumerable:!0,get:function(){return I.truncate}});Object.defineProperty(i,"truncateTo",{enumerable:!0,get:function(){return I.truncateTo}});Object.defineProperty(i,"collectMatches",{enumerable:!0,get:function(){return I.collectMatches}});Object.defineProperty(i,"resolveOverlaps",{enumerable:!0,get:function(){return I.resolveOverlaps}});Object.defineProperty(i,"applyMatches",{enumerable:!0,get:function(){return I.applyMatches}});Object.defineProperty(i,"PATTERNS",{enumerable:!0,get:function(){return I.PATTERNS}});Object.defineProperty(i,"MAX_BYTES",{enumerable:!0,get:function(){return I.MAX_BYTES}});var T=de();Object.defineProperty(i,"ulidToTraceId",{enumerable:!0,get:function(){return T.ulidToTraceId}});Object.defineProperty(i,"newSpanId",{enumerable:!0,get:function(){return T.newSpanId}});Object.defineProperty(i,"snakeCase",{enumerable:!0,get:function(){return T.snakeCase}});Object.defineProperty(i,"toOtlpValue",{enumerable:!0,get:function(){return T.toOtlpValue}});Object.defineProperty(i,"attrsFromRecord",{enumerable:!0,get:function(){return T.attrsFromRecord}});Object.defineProperty(i,"guardAttrs",{enumerable:!0,get:function(){return T.guardAttrs}});Object.defineProperty(i,"clientAttrs",{enumerable:!0,get:function(){return T.clientAttrs}});Object.defineProperty(i,"buildPayload",{enumerable:!0,get:function(){return T.buildPayload}});Object.defineProperty(i,"attachGuard",{enumerable:!0,get:function(){return T.attachGuard}});Object.defineProperty(i,"mergeBatch",{enumerable:!0,get:function(){return T.mergeBatch}});Object.defineProperty(i,"enforceSpanBudget",{enumerable:!0,get:function(){return T.enforceSpanBudget}});Object.defineProperty(i,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return T.MAX_SPAN_BYTES}});var ve=He();Object.defineProperty(i,"evaluateGuard",{enumerable:!0,get:function(){return ve.evaluateGuard}});Object.defineProperty(i,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return ve.GUARD_STATUS_REFUSED}});Object.defineProperty(i,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return ve.GUARD_BUDGET_HEADER}});var mt=me();Object.defineProperty(i,"DiskRetryQueue",{enumerable:!0,get:function(){return mt.DiskRetryQueue}});Object.defineProperty(i,"MemoryRetryQueue",{enumerable:!0,get:function(){return mt.MemoryRetryQueue}});var q=rt();Object.defineProperty(i,"DiskTransport",{enumerable:!0,get:function(){return q.DiskTransport}});Object.defineProperty(i,"MemoryTransport",{enumerable:!0,get:function(){return q.MemoryTransport}});Object.defineProperty(i,"postOtlp",{enumerable:!0,get:function(){return q.postOtlp}});Object.defineProperty(i,"envOptionsResolver",{enumerable:!0,get:function(){return q.envOptionsResolver}});Object.defineProperty(i,"parseHeadersEnv",{enumerable:!0,get:function(){return q.parseHeadersEnv}});Object.defineProperty(i,"MAX_POST_BYTES",{enumerable:!0,get:function(){return q.MAX_POST_BYTES}});var gt=Te();Object.defineProperty(i,"TraceManager",{enumerable:!0,get:function(){return gt.TraceManager}});Object.defineProperty(i,"generateUlid",{enumerable:!0,get:function(){return gt.generateUlid}});var ht=lt();Object.defineProperty(i,"DiskSessionTraceManager",{enumerable:!0,get:function(){return ht.DiskSessionTraceManager}});Object.defineProperty(i,"MemorySessionTraceManager",{enumerable:!0,get:function(){return ht.MemorySessionTraceManager}});var be=pt();Object.defineProperty(i,"envFilePath",{enumerable:!0,get:function(){return be.envFilePath}});Object.defineProperty(i,"parseEnvFile",{enumerable:!0,get:function(){return be.parseEnvFile}});Object.defineProperty(i,"loadEnvFile",{enumerable:!0,get:function(){return be.loadEnvFile}})});import{realpathSync as Cr}from"node:fs";import{pathToFileURL as Lr}from"node:url";var Y=U(N());function Nn(){return(0,Y.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function _t(e=Nn()){(0,Y.loadEnvFile)(e)}import jn from"os";import we from"path";function z(){return process.env.COPILOT_HOME||we.join(jn.homedir(),".copilot")}function yt(){let e=process.env.COPILOT_PLUGIN_DATA||we.join(z(),"pinta-copilot-data");return{pluginData:e,tracePath:we.join(e,"trace.json")}}function St(e=process.env){return e.COPILOT_AGENT_JOB_ID||e.COPILOT_AGENT_SESSION_ID||e.COPILOT_AGENT_PROMPT?"cloud":e.ELECTRON_RUN_AS_NODE||e.VSCODE_IPC_HOOK||e.VSCODE_PID?"ext":"cli"}var Ft=U(N());function j(e){return typeof e=="string"?e:void 0}function te(e){return j(e.hook_event_name)??j(e.hookEventName)??j(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function Tt(e){return j(e.session_id)??j(e.sessionId)}function Et(e){return j(e.tool_name)??j(e.toolName)}var Cn={sessionstart:"SessionStart",sessionend:"SessionEnd",userpromptsubmit:"UserPromptSubmit",userpromptsubmitted:"UserPromptSubmit",pretooluse:"PreToolUse",posttooluse:"PostToolUse",posttoolusefailure:"PostToolUseFailure",stop:"Stop",agentstop:"Stop",subagentstart:"SubagentStart",subagentstop:"SubagentStop",precompact:"PreCompact",notification:"Notification",permissionrequest:"PermissionRequest",erroroccurred:"ErrorOccurred"};function ne(e){let t=te(e);return t?Cn[t.toLowerCase()]??"Unknown":"Unknown"}function Pt(e){return e==="PreToolUse"||e==="PermissionRequest"}var Ln=new Set(["report_intent","ask_user"]);function Ot(e){return e!==void 0&&Ln.has(e)}function vt(e,t){return e==="PreToolUse"?JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}}):e==="PermissionRequest"?JSON.stringify({behavior:"deny",message:t}):null}var oe=U(N());function Un(){let e=process.env.COPILOT_PLUGIN_OPTION_ENDPOINT||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:(0,oe.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var re=class extends oe.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:Un})}};var bt=U(N()),se=class extends bt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import Xn from"fs";import ke from"os";import jt from"path";var ie="0.10.0";var C=U(N());import $n from"node:path";import w from"node:fs";import wt from"node:path";var qn=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),Fn=256*1024,Bn=1024*1024,Vn=4096;function P(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function X(e){let t=P(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)&&!qn.has(r.toLowerCase())?r:void 0}function At(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 Ae(e){return typeof e=="string"&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,255}$/.test(e)?e:void 0}function K(e,t){let n=t.filter(r=>e[r]!==void 0).map(r=>Ae(e[r]));return n.length>0&&n[0]!==void 0&&n.every(r=>r===n[0])?n[0]:void 0}function F(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 Rt(e,t){let n=e.timestamp===void 0?F(t):F(e.timestamp);return n!==void 0&&n<=t?n:void 0}function kt(e){if(typeof e!="string"||e.length>4096||/[\u0000-\u001f]/.test(e)||!wt.isAbsolute(e)||wt.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,Fn));if(w.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),s;if(o>=0)try{s=P(JSON.parse(r.toString("utf8",0,o)))}catch{}let u=Math.max(0,n.size-Bn),a=n.size<=r.length?r:Buffer.alloc(n.size-u);if(a!==r&&w.readSync(t,a,0,a.length,u)!==a.length)return;let c=w.fstatSync(t);if(c.size<n.size||c.size===n.size&&c.mtimeMs!==n.mtimeMs)return;let l=u>0?a.indexOf(10)+1:0,f=a.lastIndexOf(10);if(u>0&&l===0||f<l)return;let g=[],A=0;for(;f>l&&A<Vn;){let L=a.lastIndexOf(10,f-1),B=Math.max(l,L+1),d=a.toString("utf8",B,f).trim();if(d){let _=P(JSON.parse(d));_&&g.push(_)}f=B-1,A++}return g.reverse(),{first:s,rows:g,complete:u===0&&f<0&&a[a.length-1]===10}}catch{return}finally{if(t!==void 0)try{w.closeSync(t)}catch{}}}function Mt(e){let t=e[0];return t&&e.every(n=>n?.name===t.name)?t:void 0}var Gn=new Set(["PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest"]),It=["agent_id","agentId"],Dt=["turn_id","turnId"];function Yn(e,t,n){let r=[e.transcript_path,e.transcriptPath].filter(o=>o!==void 0);return r.length?r.every(o=>o===r[0])?r[0]:void 0:n==="cli"&&/^[A-Za-z0-9_-]{1,128}$/.test(t)?$n.join(z(),"session-state",t,"events.jsonl"):void 0}function xt(e,t){return e.agentId!==void 0&&e.agentId!==null?Ae(e.agentId)===t&&t!==void 0:t===void 0&&P(e.data)?.parentToolCallId==null}function Nt(e,t,n){let r=X(e.model);if(r)return{name:r,source:"hook.model"};try{return zn(e,t,n)}catch{return}}function zn(e,t,n){let r=ne(e),o=K(e,["tool_use_id","toolUseId","tool_call_id","toolCallId"]),s=r==="SessionStart"&&e.source==="startup";if(!s&&(!Gn.has(r)||!o))return;let u=K(e,["session_id","sessionId"]),a=K(e,It),c=K(e,Dt),l=Rt(e,n);if(!u||l===void 0||It.some(d=>e[d]!==void 0)&&!a||Dt.some(d=>e[d]!==void 0)&&!c||!a&&["agent_name","agentName","agent_type","agentType"].some(d=>e[d]!==void 0))return;let f=kt(Yn(e,u,t)),g=f?.first,A=P(g?.data),L=F(g?.timestamp);if(!f||g?.type!=="session.start"||A?.sessionId!==u||L===void 0||L>l||f.rows.some(d=>d.type==="session.start"&&P(d.data)?.sessionId!==u))return;if(s){if(a||!f.complete||e.timestamp===void 0)return;let d=X(A.selectedModel),_=L;for(let R of f.rows){if(R.type!=="session.model_change"||!xt(R,void 0))continue;let v=F(R.timestamp);if(v===void 0)return;if(v>l||v<_)continue;let V=X(P(R.data)?.newModel);if(v===_&&V!==d)return;d=V,_=v}return d?{name:d,source:"transcript.session.selected"}:void 0}let B=[];for(let d of f.rows){let _=P(d.data),R=F(d.timestamp);if(!_||R===void 0||R>l||R<L||!xt(d,a)||c!==void 0&&_.turnId!==c)continue;let v=!1;if(d.type==="assistant.message"?v=Array.isArray(_.toolRequests)&&_.toolRequests.some(Jt=>P(Jt)?.toolCallId===o):(d.type==="tool.execution_start"||d.type==="tool.execution_complete")&&(v=_.toolCallId===o),!v)continue;let V=X(_.model);B.push(V?{name:V,source:`transcript.${d.type}`}:void 0)}return Mt(B)}var ae;function Kn(){if(ae===void 0)try{ae=ke.userInfo().username}catch{ae=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return ae}var Ct=ie,Hn=new Set(["","unknown","undefined","null","n/a","none"]);function O(e){let t=typeof e=="string"?e.trim():void 0;return t&&!Hn.has(t.toLowerCase())?t:void 0}var Zn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function Wn(e){let t=O(e);return t&&Zn.test(t)?t:void 0}function Jn(e){let t=e?O(e.copilot_version)??O(e.copilotVersion)??O(e.cli_version)??O(e.cliVersion)??O(e.version):void 0;return t||(Re===void 0&&(Re=Qn()),Re??void 0)}var Re;function Qn(){let e=O(process.env.COPILOT_CLI_BINARY_VERSION)??O(process.env.COPILOT_CLI_VERSION);if(e)return e;let t=O(process.env.COPILOT_CLI_RESOLVED_DIST_DIR);if(t){let n=Wn(jt.basename(t));if(n)return n;let r=er(t);if(r)return r}return null}function er(e){try{let t=Xn.readFileSync(jt.join(e,"package.json"),"utf8");return O(JSON.parse(t).version)}catch{return}}var tr=new Set(["copilot.hook","copilot.tool_name","copilot.toolName","copilot.tool_use_id","copilot.toolUseId","copilot.session_id","copilot.sessionId","copilot.transcript_path","copilot.transcriptPath","copilot.cwd","copilot.permission_mode","copilot.surface","copilot.agent_id","copilot.agent_type","copilot.agent_name","copilot.agent_display_name","copilot.stop_reason","copilot.notification_type"]),nr=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),rr={skipRedactKeys:tr,bashContextKeys:nr},or=new Set(["hook_event_name","hookEventName","hookName"]);function sr(e,t,n){let r=Object.fromEntries(Object.entries(e).filter(([o])=>!or.has(o)));return At(r,Nt(e,t,n)),[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:te(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,C.attrsFromRecord)(r,"copilot",rr)]}function ir(e){let t=Jn(e);return[{key:"service.name",value:{stringValue:"copilot"}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:Ct}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Kn()}},{key:"host.name",value:{stringValue:ke.hostname()}},{key:"host.arch",value:{stringValue:ke.arch()}}]}function Lt(e){let t=e.now??Date.now();return(0,C.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,C.snakeCase)(te(e.event)??"unknown")}`,attributes:sr(e.event,e.surface,t),resource:ir(e.event),scope:{name:"pinta-copilot",version:Ct},now:t})}var Ut=U(N());function ar(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||100}var ur=`pinta-copilot/${ie}`;function qt(e,t){return(0,Ut.evaluateGuard)(e,t,{timeoutMs:ar(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:ur})}async function cr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function Bt(){try{let e=yt(),t=St(),n=await cr(),r=JSON.parse(n),o=ne(r),s=Tt(r),u=new re(e);await u.flush();let a=new se(e),c=o==="UserPromptSubmit"?a.newTrace(s):a.currentTrace(s),l=Lt({event:r,traceId:c,surface:t}),f=Et(r),g=null;if(Pt(o)&&!Ot(f)&&(g=await qt(l,process.env.PINTA_GUARD_ENDPOINT)),g?.decision==="DENY"){let A=vt(o,g.userMessage??g.reason??"guard_deny");A&&process.stdout.write(A+`
21
- `)}(0,Ft.attachGuard)(l,g),await u.send(l)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
22
- `)}return 0}import{opendir as Or,stat as vr}from"node:fs/promises";import ue from"node:path";import{spawn as Gt}from"node:child_process";import{copyFile as Me,mkdtemp as lr,rm as dr,stat as fr}from"node:fs/promises";import pr from"node:os";import Ie from"node:path";var mr=2e3,gr=250,Vt=3,$t=3e4,hr=3e4,De;function _r(){return De||(De=new Promise(e=>{let t=Gt("sqlite3",["-version"],{stdio:"ignore"});t.once("error",()=>e(!1)),t.once("exit",n=>e(n===0))})),De}function yr(e){return`'${e.replace(/'/g,"''")}'`}async function Sr(e,t){let n=`.backup ${yr(t)}`;await new Promise((r,o)=>{let s=Gt("sqlite3",[e,n],{stdio:["ignore","ignore","pipe"],timeout:hr,killSignal:"SIGKILL"}),u="";s.stderr?.on("data",a=>{u+=a.toString()}),s.once("error",o),s.once("exit",a=>{a===0?r():o(new Error(`sqlite3 .backup exited ${a}: ${u.trim()}`))})})}async function xe(e){try{return await fr(e)}catch{return}}function Yt(e,t){return e===void 0||t===void 0?e===void 0&&t===void 0:e.size===t.size&&e.mtimeMs===t.mtimeMs}function zt(e){return{wal:`${e}-wal`,shm:`${e}-shm`}}async function Tr(e){let{wal:t,shm:n}=zt(e),r=[e,t,n],o=Date.now(),s=o,u=await Promise.all(r.map(async a=>({path:a,st:await xe(a)})));for(;;){if(Date.now()-s>=mr)return u;if(Date.now()-o>=$t)throw new Error(`snapshot: ${e} never quiesced within ${$t}ms (actively written?)`);await new Promise(l=>setTimeout(l,gr));let a=await Promise.all(r.map(async l=>({path:l,st:await xe(l)})));a.every((l,f)=>Yt(l.st,u[f].st))||(s=Date.now()),u=a}}async function Er(e,t){let{wal:n,shm:r}=zt(e),o=await Tr(e);if(await Me(e,t),o.find(a=>a.path===n)?.st!==void 0&&await Me(n,`${t}-wal`),o.find(a=>a.path===r)?.st!==void 0&&await Me(r,`${t}-shm`),!(await Promise.all([e,n,r].map(async a=>({path:a,st:await xe(a)})))).every((a,c)=>Yt(a.st,o[c].st)))throw new Error(`snapshot: ${e} changed during quiesce-copy (torn-read guard)`)}async function Pr(e,t){let n;for(let r=1;r<=Vt;r++)try{await Er(e,t);return}catch(o){n=o}throw new Error(`snapshot: quiesce-copy of ${e} failed after ${Vt} attempts: ${String(n)}`)}async function Xt(e,t={}){let n=t.tmpDirBase??pr.tmpdir(),r=await lr(Ie.join(n,"pinta-copilot-snapshot-")),o=Ie.join(r,Ie.basename(e.absPath));try{if(await _r())try{return await Sr(e.absPath,o),o}catch{}return await Pr(e.absPath,o),o}catch(s){throw await dr(r,{recursive:!0,force:!0}).catch(()=>{}),s}}var br="pinta-copilot",Kt="events.jsonl",Ht="session.db",wr="rewind-snapshots/backups/";function Ar(){return ue.join(z(),"session-state")}function Rr(e,t){return ue.relative(e,t).split(ue.sep).join("/")}function kr(e){return e.endsWith(".db-wal")||e.endsWith(".db-shm")}function Mr(e){let[t]=e.split("/");return!t||t===e?{}:{sessionId:t}}function Ir(e,t){let n=e.split("/").length===2;return n&&t===Kt?"append-log":n&&t===Ht?"database":"rewritten-doc"}function Dr(e){let t=e.split("/"),n=t[t.length-1]??"";return t.length===2&&(n===Kt||n===Ht)?"session-log":e.includes(wr)?"other":"meta"}async function Zt(){return[Ar()]}async function*Wt(e,t){let n;try{n=await Or(t)}catch{return}try{for await(let r of n){let o=ue.join(t,r.name);r.isDirectory()?yield*Wt(e,o):r.isFile()&&(yield{absPath:o,relPath:Rr(e,o)})}}catch{return}}async function*xr(e){let[t]=await Zt(),n=e.since?.getTime();for await(let{absPath:r,relPath:o}of Wt(t,t)){let s=o.split("/"),u=s[s.length-1]??"";if(kr(u))continue;let a;try{a=await vr(r)}catch{continue}n!==void 0&&a.mtime.getTime()<=n||(yield{relPath:o,absPath:r,size:a.size,mtime:a.mtime,...Mr(o),semantics:Ir(o,u)})}}async function Nr(e){return Xt(e)}var jr={id:br,roots:Zt,scan:xr,classify:Dr,snapshot:Nr};_t();function Ur(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===Lr(Cr(e)).href}catch{return!1}}async function qr(){let e=await Bt();process.exit(e)}Ur()&&qr();export{jr as lifecycle};
12
+ `)}}tryAcquireLock(){let t=Date.now();try{S.default.mkdirSync(re.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<Bn;)try{let n=S.default.openSync(this.lockPath,"wx");return S.default.writeSync(n,String(process.pid)),S.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=S.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){S.default.unlinkSync(this.lockPath);continue}}catch{}let r=Fn,s=Date.now()+r;for(;Date.now()<s;);}return!1}release(){try{S.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))}};M.DiskRetryQueue=ge;var ye=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}};M.MemoryRetryQueue=ye});var dt=P(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.MemoryTransport=p.DiskTransport=p.MAX_POST_BYTES=void 0;p.parseHeadersEnv=ct;p.envOptionsResolver=lt;p.postOtlp=X;var it=_e(),at=he(),Vn=5e3;p.MAX_POST_BYTES=900*1024;function oe(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function ut(e,t,n){let r=[],s=[],i=[],o=0;for(let a of e){let c=t(a);if(c>n){s.push(a);continue}i.length>0&&o+c>n&&(r.push(i),i=[],o=0),i.push(a),o+=c}return i.length>0&&r.push(i),{chunks:r,oversize:s}}function ct(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let n of e.split(",")){let[r,...s]=n.split("=");r&&s.length>0&&(t[r.trim()]=s.join("=").trim())}return t}function lt(){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:ct(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function X(e,t,n){let r=new AbortController,s=setTimeout(()=>r.abort(),Vn);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 o="";try{o=(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}${o?` body=${o}`:""}
16
+ `),!1}return!0}catch(i){return process.stderr.write(`[${n}] OTLP POST failed: ${i.message??String(i)}
17
+ `),!1}finally{clearTimeout(s)}}var Se=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new it.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??lt}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await X(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:s}=ut(n,a=>oe(a.payload),p.MAX_POST_BYTES);s.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${s.length} oversized retry ${s.length===1?"entry":"entries"} (each > ${p.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
18
+ `);let i=[].concat(...r),o=0;for(let a of r){if(!await X((0,at.mergeBatch)(a.map(l=>l.payload)),t,this.logPrefix))break;o+=a.length}this.queue.rewrite(i.slice(o))}catch(n){process.stderr.write(`[${this.logPrefix}] flush failed: ${n?.message??String(n)}
19
+ `)}finally{this.queue.release()}}dropIfOversized(t){let n=oe(t);return n<=p.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${n} > ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
20
+ `),!0)}};p.DiskTransport=Se;var Te=class{queue=new it.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)>p.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
21
+ `);return}await X(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:s}=ut(n,oe,p.MAX_POST_BYTES);s.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${s.length} oversized buffered ${s.length===1?"payload":"payloads"} (each > ${p.MAX_POST_BYTES} bytes \u2014 undeliverable)
22
+ `);let i=[].concat(...r),o=0;for(let a of r){if(!await X((0,at.mergeBatch)(a),t,this.logPrefix))break;o+=a.length}for(let a of i.slice(o))this.queue.enqueue(a)}};p.MemoryTransport=Te});var ve=P(j=>{"use strict";var Oe=j&&j.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(j,"__esModule",{value:!0});j.TraceManager=void 0;j.generateUlid=pt;var ft=Oe(T("fs")),Gn=Oe(T("path")),zn=Oe(T("crypto")),Yn=ne(),Ee="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function pt(){let e=Date.now(),t="",n=e;for(let i=0;i<10;i++)t=Ee[n&31]+t,n=Math.floor(n/32);let r=zn.default.randomBytes(10),s="";for(let i=0;i<10;i++)s+=Ee[r[i]&31];for(;s.length<16;)s+=Ee[0];return t+s}var Pe=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=pt();return this.save(t),t}currentTrace(){try{let t=ft.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{ft.default.mkdirSync(Gn.default.dirname(this.tracePath),{recursive:!0}),(0,Yn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
23
+ `)}}};j.TraceManager=Pe});var _t=P(D=>{"use strict";var ht=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 mt=ht(T("fs")),Xn=ht(T("path")),gt=ve(),Kn=ne(),yt=200,be=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??yt}read(){try{let t=JSON.parse(mt.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{mt.default.mkdirSync(Xn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,Kn.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(t){let n=t||"default",r=(0,gt.generateUlid)(),s=this.read();return s[n]=r,this.write(s),r}currentTrace(t){let n=t||"default",r=this.read()[n];return r||this.newTrace(n)}};D.DiskSessionTraceManager=be;var we=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??yt}newTrace(t){let n=t||"default",r=(0,gt.generateUlid)();if(this.map.set(n,r),this.map.size>this.maxSessions){let s=this.map.keys().next().value;s!==void 0&&this.map.delete(s)}return r}currentTrace(t){let n=t||"default";return this.map.get(n)??this.newTrace(n)}};D.MemorySessionTraceManager=we});var Et=P(C=>{"use strict";var Ae=C&&C.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(C,"__esModule",{value:!0});C.envFilePath=Zn;C.parseEnvFile=Tt;C.loadEnvFile=Jn;var Hn=Ae(T("node:fs")),Wn=Ae(T("node:os")),St=Ae(T("node:path"));function Zn(e,t,n){let r=n?process.env[n]:void 0,s=r&&r.length>0?r:St.default.join(Wn.default.homedir(),e);return St.default.join(s,t)}function Tt(e){let t={};for(let n of e.split(`
24
+ `)){let r=n.trim();if(!r||r.startsWith("#"))continue;let s=r.indexOf("=");if(s<0)continue;let i=r.slice(0,s).trim(),o=r.slice(s+1).trim();(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),i&&(t[i]=o)}return t}function Jn(e){let t;try{t=Hn.default.readFileSync(e,"utf-8")}catch{return}let n=Tt(t);for(let[r,s]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=s)}});var L=P(u=>{"use strict";Object.defineProperty(u,"__esModule",{value:!0});u.loadEnvFile=u.parseEnvFile=u.envFilePath=u.MemorySessionTraceManager=u.DiskSessionTraceManager=u.generateUlid=u.TraceManager=u.MAX_POST_BYTES=u.parseHeadersEnv=u.envOptionsResolver=u.postOtlp=u.MemoryTransport=u.DiskTransport=u.MemoryRetryQueue=u.DiskRetryQueue=u.GUARD_BUDGET_HEADER=u.GUARD_STATUS_REFUSED=u.evaluateGuard=u.MAX_SPAN_BYTES=u.enforceSpanBudget=u.mergeBatch=u.attachGuard=u.buildPayload=u.clientAttrs=u.guardAttrs=u.attrsFromRecord=u.toOtlpValue=u.snakeCase=u.newSpanId=u.ulidToTraceId=u.MAX_BYTES=u.PATTERNS=u.applyMatches=u.resolveOverlaps=u.collectMatches=u.truncateTo=u.truncate=u.redact=void 0;var N=pe();Object.defineProperty(u,"redact",{enumerable:!0,get:function(){return N.redact}});Object.defineProperty(u,"truncate",{enumerable:!0,get:function(){return N.truncate}});Object.defineProperty(u,"truncateTo",{enumerable:!0,get:function(){return N.truncateTo}});Object.defineProperty(u,"collectMatches",{enumerable:!0,get:function(){return N.collectMatches}});Object.defineProperty(u,"resolveOverlaps",{enumerable:!0,get:function(){return N.resolveOverlaps}});Object.defineProperty(u,"applyMatches",{enumerable:!0,get:function(){return N.applyMatches}});Object.defineProperty(u,"PATTERNS",{enumerable:!0,get:function(){return N.PATTERNS}});Object.defineProperty(u,"MAX_BYTES",{enumerable:!0,get:function(){return N.MAX_BYTES}});var E=he();Object.defineProperty(u,"ulidToTraceId",{enumerable:!0,get:function(){return E.ulidToTraceId}});Object.defineProperty(u,"newSpanId",{enumerable:!0,get:function(){return E.newSpanId}});Object.defineProperty(u,"snakeCase",{enumerable:!0,get:function(){return E.snakeCase}});Object.defineProperty(u,"toOtlpValue",{enumerable:!0,get:function(){return E.toOtlpValue}});Object.defineProperty(u,"attrsFromRecord",{enumerable:!0,get:function(){return E.attrsFromRecord}});Object.defineProperty(u,"guardAttrs",{enumerable:!0,get:function(){return E.guardAttrs}});Object.defineProperty(u,"clientAttrs",{enumerable:!0,get:function(){return E.clientAttrs}});Object.defineProperty(u,"buildPayload",{enumerable:!0,get:function(){return E.buildPayload}});Object.defineProperty(u,"attachGuard",{enumerable:!0,get:function(){return E.attachGuard}});Object.defineProperty(u,"mergeBatch",{enumerable:!0,get:function(){return E.mergeBatch}});Object.defineProperty(u,"enforceSpanBudget",{enumerable:!0,get:function(){return E.enforceSpanBudget}});Object.defineProperty(u,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return E.MAX_SPAN_BYTES}});var Re=rt();Object.defineProperty(u,"evaluateGuard",{enumerable:!0,get:function(){return Re.evaluateGuard}});Object.defineProperty(u,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return Re.GUARD_STATUS_REFUSED}});Object.defineProperty(u,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return Re.GUARD_BUDGET_HEADER}});var Pt=_e();Object.defineProperty(u,"DiskRetryQueue",{enumerable:!0,get:function(){return Pt.DiskRetryQueue}});Object.defineProperty(u,"MemoryRetryQueue",{enumerable:!0,get:function(){return Pt.MemoryRetryQueue}});var F=dt();Object.defineProperty(u,"DiskTransport",{enumerable:!0,get:function(){return F.DiskTransport}});Object.defineProperty(u,"MemoryTransport",{enumerable:!0,get:function(){return F.MemoryTransport}});Object.defineProperty(u,"postOtlp",{enumerable:!0,get:function(){return F.postOtlp}});Object.defineProperty(u,"envOptionsResolver",{enumerable:!0,get:function(){return F.envOptionsResolver}});Object.defineProperty(u,"parseHeadersEnv",{enumerable:!0,get:function(){return F.parseHeadersEnv}});Object.defineProperty(u,"MAX_POST_BYTES",{enumerable:!0,get:function(){return F.MAX_POST_BYTES}});var Ot=ve();Object.defineProperty(u,"TraceManager",{enumerable:!0,get:function(){return Ot.TraceManager}});Object.defineProperty(u,"generateUlid",{enumerable:!0,get:function(){return Ot.generateUlid}});var vt=_t();Object.defineProperty(u,"DiskSessionTraceManager",{enumerable:!0,get:function(){return vt.DiskSessionTraceManager}});Object.defineProperty(u,"MemorySessionTraceManager",{enumerable:!0,get:function(){return vt.MemorySessionTraceManager}});var ke=Et();Object.defineProperty(u,"envFilePath",{enumerable:!0,get:function(){return ke.envFilePath}});Object.defineProperty(u,"parseEnvFile",{enumerable:!0,get:function(){return ke.parseEnvFile}});Object.defineProperty(u,"loadEnvFile",{enumerable:!0,get:function(){return ke.loadEnvFile}})});import{realpathSync as ns}from"node:fs";import{pathToFileURL as rs}from"node:url";var K=$(L());function Qn(){return(0,K.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function bt(e=Qn()){(0,K.loadEnvFile)(e)}import er from"os";import Ie from"path";function H(){return process.env.COPILOT_HOME||Ie.join(er.homedir(),".copilot")}function wt(){let e=process.env.COPILOT_PLUGIN_DATA||Ie.join(H(),"pinta-copilot-data");return{pluginData:e,tracePath:Ie.join(e,"trace.json")}}function At(e=process.env){return e.COPILOT_AGENT_JOB_ID||e.COPILOT_AGENT_SESSION_ID||e.COPILOT_AGENT_PROMPT?"cloud":e.ELECTRON_RUN_AS_NODE||e.VSCODE_IPC_HOOK||e.VSCODE_PID?"ext":"cli"}var Wt=$(L());function q(e){return typeof e=="string"?e:void 0}function W(e){return q(e.hook_event_name)??q(e.hookEventName)??q(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function Rt(e){return q(e.session_id)??q(e.sessionId)}function kt(e){return q(e.tool_name)??q(e.toolName)}var tr={sessionstart:"SessionStart",sessionend:"SessionEnd",userpromptsubmit:"UserPromptSubmit",userpromptsubmitted:"UserPromptSubmit",pretooluse:"PreToolUse",posttooluse:"PostToolUse",posttoolusefailure:"PostToolUseFailure",stop:"Stop",agentstop:"Stop",subagentstart:"SubagentStart",subagentstop:"SubagentStop",precompact:"PreCompact",notification:"Notification",permissionrequest:"PermissionRequest",erroroccurred:"ErrorOccurred"};function ie(e){let t=W(e);return t?tr[t.toLowerCase()]??"Unknown":"Unknown"}function It(e){return e==="PreToolUse"||e==="PermissionRequest"||e==="PostToolUse"}var nr=new Set(["report_intent","ask_user","AskUserQuestion"]);function Mt(e){return e!==void 0&&nr.has(e)}var rr="Pinta AI withheld this tool output because it matched a blocking policy. The tool already ran. Do not retry this operation to bypass the block.",sr="Pinta AI stopped this run because a tool output matched a blocking policy. The tool already ran and its original output may remain in the transcript. Review the incident and start a new session instead of resuming this one.";function Dt(e,t,n="cli",r){if(e==="PreToolUse"){let s={permissionDecision:"deny",permissionDecisionReason:t};return r&&W(r)==="preToolUse"?JSON.stringify(s):JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",...s}})}if(e==="PermissionRequest")return JSON.stringify({behavior:"deny",message:t});if(e==="PostToolUse"){let s=r!==void 0&&("tool_result"in r||"toolResult"in r),i=r!==void 0&&"tool_response"in r;return JSON.stringify(!s&&(i||n==="ext")?{continue:!1,stopReason:sr}:{modifiedResult:{resultType:"success",textResultForLlm:rr}})}return null}var A=$(L());function Nt(){let e=process.env.COPILOT_PLUGIN_OPTION_ENDPOINT||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:(0,A.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var ae=class extends A.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:Nt})}};function xt(e,t){if(!Nt())return;let n=Buffer.byteLength(JSON.stringify(e),"utf-8");if(n>A.MAX_POST_BYTES){process.stderr.write(`[pinta-copilot] dropping oversized span payload (${n} > ${A.MAX_POST_BYTES} bytes) - undeliverable, not queued
25
+ `);return}new A.DiskRetryQueue(t.pluginData,"pinta-copilot").enqueue(e)}var jt=$(L()),ue=class extends jt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import pr from"fs";import Ne from"os";import zt from"path";var ce="0.10.2";var U=$(L());import cr from"node:path";import R from"node:fs";import Ct from"node:path";var or=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),ir=256*1024,ar=1024*1024,ur=4096;function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Z(e){let t=O(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 Me(e){return typeof e=="string"&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,255}$/.test(e)?e:void 0}function J(e,t){let n=t.filter(r=>e[r]!==void 0).map(r=>Me(e[r]));return n.length>0&&n[0]!==void 0&&n.every(r=>r===n[0])?n[0]:void 0}function V(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 qt(e,t){let n=e.timestamp===void 0?V(t):V(e.timestamp);return n!==void 0&&n<=t?n:void 0}function Ut(e){if(typeof e!="string"||e.length>4096||/[\u0000-\u001f]/.test(e)||!Ct.isAbsolute(e)||Ct.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,ir));if(R.readSync(t,r,0,r.length,0)!==r.length)return;let s=r.indexOf(10),i;if(s>=0)try{i=O(JSON.parse(r.toString("utf8",0,s)))}catch{}let o=Math.max(0,n.size-ar),a=n.size<=r.length?r:Buffer.alloc(n.size-o);if(a!==r&&R.readSync(t,a,0,a.length,o)!==a.length)return;let c=R.fstatSync(t);if(c.size<n.size||c.size===n.size&&c.mtimeMs!==n.mtimeMs)return;let l=o>0?a.indexOf(10)+1:0,d=a.lastIndexOf(10);if(o>0&&l===0||d<l)return;let h=[],y=0;for(;d>l&&y<ur;){let k=a.lastIndexOf(10,d-1),x=Math.max(l,k+1),f=a.toString("utf8",x,d).trim();if(f){let _=O(JSON.parse(f));_&&h.push(_)}d=x-1,y++}return h.reverse(),{first:i,rows:h,complete:o===0&&d<0&&a[a.length-1]===10}}catch{return}finally{if(t!==void 0)try{R.closeSync(t)}catch{}}}function $t(e){let t=e[0];return t&&e.every(n=>n?.name===t.name)?t:void 0}var lr=new Set(["PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest"]),Bt=["agent_id","agentId"],Ft=["turn_id","turnId"];function dr(e,t,n){let r=[e.transcript_path,e.transcriptPath].filter(s=>s!==void 0);return r.length?r.every(s=>s===r[0])?r[0]:void 0:n==="cli"&&/^[A-Za-z0-9_-]{1,128}$/.test(t)?cr.join(H(),"session-state",t,"events.jsonl"):void 0}function Vt(e,t){return e.agentId!==void 0&&e.agentId!==null?Me(e.agentId)===t&&t!==void 0:t===void 0&&O(e.data)?.parentToolCallId==null}function Gt(e,t,n){let r=Z(e.model);if(r)return{name:r,source:"hook.model"};try{return fr(e,t,n)}catch{return}}function fr(e,t,n){let r=ie(e),s=J(e,["tool_use_id","toolUseId","tool_call_id","toolCallId"]),i=r==="SessionStart"&&e.source==="startup";if(!i&&(!lr.has(r)||!s))return;let o=J(e,["session_id","sessionId"]),a=J(e,Bt),c=J(e,Ft),l=qt(e,n);if(!o||l===void 0||Bt.some(f=>e[f]!==void 0)&&!a||Ft.some(f=>e[f]!==void 0)&&!c||!a&&["agent_name","agentName","agent_type","agentType"].some(f=>e[f]!==void 0))return;let d=Ut(dr(e,o,t)),h=d?.first,y=O(h?.data),k=V(h?.timestamp);if(!d||h?.type!=="session.start"||y?.sessionId!==o||k===void 0||k>l||d.rows.some(f=>f.type==="session.start"&&O(f.data)?.sessionId!==o))return;if(i){if(a||!d.complete||e.timestamp===void 0)return;let f=Z(y.selectedModel),_=k;for(let I of d.rows){if(I.type!=="session.model_change"||!Vt(I,void 0))continue;let b=V(I.timestamp);if(b===void 0)return;if(b>l||b<_)continue;let G=Z(O(I.data)?.newModel);if(b===_&&G!==f)return;f=G,_=b}return f?{name:f,source:"transcript.session.selected"}:void 0}let x=[];for(let f of d.rows){let _=O(f.data),I=V(f.timestamp);if(!_||I===void 0||I>l||I<k||!Vt(f,a)||c!==void 0&&_.turnId!==c)continue;let b=!1;if(f.type==="assistant.message"?b=Array.isArray(_.toolRequests)&&_.toolRequests.some(cn=>O(cn)?.toolCallId===s):(f.type==="tool.execution_start"||f.type==="tool.execution_complete")&&(b=_.toolCallId===s),!b)continue;let G=Z(_.model);x.push(G?{name:G,source:`transcript.${f.type}`}:void 0)}return $t(x)}var le;function mr(){if(le===void 0)try{le=Ne.userInfo().username}catch{le=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return le}var Yt=ce,hr=new Set(["","unknown","undefined","null","n/a","none"]);function v(e){let t=typeof e=="string"?e.trim():void 0;return t&&!hr.has(t.toLowerCase())?t:void 0}var gr=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function yr(e){let t=v(e);return t&&gr.test(t)?t:void 0}function _r(e){let t=e?v(e.copilot_version)??v(e.copilotVersion)??v(e.cli_version)??v(e.cliVersion)??v(e.version):void 0;return t||(De===void 0&&(De=Sr()),De??void 0)}var De;function Sr(){let e=v(process.env.COPILOT_CLI_BINARY_VERSION)??v(process.env.COPILOT_CLI_VERSION);if(e)return e;let t=v(process.env.COPILOT_CLI_RESOLVED_DIST_DIR);if(t){let n=yr(zt.basename(t));if(n)return n;let r=Tr(t);if(r)return r}return null}function Tr(e){try{let t=pr.readFileSync(zt.join(e,"package.json"),"utf8");return v(JSON.parse(t).version)}catch{return}}var Er=new Set(["copilot.hook","copilot.tool_name","copilot.toolName","copilot.tool_use_id","copilot.toolUseId","copilot.session_id","copilot.sessionId","copilot.transcript_path","copilot.transcriptPath","copilot.cwd","copilot.permission_mode","copilot.surface","copilot.agent_id","copilot.agent_type","copilot.agent_name","copilot.agent_display_name","copilot.stop_reason","copilot.notification_type"]),Pr=new Set(["copilot.tool_input","copilot.toolInput","copilot.toolArgs","copilot.tool_response","copilot.tool_result","copilot.toolResult"]),Or={skipRedactKeys:Er,bashContextKeys:Pr},vr=new Set(["hook_event_name","hookEventName","hookName"]);function br(e,t,n){let r=Object.fromEntries(Object.entries(e).filter(([s])=>!vr.has(s)));return Lt(r,Gt(e,t,n)),[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:W(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,U.attrsFromRecord)(r,"copilot",Or)]}function wr(e){let t=_r(e);return[{key:"service.name",value:{stringValue:"copilot"}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:Yt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:mr()}},{key:"host.name",value:{stringValue:Ne.hostname()}},{key:"host.arch",value:{stringValue:Ne.arch()}}]}function Xt(e){let t=e.now??Date.now();return(0,U.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,U.snakeCase)(W(e.event)??"unknown")}`,attributes:br(e.event,e.surface,t),resource:wr(e.event),scope:{name:"pinta-copilot",version:Yt},now:t})}var Kt=$(L());function Ar(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||100}var Rr=`pinta-copilot/${ce}`;function Ht(e,t){return(0,Kt.evaluateGuard)(e,t,{timeoutMs:Ar(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Rr})}async function kr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function Zt(){try{let e=wt(),t=At(),n=await kr(),r=JSON.parse(n),s=ie(r),i=Rt(r),o=new ue(e),a=s==="UserPromptSubmit"?o.newTrace(i):o.currentTrace(i),c=Xt({event:r,traceId:a,surface:t}),l=kt(r),d=null;if(It(s)&&!Mt(l)&&(d=await Ht(c,process.env.PINTA_GUARD_ENDPOINT)),d?.decision==="DENY"){let y=Dt(s,d.userMessage??d.reason??"guard_deny",t,r);y&&process.stdout.write(y+`
26
+ `)}if((0,Wt.attachGuard)(c,d),d&&s==="PostToolUse")for(let y of c.resourceSpans)for(let k of y.scopeSpans)for(let x of k.spans)x.attributes.push({key:"pinta.guard.target",value:{stringValue:"tool_output"}});if(d?.decision==="DENY")return xt(c,e),0;let h=new ae(e);await h.flush(),await h.send(c)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
27
+ `)}return 0}import{opendir as Vr,stat as Gr}from"node:fs/promises";import de from"node:path";import{spawn as en}from"node:child_process";import{copyFile as xe,mkdtemp as Ir,rm as Mr,stat as Dr}from"node:fs/promises";import Nr from"node:os";import je from"node:path";var xr=2e3,jr=250,Jt=3,Qt=3e4,Cr=3e4,Ce;function Lr(){return Ce||(Ce=new Promise(e=>{let t=en("sqlite3",["-version"],{stdio:"ignore"});t.once("error",()=>e(!1)),t.once("exit",n=>e(n===0))})),Ce}function qr(e){return`'${e.replace(/'/g,"''")}'`}async function Ur(e,t){let n=`.backup ${qr(t)}`;await new Promise((r,s)=>{let i=en("sqlite3",[e,n],{stdio:["ignore","ignore","pipe"],timeout:Cr,killSignal:"SIGKILL"}),o="";i.stderr?.on("data",a=>{o+=a.toString()}),i.once("error",s),i.once("exit",a=>{a===0?r():s(new Error(`sqlite3 .backup exited ${a}: ${o.trim()}`))})})}async function Le(e){try{return await Dr(e)}catch{return}}function tn(e,t){return e===void 0||t===void 0?e===void 0&&t===void 0:e.size===t.size&&e.mtimeMs===t.mtimeMs}function nn(e){return{wal:`${e}-wal`,shm:`${e}-shm`}}async function $r(e){let{wal:t,shm:n}=nn(e),r=[e,t,n],s=Date.now(),i=s,o=await Promise.all(r.map(async a=>({path:a,st:await Le(a)})));for(;;){if(Date.now()-i>=xr)return o;if(Date.now()-s>=Qt)throw new Error(`snapshot: ${e} never quiesced within ${Qt}ms (actively written?)`);await new Promise(l=>setTimeout(l,jr));let a=await Promise.all(r.map(async l=>({path:l,st:await Le(l)})));a.every((l,d)=>tn(l.st,o[d].st))||(i=Date.now()),o=a}}async function Br(e,t){let{wal:n,shm:r}=nn(e),s=await $r(e);if(await xe(e,t),s.find(a=>a.path===n)?.st!==void 0&&await xe(n,`${t}-wal`),s.find(a=>a.path===r)?.st!==void 0&&await xe(r,`${t}-shm`),!(await Promise.all([e,n,r].map(async a=>({path:a,st:await Le(a)})))).every((a,c)=>tn(a.st,s[c].st)))throw new Error(`snapshot: ${e} changed during quiesce-copy (torn-read guard)`)}async function Fr(e,t){let n;for(let r=1;r<=Jt;r++)try{await Br(e,t);return}catch(s){n=s}throw new Error(`snapshot: quiesce-copy of ${e} failed after ${Jt} attempts: ${String(n)}`)}async function rn(e,t={}){let n=t.tmpDirBase??Nr.tmpdir(),r=await Ir(je.join(n,"pinta-copilot-snapshot-")),s=je.join(r,je.basename(e.absPath));try{if(await Lr())try{return await Ur(e.absPath,s),s}catch{}return await Fr(e.absPath,s),s}catch(i){throw await Mr(r,{recursive:!0,force:!0}).catch(()=>{}),i}}var zr="pinta-copilot",sn="events.jsonl",on="session.db",Yr="rewind-snapshots/backups/";function Xr(){return de.join(H(),"session-state")}function Kr(e,t){return de.relative(e,t).split(de.sep).join("/")}function Hr(e){return e.endsWith(".db-wal")||e.endsWith(".db-shm")}function Wr(e){let[t]=e.split("/");return!t||t===e?{}:{sessionId:t}}function Zr(e,t){let n=e.split("/").length===2;return n&&t===sn?"append-log":n&&t===on?"database":"rewritten-doc"}function Jr(e){let t=e.split("/"),n=t[t.length-1]??"";return t.length===2&&(n===sn||n===on)?"session-log":e.includes(Yr)?"other":"meta"}async function an(){return[Xr()]}async function*un(e,t){let n;try{n=await Vr(t)}catch{return}try{for await(let r of n){let s=de.join(t,r.name);r.isDirectory()?yield*un(e,s):r.isFile()&&(yield{absPath:s,relPath:Kr(e,s)})}}catch{return}}async function*Qr(e){let[t]=await an(),n=e.since?.getTime();for await(let{absPath:r,relPath:s}of un(t,t)){let i=s.split("/"),o=i[i.length-1]??"";if(Hr(o))continue;let a;try{a=await Gr(r)}catch{continue}n!==void 0&&a.mtime.getTime()<=n||(yield{relPath:s,absPath:r,size:a.size,mtime:a.mtime,...Wr(s),semantics:Zr(s,o)})}}async function es(e){return rn(e)}var ts={id:zr,roots:an,scan:Qr,classify:Jr,snapshot:es};bt();function ss(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===rs(ns(e)).href}catch{return!1}}async function os(){let e=await Zt();process.exit(e)}ss()&&os();export{ts as lifecycle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinta-ai/pinta-copilot",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "description": "Generic OTLP forwarder + guard for GitHub Copilot hook events (CLI + VS Code extension)",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
@@ -41,7 +41,7 @@
41
41
  "prepublishOnly": "npm run build"
42
42
  },
43
43
  "devDependencies": {
44
- "@pinta-ai/core": "^0.9.0",
44
+ "@pinta-ai/core": "^0.9.2",
45
45
  "@types/node": "^22.0.0",
46
46
  "esbuild": "^0.24.0",
47
47
  "tsx": "^4.0.0",