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