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