@pinta-ai/pinta-copilot 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,50 @@
2
2
 
3
3
  All notable changes to pinta-copilot are documented here.
4
4
 
5
+ ## [0.9.0] - 2026-09-22
6
+
7
+ ### Added
8
+
9
+ - Truthful `copilot.model` telemetry on CLI, editor and cloud hook paths:
10
+ normalize explicit scalar/ID descriptors, omit placeholders and stringified
11
+ objects/arrays, and retain source/provider evidence.
12
+ - Bounded, read-only model enrichment tied to the exact session, tool, optional
13
+ turn and subagent. Fully observed startup selections are labeled separately;
14
+ ID-less tool hooks and uncorrelated records remain model-less rather than
15
+ borrowing a session's latest model.
16
+ - CJS/ESM loopback model and SDK-version smoke checks, enforced in PR CI.
17
+
18
+ ### Compatibility
19
+
20
+ - Still requires Pinta Manager 0.1.11 or later. The OTLP guard payload, denial
21
+ ordering, event counts and privacy redaction are unchanged; bundled
22
+ `@pinta-ai/core` remains `^0.8.0`. No new required envelope fields.
23
+ - Selected/requested model evidence is not proof of provider response routing.
24
+
25
+ ## [0.8.0] - 2026-09-20
26
+
27
+ ### Changed
28
+
29
+ - The guard is asked about the span, not about a summary of it. Until now the
30
+ `PreToolUse` gate assembled a five-field `GuardInput` (tool name, input, working
31
+ directory, hook, session) beside the span that carried the same facts under
32
+ `copilot.*`, and the two were free to drift — `cwd` (PTA-176) and the hook name
33
+ (PTA-207) were on the span and missing from the summary. Now the span is built
34
+ first, `POST /guard/evaluate` receives that OTLP payload unwrapped, the manager
35
+ projects it through the same AgentEvent assembly the backend stores it with,
36
+ and the verdict is attached to the same object before it is relayed — the span
37
+ the manager judged is the span the backend stores, `spanId` included.
38
+ Requires Pinta Manager 0.1.11 or later; an older manager answers `400` and the
39
+ gate fails open (`pinta.guard.fail_open_reason: error`), a newer manager that
40
+ refuses a body answers `410`, recorded as `refused`.
41
+ - `@pinta-ai/core` `^0.6.0` → `^0.8.0` (`evaluateGuard(payload)`, `attachGuard`).
42
+
43
+ ## [0.7.0] - 2026-09-15
44
+
45
+ ### Changed
46
+
47
+ - Version derived from one literal (`src/core/version.ts`); the build fails on drift.
48
+
5
49
  ## [0.5.1] - 2026-07-20
6
50
 
7
51
  ### Changed
package/README.md CHANGED
@@ -67,6 +67,8 @@ Guard is **fail-open** (no endpoint / timeout / error → allow), so it never br
67
67
  | `ingest.type` | `"copilot"` (aware-backend discriminator) |
68
68
  | `copilot.hook` | Hook event name (resolved from `hook_event_name` / `hookEventName` / `hookName`) |
69
69
  | `copilot.surface` | `cli` \| `ext` \| `cloud` (runtime-detected) |
70
+ | `copilot.model` | Exact host-reported model ID, when attributable; never a placeholder |
71
+ | `copilot.model_source` | Evidence for the model value (see below) |
70
72
  | `copilot.<key>` | Every other top-level field (Bronze flattening, raw key preserved) |
71
73
  | `service.name` | `"copilot"` · `telemetry.sdk.name` `"pinta-copilot"` |
72
74
 
@@ -81,7 +83,54 @@ Guard is **fail-open** (no endpoint / timeout / error → allow), so it never br
81
83
  | subagent id | `agent_name`/`agent_display_name` | `agent_id`/`agent_type` |
82
84
  | `permissionRequest` | fires | not fired |
83
85
 
84
- Bronze flattening passes both shapes through losslessly; the backend's `CopilotIngestData` normalizes (`tool_response ?? tool_result`, `agent_id ?? agent_name`, …).
86
+ Bronze flattening preserves both shapes, except for the model normalization described below; the backend's `CopilotIngestData` normalizes (`tool_response ?? tool_result`, `agent_id ?? agent_name`, …).
87
+
88
+ ### Model attribution and its limits
89
+
90
+ `copilot.model` is a scalar ID, not JSON. An explicit hook `model` wins:
91
+ a string or a descriptor's `id` (or `name` when no `id` field exists).
92
+ Blank, `unknown`, `undefined`, `null`, `n/a`, `none`, `auto` and `default`
93
+ values are omitted, case-insensitively. Control characters and IDs longer than
94
+ 512 characters are rejected. This does not change the input event or bypass
95
+ redaction. No provider/model is inferred from an agent name, CLI version,
96
+ global model setting, process, or prompt.
97
+
98
+ JSON-stringified objects/arrays (including `[object Object]`) are not model IDs.
99
+ For an explicit model, the host's `model_source` is retained when supplied;
100
+ otherwise `hook.model` is used. Provider and requested/response fields remain
101
+ unchanged. When transcript evidence replaces an unusable model, its source
102
+ becomes `model_source`; any previous host source is kept as
103
+ `copilot.model_original_source` rather than mislabeled as the new model's source.
104
+
105
+ | `copilot.model_source` | Evidence and scope |
106
+ |---|---|
107
+ | `hook.model` | The hook's explicit model. A SessionStart selection is **not proof of the routed response model**. |
108
+ | `transcript.assistant.message` | `assistant.message.data.model` on a response requesting the hook's exact tool-call ID. |
109
+ | `transcript.tool.execution_start` / `transcript.tool.execution_complete` | `data.model` on the exact tool execution. Matching assistant/execution records must agree; conflicts are omitted. |
110
+ | `transcript.session.selected` | Startup selection from `session.start.data.selectedModel` plus model changes at/before the hook timestamp, only when the entire bounded history is available. **Selected/requested, not routed.** Never carried onto tools or resume events. |
111
+
112
+ The CLI lookup uses the supplied `transcript_path`/`transcriptPath`, or
113
+ `$COPILOT_HOME/session-state/<session_id>/events.jsonl` (default home:
114
+ `~/.copilot`). It verifies the session header, timestamp, tool-call ID
115
+ (`tool_use_id`, `toolUseId`, `tool_call_id` or `toolCallId`), an optional turn ID,
116
+ and the exact subagent identity. Parent and child models cannot be inherited
117
+ from one another. A future or merely latest response is never a fallback.
118
+
119
+ **Many current CLI tool hooks omit a stable tool-call ID. Their model remains
120
+ absent**, even if a session selection or a recent response is visible. A
121
+ subagent ID without its own transcript, an unrecognized IDE/cloud transcript
122
+ format, or a record outside the read window also leaves the model absent.
123
+ IDE/cloud hooks can always supply `model` directly. This is intentionally not
124
+ a claim of complete model coverage for every host version.
125
+
126
+ Each lookup is read-only: at most a 256 KiB header plus a 1 MiB tail and 4,096
127
+ complete JSONL records, with no subprocess, directory scan, or cross-hook model
128
+ cache. Explicit models and tool hooks without correlation IDs do no model
129
+ lookup IO. Missing/unreadable files, non-regular files, leaf symlinks,
130
+ malformed records and ambiguous metadata fail quietly; incomplete boundary
131
+ lines are ignored. Transcript contents are never logged or forwarded by this
132
+ lookup. Guard behavior, event counts, and the existing privacy pipeline are
133
+ unchanged.
85
134
 
86
135
  ## Architecture
87
136
 
@@ -108,9 +157,17 @@ src/
108
157
  npm install
109
158
  npm run build # tsc → dist/
110
159
  npm test # vitest
160
+ npm run smoke:model # built CJS/ESM hooks -> isolated loopback collector
111
161
  npm run mock-server # local OTLP collector
112
162
  ```
113
163
 
164
+ `smoke:model` runs fresh hook processes with isolated HOME/plugin data and no
165
+ manager/guard calls. It covers supplied, missing, placeholder, correlated,
166
+ cross-session/subagent, future, partial and oversized transcript cases. Local
167
+ results are written to `.validation/model-smoke.json`. An optional
168
+ `-- --baseline=<previous-built-index.js>` compares paired end-to-end hook times
169
+ (including Node startup and loopback HTTP, so scheduler noise is included).
170
+
114
171
  ## License
115
172
 
116
173
  [PolyForm Noncommercial 1.0.0](https://polyformproject.org/licenses/noncommercial/1.0.0) — see [LICENSE](LICENSE). Commercial use is not permitted; contact Pinta AI for a commercial license.
package/dist/index.js CHANGED
@@ -1,21 +1,21 @@
1
- "use strict";var dt=Object.create;var pe=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames;var ht=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var y=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var mt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of gt(t))!yt.call(e,o)&&o!==r&&pe(e,o,{get:()=>t[o],enumerable:!(n=_t(t,o))||n.enumerable});return e};var m=(e,t,r)=>(r=e!=null?dt(ht(e)):{},mt(t||!e||!e.__esModule?pe(r,"default",{value:e,enumerable:!0}):r,e));var X=y(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.PATTERNS=p.MAX_BYTES=void 0;p.truncateTo=de;p.truncate=Pt;p.collectMatches=_e;p.resolveOverlaps=ge;p.applyMatches=he;p.redact=Ot;p.MAX_BYTES=102400;function de(e,t){let r=Buffer.from(e,"utf-8");return r.length<=t?e:`${r.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${r.length}]`}function Pt(e){return de(e,p.MAX_BYTES)}p.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 _e(e,t){let r=[];for(let n of p.PATTERNS){if(n.requireContext&&n.requireContext!==t.context)continue;let o=new RegExp(n.regex.source,n.regex.flags),i;for(;(i=o.exec(e))!==null;){let a=n.captureGroup??0,u=i[a];if(u===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}let c=i.index,d=i.index+i[0].length,g=c+i[0].indexOf(u),Y=g+u.length;r.push({start:c,end:d,replaceStart:g,replaceEnd:Y,type:n.type}),i.index===o.lastIndex&&o.lastIndex++}}return r}function ge(e){let t=[...e].sort((o,i)=>o.start!==i.start?o.start-i.start:i.end-i.start-(o.end-o.start)),r=[],n=-1;for(let o of t)o.start<n||(r.push(o),n=o.end);return r}function he(e,t){let r=[...t].sort((o,i)=>i.replaceStart-o.replaceStart),n=e;for(let o of r)n=n.slice(0,o.replaceStart)+`[REDACTED:${o.type}]`+n.slice(o.replaceEnd);return n}function Ot(e,t={}){if(e.length===0)return e;let r=_e(e,t);if(r.length===0)return e;let n=ge(r);return he(e,n)}});var z=y(f=>{"use strict";var St=f&&f.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(f,"__esModule",{value:!0});f.MAX_SPAN_BYTES=void 0;f.ulidToTraceId=Oe;f.newSpanId=Se;f.snakeCase=Et;f.toOtlpValue=Te;f.attrsFromRecord=bt;f.guardAttrs=ve;f.clientAttrs=Ee;f.enforceSpanBudget=be;f.buildPayload=kt;f.mergeBatch=wt;var Tt=St(require("crypto")),K=X(),vt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Oe(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let n of e){let o=vt.indexOf(n);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${n}"`);t=t<<5n|BigInt(o)}let r=(1n<<128n)-1n;return t&=r,t.toString(16).padStart(32,"0")}function Se(){return Tt.default.randomBytes(8).toString("hex")}function Et(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var ye=new Set;function D(e,t,r){let n=(0,K.truncate)(t);if((r.skipRedactKeys??ye).has(e))return n;let o=(r.bashContextKeys??ye).has(e)?"bash":void 0;return(0,K.redact)(n,{context:o})}function Te(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:D(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:D(e,JSON.stringify(t),r)}}catch{return{stringValue:D(e,String(t),r)}}default:return{stringValue:D(e,String(t),r)}}}function bt(e,t,r={}){let n=[];for(let[o,i]of Object.entries(e)){let a=`${t}.${o}`,u=Te(a,i,r);u!==null&&n.push({key:a,value:u})}return n}function ve(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function Ee(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}f.MAX_SPAN_BYTES=800*1024;function me(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var Pe=1024;function be(e,t=f.MAX_SPAN_BYTES){let r=me(e);for(let n=0;n<100&&r>t;n++){let o=null,i=0;for(let c of e.attributes){if(!("stringValue"in c.value))continue;let d=Buffer.byteLength(c.value.stringValue,"utf-8");d>i&&(i=d,o=c.value)}if(o===null||i<=Pe)break;let a=r-t,u=Math.max(Pe,i-a-64);o.stringValue=(0,K.truncateTo)(o.stringValue,u),r=me(e)}return e}function kt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...ve(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...Ee(o));let i={traceId:Oe(e.traceId),spanId:Se(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return be(i),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[i]}]}]}}function wt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var ke=y(J=>{"use strict";Object.defineProperty(J,"__esModule",{value:!0});J.evaluateGuard=It;var At=1e4,Mt="pinta-core";function Z(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Rt=new Set(["ALLOW","DENY","REVIEW"]);async function It(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??At,o=Date.now(),i=new AbortController,a=setTimeout(()=>i.abort(),n);try{let u=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??Mt,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e}),signal:i.signal});if(u.status!==200)return Z(Date.now()-o,"error");let c=await u.json(),d=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!Rt.has(c.decision)||!d)return Z(Date.now()-o,"error");let g=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??g,clientRttMs:g}}catch(u){let c=u.name,d=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return Z(Date.now()-o,d)}finally{clearTimeout(a)}}});var j=y(I=>{"use strict";var Nt=I&&I.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0});I.atomicWriteFileSync=xt;var we=Nt(require("fs"));function xt(e,t){let r=`${e}.${process.pid}.tmp`;we.default.writeFileSync(r,t),we.default.renameSync(r,e)}});var Q=y(S=>{"use strict";var Ae=S&&S.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(S,"__esModule",{value:!0});S.MemoryRetryQueue=S.DiskRetryQueue=void 0;var _=Ae(require("fs")),C=Ae(require("path")),Dt=j(),L=1e3,jt=50,Ct=5,H=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=C.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{_.default.mkdirSync(C.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
2
- `;_.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
3
- `)}}readAll(){try{let t=_.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
4
- `))if(n.trim())try{let o=JSON.parse(n);Array.isArray(o?.payload?.resourceSpans)&&r.push(o)}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){_.default.existsSync(this.filePath)&&_.default.unlinkSync(this.filePath);return}_.default.mkdirSync(C.default.dirname(this.filePath),{recursive:!0}),(0,Dt.atomicWriteFileSync)(this.filePath,t.map(r=>JSON.stringify(r)).join(`
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(`
5
5
  `)+`
6
- `)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
7
- `)}}tryAcquireLock(){let t=Date.now();try{_.default.mkdirSync(C.default.dirname(this.lockPath),{recursive:!0})}catch(r){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${r}
8
- `),!1}for(;Date.now()-t<jt;)try{let r=_.default.openSync(this.lockPath,"wx");return _.default.writeSync(r,String(process.pid)),_.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
9
- `),!1;try{let i=_.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){_.default.unlinkSync(this.lockPath);continue}}catch{}let n=Ct,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{_.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=L)return;let r=t.length-L;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
10
- `),this.rewrite(t.slice(r))}};S.DiskRetryQueue=H;var W=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>L&&this.entries.splice(0,this.entries.length-L)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};S.MemoryRetryQueue=W});var De=y(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});l.MemoryTransport=l.DiskTransport=l.MAX_POST_BYTES=void 0;l.parseHeadersEnv=Ne;l.envOptionsResolver=xe;l.postOtlp=N;var Me=Q(),Re=z(),Lt=5e3;l.MAX_POST_BYTES=900*1024;function q(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function Ie(e,t,r){let n=[],o=[],i=[],a=0;for(let u of e){let c=t(u);if(c>r){o.push(u);continue}i.length>0&&a+c>r&&(n.push(i),i=[],a=0),i.push(u),a+=c}return i.length>0&&n.push(i),{chunks:n,oversize:o}}function Ne(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let r of e.split(",")){let[n,...o]=r.split("=");n&&o.length>0&&(t[n.trim()]=o.join("=").trim())}return t}function xe(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:Ne(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function N(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Lt);try{let i=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!i.ok){let a="";try{a=(await i.text()).slice(0,200)}catch{}let u=i.status===401||i.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":i.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":i.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${i.status} ${t.endpoint}${u}${a?` body=${a}`:""}
11
- `),!1}return!0}catch(i){return process.stderr.write(`[${r}] OTLP POST failed: ${i.message??String(i)}
12
- `),!1}finally{clearTimeout(o)}}var ee=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new Me.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??xe}async send(t){let r=this.resolveOptions();if(!r||this.dropIfOversized(t))return;await N(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let{chunks:n,oversize:o}=Ie(r,u=>q(u.payload),l.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized retry ${o.length===1?"entry":"entries"} (each > ${l.MAX_POST_BYTES} bytes \u2014 the backend caps the request body, so they can never be delivered)
13
- `);let i=[].concat(...n),a=0;for(let u of n){if(!await N((0,Re.mergeBatch)(u.map(d=>d.payload)),t,this.logPrefix))break;a+=u.length}this.queue.rewrite(i.slice(a))}catch(r){process.stderr.write(`[${this.logPrefix}] flush failed: ${r?.message??String(r)}
14
- `)}finally{this.queue.release()}}dropIfOversized(t){let r=q(t);return r<=l.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${r} > ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
15
- `),!0)}};l.DiskTransport=ee;var te=class{queue=new Me.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;if(q(t)>l.MAX_POST_BYTES){process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (> ${l.MAX_POST_BYTES} bytes) \u2014 undeliverable, not buffered
16
- `);return}await N(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let{chunks:n,oversize:o}=Ie(r,q,l.MAX_POST_BYTES);o.length>0&&process.stderr.write(`[${this.logPrefix}] dropping ${o.length} oversized buffered ${o.length===1?"payload":"payloads"} (each > ${l.MAX_POST_BYTES} bytes \u2014 undeliverable)
17
- `);let i=[].concat(...n),a=0;for(let u of n){if(!await N((0,Re.mergeBatch)(u),t,this.logPrefix))break;a+=u.length}for(let u of i.slice(a))this.queue.enqueue(u)}};l.MemoryTransport=te});var se=y(b=>{"use strict";var oe=b&&b.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(b,"__esModule",{value:!0});b.TraceManager=void 0;b.generateUlid=Ce;var je=oe(require("fs")),qt=oe(require("path")),Bt=oe(require("crypto")),Vt=j(),re="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ce(){let e=Date.now(),t="",r=e;for(let i=0;i<10;i++)t=re[r&31]+t,r=Math.floor(r/32);let n=Bt.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=re[n[i]&31];for(;o.length<16;)o+=re[0];return t+o}var ne=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ce();return this.save(t),t}currentTrace(){try{let t=je.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){try{je.default.mkdirSync(qt.default.dirname(this.tracePath),{recursive:!0}),(0,Vt.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(r){process.stderr.write(`[pinta-core] trace persistence failed: ${r}
18
- `)}}};b.TraceManager=ne});var $e=y(T=>{"use strict";var qe=T&&T.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(T,"__esModule",{value:!0});T.MemorySessionTraceManager=T.DiskSessionTraceManager=void 0;var Le=qe(require("fs")),$t=qe(require("path")),Be=se(),Ft=j(),Ve=200,ie=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??Ve}read(){try{let t=JSON.parse(Le.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Le.default.mkdirSync($t.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;(0,Ft.atomicWriteFileSync)(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Be.generateUlid)(),o=this.read();return o[r]=n,this.write(o),n}currentTrace(t){let r=t||"default",n=this.read()[r];return n||this.newTrace(r)}};T.DiskSessionTraceManager=ie;var ae=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ve}newTrace(t){let r=t||"default",n=(0,Be.generateUlid)();if(this.map.set(r,n),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return n}currentTrace(t){let r=t||"default";return this.map.get(r)??this.newTrace(r)}};T.MemorySessionTraceManager=ae});var Ge=y(k=>{"use strict";var ue=k&&k.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(k,"__esModule",{value:!0});k.envFilePath=Yt;k.parseEnvFile=Ue;k.loadEnvFile=Xt;var Ut=ue(require("node:fs")),Gt=ue(require("node:os")),Fe=ue(require("node:path"));function Yt(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:Fe.default.join(Gt.default.homedir(),e);return Fe.default.join(o,t)}function Ue(e){let t={};for(let r of e.split(`
19
- `)){let n=r.trim();if(!n||n.startsWith("#"))continue;let o=n.indexOf("=");if(o<0)continue;let i=n.slice(0,o).trim(),a=n.slice(o+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),i&&(t[i]=a)}return t}function Xt(e){let t;try{t=Ut.default.readFileSync(e,"utf-8")}catch{return}let r=Ue(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var M=y(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.loadEnvFile=s.parseEnvFile=s.envFilePath=s.MemorySessionTraceManager=s.DiskSessionTraceManager=s.generateUlid=s.TraceManager=s.MAX_POST_BYTES=s.parseHeadersEnv=s.envOptionsResolver=s.postOtlp=s.MemoryTransport=s.DiskTransport=s.MemoryRetryQueue=s.DiskRetryQueue=s.evaluateGuard=s.MAX_SPAN_BYTES=s.enforceSpanBudget=s.mergeBatch=s.buildPayload=s.clientAttrs=s.guardAttrs=s.attrsFromRecord=s.toOtlpValue=s.snakeCase=s.newSpanId=s.ulidToTraceId=s.MAX_BYTES=s.PATTERNS=s.applyMatches=s.resolveOverlaps=s.collectMatches=s.truncateTo=s.truncate=s.redact=void 0;var v=X();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return v.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return v.truncate}});Object.defineProperty(s,"truncateTo",{enumerable:!0,get:function(){return v.truncateTo}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return v.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return v.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return v.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return v.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return v.MAX_BYTES}});var h=z();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return h.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return h.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return h.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return h.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return h.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return h.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return h.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return h.buildPayload}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return h.mergeBatch}});Object.defineProperty(s,"enforceSpanBudget",{enumerable:!0,get:function(){return h.enforceSpanBudget}});Object.defineProperty(s,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return h.MAX_SPAN_BYTES}});var Kt=ke();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return Kt.evaluateGuard}});var Ye=Q();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return Ye.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return Ye.MemoryRetryQueue}});var A=De();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return A.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return A.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return A.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return A.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return A.parseHeadersEnv}});Object.defineProperty(s,"MAX_POST_BYTES",{enumerable:!0,get:function(){return A.MAX_POST_BYTES}});var Xe=se();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return Xe.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return Xe.generateUlid}});var Ke=$e();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Ke.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Ke.MemorySessionTraceManager}});var ce=Ge();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return ce.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return ce.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return ce.loadEnvFile}})});var x=m(M());function zt(){return(0,x.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function ze(e=zt()){(0,x.loadEnvFile)(e)}var Ze=m(require("os")),B=m(require("path"));function Zt(){return process.env.COPILOT_HOME||B.default.join(Ze.default.homedir(),".copilot")}function Je(){let e=process.env.COPILOT_PLUGIN_DATA||B.default.join(Zt(),"pinta-copilot-data");return{pluginData:e,tracePath:B.default.join(e,"trace.json")}}function He(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"}function O(e){return typeof e=="string"?e:void 0}function R(e){return O(e.hook_event_name)??O(e.hookEventName)??O(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function We(e){return O(e.session_id)??O(e.sessionId)}function Qe(e){return O(e.tool_name)??O(e.toolName)}function et(e){return O(e.cwd)??O(e.workingDirectory)}function tt(e){return e.tool_input??e.toolArgs??e.toolInput}var Jt={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 rt(e){let t=R(e);return t?Jt[t.toLowerCase()]??"Unknown":"Unknown"}function nt(e){return e==="PreToolUse"||e==="PermissionRequest"}var Ht=new Set(["report_intent","ask_user"]);function ot(e){return e!==void 0&&Ht.has(e)}function st(e,t){return e==="PreToolUse"?JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}}):e==="PermissionRequest"?JSON.stringify({behavior:"deny",message:t}):null}var $=m(M());function Wt(){let e=process.env.COPILOT_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:(0,$.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var V=class extends $.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:Wt})}};var it=m(M()),F=class extends it.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var at=m(require("fs")),G=m(require("os")),fe=m(require("path")),w=m(M());var U;function Qt(){if(U===void 0)try{U=G.default.userInfo().username}catch{U=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return U}var ut="0.6.0",er=new Set(["","unknown","undefined","null","n/a","none"]);function P(e){let t=typeof e=="string"?e.trim():void 0;return t&&!er.has(t.toLowerCase())?t:void 0}var tr=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function rr(e){let t=P(e);return t&&tr.test(t)?t:void 0}function nr(e){let t=e?P(e.copilot_version)??P(e.copilotVersion)??P(e.cli_version)??P(e.cliVersion)??P(e.version):void 0;return t||(le===void 0&&(le=or()),le??void 0)}var le;function or(){let e=P(process.env.COPILOT_CLI_BINARY_VERSION)??P(process.env.COPILOT_CLI_VERSION);if(e)return e;let t=P(process.env.COPILOT_CLI_RESOLVED_DIST_DIR);if(t){let r=rr(fe.default.basename(t));if(r)return r;let n=sr(t);if(n)return n}return null}function sr(e){try{let t=at.default.readFileSync(fe.default.join(e,"package.json"),"utf8");return P(JSON.parse(t).version)}catch{return}}var ir=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"]),ar=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),ur={skipRedactKeys:ir,bashContextKeys:ar},cr=new Set(["hook_event_name","hookEventName","hookName"]);function lr(e,t){let r=Object.fromEntries(Object.entries(e).filter(([n])=>!cr.has(n)));return[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:R(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,w.attrsFromRecord)(r,"copilot",ur)]}function fr(e){let t=nr(e);return[{key:"service.name",value:{stringValue:"copilot"}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{key:"telemetry.sdk.name",value:{stringValue:"pinta-copilot"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:ut}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Qt()}},{key:"host.name",value:{stringValue:G.default.hostname()}},{key:"host.arch",value:{stringValue:G.default.arch()}}]}function ct(e){return(0,w.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,w.snakeCase)(R(e.event)??"unknown")}`,attributes:lr(e.event,e.surface),resource:fr(e.event),scope:{name:"pinta-copilot",version:ut},now:e.now,guard:e.guard})}var lt=m(M());function pr(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||50}var dr="pinta-copilot/0.6.0";function ft(e,t){return(0,lt.evaluateGuard)(e,t,{timeoutMs:pr(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:dr})}async function _r(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function pt(){try{let e=Je(),t=He(),r=await _r(),n=JSON.parse(r),o=rt(n),i=We(n),a=new V(e);await a.flush();let u=new F(e),c=o==="UserPromptSubmit"?u.newTrace(i):u.currentTrace(i),d=Qe(n),g=null;if(nt(o)&&!ot(d)){let E=tt(n);g=await ft({spanId:i??"unknown",toolName:d,method:R(n),cwd:et(n),toolInput:E,rawTextFields:{toolInput:typeof E=="string"?E:JSON.stringify(E??null)}},process.env.PINTA_GUARD_ENDPOINT)}if(g?.decision==="DENY"){let E=st(o,g.userMessage??g.reason??"guard_deny");E&&process.stdout.write(E+`
20
- `)}let Y=ct({event:n,traceId:c,surface:t,guard:g});await a.send(Y)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
21
- `)}return 0}ze();async function gr(){let e=await pt();process.exit(e)}gr();
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}`:""}
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();
package/dist/index.mjs CHANGED
@@ -1,22 +1,22 @@
1
1
  import{createRequire as __pintaCreateRequire}from 'node:module';const require=__pintaCreateRequire(import.meta.url);
2
- var At=Object.create;var _e=Object.defineProperty;var It=Object.getOwnPropertyDescriptor;var Mt=Object.getOwnPropertyNames;var Rt=Object.getPrototypeOf,xt=Object.prototype.hasOwnProperty;var m=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var _=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Nt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Mt(t))!xt.call(e,o)&&o!==r&&_e(e,o,{get:()=>t[o],enumerable:!(n=It(t,o))||n.enumerable});return e};var R=(e,t,r)=>(r=e!=null?At(Rt(e)):{},Nt(t||!e||!e.__esModule?_e(r,"default",{value:e,enumerable:!0}):r,e));var Y=_(d=>{"use strict";Object.defineProperty(d,"__esModule",{value:!0});d.PATTERNS=d.MAX_BYTES=void 0;d.truncateTo=Se;d.truncate=Dt;d.collectMatches=Pe;d.resolveOverlaps=Te;d.applyMatches=Oe;d.redact=jt;d.MAX_BYTES=102400;function Se(e,t){let r=Buffer.from(e,"utf-8");return r.length<=t?e:`${r.subarray(0,Math.max(0,t)).toString("utf-8")}\u2026[TRUNCATED:${r.length}]`}function Dt(e){return Se(e,d.MAX_BYTES)}d.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function Pe(e,t){let r=[];for(let n of d.PATTERNS){if(n.requireContext&&n.requireContext!==t.context)continue;let o=new RegExp(n.regex.source,n.regex.flags),s;for(;(s=o.exec(e))!==null;){let u=n.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,g=c+s[0].indexOf(a),X=g+a.length;r.push({start:c,end:l,replaceStart:g,replaceEnd:X,type:n.type}),s.index===o.lastIndex&&o.lastIndex++}}return r}function Te(e){let t=[...e].sort((o,s)=>o.start!==s.start?o.start-s.start:s.end-s.start-(o.end-o.start)),r=[],n=-1;for(let o of t)o.start<n||(r.push(o),n=o.end);return r}function Oe(e,t){let r=[...t].sort((o,s)=>s.replaceStart-o.replaceStart),n=e;for(let o of r)n=n.slice(0,o.replaceStart)+`[REDACTED:${o.type}]`+n.slice(o.replaceEnd);return n}function jt(e,t={}){if(e.length===0)return e;let r=Pe(e,t);if(r.length===0)return e;let n=Te(r);return Oe(e,n)}});var z=_(f=>{"use strict";var Ct=f&&f.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(f,"__esModule",{value:!0});f.MAX_SPAN_BYTES=void 0;f.ulidToTraceId=be;f.newSpanId=ke;f.snakeCase=Ft;f.toOtlpValue=Ae;f.attrsFromRecord=$t;f.guardAttrs=Ie;f.clientAttrs=Me;f.enforceSpanBudget=Re;f.buildPayload=Bt;f.mergeBatch=Vt;var Lt=Ct(m("crypto")),K=Y(),qt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function be(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let n of e){let o=qt.indexOf(n);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${n}"`);t=t<<5n|BigInt(o)}let r=(1n<<128n)-1n;return t&=r,t.toString(16).padStart(32,"0")}function ke(){return Lt.default.randomBytes(8).toString("hex")}function Ft(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Ee=new Set;function j(e,t,r){let n=(0,K.truncate)(t);if((r.skipRedactKeys??Ee).has(e))return n;let o=(r.bashContextKeys??Ee).has(e)?"bash":void 0;return(0,K.redact)(n,{context:o})}function Ae(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:j(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:j(e,JSON.stringify(t),r)}}catch{return{stringValue:j(e,String(t),r)}}default:return{stringValue:j(e,String(t),r)}}}function $t(e,t,r={}){let n=[];for(let[o,s]of Object.entries(e)){let u=`${t}.${o}`,a=Ae(u,s,r);a!==null&&n.push({key:u,value:a})}return n}function Ie(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 Me(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}f.MAX_SPAN_BYTES=800*1024;function ve(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}var we=1024;function Re(e,t=f.MAX_SPAN_BYTES){let r=ve(e);for(let n=0;n<100&&r>t;n++){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<=we)break;let u=r-t,a=Math.max(we,s-u-64);o.stringValue=(0,K.truncateTo)(o.stringValue,a),r=ve(e)}return e}function Bt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...Ie(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...Me(o));let s={traceId:be(e.traceId),spanId:ke(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return Re(s),{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]}}function Vt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var xe=_(H=>{"use strict";Object.defineProperty(H,"__esModule",{value:!0});H.evaluateGuard=Yt;var Ut=1e4,Gt="pinta-core";function Z(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}var Xt=new Set(["ALLOW","DENY","REVIEW"]);async function Yt(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??Ut,o=Date.now(),s=new AbortController,u=setTimeout(()=>s.abort(),n);try{let a=await fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??Gt,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e}),signal:s.signal});if(a.status!==200)return Z(Date.now()-o,"error");let c=await a.json(),l=c?.durationMs===void 0||typeof c.durationMs=="number"&&Number.isFinite(c.durationMs);if(!c||!Xt.has(c.decision)||!l)return Z(Date.now()-o,"error");let g=Date.now()-o;return{decision:c.decision,reason:c.reason??null,userMessage:c.userMessage??null,durationMs:c.durationMs??g,clientRttMs:g}}catch(a){let c=a.name,l=c==="AbortError"||c==="TimeoutError"?"timeout":"error";return Z(Date.now()-o,l)}finally{clearTimeout(u)}}});var C=_(x=>{"use strict";var Kt=x&&x.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(x,"__esModule",{value:!0});x.atomicWriteFileSync=zt;var Ne=Kt(m("fs"));function zt(e,t){let r=`${e}.${process.pid}.tmp`;Ne.default.writeFileSync(r,t),Ne.default.renameSync(r,e)}});var Q=_(T=>{"use strict";var De=T&&T.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(T,"__esModule",{value:!0});T.MemoryRetryQueue=T.DiskRetryQueue=void 0;var h=De(m("fs")),L=De(m("path")),Zt=C(),q=1e3,Ht=50,Jt=5,J=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=L.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{h.default.mkdirSync(L.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
3
- `;h.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
4
- `)}}readAll(){try{let t=h.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
5
- `))if(n.trim())try{let o=JSON.parse(n);Array.isArray(o?.payload?.resourceSpans)&&r.push(o)}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){h.default.existsSync(this.filePath)&&h.default.unlinkSync(this.filePath);return}h.default.mkdirSync(L.default.dirname(this.filePath),{recursive:!0}),(0,Zt.atomicWriteFileSync)(this.filePath,t.map(r=>JSON.stringify(r)).join(`
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(`
6
6
  `)+`
7
- `)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
8
- `)}}tryAcquireLock(){let t=Date.now();try{h.default.mkdirSync(L.default.dirname(this.lockPath),{recursive:!0})}catch(r){return process.stderr.write(`[${this.logPrefix}] retry-queue lock mkdir failed: ${r}
9
- `),!1}for(;Date.now()-t<Ht;)try{let r=h.default.openSync(this.lockPath,"wx");return h.default.writeSync(r,String(process.pid)),h.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
10
- `),!1;try{let s=h.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){h.default.unlinkSync(this.lockPath);continue}}catch{}let n=Jt,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{h.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=q)return;let r=t.length-q;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
11
- `),this.rewrite(t.slice(r))}};T.DiskRetryQueue=J;var W=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}};T.MemoryRetryQueue=W});var $e=_(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.MemoryTransport=p.DiskTransport=p.MAX_POST_BYTES=void 0;p.parseHeadersEnv=qe;p.envOptionsResolver=Fe;p.postOtlp=N;var je=Q(),Ce=z(),Wt=5e3;p.MAX_POST_BYTES=900*1024;function F(e){let t=JSON.stringify(e);return t===void 0?0:Buffer.byteLength(t,"utf-8")}function Le(e,t,r){let n=[],o=[],s=[],u=0;for(let a of e){let c=t(a);if(c>r){o.push(a);continue}s.length>0&&u+c>r&&(n.push(s),s=[],u=0),s.push(a),u+=c}return s.length>0&&n.push(s),{chunks:n,oversize:o}}function qe(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let r of e.split(",")){let[n,...o]=r.split("=");n&&o.length>0&&(t[n.trim()]=o.join("=").trim())}return t}function Fe(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:qe(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function N(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Wt);try{let s=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!s.ok){let 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(`[${r}] OTLP POST ${s.status} ${t.endpoint}${a}${u?` body=${u}`:""}
12
- `),!1}return!0}catch(s){return process.stderr.write(`[${r}] OTLP POST failed: ${s.message??String(s)}
13
- `),!1}finally{clearTimeout(o)}}var ee=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new je.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Fe}async send(t){let r=this.resolveOptions();if(!r||this.dropIfOversized(t))return;await N(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let{chunks:n,oversize:o}=Le(r,a=>F(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(...n),u=0;for(let a of n){if(!await N((0,Ce.mergeBatch)(a.map(l=>l.payload)),t,this.logPrefix))break;u+=a.length}this.queue.rewrite(s.slice(u))}catch(r){process.stderr.write(`[${this.logPrefix}] flush failed: ${r?.message??String(r)}
15
- `)}finally{this.queue.release()}}dropIfOversized(t){let r=F(t);return r<=p.MAX_POST_BYTES?!1:(process.stderr.write(`[${this.logPrefix}] dropping oversized span payload (${r} > ${p.MAX_POST_BYTES} bytes) \u2014 undeliverable, not queued
16
- `),!0)}};p.DiskTransport=ee;var te=class{queue=new je.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;if(F(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 N(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let{chunks:n,oversize:o}=Le(r,F,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(...n),u=0;for(let a of n){if(!await N((0,Ce.mergeBatch)(a),t,this.logPrefix))break;u+=a.length}for(let a of s.slice(u))this.queue.enqueue(a)}};p.MemoryTransport=te});var se=_(w=>{"use strict";var oe=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(w,"__esModule",{value:!0});w.TraceManager=void 0;w.generateUlid=Ve;var Be=oe(m("fs")),Qt=oe(m("path")),er=oe(m("crypto")),tr=C(),re="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ve(){let e=Date.now(),t="",r=e;for(let s=0;s<10;s++)t=re[r&31]+t,r=Math.floor(r/32);let n=er.default.randomBytes(10),o="";for(let s=0;s<10;s++)o+=re[n[s]&31];for(;o.length<16;)o+=re[0];return t+o}var ne=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Ve();return this.save(t),t}currentTrace(){try{let t=Be.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){try{Be.default.mkdirSync(Qt.default.dirname(this.tracePath),{recursive:!0}),(0,tr.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:t}))}catch(r){process.stderr.write(`[pinta-core] trace persistence failed: ${r}
19
- `)}}};w.TraceManager=ne});var Ke=_(O=>{"use strict";var Ge=O&&O.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(O,"__esModule",{value:!0});O.MemorySessionTraceManager=O.DiskSessionTraceManager=void 0;var Ue=Ge(m("fs")),rr=Ge(m("path")),Xe=se(),nr=C(),Ye=200,ie=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??Ye}read(){try{let t=JSON.parse(Ue.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{Ue.default.mkdirSync(rr.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;(0,nr.atomicWriteFileSync)(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Xe.generateUlid)(),o=this.read();return o[r]=n,this.write(o),n}currentTrace(t){let r=t||"default",n=this.read()[r];return n||this.newTrace(r)}};O.DiskSessionTraceManager=ie;var ae=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Ye}newTrace(t){let r=t||"default",n=(0,Xe.generateUlid)();if(this.map.set(r,n),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return n}currentTrace(t){let r=t||"default";return this.map.get(r)??this.newTrace(r)}};O.MemorySessionTraceManager=ae});var He=_(b=>{"use strict";var ue=b&&b.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(b,"__esModule",{value:!0});b.envFilePath=ir;b.parseEnvFile=Ze;b.loadEnvFile=ar;var or=ue(m("node:fs")),sr=ue(m("node:os")),ze=ue(m("node:path"));function ir(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:ze.default.join(sr.default.homedir(),e);return ze.default.join(o,t)}function Ze(e){let t={};for(let r of e.split(`
20
- `)){let n=r.trim();if(!n||n.startsWith("#"))continue;let o=n.indexOf("=");if(o<0)continue;let s=n.slice(0,o).trim(),u=n.slice(o+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),s&&(t[s]=u)}return t}function ar(e){let t;try{t=or.default.readFileSync(e,"utf-8")}catch{return}let r=Ze(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var I=_(i=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});i.loadEnvFile=i.parseEnvFile=i.envFilePath=i.MemorySessionTraceManager=i.DiskSessionTraceManager=i.generateUlid=i.TraceManager=i.MAX_POST_BYTES=i.parseHeadersEnv=i.envOptionsResolver=i.postOtlp=i.MemoryTransport=i.DiskTransport=i.MemoryRetryQueue=i.DiskRetryQueue=i.evaluateGuard=i.MAX_SPAN_BYTES=i.enforceSpanBudget=i.mergeBatch=i.buildPayload=i.clientAttrs=i.guardAttrs=i.attrsFromRecord=i.toOtlpValue=i.snakeCase=i.newSpanId=i.ulidToTraceId=i.MAX_BYTES=i.PATTERNS=i.applyMatches=i.resolveOverlaps=i.collectMatches=i.truncateTo=i.truncate=i.redact=void 0;var E=Y();Object.defineProperty(i,"redact",{enumerable:!0,get:function(){return E.redact}});Object.defineProperty(i,"truncate",{enumerable:!0,get:function(){return E.truncate}});Object.defineProperty(i,"truncateTo",{enumerable:!0,get:function(){return E.truncateTo}});Object.defineProperty(i,"collectMatches",{enumerable:!0,get:function(){return E.collectMatches}});Object.defineProperty(i,"resolveOverlaps",{enumerable:!0,get:function(){return E.resolveOverlaps}});Object.defineProperty(i,"applyMatches",{enumerable:!0,get:function(){return E.applyMatches}});Object.defineProperty(i,"PATTERNS",{enumerable:!0,get:function(){return E.PATTERNS}});Object.defineProperty(i,"MAX_BYTES",{enumerable:!0,get:function(){return E.MAX_BYTES}});var y=z();Object.defineProperty(i,"ulidToTraceId",{enumerable:!0,get:function(){return y.ulidToTraceId}});Object.defineProperty(i,"newSpanId",{enumerable:!0,get:function(){return y.newSpanId}});Object.defineProperty(i,"snakeCase",{enumerable:!0,get:function(){return y.snakeCase}});Object.defineProperty(i,"toOtlpValue",{enumerable:!0,get:function(){return y.toOtlpValue}});Object.defineProperty(i,"attrsFromRecord",{enumerable:!0,get:function(){return y.attrsFromRecord}});Object.defineProperty(i,"guardAttrs",{enumerable:!0,get:function(){return y.guardAttrs}});Object.defineProperty(i,"clientAttrs",{enumerable:!0,get:function(){return y.clientAttrs}});Object.defineProperty(i,"buildPayload",{enumerable:!0,get:function(){return y.buildPayload}});Object.defineProperty(i,"mergeBatch",{enumerable:!0,get:function(){return y.mergeBatch}});Object.defineProperty(i,"enforceSpanBudget",{enumerable:!0,get:function(){return y.enforceSpanBudget}});Object.defineProperty(i,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return y.MAX_SPAN_BYTES}});var ur=xe();Object.defineProperty(i,"evaluateGuard",{enumerable:!0,get:function(){return ur.evaluateGuard}});var Je=Q();Object.defineProperty(i,"DiskRetryQueue",{enumerable:!0,get:function(){return Je.DiskRetryQueue}});Object.defineProperty(i,"MemoryRetryQueue",{enumerable:!0,get:function(){return Je.MemoryRetryQueue}});var A=$e();Object.defineProperty(i,"DiskTransport",{enumerable:!0,get:function(){return A.DiskTransport}});Object.defineProperty(i,"MemoryTransport",{enumerable:!0,get:function(){return A.MemoryTransport}});Object.defineProperty(i,"postOtlp",{enumerable:!0,get:function(){return A.postOtlp}});Object.defineProperty(i,"envOptionsResolver",{enumerable:!0,get:function(){return A.envOptionsResolver}});Object.defineProperty(i,"parseHeadersEnv",{enumerable:!0,get:function(){return A.parseHeadersEnv}});Object.defineProperty(i,"MAX_POST_BYTES",{enumerable:!0,get:function(){return A.MAX_POST_BYTES}});var We=se();Object.defineProperty(i,"TraceManager",{enumerable:!0,get:function(){return We.TraceManager}});Object.defineProperty(i,"generateUlid",{enumerable:!0,get:function(){return We.generateUlid}});var Qe=Ke();Object.defineProperty(i,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Qe.DiskSessionTraceManager}});Object.defineProperty(i,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Qe.MemorySessionTraceManager}});var ce=He();Object.defineProperty(i,"envFilePath",{enumerable:!0,get:function(){return ce.envFilePath}});Object.defineProperty(i,"parseEnvFile",{enumerable:!0,get:function(){return ce.parseEnvFile}});Object.defineProperty(i,"loadEnvFile",{enumerable:!0,get:function(){return ce.loadEnvFile}})});import{realpathSync as nn}from"node:fs";import{pathToFileURL as on}from"node:url";var D=R(I());function cr(){return(0,D.envFilePath)(".copilot","pinta-copilot.env","COPILOT_HOME")}function et(e=cr()){(0,D.loadEnvFile)(e)}import lr from"os";import le from"path";function pe(){return process.env.COPILOT_HOME||le.join(lr.homedir(),".copilot")}function tt(){let e=process.env.COPILOT_PLUGIN_DATA||le.join(pe(),"pinta-copilot-data");return{pluginData:e,tracePath:le.join(e,"trace.json")}}function rt(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"}function P(e){return typeof e=="string"?e:void 0}function M(e){return P(e.hook_event_name)??P(e.hookEventName)??P(e.hookName)??(process.env.PINTA_COPILOT_EVENT||void 0)}function nt(e){return P(e.session_id)??P(e.sessionId)}function ot(e){return P(e.tool_name)??P(e.toolName)}function st(e){return P(e.cwd)??P(e.workingDirectory)}function it(e){return e.tool_input??e.toolArgs??e.toolInput}var pr={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 at(e){let t=M(e);return t?pr[t.toLowerCase()]??"Unknown":"Unknown"}function ut(e){return e==="PreToolUse"||e==="PermissionRequest"}var fr=new Set(["report_intent","ask_user"]);function ct(e){return e!==void 0&&fr.has(e)}function lt(e,t){return e==="PreToolUse"?JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:t}}):e==="PermissionRequest"?JSON.stringify({behavior:"deny",message:t}):null}var B=R(I());function dr(){let e=process.env.COPILOT_PLUGIN_OPTION_ENDPOINT||process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:(0,B.parseHeadersEnv)(process.env.COPILOT_PLUGIN_OPTION_HEADERS||process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}var $=class extends B.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-copilot",resolveOptions:dr})}};var pt=R(I()),V=class extends pt.DiskSessionTraceManager{constructor(t){super(t.tracePath)}};var k=R(I());import gr from"fs";import de from"os";import ft from"path";var U;function hr(){if(U===void 0)try{U=de.userInfo().username}catch{U=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return U}var dt="0.6.0",mr=new Set(["","unknown","undefined","null","n/a","none"]);function S(e){let t=typeof e=="string"?e.trim():void 0;return t&&!mr.has(t.toLowerCase())?t:void 0}var yr=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;function _r(e){let t=S(e);return t&&yr.test(t)?t:void 0}function Sr(e){let t=e?S(e.copilot_version)??S(e.copilotVersion)??S(e.cli_version)??S(e.cliVersion)??S(e.version):void 0;return t||(fe===void 0&&(fe=Pr()),fe??void 0)}var fe;function Pr(){let e=S(process.env.COPILOT_CLI_BINARY_VERSION)??S(process.env.COPILOT_CLI_VERSION);if(e)return e;let t=S(process.env.COPILOT_CLI_RESOLVED_DIST_DIR);if(t){let r=_r(ft.basename(t));if(r)return r;let n=Tr(t);if(n)return n}return null}function Tr(e){try{let t=gr.readFileSync(ft.join(e,"package.json"),"utf8");return S(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"]),Er=new Set(["copilot.tool_input","copilot.toolInput","copilot.tool_response","copilot.tool_result"]),vr={skipRedactKeys:Or,bashContextKeys:Er},wr=new Set(["hook_event_name","hookEventName","hookName"]);function br(e,t){let r=Object.fromEntries(Object.entries(e).filter(([n])=>!wr.has(n)));return[{key:"ingest.type",value:{stringValue:"copilot"}},{key:"copilot.hook",value:{stringValue:M(e)??"unknown"}},{key:"copilot.surface",value:{stringValue:t}},...(0,k.attrsFromRecord)(r,"copilot",vr)]}function kr(e){let t=Sr(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:dt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:hr()}},{key:"host.name",value:{stringValue:de.hostname()}},{key:"host.arch",value:{stringValue:de.arch()}}]}function gt(e){return(0,k.buildPayload)({traceId:e.traceId,spanName:`copilot.${(0,k.snakeCase)(M(e.event)??"unknown")}`,attributes:br(e.event,e.surface),resource:kr(e.event),scope:{name:"pinta-copilot",version:dt},now:e.now,guard:e.guard})}var ht=R(I());function Ar(){return Number(process.env.PINTA_GUARD_TIMEOUT_MS)||50}var Ir="pinta-copilot/0.6.0";function mt(e,t){return(0,ht.evaluateGuard)(e,t,{timeoutMs:Ar(),token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Ir})}async function Mr(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function yt(){try{let e=tt(),t=rt(),r=await Mr(),n=JSON.parse(r),o=at(n),s=nt(n),u=new $(e);await u.flush();let a=new V(e),c=o==="UserPromptSubmit"?a.newTrace(s):a.currentTrace(s),l=ot(n),g=null;if(ut(o)&&!ct(l)){let v=it(n);g=await mt({spanId:s??"unknown",toolName:l,method:M(n),cwd:st(n),toolInput:v,rawTextFields:{toolInput:typeof v=="string"?v:JSON.stringify(v??null)}},process.env.PINTA_GUARD_ENDPOINT)}if(g?.decision==="DENY"){let v=lt(o,g.userMessage??g.reason??"guard_deny");v&&process.stdout.write(v+`
21
- `)}let X=gt({event:n,traceId:c,surface:t,guard:g});await u.send(X)}catch(e){process.stderr.write(`[pinta-copilot] error: ${e}
22
- `)}return 0}import{opendir as Gr,stat as Xr}from"node:fs/promises";import G from"node:path";import{spawn as Pt}from"node:child_process";import{copyFile as ge,mkdtemp as Rr,rm as xr,stat as Nr}from"node:fs/promises";import Dr from"node:os";import he from"node:path";var jr=2e3,Cr=250,_t=3,St=3e4,Lr=3e4,me;function qr(){return me||(me=new Promise(e=>{let t=Pt("sqlite3",["-version"],{stdio:"ignore"});t.once("error",()=>e(!1)),t.once("exit",r=>e(r===0))})),me}function Fr(e){return`'${e.replace(/'/g,"''")}'`}async function $r(e,t){let r=`.backup ${Fr(t)}`;await new Promise((n,o)=>{let s=Pt("sqlite3",[e,r],{stdio:["ignore","ignore","pipe"],timeout:Lr,killSignal:"SIGKILL"}),u="";s.stderr?.on("data",a=>{u+=a.toString()}),s.once("error",o),s.once("exit",a=>{a===0?n():o(new Error(`sqlite3 .backup exited ${a}: ${u.trim()}`))})})}async function ye(e){try{return await Nr(e)}catch{return}}function Tt(e,t){return e===void 0||t===void 0?e===void 0&&t===void 0:e.size===t.size&&e.mtimeMs===t.mtimeMs}function Ot(e){return{wal:`${e}-wal`,shm:`${e}-shm`}}async function Br(e){let{wal:t,shm:r}=Ot(e),n=[e,t,r],o=Date.now(),s=o,u=await Promise.all(n.map(async a=>({path:a,st:await ye(a)})));for(;;){if(Date.now()-s>=jr)return u;if(Date.now()-o>=St)throw new Error(`snapshot: ${e} never quiesced within ${St}ms (actively written?)`);await new Promise(l=>setTimeout(l,Cr));let a=await Promise.all(n.map(async l=>({path:l,st:await ye(l)})));a.every((l,g)=>Tt(l.st,u[g].st))||(s=Date.now()),u=a}}async function Vr(e,t){let{wal:r,shm:n}=Ot(e),o=await Br(e);if(await ge(e,t),o.find(a=>a.path===r)?.st!==void 0&&await ge(r,`${t}-wal`),o.find(a=>a.path===n)?.st!==void 0&&await ge(n,`${t}-shm`),!(await Promise.all([e,r,n].map(async a=>({path:a,st:await ye(a)})))).every((a,c)=>Tt(a.st,o[c].st)))throw new Error(`snapshot: ${e} changed during quiesce-copy (torn-read guard)`)}async function Ur(e,t){let r;for(let n=1;n<=_t;n++)try{await Vr(e,t);return}catch(o){r=o}throw new Error(`snapshot: quiesce-copy of ${e} failed after ${_t} attempts: ${String(r)}`)}async function Et(e,t={}){let r=t.tmpDirBase??Dr.tmpdir(),n=await Rr(he.join(r,"pinta-copilot-snapshot-")),o=he.join(n,he.basename(e.absPath));try{if(await qr())try{return await $r(e.absPath,o),o}catch{}return await Ur(e.absPath,o),o}catch(s){throw await xr(n,{recursive:!0,force:!0}).catch(()=>{}),s}}var Yr="pinta-copilot",vt="events.jsonl",wt="session.db",Kr="rewind-snapshots/backups/";function zr(){return G.join(pe(),"session-state")}function Zr(e,t){return G.relative(e,t).split(G.sep).join("/")}function Hr(e){return e.endsWith(".db-wal")||e.endsWith(".db-shm")}function Jr(e){let[t]=e.split("/");return!t||t===e?{}:{sessionId:t}}function Wr(e,t){let r=e.split("/").length===2;return r&&t===vt?"append-log":r&&t===wt?"database":"rewritten-doc"}function Qr(e){let t=e.split("/"),r=t[t.length-1]??"";return t.length===2&&(r===vt||r===wt)?"session-log":e.includes(Kr)?"other":"meta"}async function bt(){return[zr()]}async function*kt(e,t){let r;try{r=await Gr(t)}catch{return}try{for await(let n of r){let o=G.join(t,n.name);n.isDirectory()?yield*kt(e,o):n.isFile()&&(yield{absPath:o,relPath:Zr(e,o)})}}catch{return}}async function*en(e){let[t]=await bt(),r=e.since?.getTime();for await(let{absPath:n,relPath:o}of kt(t,t)){let s=o.split("/"),u=s[s.length-1]??"";if(Hr(u))continue;let a;try{a=await Xr(n)}catch{continue}r!==void 0&&a.mtime.getTime()<=r||(yield{relPath:o,absPath:n,size:a.size,mtime:a.mtime,...Jr(o),semantics:Wr(o,u)})}}async function tn(e){return Et(e)}var rn={id:Yr,roots:bt,scan:en,classify:Qr,snapshot:tn};et();function sn(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===on(nn(e)).href}catch{return!1}}async function an(){let e=await yt();process.exit(e)}sn()&&an();export{rn as lifecycle};
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}`:""}
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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinta-ai/pinta-copilot",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
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": {
@@ -33,6 +33,7 @@
33
33
  "test": "vitest run",
34
34
  "test:watch": "vitest",
35
35
  "smoke:import": "node scripts/smoke-import.mjs",
36
+ "smoke:model": "node scripts/smoke-model.mjs",
36
37
  "mock-server": "npx tsx tools/mock-server.ts",
37
38
  "install-hooks": "node dist/tools/install-hooks.js",
38
39
  "uninstall-hooks": "node dist/tools/install-hooks.js --uninstall",
@@ -40,7 +41,7 @@
40
41
  "prepublishOnly": "npm run build"
41
42
  },
42
43
  "devDependencies": {
43
- "@pinta-ai/core": "^0.6.0",
44
+ "@pinta-ai/core": "^0.8.0",
44
45
  "@types/node": "^22.0.0",
45
46
  "esbuild": "^0.24.0",
46
47
  "tsx": "^4.0.0",