@pinta-ai/pinta-copilot 0.9.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,57 @@
2
2
 
3
3
  All notable changes to pinta-copilot are documented here.
4
4
 
5
+ ## [Unreleased]
6
+
7
+ ## [0.10.1] - 2026-09-29
8
+
9
+ ### Fixed
10
+
11
+ - Evaluate successful `PostToolUse` results with the same guard and original
12
+ redaction-aware OTLP payload used for telemetry.
13
+ - Withhold denied CLI/SDK/cloud results using the supported `modifiedResult`
14
+ contract; stop VS Code Local runs using `continue: false`. Native result
15
+ shape takes precedence over environment-only surface detection.
16
+ - Use fixed English messages, never untrusted result text or guard reasons.
17
+ - Finish every decided DENY without network telemetry. Persist the original
18
+ redacted span in the existing retry queue for the next eligible hook, so a
19
+ delayed collector cannot cause the host to time out and discard the denial.
20
+ This also protects existing before-tool and permission denials. Telemetry
21
+ disabled/guard-only mode does not retain a queued span.
22
+ - Preserve original evidence and span identity, adding
23
+ `pinta.guard.target = "tool_output"` rather than claiming that an already
24
+ executed tool was prevented. Apply the existing payload redaction context
25
+ equally to native `toolArgs`/`toolResult` casing.
26
+ - Add CJS/ESM native-stdin regressions and ordering/error-path coverage.
27
+
28
+ ### Compatibility
29
+
30
+ - Requires the host's synchronous successful-output hook contract; completion
31
+ before host timeout is still necessary. Before-tool/permission gating,
32
+ internal tools, failed-tool telemetry, ALLOW/REVIEW and guard fail-open
33
+ behavior remain unchanged. No policy thresholds change.
34
+ - A Local stop does not clear its transcript or make resume safe; start a new
35
+ session. No persistent session quarantine or automatic context clearing is
36
+ introduced.
37
+ - Denied-span backend visibility is deferred until a later telemetry hook;
38
+ after a stopped run this may be a new session.
39
+ - Roll out the corresponding guard-runtime projection update to Manager and
40
+ backend first, so native result casing and output-versus-execution outcomes
41
+ are interpreted correctly.
42
+ ## [0.10.0] - 2026-09-30
43
+
44
+ ### Changed
45
+
46
+ - The guard timeout default is 100ms, up from 50ms (PTA-579). 50ms failed open
47
+ on healthy calls — a fresh hook process's first fetch runs past it — and the
48
+ gate then allowed the call with no verdict. `PINTA_GUARD_TIMEOUT_MS` still
49
+ overrides it.
50
+ - With `@pinta-ai/core` 0.9.0 the effective timeout, env override included, is
51
+ sent to the manager as `x-pinta-guard-budget-ms`. The manager bounds its own
52
+ work (the backend package check) to 80% of that value instead of reading
53
+ copilot's budget from a copy of the old default kept in its own repo, which
54
+ gave up on the package check at 40ms whatever this adaptor waited.
55
+
5
56
  ## [0.9.0] - 2026-09-22
6
57
 
7
58
  ### Added
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,7 +50,7 @@ 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)
@@ -60,6 +62,63 @@ On `preToolUse` (all surfaces) and `permissionRequest` (CLI only) the adapter qu
60
62
 
61
63
  Guard is **fail-open** (no endpoint / timeout / error → allow), so it never breaks a session.
62
64
 
65
+ Once a `DENY` is decided, the hook does **not** wait for collector IO. It emits
66
+ the enforcement response, appends the original redacted span to the existing
67
+ local retry queue, and finishes. This applies to before-tool, permission, and
68
+ after-tool denials: otherwise a collector delay can cause the host to time out
69
+ and discard even an already-written denial. The next eligible telemetry hook
70
+ flushes the queued span with its original IDs and evidence. Backend visibility
71
+ can therefore be delayed until that hook; a stopped run may need a new session
72
+ to trigger delivery. No span is queued when telemetry is disabled. Local
73
+ persistence failures are reported without discarding the enforcement response.
74
+
75
+ ### Successful tool-output enforcement
76
+
77
+ Before-tool hooks cannot inspect contents that the tool has not returned yet.
78
+ `PostToolUse` now sends the original redaction-aware OTLP payload to the same
79
+ guard. On `DENY`, the adapter emits the host's supported response and defers
80
+ network telemetry as described above:
81
+
82
+ - **Copilot CLI/SDK/cloud:** `modifiedResult` with `resultType: "success"` and
83
+ a fixed, safe `textResultForLlm` replaces the denied result.
84
+ - **VS Code Local:** `continue: false` with a fixed `stopReason` stops the run.
85
+
86
+ The native `tool_result`/`toolResult` shape takes precedence over inherited
87
+ editor environment variables; Copilot SDK sessions inside VS Code must not
88
+ receive a Local-only stop response. Local `tool_response` uses the stop
89
+ contract. Both snake_case and camelCase input forms are supported; response
90
+ keys use the documented casing.
91
+
92
+ Keep the generated hook registration's per-command
93
+ `env: { "PINTA_COPILOT_EVENT": "PostToolUse" }` binding. Some native Copilot
94
+ payloads omit every event-name field. The installer and Manager bind each
95
+ registered event explicitly; custom registrations must do the same, using the
96
+ matching name for each hook, **not one global value for all events**. Without
97
+ either a discriminator or that binding, the event remains unknown and cannot
98
+ be guarded. Tool-result contents are not used to guess the firing event.
99
+
100
+ No untrusted output or guard-supplied reason is echoed into either response.
101
+ The original masked/truncated input and output remain on the same telemetry
102
+ span and `spanId`, together with the verdict and
103
+ `pinta.guard.target = "tool_output"`. The tool **already ran**: withholding a
104
+ result or stopping a run does not undo its effects. For the Local stop path,
105
+ the result may remain in the transcript; start a new session, not a resumed
106
+ tainted conversation.
107
+
108
+ `ALLOW`, `REVIEW`, inactive guarding and existing fail-open behavior are
109
+ unchanged. Internal control tools remain telemetry-only.
110
+ `PostToolUseFailure` remains telemetry-only: this gate covers successful
111
+ results, not failed-tool error content.
112
+
113
+ Enforcement requires synchronous hooks, a host honoring the documented
114
+ [Copilot result-replacement](https://docs.github.com/en/copilot/reference/hooks-reference#posttooluse-output)
115
+ or [VS Code Local stop](https://code.visualstudio.com/docs/agents/reference/hooks-reference)
116
+ contract, and completion within the host timeout. Added context, a
117
+ PreToolUse-shaped denial, or exit code 2 alone is not output withholding.
118
+ Deploy the corresponding guard-runtime projection update to Manager and
119
+ backend before rolling out these adapters: older readers can miss native
120
+ camelCase result fields or confuse output denial with a prevented tool call.
121
+
63
122
  ## Span conventions
64
123
 
65
124
  | Attribute | Value |
@@ -70,6 +129,7 @@ Guard is **fail-open** (no endpoint / timeout / error → allow), so it never br
70
129
  | `copilot.model` | Exact host-reported model ID, when attributable; never a placeholder |
71
130
  | `copilot.model_source` | Evidence for the model value (see below) |
72
131
  | `copilot.<key>` | Every other top-level field (Bronze flattening, raw key preserved) |
132
+ | `pinta.guard.target` | `tool_output` for a non-null successful after-tool verdict; absent on before-tool gates |
73
133
  | `service.name` | `"copilot"` · `telemetry.sdk.name` `"pinta-copilot"` |
74
134
 
75
135
  ### CLI ↔ ext payload differences (absorbed by the adapter)
@@ -145,7 +205,7 @@ src/
145
205
  │ ├── trace.ts # per-turn ULID trace, keyed by session_id
146
206
  │ ├── transport.ts # POST OTLP/HTTP traces (reads OTel env at call time)
147
207
  │ ├── retry-queue.ts # file-backed JSONL queue, flushed next invocation
148
- │ ├── guard.ts # POST PINTA_GUARD_ENDPOINT (50ms), fail-open
208
+ │ ├── guard.ts # POST PINTA_GUARD_ENDPOINT (100ms), fail-open
149
209
  │ ├── redact.ts # Tier-1 redaction + Tier-3 truncation
150
210
  │ ├── config.ts / env-bridge.ts
151
211
  └── tools/install-hooks.ts # write/remove ~/.copilot/hooks/pinta-copilot.json
@@ -161,6 +221,11 @@ npm run smoke:model # built CJS/ESM hooks -> isolated loopback collector
161
221
  npm run mock-server # local OTLP collector
162
222
  ```
163
223
 
224
+ The integration suite exercises both built CJS/ESM entrypoints against a
225
+ loopback guard and collector: native/legacy result casing, CLI/cloud/Local
226
+ contracts, retained original evidence, nonblocking verdicts and transport
227
+ failures. Hook unit tests also pin denial-before-telemetry ordering.
228
+
164
229
  `smoke:model` runs fresh hook processes with isolated HOME/plugin data and no
165
230
  manager/guard calls. It covers supplied, missing, placeholder, correlated,
166
231
  cross-session/subagent, future, partial and oversized transcript cases. Local
package/dist/index.js CHANGED
@@ -1,21 +1,22 @@
1
- "use strict";var Ut=Object.create;var ke=Object.defineProperty;var Bt=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var $t=Object.getPrototypeOf,Gt=Object.prototype.hasOwnProperty;var T=(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 Ft(t))!Gt.call(e,o)&&o!==n&&ke(e,o,{get:()=>t[o],enumerable:!(r=Bt(t,o))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?Ut($t(e)):{},Yt(t||!e||!e.__esModule?ke(n,"default",{value:e,enumerable:!0}):n,e));var ue=T(h=>{"use strict";Object.defineProperty(h,"__esModule",{value:!0});h.PATTERNS=h.MAX_BYTES=void 0;h.truncateTo=Me;h.truncate=zt;h.collectMatches=Ie;h.resolveOverlaps=xe;h.applyMatches=Ne;h.redact=Xt;h.MAX_BYTES=102400;function Me(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 Me(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 Ie(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),_=f+a.length;n.push({start:c,end:l,replaceStart:f,replaceEnd:_,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=Ie(e,t);if(n.length===0)return e;let r=xe(n);return Ne(e,r)}});var le=T(m=>{"use strict";var Kt=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=Le;m.newSpanId=Ve;m.snakeCase=Jt;m.toOtlpValue=qe;m.attrsFromRecord=Wt;m.guardAttrs=Ue;m.clientAttrs=Be;m.enforceSpanBudget=Fe;m.buildPayload=Qt;m.attachGuard=$e;m.mergeBatch=en;var Zt=Kt(require("crypto")),ce=ue(),Ht="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=Ht.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 Zt.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 De=new Set;function X(e,t,n){let r=(0,ce.truncate)(t);if((n.skipRedactKeys??De).has(e))return r;let o=(n.bashContextKeys??De).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 Ue(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 Be(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 je(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Ce=1024;function Fe(e,t=m.MAX_SPAN_BYTES){let n=je(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<=Ce)break;let u=n-t,a=Math.max(Ce,i-u-64);o.stringValue=(0,ce.truncateTo)(o.stringValue,a),n=je(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(...Ue(t));let o=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return o&&r.attributes.push(...Be(o)),e}function en(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var Ge=T(L=>{"use strict";Object.defineProperty(L,"__esModule",{value:!0});L.GUARD_STATUS_REFUSED=void 0;L.evaluateGuard=on;var tn=1e4,nn="pinta-core";function K(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var rn=new Set(["ALLOW","DENY","REVIEW"]);L.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}:{}},body:JSON.stringify(e),signal:i.signal});if(a.status===L.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 Z=T(F=>{"use strict";var sn=F&&F.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(F,"__esModule",{value:!0});F.atomicWriteFileSync=an;var Ye=sn(require("fs"));function an(e,t){let n=`${e}.${process.pid}.tmp`;Ye.default.writeFileSync(n,t),Ye.default.renameSync(n,e)}});var pe=T(w=>{"use strict";var ze=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(w,"__esModule",{value:!0});w.MemoryRetryQueue=w.DiskRetryQueue=void 0;var S=ze(require("fs")),H=ze(require("path")),un=Z(),J=1e3,cn=50,ln=5,de=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=H.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{S.default.mkdirSync(H.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(H.default.dirname(this.filePath),{recursive:!0}),(0,un.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
1
+ "use strict";var Ft=Object.create;var Me=Object.defineProperty;var Gt=Object.getOwnPropertyDescriptor;var $t=Object.getOwnPropertyNames;var Yt=Object.getPrototypeOf,zt=Object.prototype.hasOwnProperty;var P=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Xt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $t(t))!zt.call(e,o)&&o!==n&&Me(e,o,{get:()=>t[o],enumerable:!(r=Gt(t,o))||r.enumerable});return e};var _=(e,t,n)=>(n=e!=null?Ft(Yt(e)):{},Xt(t||!e||!e.__esModule?Me(n,"default",{value:e,enumerable:!0}):n,e));var ue=P(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.PATTERNS=g.MAX_BYTES=void 0;g.truncateTo=Ie;g.truncate=Kt;g.collectMatches=De;g.resolveOverlaps=xe;g.applyMatches=Ne;g.redact=Ht;g.MAX_BYTES=102400;function Ie(e,t){let n=Buffer.from(e,"utf-8");return n.length<=t?e:`${n.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${n.length}]`}function Kt(e){return Ie(e,g.MAX_BYTES)}g.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function De(e,t){let n=[];for(let r of g.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;let o=new RegExp(r.regex.source,r.regex.flags),i;for(;(i=o.exec(e))!==null;){let u=r.captureGroup??0,a=i[u];if(a===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}let c=i.index,f=i.index+i[0].length,l=c+i[0].indexOf(a),S=l+a.length;n.push({start:c,end:f,replaceStart:l,replaceEnd:S,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 Ht(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=P(m=>{"use strict";var Zt=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=Ce;m.newSpanId=Ve;m.snakeCase=Qt;m.toOtlpValue=qe;m.attrsFromRecord=en;m.guardAttrs=Be;m.clientAttrs=Fe;m.enforceSpanBudget=Ge;m.buildPayload=tn;m.attachGuard=$e;m.mergeBatch=nn;var Jt=Zt(require("crypto")),ce=ue(),Wt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ce(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=Wt.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 Jt.default.randomBytes(8).toString("hex")}function Qt(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 K(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:K(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:K(e,JSON.stringify(t),n)}}catch{return{stringValue:K(e,String(t),n)}}default:return{stringValue:K(e,String(t),n)}}}function en(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 Fe(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 Ue(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Le=1024;function Ge(e,t=m.MAX_SPAN_BYTES){let n=Ue(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 f=Buffer.byteLength(c.value.stringValue,"utf-8");f>i&&(i=f,o=c.value)}if(o===null||i<=Le)break;let u=n-t,a=Math.max(Le,i-u-64);o.stringValue=(0,ce.truncateTo)(o.stringValue,a),n=Ue(e)}return e}function tn(e){let t=e.now??Date.now(),n=(BigInt(t)*1000000n).toString(),r=[...e.attributes],o={traceId:Ce(e.traceId),spanId:Ve(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};Ge(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(...Fe(o)),e}function nn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var Ye=P(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.GUARD_STATUS_REFUSED=R.GUARD_BUDGET_HEADER=void 0;R.evaluateGuard=an;var rn=1e4,on="pinta-core";R.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function H(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var sn=new Set(["ALLOW","DENY","REVIEW"]);R.GUARD_STATUS_REFUSED=410;async function an(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??rn,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??on,"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 H(Date.now()-o,"refused");if(a.status!==200)return H(Date.now()-o,"error");let c=await a.json(),f=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!sn.has(c.decision)||!f)return H(Date.now()-o,"error");let l=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??l,clientRttMs:l}}catch(a){let c=a.name,f=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return H(Date.now()-o,f)}finally{clearTimeout(u)}}});var Z=P(G=>{"use strict";var un=G&&G.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(G,"__esModule",{value:!0});G.atomicWriteFileSync=cn;var ze=un(require("fs"));function cn(e,t){let n=`${e}.${process.pid}.tmp`;ze.default.writeFileSync(n,t),ze.default.renameSync(n,e)}});var pe=P(I=>{"use strict";var Xe=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 y=Xe(require("fs")),J=Xe(require("path")),ln=Z(),W=1e3,dn=50,fn=5,de=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})+`
2
+ `;y.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
3
+ `)}}readAll(){try{let t=y.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){y.default.existsSync(this.filePath)&&y.default.unlinkSync(this.filePath);return}y.default.mkdirSync(J.default.dirname(this.filePath),{recursive:!0}),(0,ln.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
5
5
  `)+`
6
6
  `)}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${n}
7
- `)}}tryAcquireLock(){let t=Date.now();try{S.default.mkdirSync(H.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))}};w.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}};w.MemoryRetryQueue=fe});var We=T(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.MemoryTransport=p.DiskTransport=p.MAX_POST_BYTES=void 0;p.parseHeadersEnv=He;p.envOptionsResolver=Je;p.postOtlp=$;var Xe=pe(),Ke=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 He(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 Je(){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:He(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function $(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}`:""}
7
+ `)}}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}
8
+ `),!1}for(;Date.now()-t<dn;)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}
9
+ `),!1;try{let i=y.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){y.default.unlinkSync(this.lockPath);continue}}catch{}let r=fn,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<=W)return;let n=t.length-W;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
10
+ `),this.rewrite(t.slice(n))}};I.DiskRetryQueue=de;var fe=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>W&&this.entries.splice(0,this.entries.length-W)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};I.MemoryRetryQueue=fe});var Qe=P(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=$;var Ke=pe(),He=le(),pn=5e3;p.MAX_POST_BYTES=900*1024;function Q(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 $(e,t,n){let r=new AbortController,o=setTimeout(()=>r.abort(),pn);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
11
  `),!1}return!0}catch(i){return process.stderr.write(`[${n}] OTLP POST failed: ${i.message??String(i)}
12
- `),!1}finally{clearTimeout(o)}}var me=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new Xe.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Je}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await $(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 $((0,Ke.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=me;var _e=class{queue=new Xe.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 $(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 $((0,Ke.mergeBatch)(a),t,this.logPrefix))break;u+=a.length}for(let a of i.slice(u))this.queue.enqueue(a)}};p.MemoryTransport=_e});var Se=T(I=>{"use strict";var ye=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.TraceManager=void 0;I.generateUlid=et;var Qe=ye(require("fs")),fn=ye(require("path")),pn=ye(require("crypto")),mn=Z(),ge="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function et(){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=et();return this.save(t),t}currentTrace(){try{let t=Qe.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{Qe.default.mkdirSync(fn.default.dirname(this.tracePath),{recursive:!0}),(0,mn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
18
- `)}}};I.TraceManager=he});var st=T(k=>{"use strict";var nt=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.MemorySessionTraceManager=k.DiskSessionTraceManager=void 0;var tt=nt(require("fs")),_n=nt(require("path")),rt=Se(),gn=Z(),ot=200,Oe=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??ot}read(){try{let t=JSON.parse(tt.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{tt.default.mkdirSync(_n.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,rt.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)}};k.DiskSessionTraceManager=Oe;var Te=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??ot}newTrace(t){let n=t||"default",r=(0,rt.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)}};k.MemorySessionTraceManager=Te});var ut=T(x=>{"use strict";var Pe=x&&x.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(x,"__esModule",{value:!0});x.envFilePath=Sn;x.parseEnvFile=at;x.loadEnvFile=On;var hn=Pe(require("node:fs")),yn=Pe(require("node:os")),it=Pe(require("node:path"));function Sn(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:it.default.join(yn.default.homedir(),e);return it.default.join(o,t)}function at(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 On(e){let t;try{t=hn.default.readFileSync(e,"utf-8")}catch{return}let n=at(t);for(let[r,o]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=o)}});var N=T(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_STATUS_REFUSED=s.evaluateGuard=s.MAX_SPAN_BYTES=s.enforceSpanBudget=s.mergeBatch=s.attachGuard=s.buildPayload=s.clientAttrs=s.guardAttrs=s.attrsFromRecord=s.toOtlpValue=s.snakeCase=s.newSpanId=s.ulidToTraceId=s.MAX_BYTES=s.PATTERNS=s.applyMatches=s.resolveOverlaps=s.collectMatches=s.truncateTo=s.truncate=s.redact=void 0;var M=ue();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return M.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return M.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return M.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return M.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return M.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return M.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return M.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return M.MAX_BYTES}});var O=le();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return O.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return O.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return O.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return O.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return O.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return O.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return O.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return O.buildPayload}});Object.defineProperty(s,"attachGuard",{enumerable:!0,get:function(){return O.attachGuard}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return O.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return O.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return O.MAX_SPAN_BYTES}});var ct=Ge();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return ct.evaluateGuard}});Object.defineProperty(s,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return ct.GUARD_STATUS_REFUSED}});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 V=We();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return V.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return V.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return V.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return V.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return V.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return V.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=st();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return ft.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return ft.MemorySessionTraceManager}});var Ee=ut();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return Ee.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return Ee.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return Ee.loadEnvFile}})});var G=g(N());function Tn(){return(0,G.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function pt(e=Tn()){(0,G.loadEnvFile)(e)}var mt=g(require("os")),Q=g(require("path"));function ve(){return process.env.COPILOT_HOME||Q.default.join(mt.default.homedir(),".copilot")}function _t(){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 Lt=g(N());function D(e){return typeof e=="string"?e:void 0}function ee(e){return D(e.hook_event_name)??D(e.hookEventName)??D(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function ht(e){return D(e.session_id)??D(e.sessionId)}function yt(e){return D(e.tool_name)??D(e.toolName)}var Pn={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?Pn[t.toLowerCase()]??"Unknown":"Unknown"}function St(e){return e==="PreToolUse"||e==="PermissionRequest"}var En=new Set(["report_intent","ask_user"]);function Ot(e){return e!==void 0&&En.has(e)}function Tt(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 vn(){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:vn})}};var Pt=g(N()),oe=class extends Pt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var xt=g(require("fs")),ae=g(require("os")),we=g(require("path"));var se="0.9.0";var j=g(N());var Mt=g(require("node:path"));var P=g(require("node:fs")),be=g(require("node:path")),bn=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),An=256*1024,Rn=1024*1024,wn=4096;function E(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Y(e){let t=E(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)&&!bn.has(r.toLowerCase())?r:void 0}function Et(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 z(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 q(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 vt(e,t){let n=e.timestamp===void 0?q(t):q(e.timestamp);return n!==void 0&&n<=t?n:void 0}function bt(e){if(typeof e!="string"||e.length>4096||/[\u0000-\u001f]/.test(e)||!be.default.isAbsolute(e)||be.default.extname(e)!==".jsonl")return;let t;try{t=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,An));if(P.default.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),i;if(o>=0)try{i=E(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&&P.default.readSync(t,a,0,a.length,u)!==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=u>0?a.indexOf(10)+1:0,f=a.lastIndexOf(10);if(u>0&&l===0||f<l)return;let _=[],A=0;for(;f>l&&A<wn;){let C=a.lastIndexOf(10,f-1),U=Math.max(l,C+1),d=a.toString("utf8",U,f).trim();if(d){let y=E(JSON.parse(d));y&&_.push(y)}f=U-1,A++}return _.reverse(),{first:i,rows:_,complete:u===0&&f<0&&a[a.length-1]===10}}catch{return}finally{if(t!==void 0)try{P.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?Ae(e.agentId)===t&&t!==void 0:t===void 0&&E(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=vt(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=bt(Mn(e,u,t)),_=f?.first,A=E(_?.data),C=q(_?.timestamp);if(!f||_?.type!=="session.start"||A?.sessionId!==u||C===void 0||C>l||f.rows.some(d=>d.type==="session.start"&&E(d.data)?.sessionId!==u))return;if(i){if(a||!f.complete||e.timestamp===void 0)return;let d=Y(A.selectedModel),y=C;for(let R of f.rows){if(R.type!=="session.model_change"||!kt(R,void 0))continue;let b=q(R.timestamp);if(b===void 0)return;if(b>l||b<y)continue;let B=Y(E(R.data)?.newModel);if(b===y&&B!==d)return;d=B,y=b}return d?{name:d,source:"transcript.session.selected"}:void 0}let U=[];for(let d of f.rows){let y=E(d.data),R=q(d.timestamp);if(!y||R===void 0||R>l||R<C||!kt(d,a)||c!==void 0&&y.turnId!==c)continue;let b=!1;if(d.type==="assistant.message"?b=Array.isArray(y.toolRequests)&&y.toolRequests.some(qt=>E(qt)?.toolCallId===o):(d.type==="tool.execution_start"||d.type==="tool.execution_complete")&&(b=y.toolCallId===o),!b)continue;let B=Y(y.model);U.push(B?{name:B,source:`transcript.${d.type}`}:void 0)}return At(U)}var ie;function xn(){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 Nt=se,Nn=new Set(["","unknown","undefined","null","n/a","none"]);function v(e){let t=typeof e=="string"?e.trim():void 0;return t&&!Nn.has(t.toLowerCase())?t:void 0}var Dn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function jn(e){let t=v(e);return t&&Dn.test(t)?t:void 0}function Cn(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||(Re===void 0&&(Re=Ln()),Re??void 0)}var Re;function Ln(){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=jn(we.default.basename(t));if(n)return n;let r=Vn(t);if(r)return r}return null}function Vn(e){try{let t=xt.default.readFileSync(we.default.join(e,"package.json"),"utf8");return v(JSON.parse(t).version)}catch{return}}var qn=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"]),Un=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),Bn={skipRedactKeys:qn,bashContextKeys:Un},Fn=new Set(["hook_event_name","hookEventName","hookName"]);function $n(e,t,n){let r=Object.fromEntries(Object.entries(e).filter(([o])=>!Fn.has(o)));return Et(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,j.attrsFromRecord)(r,"copilot",Bn)]}function Gn(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:Nt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:xn()}},{key:"host.name",value:{stringValue:ae.default.hostname()}},{key:"host.arch",value:{stringValue:ae.default.arch()}}]}function Dt(e){let t=e.now??Date.now();return(0,j.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,j.snakeCase)(ee(e.event)??"unknown")}`,attributes:$n(e.event,e.surface,t),resource:Gn(e.event),scope:{name:"pinta-copilot",version:Nt},now:t})}var jt=g(N());function Yn(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||50}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 Vt(){try{let e=_t(),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=Dt({event:r,traceId:c,surface:t}),f=yt(r),_=null;if(St(o)&&!Ot(f)&&(_=await Ct(l,process.env.PINTA_GUARD_ENDPOINT)),_?.decision==="DENY"){let A=Tt(o,_.userMessage??_.reason??"guard_deny");A&&process.stdout.write(A+`
20
- `)}(0,Lt.attachGuard)(l,_),await u.send(l)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
21
- `)}return 0}pt();async function Kn(){let e=await Vt();process.exit(e)}Kn();
12
+ `),!1}finally{clearTimeout(o)}}var me=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 $(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=>Q(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 $((0,He.mergeBatch)(a.map(f=>f.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=Q(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=me;var _e=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(Q(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 $(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,Q,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 $((0,He.mergeBatch)(a),t,this.logPrefix))break;u+=a.length}for(let a of i.slice(u))this.queue.enqueue(a)}};p.MemoryTransport=_e});var Se=P(j=>{"use strict";var ye=j&&j.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(j,"__esModule",{value:!0});j.TraceManager=void 0;j.generateUlid=tt;var et=ye(require("fs")),mn=ye(require("path")),_n=ye(require("crypto")),gn=Z(),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=_n.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(mn.default.dirname(this.tracePath),{recursive:!0}),(0,gn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
18
+ `)}}};j.TraceManager=he});var it=P(D=>{"use strict";var rt=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 nt=rt(require("fs")),hn=rt(require("path")),ot=Se(),yn=Z(),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(hn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,yn.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)}};D.DiskSessionTraceManager=Te;var Oe=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)}};D.MemorySessionTraceManager=Oe});var ct=P(U=>{"use strict";var Pe=U&&U.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(U,"__esModule",{value:!0});U.envFilePath=On;U.parseEnvFile=ut;U.loadEnvFile=Pn;var Sn=Pe(require("node:fs")),Tn=Pe(require("node:os")),at=Pe(require("node:path"));function On(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:at.default.join(Tn.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 Pn(e){let t;try{t=Sn.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 L=P(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 x=ue();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return x.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return x.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return x.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return x.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return x.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return x.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return x.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return x.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 Ee=Ye();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Ee.evaluateGuard}});Object.defineProperty(s,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return Ee.GUARD_STATUS_REFUSED}});Object.defineProperty(s,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return Ee.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 q=Qe();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return q.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return q.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return q.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return q.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return q.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return q.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 Y=_(L());function En(){return(0,Y.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function pt(e=En()){(0,Y.loadEnvFile)(e)}var mt=_(require("os")),ee=_(require("path"));function ve(){return process.env.COPILOT_HOME||ee.default.join(mt.default.homedir(),".copilot")}function _t(){let e=process.env.COPILOT_PLUGIN_DATA||ee.default.join(ve(),"pinta-copilot-data");return{pluginData:e,tracePath:ee.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 Vt=_(L());function C(e){return typeof e=="string"?e:void 0}function te(e){return C(e.hook_event_name)??C(e.hookEventName)??C(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function ht(e){return C(e.session_id)??C(e.sessionId)}function yt(e){return C(e.tool_name)??C(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 ne(e){let t=te(e);return t?bn[t.toLowerCase()]??"Unknown":"Unknown"}function St(e){return e==="PreToolUse"||e==="PermissionRequest"||e==="PostToolUse"}var vn=new Set(["report_intent","ask_user"]);function Tt(e){return e!==void 0&&vn.has(e)}var An="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.",Rn="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 Ot(e,t,n="cli",r){if(e==="PreToolUse")return JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}});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:Rn}:{modifiedResult:{resultType:"success",textResultForLlm:An}})}return null}var w=_(L());function Pt(){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 re=class extends w.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:Pt})}};function Et(e,t){if(!Pt())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
20
+ `);return}new w.DiskRetryQueue(t.pluginData,"pinta-copilot").enqueue(e)}var bt=_(L()),oe=class extends bt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var Nt=_(require("fs")),ae=_(require("os")),ke=_(require("path"));var se="0.10.1";var V=_(L());var Dt=_(require("node:path"));var E=_(require("node:fs")),Ae=_(require("node:path")),wn=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),kn=256*1024,Mn=1024*1024,In=4096;function b(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function z(e){let t=b(e),n=t?"id"in t?t.id:t.name:e;if(typeof n!="string")return;let r=n.trim();if(!(r.startsWith("{")||r.startsWith("[")))return r.length<=512&&!/[\u0000-\u001f\u007f]/.test(r)&&!wn.has(r.toLowerCase())?r:void 0}function vt(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 X(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 B(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 At(e,t){let n=e.timestamp===void 0?B(t):B(e.timestamp);return n!==void 0&&n<=t?n:void 0}function Rt(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=E.default.openSync(e,E.default.constants.O_RDONLY|E.default.constants.O_NONBLOCK|(E.default.constants.O_NOFOLLOW??0));let n=E.default.fstatSync(t);if(!n.isFile()||!Number.isSafeInteger(n.size)||n.size<=0)return;let r=Buffer.alloc(Math.min(n.size,kn));if(E.default.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),i;if(o>=0)try{i=b(JSON.parse(r.toString("utf8",0,o)))}catch{}let u=Math.max(0,n.size-Mn),a=n.size<=r.length?r:Buffer.alloc(n.size-u);if(a!==r&&E.default.readSync(t,a,0,a.length,u)!==a.length)return;let c=E.default.fstatSync(t);if(c.size<n.size||c.size===n.size&&c.mtimeMs!==n.mtimeMs)return;let f=u>0?a.indexOf(10)+1:0,l=a.lastIndexOf(10);if(u>0&&f===0||l<f)return;let S=[],O=0;for(;l>f&&O<In;){let k=a.lastIndexOf(10,l-1),N=Math.max(f,k+1),d=a.toString("utf8",N,l).trim();if(d){let h=b(JSON.parse(d));h&&S.push(h)}l=N-1,O++}return S.reverse(),{first:i,rows:S,complete:u===0&&l<0&&a[a.length-1]===10}}catch{return}finally{if(t!==void 0)try{E.default.closeSync(t)}catch{}}}function wt(e){let t=e[0];return t&&e.every(n=>n?.name===t.name)?t:void 0}var Dn=new Set(["PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest"]),kt=["agent_id","agentId"],Mt=["turn_id","turnId"];function xn(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)?Dt.default.join(ve(),"session-state",t,"events.jsonl"):void 0}function It(e,t){return e.agentId!==void 0&&e.agentId!==null?Re(e.agentId)===t&&t!==void 0:t===void 0&&b(e.data)?.parentToolCallId==null}function xt(e,t,n){let r=z(e.model);if(r)return{name:r,source:"hook.model"};try{return Nn(e,t,n)}catch{return}}function Nn(e,t,n){let r=ne(e),o=X(e,["tool_use_id","toolUseId","tool_call_id","toolCallId"]),i=r==="SessionStart"&&e.source==="startup";if(!i&&(!Dn.has(r)||!o))return;let u=X(e,["session_id","sessionId"]),a=X(e,kt),c=X(e,Mt),f=At(e,n);if(!u||f===void 0||kt.some(d=>e[d]!==void 0)&&!a||Mt.some(d=>e[d]!==void 0)&&!c||!a&&["agent_name","agentName","agent_type","agentType"].some(d=>e[d]!==void 0))return;let l=Rt(xn(e,u,t)),S=l?.first,O=b(S?.data),k=B(S?.timestamp);if(!l||S?.type!=="session.start"||O?.sessionId!==u||k===void 0||k>f||l.rows.some(d=>d.type==="session.start"&&b(d.data)?.sessionId!==u))return;if(i){if(a||!l.complete||e.timestamp===void 0)return;let d=z(O.selectedModel),h=k;for(let M of l.rows){if(M.type!=="session.model_change"||!It(M,void 0))continue;let A=B(M.timestamp);if(A===void 0)return;if(A>f||A<h)continue;let F=z(b(M.data)?.newModel);if(A===h&&F!==d)return;d=F,h=A}return d?{name:d,source:"transcript.session.selected"}:void 0}let N=[];for(let d of l.rows){let h=b(d.data),M=B(d.timestamp);if(!h||M===void 0||M>f||M<k||!It(d,a)||c!==void 0&&h.turnId!==c)continue;let A=!1;if(d.type==="assistant.message"?A=Array.isArray(h.toolRequests)&&h.toolRequests.some(Bt=>b(Bt)?.toolCallId===o):(d.type==="tool.execution_start"||d.type==="tool.execution_complete")&&(A=h.toolCallId===o),!A)continue;let F=z(h.model);N.push(F?{name:F,source:`transcript.${d.type}`}:void 0)}return wt(N)}var ie;function jn(){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 jt=se,Un=new Set(["","unknown","undefined","null","n/a","none"]);function v(e){let t=typeof e=="string"?e.trim():void 0;return t&&!Un.has(t.toLowerCase())?t:void 0}var Ln=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function Cn(e){let t=v(e);return t&&Ln.test(t)?t:void 0}function Vn(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||(we===void 0&&(we=qn()),we??void 0)}var we;function qn(){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=Cn(ke.default.basename(t));if(n)return n;let r=Bn(t);if(r)return r}return null}function Bn(e){try{let t=Nt.default.readFileSync(ke.default.join(e,"package.json"),"utf8");return v(JSON.parse(t).version)}catch{return}}var Fn=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"]),Gn=new Set(["copilot.tool_input","copilot.toolInput","copilot.toolArgs","copilot.tool_response","copilot.tool_result","copilot.toolResult"]),$n={skipRedactKeys:Fn,bashContextKeys:Gn},Yn=new Set(["hook_event_name","hookEventName","hookName"]);function zn(e,t,n){let r=Object.fromEntries(Object.entries(e).filter(([o])=>!Yn.has(o)));return vt(r,xt(e,t,n)),[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:te(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,V.attrsFromRecord)(r,"copilot",$n)]}function Xn(e){let t=Vn(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:jt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:jn()}},{key:"host.name",value:{stringValue:ae.default.hostname()}},{key:"host.arch",value:{stringValue:ae.default.arch()}}]}function Ut(e){let t=e.now??Date.now();return(0,V.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,V.snakeCase)(te(e.event)??"unknown")}`,attributes:zn(e.event,e.surface,t),resource:Xn(e.event),scope:{name:"pinta-copilot",version:jt},now:t})}var Lt=_(L());function Kn(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||100}var Hn=`pinta-copilot/${se}`;function Ct(e,t){return(0,Lt.evaluateGuard)(e,t,{timeoutMs:Kn(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Hn})}async function Zn(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function qt(){try{let e=_t(),t=gt(),n=await Zn(),r=JSON.parse(n),o=ne(r),i=ht(r),u=new oe(e),a=o==="UserPromptSubmit"?u.newTrace(i):u.currentTrace(i),c=Ut({event:r,traceId:a,surface:t}),f=yt(r),l=null;if(St(o)&&!Tt(f)&&(l=await Ct(c,process.env.PINTA_GUARD_ENDPOINT)),l?.decision==="DENY"){let O=Ot(o,l.userMessage??l.reason??"guard_deny",t,r);O&&process.stdout.write(O+`
21
+ `)}if((0,Vt.attachGuard)(c,l),l&&o==="PostToolUse")for(let O of c.resourceSpans)for(let k of O.scopeSpans)for(let N of k.spans)N.attributes.push({key:"pinta.guard.target",value:{stringValue:"tool_output"}});if(l?.decision==="DENY")return Et(c,e),0;let S=new re(e);await S.flush(),await S.send(c)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
22
+ `)}return 0}pt();async function Jn(){let e=await qt();process.exit(e)}Jn();
package/dist/index.mjs CHANGED
@@ -1,22 +1,23 @@
1
1
  import{createRequire as __pintaCreateRequire}from 'node:module';const require=__pintaCreateRequire(import.meta.url);
2
- var Qt=Object.create;var De=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 P=(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&&De(e,o,{get:()=>t[o],enumerable:!(r=en(t,o))||r.enumerable});return e};var L=(e,t,n)=>(n=e!=null?Qt(nn(e)):{},on(t||!e||!e.__esModule?De(n,"default",{value:e,enumerable:!0}):n,e));var ce=P(h=>{"use strict";Object.defineProperty(h,"__esModule",{value:!0});h.PATTERNS=h.MAX_BYTES=void 0;h.truncateTo=Ne;h.truncate=sn;h.collectMatches=je;h.resolveOverlaps=Ce;h.applyMatches=Le;h.redact=an;h.MAX_BYTES=102400;function Ne(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 Ne(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 je(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 Ce(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 Le(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=je(e,t);if(n.length===0)return e;let r=Ce(n);return Le(e,r)}});var de=P(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=Be;m.attrsFromRecord=fn;m.guardAttrs=Ge;m.clientAttrs=Ye;m.enforceSpanBudget=ze;m.buildPayload=pn;m.attachGuard=Xe;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 Z(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 Be(e,t,n={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:Z(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:Z(e,JSON.stringify(t),n)}}catch{return{stringValue:Z(e,String(t),n)}}default:return{stringValue:Z(e,String(t),n)}}}function fn(e,t,n={}){let r=[];for(let[o,s]of Object.entries(e)){let u=`${t}.${o}`,a=Be(u,s,n);a!==null&&r.push({key:u,value:a})}return r}function Ge(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 Ye(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 Ue=1024;function ze(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<=Ue)break;let u=n-t,a=Math.max(Ue,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};ze(o);let s={resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[o]}]}]};return Xe(s,e.guard,e.clientTiming)}function Xe(e,t,n){let r=e.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return e;t&&r.attributes.push(...Ge(t));let o=n??(t?.clientRttMs!==void 0?{op:"guard",rttMs:t.clientRttMs}:null);return o&&r.attributes.push(...Ye(o)),e}function mn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var Ke=P(q=>{"use strict";Object.defineProperty(q,"__esModule",{value:!0});q.GUARD_STATUS_REFUSED=void 0;q.evaluateGuard=_n;var gn=1e4,hn="pinta-core";function H(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var yn=new Set(["ALLOW","DENY","REVIEW"]);q.GUARD_STATUS_REFUSED=410;async function _n(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}:{}},body:JSON.stringify(e),signal:s.signal});if(a.status===q.GUARD_STATUS_REFUSED)return H(Date.now()-o,"refused");if(a.status!==200)return H(Date.now()-o,"error");let c=await a.json(),l=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!yn.has(c.decision)||!l)return H(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 H(Date.now()-o,l)}finally{clearTimeout(u)}}});var W=P(B=>{"use strict";var Sn=B&&B.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(B,"__esModule",{value:!0});B.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=P(R=>{"use strict";var He=R&&R.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(R,"__esModule",{value:!0});R.MemoryRetryQueue=R.DiskRetryQueue=void 0;var _=He(S("fs")),J=He(S("path")),Pn=W(),Q=1e3,En=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{_.default.mkdirSync(J.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
- `;_.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
4
- `)}}readAll(){try{let t=_.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){_.default.existsSync(this.filePath)&&_.default.unlinkSync(this.filePath);return}_.default.mkdirSync(J.default.dirname(this.filePath),{recursive:!0}),(0,Pn.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
2
+ var tn=Object.create;var Ne=Object.defineProperty;var nn=Object.getOwnPropertyDescriptor;var rn=Object.getOwnPropertyNames;var on=Object.getPrototypeOf,sn=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 P=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var an=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of rn(t))!sn.call(e,o)&&o!==n&&Ne(e,o,{get:()=>t[o],enumerable:!(r=nn(t,o))||r.enumerable});return e};var F=(e,t,n)=>(n=e!=null?tn(on(e)):{},an(t||!e||!e.__esModule?Ne(n,"default",{value:e,enumerable:!0}):n,e));var ce=P(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.PATTERNS=g.MAX_BYTES=void 0;g.truncateTo=je;g.truncate=un;g.collectMatches=Ce;g.resolveOverlaps=Le;g.applyMatches=Ue;g.redact=cn;g.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 un(e){return je(e,g.MAX_BYTES)}g.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function Ce(e,t){let n=[];for(let r of g.PATTERNS){if(r.requireContext&&r.requireContext!==t.context)continue;let o=new RegExp(r.regex.source,r.regex.flags),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,d=c+s[0].indexOf(a),_=d+a.length;n.push({start:c,end:l,replaceStart:d,replaceEnd:_,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 cn(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=P(m=>{"use strict";var ln=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=pn;m.toOtlpValue=Ge;m.attrsFromRecord=mn;m.guardAttrs=Ye;m.clientAttrs=ze;m.enforceSpanBudget=Xe;m.buildPayload=gn;m.attachGuard=Ke;m.mergeBatch=hn;var dn=ln(S("crypto")),le=ce(),fn="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=fn.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 dn.default.randomBytes(8).toString("hex")}function pn(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 Z(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:Z(e,t,n)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:Z(e,JSON.stringify(t),n)}}catch{return{stringValue:Z(e,String(t),n)}}default:return{stringValue:Z(e,String(t),n)}}}function mn(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 gn(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 hn(e){let t=[];for(let n of e)t.push(...n.resourceSpans);return{resourceSpans:t}}});var He=P(w=>{"use strict";Object.defineProperty(w,"__esModule",{value:!0});w.GUARD_STATUS_REFUSED=w.GUARD_BUDGET_HEADER=void 0;w.evaluateGuard=Tn;var yn=1e4,_n="pinta-core";w.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function J(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Sn=new Set(["ALLOW","DENY","REVIEW"]);w.GUARD_STATUS_REFUSED=410;async function Tn(e,t,n={}){if(!t||n.disabled)return null;let r=n.timeoutMs??yn,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??_n,"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:s.signal});if(a.status===w.GUARD_STATUS_REFUSED)return J(Date.now()-o,"refused");if(a.status!==200)return J(Date.now()-o,"error");let c=await a.json(),l=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!Sn.has(c.decision)||!l)return J(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 J(Date.now()-o,l)}finally{clearTimeout(u)}}});var W=P(G=>{"use strict";var En=G&&G.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(G,"__esModule",{value:!0});G.atomicWriteFileSync=Pn;var Ze=En(S("fs"));function Pn(e,t){let n=`${e}.${process.pid}.tmp`;Ze.default.writeFileSync(n,t),Ze.default.renameSync(n,e)}});var me=P(I=>{"use strict";var Je=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 y=Je(S("fs")),Q=Je(S("path")),On=W(),ee=1e3,bn=50,vn=5,fe=class{filePath;lockPath;logPrefix;constructor(t,n){this.filePath=Q.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(t){try{y.default.mkdirSync(Q.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(Q.default.dirname(this.filePath),{recursive:!0}),(0,On.atomicWriteFileSync)(this.filePath,t.map(n=>JSON.stringify(n)).join(`
6
6
  `)+`
7
7
  `)}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${n}
8
- `)}}tryAcquireLock(){let t=Date.now();try{_.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<En;)try{let n=_.default.openSync(this.lockPath,"wx");return _.default.writeSync(n,String(process.pid)),_.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=_.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){_.default.unlinkSync(this.lockPath);continue}}catch{}let r=On,o=Date.now()+r;for(;Date.now()<o;);}return!1}release(){try{_.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))}};R.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}};R.MemoryRetryQueue=pe});var nt=P(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.MemoryTransport=p.DiskTransport=p.MAX_POST_BYTES=void 0;p.parseHeadersEnv=et;p.envOptionsResolver=tt;p.postOtlp=G;var We=me(),Je=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 Qe(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 et(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 tt(){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:et(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}`:""}
8
+ `)}}tryAcquireLock(){let t=Date.now();try{y.default.mkdirSync(Q.default.dirname(this.lockPath),{recursive:!0})}catch(n){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${n}
9
+ `),!1}for(;Date.now()-t<bn;)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=vn,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<=ee)return;let n=t.length-ee;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${n} oldest entries
11
+ `),this.rewrite(t.slice(n))}};I.DiskRetryQueue=fe;var pe=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>ee&&this.entries.splice(0,this.entries.length-ee)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};I.MemoryRetryQueue=pe});var rt=P(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=Y;var We=me(),Qe=de(),wn=5e3;p.MAX_POST_BYTES=900*1024;function te(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function et(e,t,n){let r=[],o=[],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 Y(e,t,n){let r=new AbortController,o=setTimeout(()=>r.abort(),wn);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
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 We.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??tt}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}=Qe(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,Je.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 We.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(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}=Qe(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,Je.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=P(I=>{"use strict";var Se=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.TraceManager=void 0;I.generateUlid=ot;var rt=Se(S("fs")),wn=Se(S("path")),bn=Se(S("crypto")),An=W(),ye="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ot(){let e=Date.now(),t="",n=e;for(let s=0;s<10;s++)t=ye[n&31]+t,n=Math.floor(n/32);let r=bn.default.randomBytes(10),o="";for(let s=0;s<10;s++)o+=ye[r[s]&31];for(;o.length<16;)o+=ye[0];return t+o}var _e=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=ot();return this.save(t),t}currentTrace(){try{let t=rt.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(t);if(n)return n}catch{}return this.newTrace()}save(t){try{rt.default.mkdirSync(wn.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
- `)}}};I.TraceManager=_e});var ct=P(k=>{"use strict";var it=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.MemorySessionTraceManager=k.DiskSessionTraceManager=void 0;var st=it(S("fs")),Rn=it(S("path")),at=Te(),kn=W(),ut=200,Pe=class{tracePath;maxSessions;constructor(t,n={}){this.tracePath=t,this.maxSessions=n.maxSessions??ut}read(){try{let t=JSON.parse(st.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{st.default.mkdirSync(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,at.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)}};k.DiskSessionTraceManager=Pe;var Ee=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??ut}newTrace(t){let n=t||"default",r=(0,at.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)}};k.MemorySessionTraceManager=Ee});var ft=P(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=xn;x.parseEnvFile=dt;x.loadEnvFile=Dn;var Mn=Oe(S("node:fs")),In=Oe(S("node:os")),lt=Oe(S("node:path"));function xn(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:lt.default.join(In.default.homedir(),e);return lt.default.join(o,t)}function dt(e){let t={};for(let n of e.split(`
20
- `)){let r=n.trim();if(!r||r.startsWith("#"))continue;let o=r.indexOf("=");if(o<0)continue;let 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 Dn(e){let t;try{t=Mn.default.readFileSync(e,"utf-8")}catch{return}let n=dt(t);for(let[r,o]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=o)}});var D=P(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_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 M=ce();Object.defineProperty(i,"redact",{enumerable:!0,get:function(){return M.redact}});Object.defineProperty(i,"truncate",{enumerable:!0,get:function(){return M.truncate}});Object.defineProperty(i,"truncateTo",{enumerable:!0,get:function(){return M.truncateTo}});Object.defineProperty(i,"collectMatches",{enumerable:!0,get:function(){return M.collectMatches}});Object.defineProperty(i,"resolveOverlaps",{enumerable:!0,get:function(){return M.resolveOverlaps}});Object.defineProperty(i,"applyMatches",{enumerable:!0,get:function(){return M.applyMatches}});Object.defineProperty(i,"PATTERNS",{enumerable:!0,get:function(){return M.PATTERNS}});Object.defineProperty(i,"MAX_BYTES",{enumerable:!0,get:function(){return M.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 pt=Ke();Object.defineProperty(i,"evaluateGuard",{enumerable:!0,get:function(){return pt.evaluateGuard}});Object.defineProperty(i,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return pt.GUARD_STATUS_REFUSED}});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 F=nt();Object.defineProperty(i,"DiskTransport",{enumerable:!0,get:function(){return F.DiskTransport}});Object.defineProperty(i,"MemoryTransport",{enumerable:!0,get:function(){return F.MemoryTransport}});Object.defineProperty(i,"postOtlp",{enumerable:!0,get:function(){return F.postOtlp}});Object.defineProperty(i,"envOptionsResolver",{enumerable:!0,get:function(){return F.envOptionsResolver}});Object.defineProperty(i,"parseHeadersEnv",{enumerable:!0,get:function(){return F.parseHeadersEnv}});Object.defineProperty(i,"MAX_POST_BYTES",{enumerable:!0,get:function(){return F.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=ct();Object.defineProperty(i,"DiskSessionTraceManager",{enumerable:!0,get:function(){return ht.DiskSessionTraceManager}});Object.defineProperty(i,"MemorySessionTraceManager",{enumerable:!0,get:function(){return ht.MemorySessionTraceManager}});var ve=ft();Object.defineProperty(i,"envFilePath",{enumerable:!0,get:function(){return ve.envFilePath}});Object.defineProperty(i,"parseEnvFile",{enumerable:!0,get:function(){return ve.parseEnvFile}});Object.defineProperty(i,"loadEnvFile",{enumerable:!0,get:function(){return ve.loadEnvFile}})});import{realpathSync as Cr}from"node:fs";import{pathToFileURL as Lr}from"node:url";var Y=L(D());function Nn(){return(0,Y.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function yt(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 _t(){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 Ut=L(D());function N(e){return typeof e=="string"?e:void 0}function te(e){return N(e.hook_event_name)??N(e.hookEventName)??N(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function Tt(e){return N(e.session_id)??N(e.sessionId)}function Pt(e){return N(e.tool_name)??N(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 Et(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=L(D());function qn(){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:qn})}};var wt=L(D()),se=class extends wt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import Xn from"fs";import Re from"os";import jt from"path";var ie="0.9.0";var j=L(D());import Bn from"node:path";import w from"node:fs";import bt from"node:path";var Fn=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),Un=256*1024,Vn=1024*1024,$n=4096;function E(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function X(e){let t=E(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)&&!Fn.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 be(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=>be(e[r]));return n.length>0&&n[0]!==void 0&&n.every(r=>r===n[0])?n[0]:void 0}function U(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?U(t):U(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)||!bt.isAbsolute(e)||bt.extname(e)!==".jsonl")return;let t;try{t=w.openSync(e,w.constants.O_RDONLY|w.constants.O_NONBLOCK|(w.constants.O_NOFOLLOW??0));let n=w.fstatSync(t);if(!n.isFile()||!Number.isSafeInteger(n.size)||n.size<=0)return;let r=Buffer.alloc(Math.min(n.size,Un));if(w.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),s;if(o>=0)try{s=E(JSON.parse(r.toString("utf8",0,o)))}catch{}let u=Math.max(0,n.size-Vn),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=[],b=0;for(;f>l&&b<$n;){let C=a.lastIndexOf(10,f-1),V=Math.max(l,C+1),d=a.toString("utf8",V,f).trim();if(d){let y=E(JSON.parse(d));y&&g.push(y)}f=V-1,b++}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"],xt=["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)?Bn.join(z(),"session-state",t,"events.jsonl"):void 0}function Dt(e,t){return e.agentId!==void 0&&e.agentId!==null?be(e.agentId)===t&&t!==void 0:t===void 0&&E(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,xt),l=Rt(e,n);if(!u||l===void 0||It.some(d=>e[d]!==void 0)&&!a||xt.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,b=E(g?.data),C=U(g?.timestamp);if(!f||g?.type!=="session.start"||b?.sessionId!==u||C===void 0||C>l||f.rows.some(d=>d.type==="session.start"&&E(d.data)?.sessionId!==u))return;if(s){if(a||!f.complete||e.timestamp===void 0)return;let d=X(b.selectedModel),y=C;for(let A of f.rows){if(A.type!=="session.model_change"||!Dt(A,void 0))continue;let v=U(A.timestamp);if(v===void 0)return;if(v>l||v<y)continue;let $=X(E(A.data)?.newModel);if(v===y&&$!==d)return;d=$,y=v}return d?{name:d,source:"transcript.session.selected"}:void 0}let V=[];for(let d of f.rows){let y=E(d.data),A=U(d.timestamp);if(!y||A===void 0||A>l||A<C||!Dt(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(Jt=>E(Jt)?.toolCallId===o):(d.type==="tool.execution_start"||d.type==="tool.execution_complete")&&(v=y.toolCallId===o),!v)continue;let $=X(y.model);V.push($?{name:$,source:`transcript.${d.type}`}:void 0)}return Mt(V)}var ae;function Kn(){if(ae===void 0)try{ae=Re.userInfo().username}catch{ae=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return ae}var Ct=ie,Zn=new Set(["","unknown","undefined","null","n/a","none"]);function O(e){let t=typeof e=="string"?e.trim():void 0;return t&&!Zn.has(t.toLowerCase())?t:void 0}var Hn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function Wn(e){let t=O(e);return t&&Hn.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||(Ae===void 0&&(Ae=Qn()),Ae??void 0)}var Ae;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,j.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:Re.hostname()}},{key:"host.arch",value:{stringValue:Re.arch()}}]}function Lt(e){let t=e.now??Date.now();return(0,j.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,j.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 qt=L(D());function ar(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||50}var ur=`pinta-copilot/${ie}`;function Ft(e,t){return(0,qt.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 Vt(){try{let e=_t(),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=Pt(r),g=null;if(Et(o)&&!Ot(f)&&(g=await Ft(l,process.env.PINTA_GUARD_ENDPOINT)),g?.decision==="DENY"){let b=vt(o,g.userMessage??g.reason??"guard_deny");b&&process.stdout.write(b+`
21
- `)}(0,Ut.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 ke,mkdtemp as lr,rm as dr,stat as fr}from"node:fs/promises";import pr from"node:os";import Me from"node:path";var mr=2e3,gr=250,$t=3,Bt=3e4,hr=3e4,Ie;function yr(){return Ie||(Ie=new Promise(e=>{let t=Gt("sqlite3",["-version"],{stdio:"ignore"});t.once("error",()=>e(!1)),t.once("exit",n=>e(n===0))})),Ie}function _r(e){return`'${e.replace(/'/g,"''")}'`}async function Sr(e,t){let n=`.backup ${_r(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>=Bt)throw new Error(`snapshot: ${e} never quiesced within ${Bt}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 Pr(e,t){let{wal:n,shm:r}=zt(e),o=await Tr(e);if(await ke(e,t),o.find(a=>a.path===n)?.st!==void 0&&await ke(n,`${t}-wal`),o.find(a=>a.path===r)?.st!==void 0&&await ke(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 Er(e,t){let n;for(let r=1;r<=$t;r++)try{await Pr(e,t);return}catch(o){n=o}throw new Error(`snapshot: quiesce-copy of ${e} failed after ${$t} attempts: ${String(n)}`)}async function Xt(e,t={}){let n=t.tmpDirBase??pr.tmpdir(),r=await lr(Me.join(n,"pinta-copilot-snapshot-")),o=Me.join(r,Me.basename(e.absPath));try{if(await yr())try{return await Sr(e.absPath,o),o}catch{}return await Er(e.absPath,o),o}catch(s){throw await dr(r,{recursive:!0,force:!0}).catch(()=>{}),s}}var wr="pinta-copilot",Kt="events.jsonl",Zt="session.db",br="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===Zt?"database":"rewritten-doc"}function xr(e){let t=e.split("/"),n=t[t.length-1]??"";return t.length===2&&(n===Kt||n===Zt)?"session-log":e.includes(br)?"other":"meta"}async function Ht(){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*Dr(e){let[t]=await Ht(),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:wr,roots:Ht,scan:Dr,classify:xr,snapshot:Nr};yt();function qr(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===Lr(Cr(e)).href}catch{return!1}}async function Fr(){let e=await Vt();process.exit(e)}qr()&&Fr();export{jr as lifecycle};
13
+ `),!1}finally{clearTimeout(o)}}var ge=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new We.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??nt}async send(t){let n=this.resolveOptions();if(!n||this.dropIfOversized(t))return;await Y(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=>te(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 Y((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=te(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 We.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let n=this.resolveOptions();if(!n)return;if(te(t)>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 Y(t,n,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let n=this.queue.drain();if(n.length===0)return;let{chunks:r,oversize:o}=et(n,te,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 Y((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=P(j=>{"use strict";var Se=j&&j.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(j,"__esModule",{value:!0});j.TraceManager=void 0;j.generateUlid=st;var ot=Se(S("fs")),An=Se(S("path")),Rn=Se(S("crypto")),kn=W(),ye="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function st(){let e=Date.now(),t="",n=e;for(let s=0;s<10;s++)t=ye[n&31]+t,n=Math.floor(n/32);let r=Rn.default.randomBytes(10),o="";for(let s=0;s<10;s++)o+=ye[r[s]&31];for(;o.length<16;)o+=ye[0];return t+o}var _e=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(An.default.dirname(this.tracePath),{recursive:!0}),(0,kn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
19
+ `)}}};j.TraceManager=_e});var lt=P(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")),Dn=at(S("path")),ut=Te(),In=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(Dn.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(t),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):t;(0,In.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=P(C=>{"use strict";var Oe=C&&C.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(C,"__esModule",{value:!0});C.envFilePath=Nn;C.parseEnvFile=ft;C.loadEnvFile=jn;var Mn=Oe(S("node:fs")),xn=Oe(S("node:os")),dt=Oe(S("node:path"));function Nn(e,t,n){let r=n?process.env[n]:void 0,o=r&&r.length>0?r:dt.default.join(xn.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 jn(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 L=P(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 x=ce();Object.defineProperty(i,"redact",{enumerable:!0,get:function(){return x.redact}});Object.defineProperty(i,"truncate",{enumerable:!0,get:function(){return x.truncate}});Object.defineProperty(i,"truncateTo",{enumerable:!0,get:function(){return x.truncateTo}});Object.defineProperty(i,"collectMatches",{enumerable:!0,get:function(){return x.collectMatches}});Object.defineProperty(i,"resolveOverlaps",{enumerable:!0,get:function(){return x.resolveOverlaps}});Object.defineProperty(i,"applyMatches",{enumerable:!0,get:function(){return x.applyMatches}});Object.defineProperty(i,"PATTERNS",{enumerable:!0,get:function(){return x.PATTERNS}});Object.defineProperty(i,"MAX_BYTES",{enumerable:!0,get:function(){return x.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 be=He();Object.defineProperty(i,"evaluateGuard",{enumerable:!0,get:function(){return be.evaluateGuard}});Object.defineProperty(i,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return be.GUARD_STATUS_REFUSED}});Object.defineProperty(i,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return be.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 B=rt();Object.defineProperty(i,"DiskTransport",{enumerable:!0,get:function(){return B.DiskTransport}});Object.defineProperty(i,"MemoryTransport",{enumerable:!0,get:function(){return B.MemoryTransport}});Object.defineProperty(i,"postOtlp",{enumerable:!0,get:function(){return B.postOtlp}});Object.defineProperty(i,"envOptionsResolver",{enumerable:!0,get:function(){return B.envOptionsResolver}});Object.defineProperty(i,"parseHeadersEnv",{enumerable:!0,get:function(){return B.parseHeadersEnv}});Object.defineProperty(i,"MAX_POST_BYTES",{enumerable:!0,get:function(){return B.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 ve=pt();Object.defineProperty(i,"envFilePath",{enumerable:!0,get:function(){return ve.envFilePath}});Object.defineProperty(i,"parseEnvFile",{enumerable:!0,get:function(){return ve.parseEnvFile}});Object.defineProperty(i,"loadEnvFile",{enumerable:!0,get:function(){return ve.loadEnvFile}})});import{realpathSync as qr}from"node:fs";import{pathToFileURL as Fr}from"node:url";var z=F(L());function Cn(){return(0,z.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function yt(e=Cn()){(0,z.loadEnvFile)(e)}import Ln from"os";import we from"path";function X(){return process.env.COPILOT_HOME||we.join(Ln.homedir(),".copilot")}function _t(){let e=process.env.COPILOT_PLUGIN_DATA||we.join(X(),"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 Vt=F(L());function U(e){return typeof e=="string"?e:void 0}function ne(e){return U(e.hook_event_name)??U(e.hookEventName)??U(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function Tt(e){return U(e.session_id)??U(e.sessionId)}function Et(e){return U(e.tool_name)??U(e.toolName)}var Un={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 re(e){let t=ne(e);return t?Un[t.toLowerCase()]??"Unknown":"Unknown"}function Pt(e){return e==="PreToolUse"||e==="PermissionRequest"||e==="PostToolUse"}var qn=new Set(["report_intent","ask_user"]);function Ot(e){return e!==void 0&&qn.has(e)}var Fn="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.",Bn="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 bt(e,t,n="cli",r){if(e==="PreToolUse")return JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}});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),s=r!==void 0&&"tool_response"in r;return JSON.stringify(!o&&(s||n==="ext")?{continue:!1,stopReason:Bn}:{modifiedResult:{resultType:"success",textResultForLlm:Fn}})}return null}var A=F(L());function vt(){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 oe=class extends A.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:vt})}};function wt(e,t){if(!vt())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
21
+ `);return}new A.DiskRetryQueue(t.pluginData,"pinta-copilot").enqueue(e)}var At=F(L()),se=class extends At.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};import Zn from"fs";import ke from"os";import Lt from"path";var ie="0.10.1";var q=F(L());import zn from"node:path";import R from"node:fs";import Rt from"node:path";var Vn=new Set(["","unknown","undefined","null","n/a","none","auto","default"]),$n=256*1024,Gn=1024*1024,Yn=4096;function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function K(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)&&!Vn.has(r.toLowerCase())?r:void 0}function kt(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 H(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 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 Dt(e,t){let n=e.timestamp===void 0?V(t):V(e.timestamp);return n!==void 0&&n<=t?n:void 0}function It(e){if(typeof e!="string"||e.length>4096||/[\u0000-\u001f]/.test(e)||!Rt.isAbsolute(e)||Rt.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,$n));if(R.readSync(t,r,0,r.length,0)!==r.length)return;let o=r.indexOf(10),s;if(o>=0)try{s=O(JSON.parse(r.toString("utf8",0,o)))}catch{}let u=Math.max(0,n.size-Gn),a=n.size<=r.length?r:Buffer.alloc(n.size-u);if(a!==r&&R.readSync(t,a,0,a.length,u)!==a.length)return;let c=R.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,d=a.lastIndexOf(10);if(u>0&&l===0||d<l)return;let _=[],E=0;for(;d>l&&E<Yn;){let k=a.lastIndexOf(10,d-1),N=Math.max(l,k+1),f=a.toString("utf8",N,d).trim();if(f){let h=O(JSON.parse(f));h&&_.push(h)}d=N-1,E++}return _.reverse(),{first:s,rows:_,complete:u===0&&d<0&&a[a.length-1]===10}}catch{return}finally{if(t!==void 0)try{R.closeSync(t)}catch{}}}function Mt(e){let t=e[0];return t&&e.every(n=>n?.name===t.name)?t:void 0}var Xn=new Set(["PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest"]),xt=["agent_id","agentId"],Nt=["turn_id","turnId"];function Kn(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)?zn.join(X(),"session-state",t,"events.jsonl"):void 0}function jt(e,t){return e.agentId!==void 0&&e.agentId!==null?Ae(e.agentId)===t&&t!==void 0:t===void 0&&O(e.data)?.parentToolCallId==null}function Ct(e,t,n){let r=K(e.model);if(r)return{name:r,source:"hook.model"};try{return Hn(e,t,n)}catch{return}}function Hn(e,t,n){let r=re(e),o=H(e,["tool_use_id","toolUseId","tool_call_id","toolCallId"]),s=r==="SessionStart"&&e.source==="startup";if(!s&&(!Xn.has(r)||!o))return;let u=H(e,["session_id","sessionId"]),a=H(e,xt),c=H(e,Nt),l=Dt(e,n);if(!u||l===void 0||xt.some(f=>e[f]!==void 0)&&!a||Nt.some(f=>e[f]!==void 0)&&!c||!a&&["agent_name","agentName","agent_type","agentType"].some(f=>e[f]!==void 0))return;let d=It(Kn(e,u,t)),_=d?.first,E=O(_?.data),k=V(_?.timestamp);if(!d||_?.type!=="session.start"||E?.sessionId!==u||k===void 0||k>l||d.rows.some(f=>f.type==="session.start"&&O(f.data)?.sessionId!==u))return;if(s){if(a||!d.complete||e.timestamp===void 0)return;let f=K(E.selectedModel),h=k;for(let D of d.rows){if(D.type!=="session.model_change"||!jt(D,void 0))continue;let v=V(D.timestamp);if(v===void 0)return;if(v>l||v<h)continue;let $=K(O(D.data)?.newModel);if(v===h&&$!==f)return;f=$,h=v}return f?{name:f,source:"transcript.session.selected"}:void 0}let N=[];for(let f of d.rows){let h=O(f.data),D=V(f.timestamp);if(!h||D===void 0||D>l||D<k||!jt(f,a)||c!==void 0&&h.turnId!==c)continue;let v=!1;if(f.type==="assistant.message"?v=Array.isArray(h.toolRequests)&&h.toolRequests.some(en=>O(en)?.toolCallId===o):(f.type==="tool.execution_start"||f.type==="tool.execution_complete")&&(v=h.toolCallId===o),!v)continue;let $=K(h.model);N.push($?{name:$,source:`transcript.${f.type}`}:void 0)}return Mt(N)}var ae;function Jn(){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 Ut=ie,Wn=new Set(["","unknown","undefined","null","n/a","none"]);function b(e){let t=typeof e=="string"?e.trim():void 0;return t&&!Wn.has(t.toLowerCase())?t:void 0}var Qn=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function er(e){let t=b(e);return t&&Qn.test(t)?t:void 0}function tr(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||(Re===void 0&&(Re=nr()),Re??void 0)}var Re;function nr(){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=er(Lt.basename(t));if(n)return n;let r=rr(t);if(r)return r}return null}function rr(e){try{let t=Zn.readFileSync(Lt.join(e,"package.json"),"utf8");return b(JSON.parse(t).version)}catch{return}}var or=new Set(["copilot.hook","copilot.tool_name","copilot.toolName","copilot.tool_use_id","copilot.toolUseId","copilot.session_id","copilot.sessionId","copilot.transcript_path","copilot.transcriptPath","copilot.cwd","copilot.permission_mode","copilot.surface","copilot.agent_id","copilot.agent_type","copilot.agent_name","copilot.agent_display_name","copilot.stop_reason","copilot.notification_type"]),sr=new Set(["copilot.tool_input","copilot.toolInput","copilot.toolArgs","copilot.tool_response","copilot.tool_result","copilot.toolResult"]),ir={skipRedactKeys:or,bashContextKeys:sr},ar=new Set(["hook_event_name","hookEventName","hookName"]);function ur(e,t,n){let r=Object.fromEntries(Object.entries(e).filter(([o])=>!ar.has(o)));return kt(r,Ct(e,t,n)),[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:ne(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,q.attrsFromRecord)(r,"copilot",ir)]}function cr(e){let t=tr(e);return[{key:"service.name",value:{stringValue:"copilot"}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:Ut}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Jn()}},{key:"host.name",value:{stringValue:ke.hostname()}},{key:"host.arch",value:{stringValue:ke.arch()}}]}function qt(e){let t=e.now??Date.now();return(0,q.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,q.snakeCase)(ne(e.event)??"unknown")}`,attributes:ur(e.event,e.surface,t),resource:cr(e.event),scope:{name:"pinta-copilot",version:Ut},now:t})}var Ft=F(L());function lr(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||100}var dr=`pinta-copilot/${ie}`;function Bt(e,t){return(0,Ft.evaluateGuard)(e,t,{timeoutMs:lr(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:dr})}async function fr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function $t(){try{let e=_t(),t=St(),n=await fr(),r=JSON.parse(n),o=re(r),s=Tt(r),u=new se(e),a=o==="UserPromptSubmit"?u.newTrace(s):u.currentTrace(s),c=qt({event:r,traceId:a,surface:t}),l=Et(r),d=null;if(Pt(o)&&!Ot(l)&&(d=await Bt(c,process.env.PINTA_GUARD_ENDPOINT)),d?.decision==="DENY"){let E=bt(o,d.userMessage??d.reason??"guard_deny",t,r);E&&process.stdout.write(E+`
22
+ `)}if((0,Vt.attachGuard)(c,d),d&&o==="PostToolUse")for(let E of c.resourceSpans)for(let k of E.scopeSpans)for(let N of k.spans)N.attributes.push({key:"pinta.guard.target",value:{stringValue:"tool_output"}});if(d?.decision==="DENY")return wt(c,e),0;let _=new oe(e);await _.flush(),await _.send(c)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
23
+ `)}return 0}import{opendir as wr,stat as Ar}from"node:fs/promises";import ue from"node:path";import{spawn as zt}from"node:child_process";import{copyFile as De,mkdtemp as pr,rm as mr,stat as gr}from"node:fs/promises";import hr from"node:os";import Ie from"node:path";var yr=2e3,_r=250,Gt=3,Yt=3e4,Sr=3e4,Me;function Tr(){return Me||(Me=new Promise(e=>{let t=zt("sqlite3",["-version"],{stdio:"ignore"});t.once("error",()=>e(!1)),t.once("exit",n=>e(n===0))})),Me}function Er(e){return`'${e.replace(/'/g,"''")}'`}async function Pr(e,t){let n=`.backup ${Er(t)}`;await new Promise((r,o)=>{let s=zt("sqlite3",[e,n],{stdio:["ignore","ignore","pipe"],timeout:Sr,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 gr(e)}catch{return}}function Xt(e,t){return e===void 0||t===void 0?e===void 0&&t===void 0:e.size===t.size&&e.mtimeMs===t.mtimeMs}function Kt(e){return{wal:`${e}-wal`,shm:`${e}-shm`}}async function Or(e){let{wal:t,shm:n}=Kt(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>=yr)return u;if(Date.now()-o>=Yt)throw new Error(`snapshot: ${e} never quiesced within ${Yt}ms (actively written?)`);await new Promise(l=>setTimeout(l,_r));let a=await Promise.all(r.map(async l=>({path:l,st:await xe(l)})));a.every((l,d)=>Xt(l.st,u[d].st))||(s=Date.now()),u=a}}async function br(e,t){let{wal:n,shm:r}=Kt(e),o=await Or(e);if(await De(e,t),o.find(a=>a.path===n)?.st!==void 0&&await De(n,`${t}-wal`),o.find(a=>a.path===r)?.st!==void 0&&await De(r,`${t}-shm`),!(await Promise.all([e,n,r].map(async a=>({path:a,st:await xe(a)})))).every((a,c)=>Xt(a.st,o[c].st)))throw new Error(`snapshot: ${e} changed during quiesce-copy (torn-read guard)`)}async function vr(e,t){let n;for(let r=1;r<=Gt;r++)try{await br(e,t);return}catch(o){n=o}throw new Error(`snapshot: quiesce-copy of ${e} failed after ${Gt} attempts: ${String(n)}`)}async function Ht(e,t={}){let n=t.tmpDirBase??hr.tmpdir(),r=await pr(Ie.join(n,"pinta-copilot-snapshot-")),o=Ie.join(r,Ie.basename(e.absPath));try{if(await Tr())try{return await Pr(e.absPath,o),o}catch{}return await vr(e.absPath,o),o}catch(s){throw await mr(r,{recursive:!0,force:!0}).catch(()=>{}),s}}var Rr="pinta-copilot",Zt="events.jsonl",Jt="session.db",kr="rewind-snapshots/backups/";function Dr(){return ue.join(X(),"session-state")}function Ir(e,t){return ue.relative(e,t).split(ue.sep).join("/")}function Mr(e){return e.endsWith(".db-wal")||e.endsWith(".db-shm")}function xr(e){let[t]=e.split("/");return!t||t===e?{}:{sessionId:t}}function Nr(e,t){let n=e.split("/").length===2;return n&&t===Zt?"append-log":n&&t===Jt?"database":"rewritten-doc"}function jr(e){let t=e.split("/"),n=t[t.length-1]??"";return t.length===2&&(n===Zt||n===Jt)?"session-log":e.includes(kr)?"other":"meta"}async function Wt(){return[Dr()]}async function*Qt(e,t){let n;try{n=await wr(t)}catch{return}try{for await(let r of n){let o=ue.join(t,r.name);r.isDirectory()?yield*Qt(e,o):r.isFile()&&(yield{absPath:o,relPath:Ir(e,o)})}}catch{return}}async function*Cr(e){let[t]=await Wt(),n=e.since?.getTime();for await(let{absPath:r,relPath:o}of Qt(t,t)){let s=o.split("/"),u=s[s.length-1]??"";if(Mr(u))continue;let a;try{a=await Ar(r)}catch{continue}n!==void 0&&a.mtime.getTime()<=n||(yield{relPath:o,absPath:r,size:a.size,mtime:a.mtime,...xr(o),semantics:Nr(o,u)})}}async function Lr(e){return Ht(e)}var Ur={id:Rr,roots:Wt,scan:Cr,classify:jr,snapshot:Lr};yt();function Br(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===Fr(qr(e)).href}catch{return!1}}async function Vr(){let e=await $t();process.exit(e)}Br()&&Vr();export{Ur as lifecycle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinta-ai/pinta-copilot",
3
- "version": "0.9.0",
3
+ "version": "0.10.1",
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.8.0",
44
+ "@pinta-ai/core": "^0.9.0",
45
45
  "@types/node": "^22.0.0",
46
46
  "esbuild": "^0.24.0",
47
47
  "tsx": "^4.0.0",