@pinta-ai/pinta-opencode 0.11.1 → 0.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +3 -0
- package/dist/index.mjs +2 -2
- package/dist/plugin.js +2 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.11.2
|
|
4
|
+
|
|
5
|
+
- Bundle published `@pinta-ai/core` 0.9.2, including the narrowly scoped
|
|
6
|
+
`CommandLine` JSON-command masking alias fix. Arbitrary JSON strings and fake
|
|
7
|
+
executable wrappers are not treated as native command fields.
|
|
8
|
+
- Preserve the existing output gate, original evidence, fail-open behavior and
|
|
9
|
+
collector-independent DENY. OpenCode 1.18.31 still skips the after hook for
|
|
10
|
+
MCP `isError: true`; this distinct host gap remains open as PTA-608.
|
|
11
|
+
- Forward-only patch: the published 0.11.1 version, tag and artifact are
|
|
12
|
+
unchanged. No Manager, backend or catalog change accompanies this release.
|
|
13
|
+
|
|
14
|
+
Refs PTA-584, PTA-608.
|
|
15
|
+
|
|
3
16
|
## 0.11.1
|
|
4
17
|
|
|
5
18
|
- Evaluate the original `tool.execute.after` payload before OpenCode delivers
|
package/README.md
CHANGED
|
@@ -120,6 +120,9 @@ and [tool runner](https://github.com/anomalyco/opencode/blob/v1.18.31/packages/o
|
|
|
120
120
|
define this boundary. Returned builtin results, including nonzero shell exit
|
|
121
121
|
codes, and successful raw MCP results use the awaited after hook; undispatched
|
|
122
122
|
host paths are not treated as protected.
|
|
123
|
+
This native MCP-error gap is tracked separately in
|
|
124
|
+
[PTA-608](https://linear.app/pinta-ai/issue/PTA-608); a shared-core masking upgrade
|
|
125
|
+
does not make the missing host callback fire.
|
|
123
126
|
|
|
124
127
|
## Span conventions
|
|
125
128
|
|
package/dist/index.mjs
CHANGED
|
@@ -372,7 +372,7 @@ var require_mysql_password = __commonJS({
|
|
|
372
372
|
let match;
|
|
373
373
|
while (match = strings.exec(input)) {
|
|
374
374
|
const key2 = JSON.parse(match[0]);
|
|
375
|
-
if (key2 !== "command" && key2 !== "cmd")
|
|
375
|
+
if (key2 !== "command" && key2 !== "cmd" && key2 !== "CommandLine")
|
|
376
376
|
continue;
|
|
377
377
|
const separator = /^\s*:\s*/.exec(input.slice(strings.lastIndex));
|
|
378
378
|
if (!separator)
|
|
@@ -1644,7 +1644,7 @@ var import_core8 = __toESM(require_dist(), 1);
|
|
|
1644
1644
|
var import_core5 = __toESM(require_dist(), 1);
|
|
1645
1645
|
|
|
1646
1646
|
// src/core/version.ts
|
|
1647
|
-
var ADAPTER_VERSION = "0.11.
|
|
1647
|
+
var ADAPTER_VERSION = "0.11.2";
|
|
1648
1648
|
|
|
1649
1649
|
// src/core/guard.ts
|
|
1650
1650
|
var DEFAULT_TIMEOUT_MS = 100;
|
package/dist/plugin.js
CHANGED
|
@@ -3,7 +3,7 @@ var Dt=Object.create;var Ae=Object.defineProperty;var It=Object.getOwnPropertyDe
|
|
|
3
3
|
`){a+=2;continue}if(u&&(!i||/[$`"\\]/.test(u))){G(s,t,a+1,a+2),a+=2;continue}}if(i!=="'"&&t.value.startsWith("$(",a)){let u=ke(t.value,a+2);t.value[a+2]!=="("&&r<X&&x(Me(t,a+2,u),n,r+1),G(s,t,a,Math.min(u+1,t.value.length)),s.literal=!1,a=Math.min(u+1,t.value.length);continue}if(o==="`"&&i!=="'"){let u=a+1;for(;u<t.value.length&&t.value[u]!=="`";)u+=t.value[u]==="\\"?2:1;r<X&&x(Me(t,a+1,u),n,r+1),G(s,t,a,Math.min(u+1,t.value.length)),s.literal=!1,a=Math.min(u+1,t.value.length);continue}o==="$"&&i!=="'"&&(s.literal=!1),G(s,t,a,a+1),a++}return s.end=a,s}function Ct(t,e,n,r){let s=Nt(e);if(s===void 0)return;let i=we(e[s]);if(xt.has(i)&&r<X){for(let a=s+1;a<e.length;a++){let o=e[a].value;if(o==="--command"||/^-[a-zA-Z]*c[a-zA-Z]*$/.test(o)){let u=e[a+1];u&&x(u,n,r+1);return}if(!o.startsWith("-")||o==="--")return;(o==="-o"||o==="-O")&&a++}return}if(Rt.has(i))for(let a=s+1;a<e.length;a++){let o=e[a];if(o.value==="--")return;if(jt.has(o.value)){a++;continue}o.value.startsWith("-p")&&o.value.length>2&&n.push({start:t.ranges[o.start].start,end:t.ranges[o.end-1].end})}}function x(t,e,n=0){let r=[],s,i=[],a=0,o=()=>{Ct(t,r,e,n),r=[],s=void 0};for(;a<t.value.length;){let u=t.value[a];if(u===`
|
|
4
4
|
`){o(),a++;for(let l of i.splice(0))for(;a<t.value.length;){let d=t.value.indexOf(`
|
|
5
5
|
`,a),h=d<0?t.value.length:d,$=t.value.slice(a,h);if(a=d<0?h:h+1,(l.stripTabs?$.replace(/^\t+/,""):$)===l.delimiter)break}}else if(/\s/.test(u))a++;else if(u==="#"){let l=t.value.indexOf(`
|
|
6
|
-
`,a);a=l<0?t.value.length:l}else if(t.value.startsWith("((",a))o(),a=Math.min(ke(t.value,a+1)+1,t.value.length);else if(/[;|&(){}]/.test(u))o(),a++;else if(u==="<"||u===">")r.at(-1)?.end===a&&/^\d+$/.test(r.at(-1).value)&&r.pop(),s=/^(?:<<<|<<-?|>>|<&|>&|[<>])/.exec(t.value.slice(a))?.[0]??u,a+=s.length;else{let l=qt(t,a,e,n);a=l.end,(s==="<<"||s==="<<-")&&i.push({delimiter:l.value,stripTabs:s==="<<-"}),s||r.push(l),s=void 0}}o()}function Bt(t,e,n){let r={value:"",ranges:[]};for(let s=e+1;s<n-1;s++){if(t.value[s]!=="\\"){G(r,t,s,s+1);continue}let i=s+(t.value[s+1]==="u"?6:2),a=JSON.parse(`"${t.value.slice(s,i)}"`);r.value+=a;for(let o=0;o<a.length;o++)r.ranges.push({start:t.ranges[s].start,end:t.ranges[i-1].end});s=i-1}return r}function $t(t){let e={value:t,ranges:Array.from({length:t.length},(r,s)=>({start:s,end:s+1}))},n=[];if(/^\s*[{[]/.test(t)){let r;try{r=JSON.parse(t)}catch{return x(e,n),n}if(r!==null&&typeof r=="object"){let s=/"(?:[^"\\]|\\.)*"/g,i;for(;i=s.exec(t);){let a=JSON.parse(i[0]);if(a!=="command"&&a!=="cmd")continue;let o=/^\s*:\s*/.exec(t.slice(s.lastIndex));if(!o)continue;let u=s.lastIndex+o[0].length;if(t[u]!=='"')continue;s.lastIndex=u;let l=s.exec(t);l?.index===u&&x(Bt(e,u,u+l[0].length),n)}}return n}return x(e,n),n}});var oe=T(m=>{"use strict";Object.defineProperty(m,"__esModule",{value:!0});m.PATTERNS=m.MAX_BYTES=void 0;m.truncateTo=xe;m.truncate=Ft;m.collectMatches=je;m.resolveOverlaps=Ne;m.applyMatches=qe;m.redact=Ut;var Gt=Re();m.MAX_BYTES=102400;function xe(t,e){let n=Buffer.from(t,"utf-8");return n.length<=e?t:`${n.subarray(0,Math.max(0,e)).toString("utf-8")}\u2026[TRUNCATED:${n.length}]`}function Ft(t){return xe(t,m.MAX_BYTES)}m.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function je(t,e){let n=[];for(let r of m.PATTERNS){if(r.requireContext&&r.requireContext!==e.context)continue;if(r.type==="cli_password_short"){for(let{start:a,end:o}of(0,Gt.mysqlPasswordRanges)(t))n.push({start:a,end:o,replaceStart:a,replaceEnd:o,type:r.type,replacement:`-p[REDACTED:${r.type}]`});continue}let s=new RegExp(r.regex.source,r.regex.flags),i;for(;(i=s.exec(t))!==null;){let a=r.captureGroup??0,o=i[a];if(o===void 0){i.index===s.lastIndex&&s.lastIndex++;continue}let u=i.index,l=i.index+i[0].length,d=u+i[0].indexOf(o),h=d+o.length;n.push({start:u,end:l,replaceStart:d,replaceEnd:h,type:r.type}),i.index===s.lastIndex&&s.lastIndex++}}return n}function Ne(t){let e=[...t].sort((s,i)=>s.start!==i.start?s.start-i.start:i.end-i.start-(s.end-s.start)),n=[],r=-1;for(let s of e)s.start<r||(n.push(s),r=s.end);return n}function qe(t,e){let n=[...e].sort((s,i)=>i.replaceStart-s.replaceStart),r=t;for(let s of n)r=r.slice(0,s.replaceStart)+(s.replacement??`[REDACTED:${s.type}]`)+r.slice(s.replaceEnd);return r}function Ut(t,e={}){if(t.length===0)return t;let n=je(t,e);if(n.length===0)return t;let r=Ne(n);return qe(t,r)}});var ae=T(p=>{"use strict";var Vt=p&&p.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(p,"__esModule",{value:!0});p.MAX_SPAN_BYTES=void 0;p.ulidToTraceId=Ge;p.newSpanId=Fe;p.snakeCase=Yt;p.toOtlpValue=Ue;p.attrsFromRecord=Wt;p.guardAttrs=Ve;p.clientAttrs=Le;p.enforceSpanBudget=Xe;p.buildPayload=zt;p.attachGuard=Ye;p.mergeBatch=Zt;var Lt=Vt(v("crypto")),ie=oe(),Xt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ge(t){if(t.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${t.length}`);let e=0n;for(let r of t){let s=Xt.indexOf(r);if(s<0)throw new Error(`ulidToTraceId: invalid Crockford char "${r}"`);e=e<<5n|BigInt(s)}let n=(1n<<128n)-1n;return e&=n,e.toString(16).padStart(32,"0")}function Fe(){return Lt.default.randomBytes(8).toString("hex")}function Yt(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Ce=new Set;function Y(t,e,n){let r=(0,ie.truncate)(e);if((n.skipRedactKeys??Ce).has(t))return r;let s=(n.bashContextKeys??Ce).has(t)?"bash":void 0;return(0,ie.redact)(r,{context:s})}function Ue(t,e,n={}){if(e==null)return null;switch(typeof e){case"string":return{stringValue:Y(t,e,n)};case"boolean":return{boolValue:e};case"number":return Number.isInteger(e)?{intValue:e}:{doubleValue:e};case"object":try{return{stringValue:Y(t,JSON.stringify(e),n)}}catch{return{stringValue:Y(t,String(e),n)}}default:return{stringValue:Y(t,String(e),n)}}}function Wt(t,e,n={}){let r=[];for(let[s,i]of Object.entries(t)){let a=`${e}.${s}`,o=Ue(a,i,n);o!==null&&r.push({key:a,value:o})}return r}function Ve(t){let e=[{key:"pinta.guard.decision",value:{stringValue:t.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:t.durationMs}}];return t.reason&&e.push({key:"pinta.guard.matched_rule",value:{stringValue:t.reason}}),t.failOpenReason&&e.push({key:"pinta.guard.fail_open_reason",value:{stringValue:t.failOpenReason}}),e}function Le(t){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(t.rttMs)?{intValue:t.rttMs}:{doubleValue:t.rttMs}},{key:"pinta.client.op",value:{stringValue:t.op}}]}p.MAX_SPAN_BYTES=800*1024;function Be(t){let e=JSON.stringify(t);return e===void 0?0:Buffer.byteLength(e,"utf-8")}var $e=1024;function Xe(t,e=p.MAX_SPAN_BYTES){let n=Be(t);for(let r=0;r<100&&n>e;r++){let s=null,i=0;for(let u of t.attributes){if(!("stringValue"in u.value))continue;let l=Buffer.byteLength(u.value.stringValue,"utf-8");l>i&&(i=l,s=u.value)}if(s===null||i<=$e)break;let a=n-e,o=Math.max($e,i-a-64);s.stringValue=(0,ie.truncateTo)(s.stringValue,o),n=Be(t)}return t}function zt(t){let e=t.now??Date.now(),n=(BigInt(e)*1000000n).toString(),r=[...t.attributes],s={traceId:Ge(t.traceId),spanId:Fe(),name:t.spanName,kind:t.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};Xe(s);let i={resourceSpans:[{resource:{attributes:t.resource},scopeSpans:[{scope:t.scope,spans:[s]}]}]};return Ye(i,t.guard,t.clientTiming)}function Ye(t,e,n){let r=t.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return t;e&&r.attributes.push(...Ve(e));let s=n??(e?.clientRttMs!==void 0?{op:"guard",rttMs:e.clientRttMs}:null);return s&&r.attributes.push(...Le(s)),t}function Zt(t){let e=[];for(let n of t)e.push(...n.resourceSpans);return{resourceSpans:e}}});var We=T(P=>{"use strict";Object.defineProperty(P,"__esModule",{value:!0});P.GUARD_STATUS_REFUSED=P.GUARD_BUDGET_HEADER=void 0;P.evaluateGuard=Qt;var Kt=1e4,Ht="pinta-core";P.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function W(t,e){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:t,clientRttMs:t,failOpenReason:e}}var Jt=new Set(["ALLOW","DENY","REVIEW"]);P.GUARD_STATUS_REFUSED=410;async function Qt(t,e,n={}){if(!e||n.disabled)return null;let r=n.timeoutMs??Kt,s=Date.now(),i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let o=await fetch(e,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??Ht,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{},...Number.isFinite(r)&&r>0?{[P.GUARD_BUDGET_HEADER]:String(r)}:{}},body:JSON.stringify(t),signal:i.signal});if(o.status===P.GUARD_STATUS_REFUSED)return W(Date.now()-s,"refused");if(o.status!==200)return W(Date.now()-s,"error");let u=await o.json(),l=u?.durationMs===void 0||typeof u.durationMs=="number"&&Number.isFinite(u.durationMs);if(!u||!Jt.has(u.decision)||!l)return W(Date.now()-s,"error");let d=Date.now()-s;return{decision:u.decision,reason:u.reason??null,userMessage:u.userMessage??null,durationMs:u.durationMs??d,clientRttMs:d}}catch(o){let u=o.name,l=u==="AbortError"||u==="TimeoutError"?"timeout":"error";return W(Date.now()-s,l)}finally{clearTimeout(a)}}});var z=T(F=>{"use strict";var en=F&&F.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(F,"__esModule",{value:!0});F.atomicWriteFileSync=tn;var ze=en(v("fs"));function tn(t,e){let n=`${t}.${process.pid}.tmp`;ze.default.writeFileSync(n,e),ze.default.renameSync(n,t)}});var le=T(I=>{"use strict";var Ze=I&&I.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(I,"__esModule",{value:!0});I.MemoryRetryQueue=I.DiskRetryQueue=void 0;var y=Ze(v("fs")),Z=Ze(v("path")),nn=z(),K=1e3,rn=50,sn=5,ue=class{filePath;lockPath;logPrefix;constructor(e,n){this.filePath=Z.default.join(e,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(e){try{y.default.mkdirSync(Z.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:e})+`
|
|
6
|
+
`,a);a=l<0?t.value.length:l}else if(t.value.startsWith("((",a))o(),a=Math.min(ke(t.value,a+1)+1,t.value.length);else if(/[;|&(){}]/.test(u))o(),a++;else if(u==="<"||u===">")r.at(-1)?.end===a&&/^\d+$/.test(r.at(-1).value)&&r.pop(),s=/^(?:<<<|<<-?|>>|<&|>&|[<>])/.exec(t.value.slice(a))?.[0]??u,a+=s.length;else{let l=qt(t,a,e,n);a=l.end,(s==="<<"||s==="<<-")&&i.push({delimiter:l.value,stripTabs:s==="<<-"}),s||r.push(l),s=void 0}}o()}function Bt(t,e,n){let r={value:"",ranges:[]};for(let s=e+1;s<n-1;s++){if(t.value[s]!=="\\"){G(r,t,s,s+1);continue}let i=s+(t.value[s+1]==="u"?6:2),a=JSON.parse(`"${t.value.slice(s,i)}"`);r.value+=a;for(let o=0;o<a.length;o++)r.ranges.push({start:t.ranges[s].start,end:t.ranges[i-1].end});s=i-1}return r}function $t(t){let e={value:t,ranges:Array.from({length:t.length},(r,s)=>({start:s,end:s+1}))},n=[];if(/^\s*[{[]/.test(t)){let r;try{r=JSON.parse(t)}catch{return x(e,n),n}if(r!==null&&typeof r=="object"){let s=/"(?:[^"\\]|\\.)*"/g,i;for(;i=s.exec(t);){let a=JSON.parse(i[0]);if(a!=="command"&&a!=="cmd"&&a!=="CommandLine")continue;let o=/^\s*:\s*/.exec(t.slice(s.lastIndex));if(!o)continue;let u=s.lastIndex+o[0].length;if(t[u]!=='"')continue;s.lastIndex=u;let l=s.exec(t);l?.index===u&&x(Bt(e,u,u+l[0].length),n)}}return n}return x(e,n),n}});var oe=T(m=>{"use strict";Object.defineProperty(m,"__esModule",{value:!0});m.PATTERNS=m.MAX_BYTES=void 0;m.truncateTo=xe;m.truncate=Ft;m.collectMatches=je;m.resolveOverlaps=Ne;m.applyMatches=qe;m.redact=Ut;var Gt=Re();m.MAX_BYTES=102400;function xe(t,e){let n=Buffer.from(t,"utf-8");return n.length<=e?t:`${n.subarray(0,Math.max(0,e)).toString("utf-8")}\u2026[TRUNCATED:${n.length}]`}function Ft(t){return xe(t,m.MAX_BYTES)}m.PATTERNS=[{type:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{type:"aws_secret_key",regex:/(?:aws[_-]?secret(?:[_-]?(?:access)?[_-]?key)?)\s*[:=]\s*["']?([A-Za-z0-9/+=]{40})(?![A-Za-z0-9/+=])/gi,captureGroup:1},{type:"gcp_service_account",regex:/\{[\s\S]{0,200}?"type"\s*:\s*"service_account"[\s\S]*?\}/g},{type:"github_token",regex:/gh[pousr]_[A-Za-z0-9]{36,}/g},{type:"gitlab_token",regex:/glpat-[A-Za-z0-9_-]{20}/g},{type:"slack_token",regex:/xox[abrsp]-[0-9A-Za-z-]{10,}/g},{type:"openai_key",regex:/sk-(?:proj-)?[A-Za-z0-9_-]{40,}/g},{type:"anthropic_key",regex:/sk-ant-[A-Za-z0-9_-]{50,}/g},{type:"stripe_key",regex:/(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g},{type:"jwt",regex:/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{type:"private_key_block",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"bearer_token",regex:/bearer\s+([A-Za-z0-9._~+/=-]{12,})/gi,captureGroup:1},{type:"basic_auth",regex:/basic\s+([A-Za-z0-9+/=]{12,})/gi,captureGroup:1},{type:"db_url_password",regex:/\b(?:postgres|postgresql|mysql|mariadb|mongodb(?:\+srv)?|redis):\/\/[^:\s/]+:([^@\s]+)@/gi,captureGroup:1},{type:"cli_password_flag",regex:/(?:--password|--pass|--pwd)[=\s]([^\s'"]+)/g,captureGroup:1},{type:"cli_password_short",regex:/\s-p([^\s'"]+)/g,captureGroup:1,requireContext:"bash"},{type:"env_var_secret",regex:/^(?:export\s+)?([A-Z][A-Z0-9_]*(?:KEY|SECRET|TOKEN|PASSWORD|PASSWD|PWD|API_KEY)[A-Z0-9_]*)\s*=\s*["']?([^\s"'\n]+)/gm,captureGroup:2}];function je(t,e){let n=[];for(let r of m.PATTERNS){if(r.requireContext&&r.requireContext!==e.context)continue;if(r.type==="cli_password_short"){for(let{start:a,end:o}of(0,Gt.mysqlPasswordRanges)(t))n.push({start:a,end:o,replaceStart:a,replaceEnd:o,type:r.type,replacement:`-p[REDACTED:${r.type}]`});continue}let s=new RegExp(r.regex.source,r.regex.flags),i;for(;(i=s.exec(t))!==null;){let a=r.captureGroup??0,o=i[a];if(o===void 0){i.index===s.lastIndex&&s.lastIndex++;continue}let u=i.index,l=i.index+i[0].length,d=u+i[0].indexOf(o),h=d+o.length;n.push({start:u,end:l,replaceStart:d,replaceEnd:h,type:r.type}),i.index===s.lastIndex&&s.lastIndex++}}return n}function Ne(t){let e=[...t].sort((s,i)=>s.start!==i.start?s.start-i.start:i.end-i.start-(s.end-s.start)),n=[],r=-1;for(let s of e)s.start<r||(n.push(s),r=s.end);return n}function qe(t,e){let n=[...e].sort((s,i)=>i.replaceStart-s.replaceStart),r=t;for(let s of n)r=r.slice(0,s.replaceStart)+(s.replacement??`[REDACTED:${s.type}]`)+r.slice(s.replaceEnd);return r}function Ut(t,e={}){if(t.length===0)return t;let n=je(t,e);if(n.length===0)return t;let r=Ne(n);return qe(t,r)}});var ae=T(p=>{"use strict";var Vt=p&&p.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(p,"__esModule",{value:!0});p.MAX_SPAN_BYTES=void 0;p.ulidToTraceId=Ge;p.newSpanId=Fe;p.snakeCase=Yt;p.toOtlpValue=Ue;p.attrsFromRecord=Wt;p.guardAttrs=Ve;p.clientAttrs=Le;p.enforceSpanBudget=Xe;p.buildPayload=zt;p.attachGuard=Ye;p.mergeBatch=Zt;var Lt=Vt(v("crypto")),ie=oe(),Xt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ge(t){if(t.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${t.length}`);let e=0n;for(let r of t){let s=Xt.indexOf(r);if(s<0)throw new Error(`ulidToTraceId: invalid Crockford char "${r}"`);e=e<<5n|BigInt(s)}let n=(1n<<128n)-1n;return e&=n,e.toString(16).padStart(32,"0")}function Fe(){return Lt.default.randomBytes(8).toString("hex")}function Yt(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var Ce=new Set;function Y(t,e,n){let r=(0,ie.truncate)(e);if((n.skipRedactKeys??Ce).has(t))return r;let s=(n.bashContextKeys??Ce).has(t)?"bash":void 0;return(0,ie.redact)(r,{context:s})}function Ue(t,e,n={}){if(e==null)return null;switch(typeof e){case"string":return{stringValue:Y(t,e,n)};case"boolean":return{boolValue:e};case"number":return Number.isInteger(e)?{intValue:e}:{doubleValue:e};case"object":try{return{stringValue:Y(t,JSON.stringify(e),n)}}catch{return{stringValue:Y(t,String(e),n)}}default:return{stringValue:Y(t,String(e),n)}}}function Wt(t,e,n={}){let r=[];for(let[s,i]of Object.entries(t)){let a=`${e}.${s}`,o=Ue(a,i,n);o!==null&&r.push({key:a,value:o})}return r}function Ve(t){let e=[{key:"pinta.guard.decision",value:{stringValue:t.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:t.durationMs}}];return t.reason&&e.push({key:"pinta.guard.matched_rule",value:{stringValue:t.reason}}),t.failOpenReason&&e.push({key:"pinta.guard.fail_open_reason",value:{stringValue:t.failOpenReason}}),e}function Le(t){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(t.rttMs)?{intValue:t.rttMs}:{doubleValue:t.rttMs}},{key:"pinta.client.op",value:{stringValue:t.op}}]}p.MAX_SPAN_BYTES=800*1024;function Be(t){let e=JSON.stringify(t);return e===void 0?0:Buffer.byteLength(e,"utf-8")}var $e=1024;function Xe(t,e=p.MAX_SPAN_BYTES){let n=Be(t);for(let r=0;r<100&&n>e;r++){let s=null,i=0;for(let u of t.attributes){if(!("stringValue"in u.value))continue;let l=Buffer.byteLength(u.value.stringValue,"utf-8");l>i&&(i=l,s=u.value)}if(s===null||i<=$e)break;let a=n-e,o=Math.max($e,i-a-64);s.stringValue=(0,ie.truncateTo)(s.stringValue,o),n=Be(t)}return t}function zt(t){let e=t.now??Date.now(),n=(BigInt(e)*1000000n).toString(),r=[...t.attributes],s={traceId:Ge(t.traceId),spanId:Fe(),name:t.spanName,kind:t.spanKind??1,startTimeUnixNano:n,endTimeUnixNano:n,attributes:r};Xe(s);let i={resourceSpans:[{resource:{attributes:t.resource},scopeSpans:[{scope:t.scope,spans:[s]}]}]};return Ye(i,t.guard,t.clientTiming)}function Ye(t,e,n){let r=t.resourceSpans[0]?.scopeSpans[0]?.spans[0];if(!r)return t;e&&r.attributes.push(...Ve(e));let s=n??(e?.clientRttMs!==void 0?{op:"guard",rttMs:e.clientRttMs}:null);return s&&r.attributes.push(...Le(s)),t}function Zt(t){let e=[];for(let n of t)e.push(...n.resourceSpans);return{resourceSpans:e}}});var We=T(P=>{"use strict";Object.defineProperty(P,"__esModule",{value:!0});P.GUARD_STATUS_REFUSED=P.GUARD_BUDGET_HEADER=void 0;P.evaluateGuard=Qt;var Kt=1e4,Ht="pinta-core";P.GUARD_BUDGET_HEADER="x-pinta-guard-budget-ms";function W(t,e){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:t,clientRttMs:t,failOpenReason:e}}var Jt=new Set(["ALLOW","DENY","REVIEW"]);P.GUARD_STATUS_REFUSED=410;async function Qt(t,e,n={}){if(!e||n.disabled)return null;let r=n.timeoutMs??Kt,s=Date.now(),i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let o=await fetch(e,{method:"POST",headers:{"content-type":"application/json","user-agent":n.userAgent??Ht,"x-pinta-relay-token":n.token??"",...n.agentType?{"x-pinta-agent-type":n.agentType}:{},...Number.isFinite(r)&&r>0?{[P.GUARD_BUDGET_HEADER]:String(r)}:{}},body:JSON.stringify(t),signal:i.signal});if(o.status===P.GUARD_STATUS_REFUSED)return W(Date.now()-s,"refused");if(o.status!==200)return W(Date.now()-s,"error");let u=await o.json(),l=u?.durationMs===void 0||typeof u.durationMs=="number"&&Number.isFinite(u.durationMs);if(!u||!Jt.has(u.decision)||!l)return W(Date.now()-s,"error");let d=Date.now()-s;return{decision:u.decision,reason:u.reason??null,userMessage:u.userMessage??null,durationMs:u.durationMs??d,clientRttMs:d}}catch(o){let u=o.name,l=u==="AbortError"||u==="TimeoutError"?"timeout":"error";return W(Date.now()-s,l)}finally{clearTimeout(a)}}});var z=T(F=>{"use strict";var en=F&&F.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(F,"__esModule",{value:!0});F.atomicWriteFileSync=tn;var ze=en(v("fs"));function tn(t,e){let n=`${t}.${process.pid}.tmp`;ze.default.writeFileSync(n,e),ze.default.renameSync(n,t)}});var le=T(I=>{"use strict";var Ze=I&&I.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(I,"__esModule",{value:!0});I.MemoryRetryQueue=I.DiskRetryQueue=void 0;var y=Ze(v("fs")),Z=Ze(v("path")),nn=z(),K=1e3,rn=50,sn=5,ue=class{filePath;lockPath;logPrefix;constructor(e,n){this.filePath=Z.default.join(e,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=n}enqueue(e){try{y.default.mkdirSync(Z.default.dirname(this.filePath),{recursive:!0});let n=JSON.stringify({savedAt:new Date().toISOString(),payload:e})+`
|
|
7
7
|
`;y.default.appendFileSync(this.filePath,n),this.trim()}catch(n){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${n}
|
|
8
8
|
`)}}readAll(){try{let e=y.default.readFileSync(this.filePath,"utf-8"),n=[];for(let r of e.split(`
|
|
9
9
|
`))if(r.trim())try{let s=JSON.parse(r);Array.isArray(s?.payload?.resourceSpans)&&n.push(s)}catch{}return n}catch{return[]}}rewrite(e){try{if(e.length===0){y.default.existsSync(this.filePath)&&y.default.unlinkSync(this.filePath);return}y.default.mkdirSync(Z.default.dirname(this.filePath),{recursive:!0}),(0,nn.atomicWriteFileSync)(this.filePath,e.map(n=>JSON.stringify(n)).join(`
|
|
@@ -22,5 +22,5 @@ var Dt=Object.create;var Ae=Object.defineProperty;var It=Object.getOwnPropertyDe
|
|
|
22
22
|
`);let i=[].concat(...r),a=0;for(let o of r){if(!await U((0,He.mergeBatch)(o),e,this.logPrefix))break;a+=o.length}for(let o of i.slice(a))this.queue.enqueue(o)}};f.MemoryTransport=fe});var me=T(k=>{"use strict";var he=k&&k.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(k,"__esModule",{value:!0});k.TraceManager=void 0;k.generateUlid=rt;var nt=he(v("fs")),an=he(v("path")),un=he(v("crypto")),cn=z(),pe="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function rt(){let t=Date.now(),e="",n=t;for(let i=0;i<10;i++)e=pe[n&31]+e,n=Math.floor(n/32);let r=un.default.randomBytes(10),s="";for(let i=0;i<10;i++)s+=pe[r[i]&31];for(;s.length<16;)s+=pe[0];return e+s}var ge=class{tracePath;constructor(e){this.tracePath=e}newTrace(){let e=rt();return this.save(e),e}currentTrace(){try{let e=nt.default.readFileSync(this.tracePath,"utf-8"),{traceId:n}=JSON.parse(e);if(n)return n}catch{}return this.newTrace()}save(e){try{nt.default.mkdirSync(an.default.dirname(this.tracePath),{recursive:!0}),(0,cn.atomicWriteFileSync)(this.tracePath,JSON.stringify({traceId:e}))}catch(n){process.stderr.write(`[pinta-core] trace persistence failed: ${n}
|
|
23
23
|
`)}}};k.TraceManager=ge});var ut=T(A=>{"use strict";var ot=A&&A.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(A,"__esModule",{value:!0});A.MemorySessionTraceManager=A.DiskSessionTraceManager=void 0;var st=ot(v("fs")),ln=ot(v("path")),it=me(),dn=z(),at=200,ye=class{tracePath;maxSessions;constructor(e,n={}){this.tracePath=e,this.maxSessions=n.maxSessions??at}read(){try{let e=JSON.parse(st.default.readFileSync(this.tracePath,"utf-8"));if(e&&typeof e=="object"&&!("traceId"in e))return e}catch{}return{}}write(e){try{st.default.mkdirSync(ln.default.dirname(this.tracePath),{recursive:!0});let n=Object.entries(e),r=n.length>this.maxSessions?Object.fromEntries(n.slice(-this.maxSessions)):e;(0,dn.atomicWriteFileSync)(this.tracePath,JSON.stringify(r))}catch{}}newTrace(e){let n=e||"default",r=(0,it.generateUlid)(),s=this.read();return s[n]=r,this.write(s),r}currentTrace(e){let n=e||"default",r=this.read()[n];return r||this.newTrace(n)}};A.DiskSessionTraceManager=ye;var ve=class{map=new Map;maxSessions;constructor(e={}){this.maxSessions=e.maxSessions??at}newTrace(e){let n=e||"default",r=(0,it.generateUlid)();if(this.map.set(n,r),this.map.size>this.maxSessions){let s=this.map.keys().next().value;s!==void 0&&this.map.delete(s)}return r}currentTrace(e){let n=e||"default";return this.map.get(n)??this.newTrace(n)}};A.MemorySessionTraceManager=ve});var dt=T(R=>{"use strict";var _e=R&&R.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(R,"__esModule",{value:!0});R.envFilePath=gn;R.parseEnvFile=lt;R.loadEnvFile=hn;var fn=_e(v("node:fs")),pn=_e(v("node:os")),ct=_e(v("node:path"));function gn(t,e,n){let r=n?process.env[n]:void 0,s=r&&r.length>0?r:ct.default.join(pn.default.homedir(),t);return ct.default.join(s,e)}function lt(t){let e={};for(let n of t.split(`
|
|
24
24
|
`)){let r=n.trim();if(!r||r.startsWith("#"))continue;let s=r.indexOf("=");if(s<0)continue;let i=r.slice(0,s).trim(),a=r.slice(s+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),i&&(e[i]=a)}return e}function hn(t){let e;try{e=fn.default.readFileSync(t,"utf-8")}catch{return}let n=lt(e);for(let[r,s]of Object.entries(n))process.env[r]===void 0&&(process.env[r]=s)}});var S=T(c=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});c.loadEnvFile=c.parseEnvFile=c.envFilePath=c.MemorySessionTraceManager=c.DiskSessionTraceManager=c.generateUlid=c.TraceManager=c.MAX_POST_BYTES=c.parseHeadersEnv=c.envOptionsResolver=c.postOtlp=c.MemoryTransport=c.DiskTransport=c.MemoryRetryQueue=c.DiskRetryQueue=c.GUARD_BUDGET_HEADER=c.GUARD_STATUS_REFUSED=c.evaluateGuard=c.MAX_SPAN_BYTES=c.enforceSpanBudget=c.mergeBatch=c.attachGuard=c.buildPayload=c.clientAttrs=c.guardAttrs=c.attrsFromRecord=c.toOtlpValue=c.snakeCase=c.newSpanId=c.ulidToTraceId=c.MAX_BYTES=c.PATTERNS=c.applyMatches=c.resolveOverlaps=c.collectMatches=c.truncateTo=c.truncate=c.redact=void 0;var M=oe();Object.defineProperty(c,"redact",{enumerable:!0,get:function(){return M.redact}});Object.defineProperty(c,"truncate",{enumerable:!0,get:function(){return M.truncate}});Object.defineProperty(c,"truncateTo",{enumerable:!0,get:function(){return M.truncateTo}});Object.defineProperty(c,"collectMatches",{enumerable:!0,get:function(){return M.collectMatches}});Object.defineProperty(c,"resolveOverlaps",{enumerable:!0,get:function(){return M.resolveOverlaps}});Object.defineProperty(c,"applyMatches",{enumerable:!0,get:function(){return M.applyMatches}});Object.defineProperty(c,"PATTERNS",{enumerable:!0,get:function(){return M.PATTERNS}});Object.defineProperty(c,"MAX_BYTES",{enumerable:!0,get:function(){return M.MAX_BYTES}});var _=ae();Object.defineProperty(c,"ulidToTraceId",{enumerable:!0,get:function(){return _.ulidToTraceId}});Object.defineProperty(c,"newSpanId",{enumerable:!0,get:function(){return _.newSpanId}});Object.defineProperty(c,"snakeCase",{enumerable:!0,get:function(){return _.snakeCase}});Object.defineProperty(c,"toOtlpValue",{enumerable:!0,get:function(){return _.toOtlpValue}});Object.defineProperty(c,"attrsFromRecord",{enumerable:!0,get:function(){return _.attrsFromRecord}});Object.defineProperty(c,"guardAttrs",{enumerable:!0,get:function(){return _.guardAttrs}});Object.defineProperty(c,"clientAttrs",{enumerable:!0,get:function(){return _.clientAttrs}});Object.defineProperty(c,"buildPayload",{enumerable:!0,get:function(){return _.buildPayload}});Object.defineProperty(c,"attachGuard",{enumerable:!0,get:function(){return _.attachGuard}});Object.defineProperty(c,"mergeBatch",{enumerable:!0,get:function(){return _.mergeBatch}});Object.defineProperty(c,"enforceSpanBudget",{enumerable:!0,get:function(){return _.enforceSpanBudget}});Object.defineProperty(c,"MAX_SPAN_BYTES",{enumerable:!0,get:function(){return _.MAX_SPAN_BYTES}});var Te=We();Object.defineProperty(c,"evaluateGuard",{enumerable:!0,get:function(){return Te.evaluateGuard}});Object.defineProperty(c,"GUARD_STATUS_REFUSED",{enumerable:!0,get:function(){return Te.GUARD_STATUS_REFUSED}});Object.defineProperty(c,"GUARD_BUDGET_HEADER",{enumerable:!0,get:function(){return Te.GUARD_BUDGET_HEADER}});var ft=le();Object.defineProperty(c,"DiskRetryQueue",{enumerable:!0,get:function(){return ft.DiskRetryQueue}});Object.defineProperty(c,"MemoryRetryQueue",{enumerable:!0,get:function(){return ft.MemoryRetryQueue}});var j=tt();Object.defineProperty(c,"DiskTransport",{enumerable:!0,get:function(){return j.DiskTransport}});Object.defineProperty(c,"MemoryTransport",{enumerable:!0,get:function(){return j.MemoryTransport}});Object.defineProperty(c,"postOtlp",{enumerable:!0,get:function(){return j.postOtlp}});Object.defineProperty(c,"envOptionsResolver",{enumerable:!0,get:function(){return j.envOptionsResolver}});Object.defineProperty(c,"parseHeadersEnv",{enumerable:!0,get:function(){return j.parseHeadersEnv}});Object.defineProperty(c,"MAX_POST_BYTES",{enumerable:!0,get:function(){return j.MAX_POST_BYTES}});var pt=me();Object.defineProperty(c,"TraceManager",{enumerable:!0,get:function(){return pt.TraceManager}});Object.defineProperty(c,"generateUlid",{enumerable:!0,get:function(){return pt.generateUlid}});var gt=ut();Object.defineProperty(c,"DiskSessionTraceManager",{enumerable:!0,get:function(){return gt.DiskSessionTraceManager}});Object.defineProperty(c,"MemorySessionTraceManager",{enumerable:!0,get:function(){return gt.MemorySessionTraceManager}});var Oe=dt();Object.defineProperty(c,"envFilePath",{enumerable:!0,get:function(){return Oe.envFilePath}});Object.defineProperty(c,"parseEnvFile",{enumerable:!0,get:function(){return Oe.parseEnvFile}});Object.defineProperty(c,"loadEnvFile",{enumerable:!0,get:function(){return Oe.loadEnvFile}})});var mt=D(S(),1);import yn from"node:fs";import Ee from"node:path";var V=D(S(),1);function mn(){return(0,V.envFilePath)(".config/opencode","pinta-opencode.env","OPENCODE_CONFIG_DIR")}function ht(t=mn()){(0,V.loadEnvFile)(t)}function Pe(...t){return t.find(e=>e)||void 0}function vn(t){let e=Pe(t.endpoint,process.env.PINTA_OPENCODE_ENDPOINT,process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT);if(e)return e.replace(/\/+$/,"");let n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT;if(n)return n.replace(/\/+$/,"")+"/v1/traces"}var _n="opencode-ai";function Tn(){let t=Ee.dirname(process.execPath);for(let e=0;e<5;e++){try{let r=JSON.parse(yn.readFileSync(Ee.join(t,"package.json"),"utf8"));if(r.name===_n&&typeof r.version=="string"&&r.version)return r.version}catch{}let n=Ee.dirname(t);if(n===t)break;t=n}}function On(){let t=process.env.OPENCODE_VERSION?.trim();return t||Tn()}function yt(t={}){ht();let e=Pe(t.token,process.env.PINTA_OPENCODE_TOKEN),n=(0,mt.parseHeadersEnv)(t.headers??process.env.PINTA_OPENCODE_HEADERS??process.env.OTEL_EXPORTER_OTLP_HEADERS);e&&!Object.keys(n).some(s=>s.toLowerCase()==="x-pinta-relay-token")&&(n["x-pinta-relay-token"]=e);let r=t.guardTimeoutMs??(Number(process.env.PINTA_OPENCODE_GUARD_TIMEOUT_MS)||100);return{endpoint:vn(t),headers:n,guardEndpoint:Pe(t.guard,process.env.PINTA_OPENCODE_GUARD),relayToken:e,guardTimeoutMs:r,guardDisabled:process.env.PINTA_OPENCODE_GUARD_DISABLED==="1",serviceVersion:On()}}var N=D(S(),1),J=class extends N.MemoryTransport{constructor(n){super({logPrefix:"pinta-opencode",resolveOptions:()=>n.endpoint?{endpoint:n.endpoint,headers:n.headers}:null});this.config=n}deferred=new N.MemoryRetryQueue;defer(n){if(!this.config.endpoint)return;let r=Buffer.byteLength(JSON.stringify(n),"utf8");if(r>N.MAX_POST_BYTES){process.stderr.write(`[pinta-opencode] deferred payload exceeds POST budget (${r} bytes); dropped
|
|
25
|
-
`);return}this.deferred.enqueue(n)}async flush(){await super.flush();for(let n of this.deferred.drain())await super.send(n)}};var Se=D(S(),1);var St=D(S(),1);var vt=D(S(),1);var Q="0.11.
|
|
25
|
+
`);return}this.deferred.enqueue(n)}async flush(){await super.flush();for(let n of this.deferred.drain())await super.send(n)}};var Se=D(S(),1);var St=D(S(),1);var vt=D(S(),1);var Q="0.11.2";var En=100,Pn=`pinta-opencode/${Q}`;function _t(t,e,n={}){return(0,vt.evaluateGuard)(t,e,{timeoutMs:n.timeoutMs??En,token:n.token,disabled:n.disabled,userAgent:Pn})}var Pt=D(S(),1);import be from"os";var q=D(S(),1);var ee;function Sn(){if(ee===void 0)try{ee=be.userInfo().username}catch{ee=process.env.USER??process.env.LOGNAME??(typeof process.getuid=="function"?String(process.getuid()):"unknown")}return ee}var Tt=Q,bn=new Set(["opencode.hook","opencode.event_type","opencode.tool_name","opencode.session_id","opencode.sessionID","opencode.tool_use_id","opencode.cwd","opencode.agent","opencode.model","opencode.exit","opencode.truncated","opencode.title"]),Dn=new Set(["opencode.tool_input","opencode.tool_response"]),In={skipRedactKeys:bn,bashContextKeys:Dn};function An(t){let e=[{key:"ingest.type",value:{stringValue:"opencode"}}];return e.push(...(0,q.attrsFromRecord)(t,"opencode",In)),e}function Mn(t){return[{key:"service.name",value:{stringValue:"opencode"}},...t?[{key:"service.version",value:{stringValue:t}}]:[],{key:"telemetry.sdk.name",value:{stringValue:"pinta-opencode"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:Tt}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Sn()}},{key:"host.name",value:{stringValue:be.hostname()}},{key:"host.arch",value:{stringValue:be.arch()}}]}function Ot(t){return(0,q.buildPayload)({traceId:t.traceId,spanName:t.name,attributes:An(t.fields),resource:Mn(t.serviceVersion),scope:{name:"pinta-opencode",version:Tt},now:t.now})}var C={messages:1024,requests:512,calls:2048,endedSessions:128,ttlMs:9e5},wn=new Set(["unknown","undefined","null","n/a","none","-","auto","default"]);function g(t){if(typeof t!="string")return;let e=t.trim();return e&&e.length<=1024?e:void 0}function w(t){let e=g(t);if(!(!e||e.startsWith("{")||e.startsWith("[")||wn.has(e.toLowerCase())))return e}function b(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function O(t,e,n){let r=b(t),s=r?w(r.modelID)??w(r.id):w(t);if(s)return{model:s,source:r?`${e}.${w(r.modelID)?"modelID":"id"}`:e,provider:w(r?.providerID??n)}}function E(...t){return JSON.stringify(t)}function B(...t){let e=t.map(g).filter(n=>n!==void 0);return e.every(n=>n===e[0])?e[0]:void 0}function De(t,e){let n=b(e.info),r=b(e.part);return typeof t=="string"&&t.startsWith("session.")?B(e.sessionID,n?.id):B(e.sessionID,n?.sessionID,r?.sessionID)}var L=class{constructor(e,n){this.limit=e;this.now=n}entries=new Map;get(e){let n=this.entries.get(e);if(n&&n.expires>this.now())return n.value;this.entries.delete(e)}set(e,n){this.entries.delete(e),this.entries.set(e,{value:n,expires:this.now()+C.ttlMs}),this.entries.size>this.limit&&this.entries.delete(this.entries.keys().next().value)}removeWhere(e){for(let[n,r]of this.entries)e(r.value)&&this.entries.delete(n)}clearSession(e){this.removeWhere(n=>n.sessionID===e)}},te=class{constructor(e=Date.now){this.now=e;this.messages=new L(C.messages,e),this.requests=new L(C.requests,e),this.calls=new L(C.calls,e)}messages;requests;calls;ended=new Map;chatMessage(e,n){let r=B(e.sessionID,n?.message?.sessionID);if(!r)return;this.ended.delete(r);let s=B(e.messageID,n?.message?.id);if(!s)return;let i=g(n?.message?.agent??e.agent),a=n?.message?.model!==void 0;this.requests.set(E(r,s,i??""),{sessionID:r,messageID:s,evidence:O(a?n.message?.model:e.model,a?"requested:chat.message.message.model":"requested:chat.message.model")})}chatParams(e){let n=B(e.sessionID,e.message?.sessionID),r=g(e.message?.id),s=g(e.agent);!n||!r||!s||this.ended.has(n)||this.requests.set(E(n,r,s),{sessionID:n,messageID:r,evidence:O(e.model,"requested:chat.params.model")})}fresh(e){return e===void 0||typeof e=="number"&&Number.isFinite(e)&&e>=this.now()-C.ttlMs}clearSession(e){this.messages.clearSession(e),this.requests.clearSession(e),this.calls.clearSession(e)}event(e,n){let r=De(e,n),s=b(n.info),i=b(n.part),a=["session.idle","session.deleted","session.error"].includes(e??"")||e==="session.status"&&b(n.status)?.type==="idle";if(r&&a?(this.clearSession(r),this.ended.delete(r),this.ended.set(r,!0),this.ended.size>C.endedSessions&&this.ended.delete(this.ended.keys().next().value)):r&&e==="session.created"&&(this.clearSession(r),this.ended.delete(r)),e==="message.updated"&&s){if(!B(n.sessionID,s.sessionID)&&(n.sessionID||s.sessionID))return;let o=g(s.id),u=g(s.agent),l=s.role,d=l==="assistant"?O(w(s.modelID),"reported:message.updated.info.modelID",s.providerID)??O(s.model,"reported:message.updated.info.model"):l==="user"?O(s.model,"requested:message.updated.info.model"):void 0;if(!d&&l==="user"&&!("model"in s)&&r&&o&&(d=this.requests.get(E(r,o,u??""))?.evidence),l==="user"&&"model"in s&&!d&&r&&o&&this.requests.set(E(r,o,u??""),{sessionID:r,messageID:o}),d&&(d={...d,agent:u,messageID:o}),r&&o&&!this.ended.has(r)&&this.fresh(b(s.time)?.created)){let h=this.messages.get(E(r,o)),$=h?.ambiguous||!!(l==="assistant"&&h?.evidence&&d&&(h.evidence.model!==d.model||h.evidence.provider!==d.provider||h.evidence.agent!==d.agent));this.messages.set(E(r,o),{sessionID:r,messageID:o,evidence:$?void 0:d,ambiguous:$})}return d}if(r&&e==="message.removed"){let o=g(n.messageID);this.messages.removeWhere(u=>u.sessionID===r&&u.messageID===o),this.requests.removeWhere(u=>u.sessionID===r&&u.messageID===o),this.calls.removeWhere(u=>u.sessionID===r&&u.messageID===o)}if(r&&e==="message.part.removed"){let o=g(n.partID);o&&this.calls.removeWhere(u=>u.sessionID===r&&u.partID===o)}if(e==="message.part.delta"){let o=g(n.messageID);return r&&o&&!this.ended.has(r)?this.messages.get(E(r,o))?.evidence:void 0}if(e==="message.part.updated"&&i){if(!r||this.ended.has(r)||!this.fresh(n.time))return;let o=g(i.messageID);if(!o)return;let u=g(i.callID);if(i.type==="tool"&&u){let l=E(r,u),d=this.calls.get(l);if(!d?.closed){let h=g(i.tool);this.calls.set(l,{sessionID:r,messageID:o,partID:g(i.id),tool:h,pinned:d?.pinned,ambiguous:d?.ambiguous||!!(d&&(d.messageID!==o||d.tool!==h))})}}return this.messages.get(E(r,o))?.evidence}return typeof e=="string"&&e.startsWith("session.")?O(s?.model,`selected:${e}.info.model`)??O(n.model,`selected:${e}.model`):O(n.model,"reported:event.model")??O(w(n.modelID),"reported:event.modelID",n.providerID)}tool(e,n){let r=O(w(e.modelID),"reported:tool.modelID",e.providerID)??O(e.model,"reported:tool.model",e.providerID),s=g(e.sessionID),i=g(e.callID);if(!s||!i)return r;let a=E(s,i),o=this.calls.get(a),u=r;if(!("model"in e)&&!("modelID"in e)&&o&&!o.closed&&!o.ambiguous&&!this.ended.has(s)&&(!o.tool||o.tool===e.tool)){let l=this.messages.get(E(s,o.messageID));l?.ambiguous||(u=o.pinned??l?.evidence),(e.agent&&u?.agent&&e.agent!==u.agent||e.messageID&&e.messageID!==o.messageID)&&(u=void 0)}return o&&!o.closed&&this.calls.set(a,{...o,pinned:n?void 0:u,closed:n}),u}beforeTool(e){return this.tool(e,!1)}afterTool(e){return this.tool(e,!0)}};function ne(t,e){let{model:n,model_source:r,...s}=t;return"model"in t&&n!==e?.model&&(s.model_raw=n),"model_source"in t&&(s.model_source_raw=r),e&&(s.model=e.model,s.model_source=e.source,e.provider&&("provider"in s&&s.provider!==e.provider&&(s.provider_raw=s.provider),s.provider=e.provider),s.agent===void 0&&(s.agent=e.agent),s.message_id===void 0&&(s.message_id=e.messageID)),s}var re=class{constructor(e,n,r){this.transport=e;this.trace=n;this.config=r}models=new te;build(e,n,r){let s=this.trace.currentTrace(n);return Ot({name:e,traceId:s,fields:r,serviceVersion:this.config.serviceVersion})}async send(e){await this.transport.send(e)}async emit(e,n,r){await this.send(this.build(e,n,r))}chatMessage(e,n){this.models.chatMessage(e,n)}chatParams(e){this.models.chatParams(e)}async lifecycle(e){let n=b(e.properties)??{},r=De(e.type,n),s=this.models.event(e.type,n);e.type==="session.idle"&&await this.transport.flush(),await this.emit(`opencode.event.${e.type??"unknown"}`,r,ne({hook:"event",event_type:e.type,session_id:r,cwd:process.cwd(),...n},s))}toolBeforePayload(e,n){return this.build("opencode.tool.before",e.sessionID,ne({...Et("tool.execute.before",e),tool_input:n},this.models.beforeTool(e)))}async toolBefore(e,n,r){await this.send((0,Pt.attachGuard)(this.toolBeforePayload(e,n),r))}toolAfterPayload(e,n){let r=n.metadata??{};return this.build("opencode.tool.after",e.sessionID,ne({...Et("tool.execute.after",e),tool_input:e.args,title:n.title,tool_response:n.content!==void 0?n:n.output,attachments:n.attachments,exit:r.exit,truncated:r.truncated},this.models.afterTool(e)))}async toolAfter(e,n){await this.send(this.toolAfterPayload(e,n))}};function Et(t,e){return{hook:t,tool_name:e.tool,session_id:e.sessionID,tool_use_id:e.callID,cwd:process.cwd(),...e.model!==void 0?{model:e.model}:{},...e.modelID!==void 0?{modelID:e.modelID}:{},...e.providerID!==void 0?{providerID:e.providerID}:{},...e.agent!==void 0?{agent:e.agent}:{},...e.messageID!==void 0?{message_id:e.messageID}:{}}}function bt(t,e){process.stderr.write(`[pinta-opencode] ${t}: ${e?.message??String(e)}
|
|
26
26
|
`)}var kn="Pinta withheld this tool output because it violated an active policy.";function Ie(t,e){return async(...n)=>{try{await e(...n)}catch(r){bt(t,r)}}}var Rn=async(t,e)=>{let n=yt(e??{}),r=new J({endpoint:n.endpoint,headers:n.headers}),s=new Se.MemorySessionTraceManager,i=new re(r,s,n);async function a(o,u){let l=null;try{let d=u();l=await _t(d,n.guardEndpoint,{timeoutMs:n.guardTimeoutMs,token:n.relayToken,disabled:n.guardDisabled}),(0,St.attachGuard)(d,l),o==="tool.execute.after"&&l&&d.resourceSpans[0].scopeSpans[0].spans[0].attributes.push({key:"pinta.guard.target",value:{stringValue:"tool_output"}}),l?.decision==="DENY"?r.defer(d):await i.send(d)}catch(d){bt(o,d)}return l}return{"chat.message":Ie("chat.message",async(o,u)=>{s.newTrace(o?.sessionID),i.chatMessage(o,u)}),"chat.params":Ie("chat.params",async(o,u)=>{i.chatParams(o)}),event:Ie("event",async o=>{o?.event&&await i.lifecycle(o.event)}),"tool.execute.before":async(o,u)=>{let l=await a("tool.execute.before",()=>i.toolBeforePayload(o,u?.args));if(l?.decision==="DENY")throw new Error(l.userMessage??l.reason??"guard_deny")},"tool.execute.after":async(o,u)=>{if((await a("tool.execute.after",()=>i.toolAfterPayload(o,u)))?.decision==="DENY")throw new Error(kn)}}},pr=Rn;export{Rn as PintaOpencode,pr as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinta-ai/pinta-opencode",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.2",
|
|
4
4
|
"description": "OTLP forwarder + guard for opencode (in-process plugin)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/plugin.js",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"prepublishOnly": "npm run build"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@pinta-ai/core": "^0.9.
|
|
39
|
+
"@pinta-ai/core": "^0.9.2",
|
|
40
40
|
"@types/node": "^22.0.0",
|
|
41
41
|
"esbuild": "0.24.2",
|
|
42
42
|
"typescript": "^5.7.0",
|