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