@pinta-ai/pinta-codex 1.3.1 → 1.5.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/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +31 -0
- package/dist/index.js +15 -53
- package/dist/index.mjs +16 -0
- package/package.json +20 -3
- package/dist/core/config.d.ts +0 -12
- package/dist/core/config.js +0 -125
- package/dist/core/config.js.map +0 -1
- package/dist/core/guard.d.ts +0 -13
- package/dist/core/guard.js +0 -46
- package/dist/core/guard.js.map +0 -1
- package/dist/core/identity.d.ts +0 -1
- package/dist/core/identity.js +0 -3
- package/dist/core/identity.js.map +0 -1
- package/dist/core/otlp.d.ts +0 -59
- package/dist/core/otlp.js +0 -192
- package/dist/core/otlp.js.map +0 -1
- package/dist/core/redact.d.ts +0 -57
- package/dist/core/redact.js +0 -149
- package/dist/core/redact.js.map +0 -1
- package/dist/core/retry-queue.d.ts +0 -26
- package/dist/core/retry-queue.js +0 -127
- package/dist/core/retry-queue.js.map +0 -1
- package/dist/core/trace.d.ts +0 -10
- package/dist/core/trace.js +0 -61
- package/dist/core/trace.js.map +0 -1
- package/dist/core/transport.d.ts +0 -10
- package/dist/core/transport.js +0 -83
- package/dist/core/transport.js.map +0 -1
- package/dist/core/types.d.ts +0 -48
- package/dist/core/types.js +0 -45
- package/dist/core/types.js.map +0 -1
- package/dist/handlers/default.d.ts +0 -6
- package/dist/handlers/default.js +0 -11
- package/dist/handlers/default.js.map +0 -1
- package/dist/handlers/post-tool-use.d.ts +0 -3
- package/dist/handlers/post-tool-use.js +0 -15
- package/dist/handlers/post-tool-use.js.map +0 -1
- package/dist/handlers/pre-tool-use.d.ts +0 -3
- package/dist/handlers/pre-tool-use.js +0 -38
- package/dist/handlers/pre-tool-use.js.map +0 -1
- package/dist/handlers/session.d.ts +0 -3
- package/dist/handlers/session.js +0 -15
- package/dist/handlers/session.js.map +0 -1
- package/dist/handlers/stop.d.ts +0 -3
- package/dist/handlers/stop.js +0 -15
- package/dist/handlers/stop.js.map +0 -1
- package/dist/handlers/user-prompt.d.ts +0 -3
- package/dist/handlers/user-prompt.js +0 -15
- package/dist/handlers/user-prompt.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to pinta-codex are documented here.
|
|
4
4
|
|
|
5
|
+
## [1.4.0] - 2026-07-12
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Low-level utilities consolidated into the shared private `@pinta-ai/core`
|
|
10
|
+
package (`^0.3.0`, devDependency). `src/core/*` keeps thin adaptor bindings;
|
|
11
|
+
core is **bundled + minified into `dist/` by esbuild at build time**, so npmjs
|
|
12
|
+
consumers never need private-registry access and `dist/` carries no runtime
|
|
13
|
+
`@pinta-ai/core` dependency.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- `pinta.client.rtt_ms` / `pinta.client.op` span attributes on PreToolUse spans.
|
|
18
|
+
`buildOtlpPayload` already forwards its `guard` result into core's
|
|
19
|
+
`buildPayload`, and core `0.3.0` derives the client-call timing from the
|
|
20
|
+
`GuardResult.clientRttMs` it now measures. The manager can only time its own
|
|
21
|
+
handler, so `clientRttMs - durationMs` gives it the transport overhead.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- `package-lock.json` resolved `@pinta-ai/core` as a `link:` to a local
|
|
26
|
+
`../pinta-core` checkout. `npm ci` created a dangling symlink in CI and the
|
|
27
|
+
build failed with `TS2307: Cannot find module '@pinta-ai/core'`. It is now
|
|
28
|
+
pinned to core's GitHub Packages tarball URL + integrity hash.
|
|
29
|
+
- `publish` workflow: npm pinned to `11.18.0` (npm@latest is 12.x and requires
|
|
30
|
+
node >=22.22, but the job runs node 20).
|
|
31
|
+
- `publish` workflow: restored OIDC trusted publishing. The committed `.npmrc`
|
|
32
|
+
pointed npmjs auth at `${NPM_TOKEN}`, but no such secret exists — it expanded
|
|
33
|
+
to an empty token and would have failed `npm publish` with ENEEDAUTH.
|
|
34
|
+
`NODE_AUTH_TOKEN` is now scoped to the `npm ci` step alone.
|
|
35
|
+
|
|
5
36
|
## [1.2.1] - 2026-04-30
|
|
6
37
|
|
|
7
38
|
### Changed
|
package/dist/index.js
CHANGED
|
@@ -1,53 +1,15 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
async function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return Buffer.concat(chunks).toString("utf-8");
|
|
17
|
-
}
|
|
18
|
-
async function main() {
|
|
19
|
-
let exitCode = 0;
|
|
20
|
-
try {
|
|
21
|
-
const config = (0, config_js_1.loadConfig)();
|
|
22
|
-
const raw = await readStdin();
|
|
23
|
-
const event = JSON.parse(raw);
|
|
24
|
-
if ((0, types_js_1.isSkippedHook)(event)) {
|
|
25
|
-
exitCode = await (0, default_js_1.handleDefault)(event);
|
|
26
|
-
}
|
|
27
|
-
else if ((0, types_js_1.isPreToolUseEvent)(event)) {
|
|
28
|
-
exitCode = await (0, pre_tool_use_js_1.handlePreToolUse)(event, config);
|
|
29
|
-
}
|
|
30
|
-
else if ((0, types_js_1.isPostToolUseEvent)(event)) {
|
|
31
|
-
exitCode = await (0, post_tool_use_js_1.handlePostToolUse)(event, config);
|
|
32
|
-
}
|
|
33
|
-
else if ((0, types_js_1.isUserPromptSubmitEvent)(event)) {
|
|
34
|
-
exitCode = await (0, user_prompt_js_1.handleUserPrompt)(event, config);
|
|
35
|
-
}
|
|
36
|
-
else if ((0, types_js_1.isSessionEvent)(event)) {
|
|
37
|
-
exitCode = await (0, session_js_1.handleSession)(event, config);
|
|
38
|
-
}
|
|
39
|
-
else if ((0, types_js_1.isStopEvent)(event)) {
|
|
40
|
-
exitCode = await (0, stop_js_1.handleStop)(event, config);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
exitCode = await (0, default_js_1.handleDefault)(event);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
catch (err) {
|
|
47
|
-
process.stderr.write(`[pinta-codex] error: ${err}\n`);
|
|
48
|
-
exitCode = 0; // top-level catch-all stays fail-open per spec §6
|
|
49
|
-
}
|
|
50
|
-
process.exit(exitCode);
|
|
51
|
-
}
|
|
52
|
-
main();
|
|
53
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";var tt=Object.create;var re=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var ot=Object.getPrototypeOf,st=Object.prototype.hasOwnProperty;var f=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var it=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of nt(t))!st.call(e,o)&&o!==r&&re(e,o,{get:()=>t[o],enumerable:!(n=rt(t,o))||n.enumerable});return e};var m=(e,t,r)=>(r=e!=null?tt(ot(e)):{},it(t||!e||!e.__esModule?re(r,"default",{value:e,enumerable:!0}):r,e));var j=f(c=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});c.PATTERNS=c.MAX_BYTES=void 0;c.truncate=at;c.collectMatches=ne;c.resolveOverlaps=oe;c.applyMatches=se;c.redact=ut;c.MAX_BYTES=102400;function at(e){let t=Buffer.from(e,"utf-8");return t.length<=c.MAX_BYTES?e:`${t.subarray(0,c.MAX_BYTES).toString("utf-8")}\u2026[TRUNCATED:${t.length}]`}c.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 ne(e,t){let r=[];for(let n of c.PATTERNS){if(n.requireContext&&n.requireContext!==t.context)continue;let o=new RegExp(n.regex.source,n.regex.flags),i;for(;(i=o.exec(e))!==null;){let a=n.captureGroup??0,u=i[a];if(u===void 0){i.index===o.lastIndex&&o.lastIndex++;continue}let S=i.index,Qe=i.index+i[0].length,te=S+i[0].indexOf(u),et=te+u.length;r.push({start:S,end:Qe,replaceStart:te,replaceEnd:et,type:n.type}),i.index===o.lastIndex&&o.lastIndex++}}return r}function oe(e){let t=[...e].sort((o,i)=>o.start!==i.start?o.start-i.start:i.end-i.start-(o.end-o.start)),r=[],n=-1;for(let o of t)o.start<n||(r.push(o),n=o.end);return r}function se(e,t){let r=[...t].sort((o,i)=>i.replaceStart-o.replaceStart),n=e;for(let o of r)n=n.slice(0,o.replaceStart)+`[REDACTED:${o.type}]`+n.slice(o.replaceEnd);return n}function ut(e,t={}){if(e.length===0)return e;let r=ne(e,t);if(r.length===0)return e;let n=oe(r);return se(e,n)}});var N=f(p=>{"use strict";var ct=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(p,"__esModule",{value:!0});p.ulidToTraceId=ue;p.newSpanId=ce;p.snakeCase=dt;p.toOtlpValue=le;p.attrsFromRecord=ft;p.guardAttrs=pe;p.clientAttrs=de;p.buildPayload=mt;p.mergeBatch=_t;var lt=ct(require("crypto")),ie=j(),pt="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ue(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let n of e){let o=pt.indexOf(n);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${n}"`);t=t<<5n|BigInt(o)}let r=(1n<<128n)-1n;return t&=r,t.toString(16).padStart(32,"0")}function ce(){return lt.default.randomBytes(8).toString("hex")}function dt(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var ae=new Set;function R(e,t,r){let n=(0,ie.truncate)(t);if((r.skipRedactKeys??ae).has(e))return n;let o=(r.bashContextKeys??ae).has(e)?"bash":void 0;return(0,ie.redact)(n,{context:o})}function le(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:R(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:R(e,JSON.stringify(t),r)}}catch{return{stringValue:R(e,String(t),r)}}default:return{stringValue:R(e,String(t),r)}}}function ft(e,t,r={}){let n=[];for(let[o,i]of Object.entries(e)){let a=`${t}.${o}`,u=le(a,i,r);u!==null&&n.push({key:a,value:u})}return n}function pe(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 de(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}}]}function mt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...pe(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...de(o));let i={traceId:ue(e.traceId),spanId:ce(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[i]}]}]}}function _t(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var me=f(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});U.evaluateGuard=Pt;var gt=1e4,ht="pinta-core";function fe(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}function yt(e){return new Promise((t,r)=>setTimeout(()=>{let n=new Error("Guard request timed out");n.name="TimeoutError",r(n)},e))}async function Pt(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??gt,o=Date.now();try{let i=await Promise.race([fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??ht,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e})}),yt(n)]);if(i.status!==200)return fe(Date.now()-o,"error");let a=await i.json(),u=Date.now()-o;return{decision:a.decision,reason:a.reason,userMessage:a.userMessage??null,durationMs:a.durationMs??u,clientRttMs:u}}catch(i){let a=i.name==="TimeoutError"?"timeout":"error";return fe(Date.now()-o,a)}}});var B=f(h=>{"use strict";var _e=h&&h.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(h,"__esModule",{value:!0});h.MemoryRetryQueue=h.DiskRetryQueue=void 0;var l=_e(require("fs")),w=_e(require("path")),A=1e3,Et=50,vt=5,L=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=w.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{l.default.mkdirSync(w.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
|
|
2
|
+
`;l.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
|
|
3
|
+
`)}}readAll(){try{let t=l.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
|
|
4
|
+
`))if(n.trim())try{r.push(JSON.parse(n))}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){l.default.existsSync(this.filePath)&&l.default.unlinkSync(this.filePath);return}l.default.mkdirSync(w.default.dirname(this.filePath),{recursive:!0}),l.default.writeFileSync(this.filePath,t.map(r=>JSON.stringify(r)).join(`
|
|
5
|
+
`)+`
|
|
6
|
+
`)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
|
|
7
|
+
`)}}tryAcquireLock(){let t=Date.now();for(l.default.mkdirSync(w.default.dirname(this.lockPath),{recursive:!0});Date.now()-t<Et;)try{let r=l.default.openSync(this.lockPath,"wx");return l.default.writeSync(r,String(process.pid)),l.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
|
|
8
|
+
`),!1;try{let i=l.default.statSync(this.lockPath);if(Date.now()-i.mtimeMs>3e4){l.default.unlinkSync(this.lockPath);continue}}catch{}let n=vt,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{l.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=A)return;let r=t.length-A;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
|
|
9
|
+
`),this.rewrite(t.slice(r))}};h.DiskRetryQueue=L;var q=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>A&&this.entries.splice(0,this.entries.length-A)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};h.MemoryRetryQueue=q});var Ee=f(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});_.MemoryTransport=_.DiskTransport=void 0;_.parseHeadersEnv=ye;_.envOptionsResolver=Pe;_.postOtlp=x;var ge=B(),he=N(),Ot=5e3;function ye(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let r of e.split(",")){let[n,...o]=r.split("=");n&&o.length>0&&(t[n.trim()]=o.join("=").trim())}return t}function Pe(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:ye(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function x(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Ot);try{let i=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!i.ok){let a="";try{a=(await i.text()).slice(0,200)}catch{}let u=i.status===401||i.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":i.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":i.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${i.status} ${t.endpoint}${u}${a?` body=${a}`:""}
|
|
10
|
+
`),!1}return!0}catch(i){return process.stderr.write(`[${r}] OTLP POST failed: ${i.message??String(i)}
|
|
11
|
+
`),!1}finally{clearTimeout(o)}}var G=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new ge.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Pe}async send(t){let r=this.resolveOptions();if(!r)return;await x(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let n=(0,he.mergeBatch)(r.map(i=>i.payload));await x(n,t,this.logPrefix)&&this.queue.rewrite([])}finally{this.queue.release()}}};_.DiskTransport=G;var V=class{queue=new ge.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;await x(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let n=(0,he.mergeBatch)(r);if(!await x(n,t,this.logPrefix))for(let i of r)this.queue.enqueue(i)}};_.MemoryTransport=V});var Y=f(P=>{"use strict";var K=P&&P.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(P,"__esModule",{value:!0});P.TraceManager=void 0;P.generateUlid=ve;var F=K(require("fs")),Tt=K(require("path")),St=K(require("crypto")),X="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ve(){let e=Date.now(),t="",r=e;for(let i=0;i<10;i++)t=X[r&31]+t,r=Math.floor(r/32);let n=St.default.randomBytes(10),o="";for(let i=0;i<10;i++)o+=X[n[i]&31];for(;o.length<16;)o+=X[0];return t+o}var $=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=ve();return this.save(t),t}currentTrace(){try{let t=F.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){F.default.mkdirSync(Tt.default.dirname(this.tracePath),{recursive:!0}),F.default.writeFileSync(this.tracePath,JSON.stringify({traceId:t}))}};P.TraceManager=$});var xe=f(y=>{"use strict";var Oe=y&&y.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(y,"__esModule",{value:!0});y.MemorySessionTraceManager=y.DiskSessionTraceManager=void 0;var H=Oe(require("fs")),xt=Oe(require("path")),Te=Y(),Se=200,Z=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??Se}read(){try{let t=JSON.parse(H.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{H.default.mkdirSync(xt.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;H.default.writeFileSync(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Te.generateUlid)(),o=this.read();return o[r]=n,this.write(o),n}currentTrace(t){let r=t||"default",n=this.read()[r];return n||this.newTrace(r)}};y.DiskSessionTraceManager=Z;var W=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??Se}newTrace(t){let r=t||"default",n=(0,Te.generateUlid)();if(this.map.set(r,n),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return n}currentTrace(t){let r=t||"default";return this.map.get(r)??this.newTrace(r)}};y.MemorySessionTraceManager=W});var Re=f(E=>{"use strict";var z=E&&E.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(E,"__esModule",{value:!0});E.envFilePath=Rt;E.parseEnvFile=be;E.loadEnvFile=wt;var kt=z(require("node:fs")),bt=z(require("node:os")),ke=z(require("node:path"));function Rt(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:ke.default.join(bt.default.homedir(),e);return ke.default.join(o,t)}function be(e){let t={};for(let r of e.split(`
|
|
12
|
+
`)){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 wt(e){let t;try{t=kt.default.readFileSync(e,"utf-8")}catch{return}let r=be(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var T=f(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.loadEnvFile=s.parseEnvFile=s.envFilePath=s.MemorySessionTraceManager=s.DiskSessionTraceManager=s.generateUlid=s.TraceManager=s.parseHeadersEnv=s.envOptionsResolver=s.postOtlp=s.MemoryTransport=s.DiskTransport=s.MemoryRetryQueue=s.DiskRetryQueue=s.evaluateGuard=s.mergeBatch=s.buildPayload=s.clientAttrs=s.guardAttrs=s.attrsFromRecord=s.toOtlpValue=s.snakeCase=s.newSpanId=s.ulidToTraceId=s.MAX_BYTES=s.PATTERNS=s.applyMatches=s.resolveOverlaps=s.collectMatches=s.truncate=s.redact=void 0;var v=j();Object.defineProperty(s,"redact",{enumerable:!0,get:function(){return v.redact}});Object.defineProperty(s,"truncate",{enumerable:!0,get:function(){return v.truncate}});Object.defineProperty(s,"collectMatches",{enumerable:!0,get:function(){return v.collectMatches}});Object.defineProperty(s,"resolveOverlaps",{enumerable:!0,get:function(){return v.resolveOverlaps}});Object.defineProperty(s,"applyMatches",{enumerable:!0,get:function(){return v.applyMatches}});Object.defineProperty(s,"PATTERNS",{enumerable:!0,get:function(){return v.PATTERNS}});Object.defineProperty(s,"MAX_BYTES",{enumerable:!0,get:function(){return v.MAX_BYTES}});var g=N();Object.defineProperty(s,"ulidToTraceId",{enumerable:!0,get:function(){return g.ulidToTraceId}});Object.defineProperty(s,"newSpanId",{enumerable:!0,get:function(){return g.newSpanId}});Object.defineProperty(s,"snakeCase",{enumerable:!0,get:function(){return g.snakeCase}});Object.defineProperty(s,"toOtlpValue",{enumerable:!0,get:function(){return g.toOtlpValue}});Object.defineProperty(s,"attrsFromRecord",{enumerable:!0,get:function(){return g.attrsFromRecord}});Object.defineProperty(s,"guardAttrs",{enumerable:!0,get:function(){return g.guardAttrs}});Object.defineProperty(s,"clientAttrs",{enumerable:!0,get:function(){return g.clientAttrs}});Object.defineProperty(s,"buildPayload",{enumerable:!0,get:function(){return g.buildPayload}});Object.defineProperty(s,"mergeBatch",{enumerable:!0,get:function(){return g.mergeBatch}});var At=me();Object.defineProperty(s,"evaluateGuard",{enumerable:!0,get:function(){return At.evaluateGuard}});var we=B();Object.defineProperty(s,"DiskRetryQueue",{enumerable:!0,get:function(){return we.DiskRetryQueue}});Object.defineProperty(s,"MemoryRetryQueue",{enumerable:!0,get:function(){return we.MemoryRetryQueue}});var k=Ee();Object.defineProperty(s,"DiskTransport",{enumerable:!0,get:function(){return k.DiskTransport}});Object.defineProperty(s,"MemoryTransport",{enumerable:!0,get:function(){return k.MemoryTransport}});Object.defineProperty(s,"postOtlp",{enumerable:!0,get:function(){return k.postOtlp}});Object.defineProperty(s,"envOptionsResolver",{enumerable:!0,get:function(){return k.envOptionsResolver}});Object.defineProperty(s,"parseHeadersEnv",{enumerable:!0,get:function(){return k.parseHeadersEnv}});var Ae=Y();Object.defineProperty(s,"TraceManager",{enumerable:!0,get:function(){return Ae.TraceManager}});Object.defineProperty(s,"generateUlid",{enumerable:!0,get:function(){return Ae.generateUlid}});var De=xe();Object.defineProperty(s,"DiskSessionTraceManager",{enumerable:!0,get:function(){return De.DiskSessionTraceManager}});Object.defineProperty(s,"MemorySessionTraceManager",{enumerable:!0,get:function(){return De.MemorySessionTraceManager}});var J=Re();Object.defineProperty(s,"envFilePath",{enumerable:!0,get:function(){return J.envFilePath}});Object.defineProperty(s,"parseEnvFile",{enumerable:!0,get:function(){return J.parseEnvFile}});Object.defineProperty(s,"loadEnvFile",{enumerable:!0,get:function(){return J.loadEnvFile}})});var Q=m(require("node:fs")),Ie=m(require("node:os")),b=m(require("node:path")),Me=m(T());function Dt(e){let t={},r;try{r=Q.default.readFileSync(e,"utf-8")}catch{return t}for(let n of r.split(`
|
|
13
|
+
`)){let o=n.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i<0)continue;let a=o.slice(0,i).trim(),u=o.slice(i+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),a&&(t[a]=u)}return t}function It(e){let t=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT??e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;if(t)return t;let r=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??e.OTEL_EXPORTER_OTLP_ENDPOINT;return r?r.replace(/\/+$/,"")+"/v1/traces":process.env.PINTA_CODEX_ENDPOINT??e.PINTA_CODEX_ENDPOINT??process.env.CLAUDE_PLUGIN_OPTION_ENDPOINT}function Mt(e){if(process.env.OTEL_EXPORTER_OTLP_HEADERS)return process.env.OTEL_EXPORTER_OTLP_HEADERS;if(e.OTEL_EXPORTER_OTLP_HEADERS)return e.OTEL_EXPORTER_OTLP_HEADERS;if(process.env.PINTA_CODEX_API_KEY)return`x-pinta-relay-token=${process.env.PINTA_CODEX_API_KEY}`;if(e.PINTA_CODEX_API_KEY)return`x-pinta-relay-token=${e.PINTA_CODEX_API_KEY}`;if(process.env.CLAUDE_PLUGIN_OPTION_API_KEY)return`x-pinta-relay-token=${process.env.CLAUDE_PLUGIN_OPTION_API_KEY}`}function Ce(){let e=process.env.CODEX_PLUGIN_ROOT??process.env.CLAUDE_PLUGIN_ROOT??process.cwd(),t=process.env.CODEX_PLUGIN_DATA??process.env.CLAUDE_PLUGIN_DATA??b.default.join(e,".plugin-data"),r=process.env.CODEX_HOME??b.default.join(Ie.default.homedir(),".codex"),n=b.default.join(r,"pinta-codex.env"),o=Q.default.existsSync(n)?Dt(n):{},i=It(o),a=Mt(o);if(a&&!process.env.PINTA_RELAY_TOKEN){let S=a.match(/x-pinta-relay-token=([^,\s]+)/i);S&&(process.env.PINTA_RELAY_TOKEN=S[1])}let u=process.env.PINTA_GUARD_ENDPOINT??o.PINTA_GUARD_ENDPOINT;return{pluginRoot:e,pluginData:t,tracePath:b.default.join(t,"trace.json"),endpoint:i?.replace(/\/+$/,""),headers:(0,Me.parseHeadersEnv)(a??""),guardEndpoint:u}}function je(e){return e.hook_event_name==="PreToolUse"}function Ne(e){return e.hook_event_name==="PostToolUse"}function Ue(e){return e.hook_event_name==="UserPromptSubmit"}function Le(e){return e.hook_event_name==="SessionStart"}function qe(e){return e.hook_event_name==="Stop"}var Ct=new Set(["PreToolUse","PostToolUse","SessionStart","UserPromptSubmit","Stop"]);function Be(e){return!Ct.has(e.hook_event_name)}var Ge=m(T()),jt=50,Nt="pinta-codex/1.5.0";async function Ve(e,t){let r=await(0,Ge.evaluateGuard)(e,t,{timeoutMs:jt,token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Nt});if(r===null)return null;let n={decision:r.decision,reason:r.reason,durationMs:r.durationMs,clientRttMs:r.clientRttMs};return r.failOpenReason!==void 0&&(n.failOpenReason=r.failOpenReason),n}var Fe=m(T()),D=class extends Fe.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-codex",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var Xe=m(T()),I=class extends Xe.TraceManager{constructor(t){super(t.tracePath)}};var C=m(require("os")),O=m(T());var $e="1.5.0",M=null;function Ut(){return M!==null||(M=process.env.CODEX_CLI_VERSION||"unknown"),M}var Lt=new Set(["codex.hook","codex.tool_name","codex.tool_use_id","codex.session_id","codex.transcript_path","codex.cwd","codex.permission_mode"]),qt=new Set(["codex.tool_input","codex.tool_response"]),Bt={skipRedactKeys:Lt,bashContextKeys:qt};function Gt(e){let t=[];t.push({key:"ingest.type",value:{stringValue:"codex"}}),t.push({key:"codex.hook",value:{stringValue:e.hook_event_name}});let r={};for(let[n,o]of Object.entries(e))n!=="hook_event_name"&&(r[n]=o);return t.push(...(0,O.attrsFromRecord)(r,"codex",Bt)),t}function Vt(){return[{key:"service.name",value:{stringValue:"codex"}},{key:"service.version",value:{stringValue:Ut()}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-codex"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:$e}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:C.default.userInfo().username}},{key:"host.name",value:{stringValue:C.default.hostname()}},{key:"host.arch",value:{stringValue:C.default.arch()}}]}function Ke(e){return(0,O.buildPayload)({traceId:e.traceId,spanName:`codex.${(0,O.snakeCase)(e.event.hook_event_name)}`,attributes:Gt(e.event),resource:Vt(),scope:{name:"pinta-codex",version:$e},now:e.now,guard:e.guard})}async function d(e,t,r){let n=new D(t);await n.flush();let o=new I(t),i=r.trace==="new"?o.newTrace():o.currentTrace(),a=Ke({event:e,traceId:i,guard:r.guard});await n.send(a)}async function Ye(e,t){let r=typeof e.tool_input=="string"?e.tool_input:JSON.stringify(e.tool_input),n=await Ve({spanId:e.session_id??"unknown",toolName:e.tool_name,toolInput:e.tool_input,rawTextFields:{toolInput:r}},t.guardEndpoint);if(await d(e,t,{trace:"current",guard:n}),n?.decision==="DENY"){let o={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:n.reason??"guard_deny"}};process.stdout.write(JSON.stringify(o)+`
|
|
14
|
+
`)}return 0}async function He(e,t){return await d(e,t,{trace:"current"}),0}async function Ze(e,t){return await d(e,t,{trace:"new"}),0}async function We(e,t){return await d(e,t,{trace:"current"}),0}async function ze(e,t){return await d(e,t,{trace:"current"}),0}async function ee(e){return 0}async function Ft(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function Je(){let e=0;try{let t=Ce(),r=await Ft(),n=JSON.parse(r);Be(n)?e=await ee(n):je(n)?e=await Ye(n,t):Ne(n)?e=await He(n,t):Ue(n)?e=await Ze(n,t):Le(n)?e=await We(n,t):qe(n)?e=await ze(n,t):e=await ee(n)}catch(t){process.stderr.write(`[pinta-codex] error: ${t}
|
|
15
|
+
`),e=0}return e}async function Xt(){let e=await Je();process.exit(e)}Xt();
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import{createRequire as __pintaCreateRequire}from 'node:module';const require=__pintaCreateRequire(import.meta.url);
|
|
2
|
+
var st=Object.create;var ne=Object.defineProperty;var it=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var ut=Object.getPrototypeOf,ct=Object.prototype.hasOwnProperty;var d=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var m=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var lt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of at(t))!ct.call(e,o)&&o!==r&&ne(e,o,{get:()=>t[o],enumerable:!(n=it(t,o))||n.enumerable});return e};var S=(e,t,r)=>(r=e!=null?st(ut(e)):{},lt(t||!e||!e.__esModule?ne(r,"default",{value:e,enumerable:!0}):r,e));var C=m(c=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});c.PATTERNS=c.MAX_BYTES=void 0;c.truncate=pt;c.collectMatches=oe;c.resolveOverlaps=se;c.applyMatches=ie;c.redact=dt;c.MAX_BYTES=102400;function pt(e){let t=Buffer.from(e,"utf-8");return t.length<=c.MAX_BYTES?e:`${t.subarray(0,c.MAX_BYTES).toString("utf-8")}\u2026[TRUNCATED:${t.length}]`}c.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 oe(e,t){let r=[];for(let n of c.PATTERNS){if(n.requireContext&&n.requireContext!==t.context)continue;let o=new RegExp(n.regex.source,n.regex.flags),s;for(;(s=o.exec(e))!==null;){let a=n.captureGroup??0,u=s[a];if(u===void 0){s.index===o.lastIndex&&o.lastIndex++;continue}let x=s.index,nt=s.index+s[0].length,re=x+s[0].indexOf(u),ot=re+u.length;r.push({start:x,end:nt,replaceStart:re,replaceEnd:ot,type:n.type}),s.index===o.lastIndex&&o.lastIndex++}}return r}function se(e){let t=[...e].sort((o,s)=>o.start!==s.start?o.start-s.start:s.end-s.start-(o.end-o.start)),r=[],n=-1;for(let o of t)o.start<n||(r.push(o),n=o.end);return r}function ie(e,t){let r=[...t].sort((o,s)=>s.replaceStart-o.replaceStart),n=e;for(let o of r)n=n.slice(0,o.replaceStart)+`[REDACTED:${o.type}]`+n.slice(o.replaceEnd);return n}function dt(e,t={}){if(e.length===0)return e;let r=oe(e,t);if(r.length===0)return e;let n=se(r);return ie(e,n)}});var N=m(p=>{"use strict";var ft=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(p,"__esModule",{value:!0});p.ulidToTraceId=ce;p.newSpanId=le;p.snakeCase=ht;p.toOtlpValue=pe;p.attrsFromRecord=gt;p.guardAttrs=de;p.clientAttrs=fe;p.buildPayload=yt;p.mergeBatch=Pt;var mt=ft(d("crypto")),ae=C(),_t="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ce(e){if(e.length!==26)throw new Error(`ulidToTraceId: expected 26 chars, got ${e.length}`);let t=0n;for(let n of e){let o=_t.indexOf(n);if(o<0)throw new Error(`ulidToTraceId: invalid Crockford char "${n}"`);t=t<<5n|BigInt(o)}let r=(1n<<128n)-1n;return t&=r,t.toString(16).padStart(32,"0")}function le(){return mt.default.randomBytes(8).toString("hex")}function ht(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}var ue=new Set;function A(e,t,r){let n=(0,ae.truncate)(t);if((r.skipRedactKeys??ue).has(e))return n;let o=(r.bashContextKeys??ue).has(e)?"bash":void 0;return(0,ae.redact)(n,{context:o})}function pe(e,t,r={}){if(t==null)return null;switch(typeof t){case"string":return{stringValue:A(e,t,r)};case"boolean":return{boolValue:t};case"number":return Number.isInteger(t)?{intValue:t}:{doubleValue:t};case"object":try{return{stringValue:A(e,JSON.stringify(t),r)}}catch{return{stringValue:A(e,String(t),r)}}default:return{stringValue:A(e,String(t),r)}}}function gt(e,t,r={}){let n=[];for(let[o,s]of Object.entries(e)){let a=`${t}.${o}`,u=pe(a,s,r);u!==null&&n.push({key:a,value:u})}return n}function de(e){let t=[{key:"pinta.guard.decision",value:{stringValue:e.decision.toLowerCase()}},{key:"pinta.guard.duration_ms",value:{intValue:e.durationMs}}];return e.reason&&t.push({key:"pinta.guard.matched_rule",value:{stringValue:e.reason}}),e.failOpenReason&&t.push({key:"pinta.guard.fail_open_reason",value:{stringValue:e.failOpenReason}}),t}function fe(e){return[{key:"pinta.client.rtt_ms",value:Number.isInteger(e.rttMs)?{intValue:e.rttMs}:{doubleValue:e.rttMs}},{key:"pinta.client.op",value:{stringValue:e.op}}]}function yt(e){let t=e.now??Date.now(),r=(BigInt(t)*1000000n).toString(),n=[...e.attributes];e.guard&&n.push(...de(e.guard));let o=e.clientTiming??(e.guard?.clientRttMs!==void 0?{op:"guard",rttMs:e.guard.clientRttMs}:null);o&&n.push(...fe(o));let s={traceId:ce(e.traceId),spanId:le(),name:e.spanName,kind:e.spanKind??1,startTimeUnixNano:r,endTimeUnixNano:r,attributes:n};return{resourceSpans:[{resource:{attributes:e.resource},scopeSpans:[{scope:e.scope,spans:[s]}]}]}}function Pt(e){let t=[];for(let r of e)t.push(...r.resourceSpans);return{resourceSpans:t}}});var _e=m(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});U.evaluateGuard=Ot;var Et=1e4,vt="pinta-core";function me(e,t){return{decision:"ALLOW",reason:null,userMessage:null,durationMs:e,clientRttMs:e,failOpenReason:t}}function Tt(e){return new Promise((t,r)=>setTimeout(()=>{let n=new Error("Guard request timed out");n.name="TimeoutError",r(n)},e))}async function Ot(e,t,r={}){if(!t||r.disabled)return null;let n=r.timeoutMs??Et,o=Date.now();try{let s=await Promise.race([fetch(t,{method:"POST",headers:{"content-type":"application/json","user-agent":r.userAgent??vt,"x-pinta-relay-token":r.token??""},body:JSON.stringify({input:e})}),Tt(n)]);if(s.status!==200)return me(Date.now()-o,"error");let a=await s.json(),u=Date.now()-o;return{decision:a.decision,reason:a.reason,userMessage:a.userMessage??null,durationMs:a.durationMs??u,clientRttMs:u}}catch(s){let a=s.name==="TimeoutError"?"timeout":"error";return me(Date.now()-o,a)}}});var B=m(g=>{"use strict";var he=g&&g.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(g,"__esModule",{value:!0});g.MemoryRetryQueue=g.DiskRetryQueue=void 0;var l=he(d("fs")),R=he(d("path")),w=1e3,St=50,xt=5,L=class{filePath;lockPath;logPrefix;constructor(t,r){this.filePath=R.default.join(t,"failed-spans.jsonl"),this.lockPath=this.filePath+".lock",this.logPrefix=r}enqueue(t){try{l.default.mkdirSync(R.default.dirname(this.filePath),{recursive:!0});let r=JSON.stringify({savedAt:new Date().toISOString(),payload:t})+`
|
|
3
|
+
`;l.default.appendFileSync(this.filePath,r),this.trim()}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue enqueue failed: ${r}
|
|
4
|
+
`)}}readAll(){try{let t=l.default.readFileSync(this.filePath,"utf-8"),r=[];for(let n of t.split(`
|
|
5
|
+
`))if(n.trim())try{r.push(JSON.parse(n))}catch{}return r}catch{return[]}}rewrite(t){try{if(t.length===0){l.default.existsSync(this.filePath)&&l.default.unlinkSync(this.filePath);return}l.default.mkdirSync(R.default.dirname(this.filePath),{recursive:!0}),l.default.writeFileSync(this.filePath,t.map(r=>JSON.stringify(r)).join(`
|
|
6
|
+
`)+`
|
|
7
|
+
`)}catch(r){process.stderr.write(`[${this.logPrefix}] retry-queue rewrite failed: ${r}
|
|
8
|
+
`)}}tryAcquireLock(){let t=Date.now();for(l.default.mkdirSync(R.default.dirname(this.lockPath),{recursive:!0});Date.now()-t<St;)try{let r=l.default.openSync(this.lockPath,"wx");return l.default.writeSync(r,String(process.pid)),l.default.closeSync(r),!0}catch(r){if(r?.code!=="EEXIST")return process.stderr.write(`[${this.logPrefix}] retry-queue lock open failed: ${r}
|
|
9
|
+
`),!1;try{let s=l.default.statSync(this.lockPath);if(Date.now()-s.mtimeMs>3e4){l.default.unlinkSync(this.lockPath);continue}}catch{}let n=xt,o=Date.now()+n;for(;Date.now()<o;);}return!1}release(){try{l.default.unlinkSync(this.lockPath)}catch{}}trim(){let t=this.readAll();if(t.length<=w)return;let r=t.length-w;process.stderr.write(`[${this.logPrefix}] retry-queue full, dropping ${r} oldest entries
|
|
10
|
+
`),this.rewrite(t.slice(r))}};g.DiskRetryQueue=L;var q=class{entries=[];enqueue(t){this.entries.push(t),this.entries.length>w&&this.entries.splice(0,this.entries.length-w)}drain(){let t=this.entries;return this.entries=[],t}get size(){return this.entries.length}};g.MemoryRetryQueue=q});var ve=m(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});_.MemoryTransport=_.DiskTransport=void 0;_.parseHeadersEnv=Pe;_.envOptionsResolver=Ee;_.postOtlp=b;var ge=B(),ye=N(),bt=5e3;function Pe(e){if(!e)return{};if(typeof e=="object")return{...e};let t={};for(let r of e.split(",")){let[n,...o]=r.split("=");n&&o.length>0&&(t[n.trim()]=o.join("=").trim())}return t}function Ee(){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,t=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r;return e?r=e.replace(/\/+$/,""):t&&(r=t.replace(/\/+$/,"")+"/v1/traces"),r?{endpoint:r,headers:Pe(process.env.OTEL_EXPORTER_OTLP_HEADERS)}:null}async function b(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),bt);try{let s=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify(e),signal:n.signal});if(!s.ok){let a="";try{a=(await s.text()).slice(0,200)}catch{}let u=s.status===401||s.status===403?" \u2014 check OTEL_EXPORTER_OTLP_HEADERS (relay token)":s.status===404?" \u2014 check OTEL_EXPORTER_OTLP_TRACES_ENDPOINT path":s.status>=500?" \u2014 collector may be down":"";return process.stderr.write(`[${r}] OTLP POST ${s.status} ${t.endpoint}${u}${a?` body=${a}`:""}
|
|
11
|
+
`),!1}return!0}catch(s){return process.stderr.write(`[${r}] OTLP POST failed: ${s.message??String(s)}
|
|
12
|
+
`),!1}finally{clearTimeout(o)}}var F=class{queue;logPrefix;resolveOptions;constructor(t){this.queue=new ge.DiskRetryQueue(t.pluginData,t.logPrefix),this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions??Ee}async send(t){let r=this.resolveOptions();if(!r)return;await b(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(t&&this.queue.tryAcquireLock())try{let r=this.queue.readAll();if(r.length===0)return;let n=(0,ye.mergeBatch)(r.map(s=>s.payload));await b(n,t,this.logPrefix)&&this.queue.rewrite([])}finally{this.queue.release()}}};_.DiskTransport=F;var G=class{queue=new ge.MemoryRetryQueue;logPrefix;resolveOptions;constructor(t){this.logPrefix=t.logPrefix,this.resolveOptions=t.resolveOptions}async send(t){let r=this.resolveOptions();if(!r)return;await b(t,r,this.logPrefix)||this.queue.enqueue(t)}async flush(){let t=this.resolveOptions();if(!t)return;let r=this.queue.drain();if(r.length===0)return;let n=(0,ye.mergeBatch)(r);if(!await b(n,t,this.logPrefix))for(let s of r)this.queue.enqueue(s)}};_.MemoryTransport=G});var Y=m(P=>{"use strict";var K=P&&P.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(P,"__esModule",{value:!0});P.TraceManager=void 0;P.generateUlid=Te;var V=K(d("fs")),kt=K(d("path")),At=K(d("crypto")),X="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Te(){let e=Date.now(),t="",r=e;for(let s=0;s<10;s++)t=X[r&31]+t,r=Math.floor(r/32);let n=At.default.randomBytes(10),o="";for(let s=0;s<10;s++)o+=X[n[s]&31];for(;o.length<16;)o+=X[0];return t+o}var $=class{tracePath;constructor(t){this.tracePath=t}newTrace(){let t=Te();return this.save(t),t}currentTrace(){try{let t=V.default.readFileSync(this.tracePath,"utf-8"),{traceId:r}=JSON.parse(t);if(r)return r}catch{}return this.newTrace()}save(t){V.default.mkdirSync(kt.default.dirname(this.tracePath),{recursive:!0}),V.default.writeFileSync(this.tracePath,JSON.stringify({traceId:t}))}};P.TraceManager=$});var be=m(y=>{"use strict";var Oe=y&&y.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(y,"__esModule",{value:!0});y.MemorySessionTraceManager=y.DiskSessionTraceManager=void 0;var H=Oe(d("fs")),Rt=Oe(d("path")),Se=Y(),xe=200,Z=class{tracePath;maxSessions;constructor(t,r={}){this.tracePath=t,this.maxSessions=r.maxSessions??xe}read(){try{let t=JSON.parse(H.default.readFileSync(this.tracePath,"utf-8"));if(t&&typeof t=="object"&&!("traceId"in t))return t}catch{}return{}}write(t){try{H.default.mkdirSync(Rt.default.dirname(this.tracePath),{recursive:!0});let r=Object.entries(t),n=r.length>this.maxSessions?Object.fromEntries(r.slice(-this.maxSessions)):t;H.default.writeFileSync(this.tracePath,JSON.stringify(n))}catch{}}newTrace(t){let r=t||"default",n=(0,Se.generateUlid)(),o=this.read();return o[r]=n,this.write(o),n}currentTrace(t){let r=t||"default",n=this.read()[r];return n||this.newTrace(r)}};y.DiskSessionTraceManager=Z;var W=class{map=new Map;maxSessions;constructor(t={}){this.maxSessions=t.maxSessions??xe}newTrace(t){let r=t||"default",n=(0,Se.generateUlid)();if(this.map.set(r,n),this.map.size>this.maxSessions){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}return n}currentTrace(t){let r=t||"default";return this.map.get(r)??this.newTrace(r)}};y.MemorySessionTraceManager=W});var Re=m(E=>{"use strict";var z=E&&E.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(E,"__esModule",{value:!0});E.envFilePath=It;E.parseEnvFile=Ae;E.loadEnvFile=jt;var wt=z(d("node:fs")),Dt=z(d("node:os")),ke=z(d("node:path"));function It(e,t,r){let n=r?process.env[r]:void 0,o=n&&n.length>0?n:ke.default.join(Dt.default.homedir(),e);return ke.default.join(o,t)}function Ae(e){let t={};for(let r of e.split(`
|
|
13
|
+
`)){let n=r.trim();if(!n||n.startsWith("#"))continue;let o=n.indexOf("=");if(o<0)continue;let s=n.slice(0,o).trim(),a=n.slice(o+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),s&&(t[s]=a)}return t}function jt(e){let t;try{t=wt.default.readFileSync(e,"utf-8")}catch{return}let r=Ae(t);for(let[n,o]of Object.entries(r))process.env[n]===void 0&&(process.env[n]=o)}});var T=m(i=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});i.loadEnvFile=i.parseEnvFile=i.envFilePath=i.MemorySessionTraceManager=i.DiskSessionTraceManager=i.generateUlid=i.TraceManager=i.parseHeadersEnv=i.envOptionsResolver=i.postOtlp=i.MemoryTransport=i.DiskTransport=i.MemoryRetryQueue=i.DiskRetryQueue=i.evaluateGuard=i.mergeBatch=i.buildPayload=i.clientAttrs=i.guardAttrs=i.attrsFromRecord=i.toOtlpValue=i.snakeCase=i.newSpanId=i.ulidToTraceId=i.MAX_BYTES=i.PATTERNS=i.applyMatches=i.resolveOverlaps=i.collectMatches=i.truncate=i.redact=void 0;var v=C();Object.defineProperty(i,"redact",{enumerable:!0,get:function(){return v.redact}});Object.defineProperty(i,"truncate",{enumerable:!0,get:function(){return v.truncate}});Object.defineProperty(i,"collectMatches",{enumerable:!0,get:function(){return v.collectMatches}});Object.defineProperty(i,"resolveOverlaps",{enumerable:!0,get:function(){return v.resolveOverlaps}});Object.defineProperty(i,"applyMatches",{enumerable:!0,get:function(){return v.applyMatches}});Object.defineProperty(i,"PATTERNS",{enumerable:!0,get:function(){return v.PATTERNS}});Object.defineProperty(i,"MAX_BYTES",{enumerable:!0,get:function(){return v.MAX_BYTES}});var h=N();Object.defineProperty(i,"ulidToTraceId",{enumerable:!0,get:function(){return h.ulidToTraceId}});Object.defineProperty(i,"newSpanId",{enumerable:!0,get:function(){return h.newSpanId}});Object.defineProperty(i,"snakeCase",{enumerable:!0,get:function(){return h.snakeCase}});Object.defineProperty(i,"toOtlpValue",{enumerable:!0,get:function(){return h.toOtlpValue}});Object.defineProperty(i,"attrsFromRecord",{enumerable:!0,get:function(){return h.attrsFromRecord}});Object.defineProperty(i,"guardAttrs",{enumerable:!0,get:function(){return h.guardAttrs}});Object.defineProperty(i,"clientAttrs",{enumerable:!0,get:function(){return h.clientAttrs}});Object.defineProperty(i,"buildPayload",{enumerable:!0,get:function(){return h.buildPayload}});Object.defineProperty(i,"mergeBatch",{enumerable:!0,get:function(){return h.mergeBatch}});var Mt=_e();Object.defineProperty(i,"evaluateGuard",{enumerable:!0,get:function(){return Mt.evaluateGuard}});var we=B();Object.defineProperty(i,"DiskRetryQueue",{enumerable:!0,get:function(){return we.DiskRetryQueue}});Object.defineProperty(i,"MemoryRetryQueue",{enumerable:!0,get:function(){return we.MemoryRetryQueue}});var k=ve();Object.defineProperty(i,"DiskTransport",{enumerable:!0,get:function(){return k.DiskTransport}});Object.defineProperty(i,"MemoryTransport",{enumerable:!0,get:function(){return k.MemoryTransport}});Object.defineProperty(i,"postOtlp",{enumerable:!0,get:function(){return k.postOtlp}});Object.defineProperty(i,"envOptionsResolver",{enumerable:!0,get:function(){return k.envOptionsResolver}});Object.defineProperty(i,"parseHeadersEnv",{enumerable:!0,get:function(){return k.parseHeadersEnv}});var De=Y();Object.defineProperty(i,"TraceManager",{enumerable:!0,get:function(){return De.TraceManager}});Object.defineProperty(i,"generateUlid",{enumerable:!0,get:function(){return De.generateUlid}});var Ie=be();Object.defineProperty(i,"DiskSessionTraceManager",{enumerable:!0,get:function(){return Ie.DiskSessionTraceManager}});Object.defineProperty(i,"MemorySessionTraceManager",{enumerable:!0,get:function(){return Ie.MemorySessionTraceManager}});var J=Re();Object.defineProperty(i,"envFilePath",{enumerable:!0,get:function(){return J.envFilePath}});Object.defineProperty(i,"parseEnvFile",{enumerable:!0,get:function(){return J.parseEnvFile}});Object.defineProperty(i,"loadEnvFile",{enumerable:!0,get:function(){return J.loadEnvFile}})});import{realpathSync as ir}from"node:fs";import{pathToFileURL as ar}from"node:url";var Me=S(T());import je from"node:fs";import Ct from"node:os";import D from"node:path";function Nt(e){let t={},r;try{r=je.readFileSync(e,"utf-8")}catch{return t}for(let n of r.split(`
|
|
14
|
+
`)){let o=n.trim();if(!o||o.startsWith("#"))continue;let s=o.indexOf("=");if(s<0)continue;let a=o.slice(0,s).trim(),u=o.slice(s+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),a&&(t[a]=u)}return t}function Ut(e){let t=process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT??e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;if(t)return t;let r=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??e.OTEL_EXPORTER_OTLP_ENDPOINT;return r?r.replace(/\/+$/,"")+"/v1/traces":process.env.PINTA_CODEX_ENDPOINT??e.PINTA_CODEX_ENDPOINT??process.env.CLAUDE_PLUGIN_OPTION_ENDPOINT}function Lt(e){if(process.env.OTEL_EXPORTER_OTLP_HEADERS)return process.env.OTEL_EXPORTER_OTLP_HEADERS;if(e.OTEL_EXPORTER_OTLP_HEADERS)return e.OTEL_EXPORTER_OTLP_HEADERS;if(process.env.PINTA_CODEX_API_KEY)return`x-pinta-relay-token=${process.env.PINTA_CODEX_API_KEY}`;if(e.PINTA_CODEX_API_KEY)return`x-pinta-relay-token=${e.PINTA_CODEX_API_KEY}`;if(process.env.CLAUDE_PLUGIN_OPTION_API_KEY)return`x-pinta-relay-token=${process.env.CLAUDE_PLUGIN_OPTION_API_KEY}`}function Ce(){let e=process.env.CODEX_PLUGIN_ROOT??process.env.CLAUDE_PLUGIN_ROOT??process.cwd(),t=process.env.CODEX_PLUGIN_DATA??process.env.CLAUDE_PLUGIN_DATA??D.join(e,".plugin-data"),r=process.env.CODEX_HOME??D.join(Ct.homedir(),".codex"),n=D.join(r,"pinta-codex.env"),o=je.existsSync(n)?Nt(n):{},s=Ut(o),a=Lt(o);if(a&&!process.env.PINTA_RELAY_TOKEN){let x=a.match(/x-pinta-relay-token=([^,\s]+)/i);x&&(process.env.PINTA_RELAY_TOKEN=x[1])}let u=process.env.PINTA_GUARD_ENDPOINT??o.PINTA_GUARD_ENDPOINT;return{pluginRoot:e,pluginData:t,tracePath:D.join(t,"trace.json"),endpoint:s?.replace(/\/+$/,""),headers:(0,Me.parseHeadersEnv)(a??""),guardEndpoint:u}}function Ne(e){return e.hook_event_name==="PreToolUse"}function Ue(e){return e.hook_event_name==="PostToolUse"}function Le(e){return e.hook_event_name==="UserPromptSubmit"}function qe(e){return e.hook_event_name==="SessionStart"}function Be(e){return e.hook_event_name==="Stop"}var qt=new Set(["PreToolUse","PostToolUse","SessionStart","UserPromptSubmit","Stop"]);function Fe(e){return!qt.has(e.hook_event_name)}var Ge=S(T()),Bt=50,Ft="pinta-codex/1.5.0";async function Ve(e,t){let r=await(0,Ge.evaluateGuard)(e,t,{timeoutMs:Bt,token:process.env.PINTA_RELAY_TOKEN??"",disabled:process.env.PINTA_GUARD_DISABLED==="1",userAgent:Ft});if(r===null)return null;let n={decision:r.decision,reason:r.reason,durationMs:r.durationMs,clientRttMs:r.clientRttMs};return r.failOpenReason!==void 0&&(n.failOpenReason=r.failOpenReason),n}var Xe=S(T()),I=class extends Xe.DiskTransport{constructor(t){super({pluginData:t.pluginData,logPrefix:"pinta-codex",resolveOptions:()=>t.endpoint?{endpoint:t.endpoint,headers:t.headers}:null})}};var $e=S(T()),j=class extends $e.TraceManager{constructor(t){super(t.tracePath)}};var O=S(T());import Q from"os";var Ke="1.5.0",M=null;function Gt(){return M!==null||(M=process.env.CODEX_CLI_VERSION||"unknown"),M}var Vt=new Set(["codex.hook","codex.tool_name","codex.tool_use_id","codex.session_id","codex.transcript_path","codex.cwd","codex.permission_mode"]),Xt=new Set(["codex.tool_input","codex.tool_response"]),$t={skipRedactKeys:Vt,bashContextKeys:Xt};function Kt(e){let t=[];t.push({key:"ingest.type",value:{stringValue:"codex"}}),t.push({key:"codex.hook",value:{stringValue:e.hook_event_name}});let r={};for(let[n,o]of Object.entries(e))n!=="hook_event_name"&&(r[n]=o);return t.push(...(0,O.attrsFromRecord)(r,"codex",$t)),t}function Yt(){return[{key:"service.name",value:{stringValue:"codex"}},{key:"service.version",value:{stringValue:Gt()}},{key:"telemetry.sdk.name",value:{stringValue:"pinta-codex"}},{key:"telemetry.sdk.language",value:{stringValue:"nodejs"}},{key:"telemetry.sdk.version",value:{stringValue:Ke}},{key:"process.pid",value:{intValue:process.pid}},{key:"process.owner",value:{stringValue:Q.userInfo().username}},{key:"host.name",value:{stringValue:Q.hostname()}},{key:"host.arch",value:{stringValue:Q.arch()}}]}function Ye(e){return(0,O.buildPayload)({traceId:e.traceId,spanName:`codex.${(0,O.snakeCase)(e.event.hook_event_name)}`,attributes:Kt(e.event),resource:Yt(),scope:{name:"pinta-codex",version:Ke},now:e.now,guard:e.guard})}async function f(e,t,r){let n=new I(t);await n.flush();let o=new j(t),s=r.trace==="new"?o.newTrace():o.currentTrace(),a=Ye({event:e,traceId:s,guard:r.guard});await n.send(a)}async function He(e,t){let r=typeof e.tool_input=="string"?e.tool_input:JSON.stringify(e.tool_input),n=await Ve({spanId:e.session_id??"unknown",toolName:e.tool_name,toolInput:e.tool_input,rawTextFields:{toolInput:r}},t.guardEndpoint);if(await f(e,t,{trace:"current",guard:n}),n?.decision==="DENY"){let o={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:n.reason??"guard_deny"}};process.stdout.write(JSON.stringify(o)+`
|
|
15
|
+
`)}return 0}async function Ze(e,t){return await f(e,t,{trace:"current"}),0}async function We(e,t){return await f(e,t,{trace:"new"}),0}async function ze(e,t){return await f(e,t,{trace:"current"}),0}async function Je(e,t){return await f(e,t,{trace:"current"}),0}async function ee(e){return 0}async function Ht(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf-8")}async function Qe(){let e=0;try{let t=Ce(),r=await Ht(),n=JSON.parse(r);Fe(n)?e=await ee(n):Ne(n)?e=await He(n,t):Ue(n)?e=await Ze(n,t):Le(n)?e=await We(n,t):qe(n)?e=await ze(n,t):Be(n)?e=await Je(n,t):e=await ee(n)}catch(t){process.stderr.write(`[pinta-codex] error: ${t}
|
|
16
|
+
`),e=0}return e}var et=S(T());import{opendir as Zt,stat as Wt}from"node:fs/promises";import te from"node:path";var zt="pinta-codex",Jt=/^rollout-.+-([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\.jsonl$/;function Qt(){return(0,et.envFilePath)(".codex","sessions","CODEX_HOME")}function er(e,t){return te.relative(e,t).split(te.sep).join("/")}function tr(e){return e.endsWith(".jsonl")?"append-log":"rewritten-doc"}function rr(e){return e.endsWith(".jsonl")?"session-log":"other"}function nr(e){let t=e.slice(e.lastIndexOf("/")+1);return Jt.exec(t)?.[1]}async function tt(){return[Qt()]}async function*rt(e,t){let r;try{r=await Zt(t)}catch{return}try{for await(let n of r){let o=te.join(t,n.name);n.isDirectory()?yield*rt(e,o):n.isFile()&&(yield{absPath:o,relPath:er(e,o)})}}catch{return}}async function*or(e){let[t]=await tt(),r=e.since?.getTime();for await(let{absPath:n,relPath:o}of rt(t,t)){let s;try{s=await Wt(n)}catch{continue}r!==void 0&&s.mtime.getTime()<=r||(yield{relPath:o,absPath:n,size:s.size,mtime:s.mtime,sessionId:nr(o),semantics:tr(o)})}}var sr={id:zt,roots:tt,scan:or,classify:rr};function ur(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===ar(ir(e)).href}catch{return!1}}async function cr(){let e=await Qe();process.exit(e)}ur()&&cr();export{sr as lifecycle};
|
package/package.json
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinta-ai/pinta-codex",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Generic OTLP forwarder for Codex hook events",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"import": "./dist/index.mjs",
|
|
9
|
+
"require": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
6
12
|
"license": "SEE LICENSE IN ./LICENSE",
|
|
7
13
|
"author": "Pinta AI (https://pinta.sh)",
|
|
8
14
|
"repository": {
|
|
@@ -24,7 +30,10 @@
|
|
|
24
30
|
],
|
|
25
31
|
"scripts": {
|
|
26
32
|
"bump": "node scripts/bump.mjs",
|
|
27
|
-
"
|
|
33
|
+
"typecheck": "tsc --noEmit",
|
|
34
|
+
"build": "tsc --noEmit && npm run build:cjs && npm run build:esm",
|
|
35
|
+
"build:cjs": "esbuild src/index.ts --bundle --platform=node --format=cjs --target=node18 --minify --outfile=dist/index.js",
|
|
36
|
+
"build:esm": "esbuild src/index.mts --bundle --platform=node --format=esm --target=node18 --minify --banner:js=\"import{createRequire as __pintaCreateRequire}from 'node:module';const require=__pintaCreateRequire(import.meta.url);\" --outfile=dist/index.mjs",
|
|
28
37
|
"dev": "tsc --watch",
|
|
29
38
|
"setup": "npx tsx tools/setup.ts",
|
|
30
39
|
"doctor": "npx tsx tools/doctor.ts",
|
|
@@ -34,11 +43,19 @@
|
|
|
34
43
|
"test:otlp": "npx tsx tools/test-otlp.ts",
|
|
35
44
|
"test:redact": "npx tsx tools/test-redact.ts",
|
|
36
45
|
"test": "vitest run",
|
|
37
|
-
"test:watch": "vitest"
|
|
46
|
+
"test:watch": "vitest",
|
|
47
|
+
"smoke:import": "node scripts/smoke-import.mjs",
|
|
48
|
+
"prepublishOnly": "npm run build"
|
|
38
49
|
},
|
|
39
50
|
"devDependencies": {
|
|
51
|
+
"@pinta-ai/core": "^0.3.0",
|
|
40
52
|
"@types/node": "^22.0.0",
|
|
53
|
+
"esbuild": "^0.24.0",
|
|
41
54
|
"typescript": "^5.7.0",
|
|
42
55
|
"vitest": "^2.1.0"
|
|
56
|
+
},
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"registry": "https://registry.npmjs.org",
|
|
59
|
+
"access": "public"
|
|
43
60
|
}
|
|
44
61
|
}
|
package/dist/core/config.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export interface PintaCodexConfig {
|
|
2
|
-
pluginRoot: string;
|
|
3
|
-
pluginData: string;
|
|
4
|
-
tracePath: string;
|
|
5
|
-
endpoint?: string;
|
|
6
|
-
headers: Record<string, string>;
|
|
7
|
-
/** Plan 5: manager-local guard endpoint (or undefined → guard skipped). */
|
|
8
|
-
guardEndpoint?: string;
|
|
9
|
-
}
|
|
10
|
-
export declare function loadConfig(): PintaCodexConfig;
|
|
11
|
-
/** Returns true if OTel endpoint is configured (signal to silently disable telemetry). */
|
|
12
|
-
export declare function hasOtlpEndpoint(config: PintaCodexConfig): boolean;
|
package/dist/core/config.js
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.loadConfig = loadConfig;
|
|
7
|
-
exports.hasOtlpEndpoint = hasOtlpEndpoint;
|
|
8
|
-
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
-
const node_os_1 = __importDefault(require("node:os"));
|
|
10
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
-
function readEnvFile(p) {
|
|
12
|
-
const out = {};
|
|
13
|
-
let content;
|
|
14
|
-
try {
|
|
15
|
-
content = node_fs_1.default.readFileSync(p, "utf-8");
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
return out;
|
|
19
|
-
}
|
|
20
|
-
for (const raw of content.split("\n")) {
|
|
21
|
-
const line = raw.trim();
|
|
22
|
-
if (!line || line.startsWith("#"))
|
|
23
|
-
continue;
|
|
24
|
-
const idx = line.indexOf("=");
|
|
25
|
-
if (idx < 0)
|
|
26
|
-
continue;
|
|
27
|
-
const key = line.slice(0, idx).trim();
|
|
28
|
-
let value = line.slice(idx + 1).trim();
|
|
29
|
-
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
30
|
-
(value.startsWith("'") && value.endsWith("'"))) {
|
|
31
|
-
value = value.slice(1, -1);
|
|
32
|
-
}
|
|
33
|
-
if (key)
|
|
34
|
-
out[key] = value;
|
|
35
|
-
}
|
|
36
|
-
return out;
|
|
37
|
-
}
|
|
38
|
-
function resolveEndpoint(envFile) {
|
|
39
|
-
// Per OTel spec:
|
|
40
|
-
// OTEL_EXPORTER_OTLP_TRACES_ENDPOINT = full URL (use as-is)
|
|
41
|
-
// OTEL_EXPORTER_OTLP_ENDPOINT = base URL (append /v1/traces)
|
|
42
|
-
// We treat values from manager (and the user-facing parity vars) as full URLs.
|
|
43
|
-
const tracesEndpoint = process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ??
|
|
44
|
-
envFile.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;
|
|
45
|
-
if (tracesEndpoint)
|
|
46
|
-
return tracesEndpoint;
|
|
47
|
-
const baseEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT ??
|
|
48
|
-
envFile.OTEL_EXPORTER_OTLP_ENDPOINT;
|
|
49
|
-
if (baseEndpoint)
|
|
50
|
-
return baseEndpoint.replace(/\/+$/, "") + "/v1/traces";
|
|
51
|
-
return (process.env.PINTA_CODEX_ENDPOINT ?? // legacy (full URL)
|
|
52
|
-
envFile.PINTA_CODEX_ENDPOINT ?? // legacy
|
|
53
|
-
process.env.CLAUDE_PLUGIN_OPTION_ENDPOINT // parity (full URL)
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
function resolveHeaders(envFile) {
|
|
57
|
-
// Primary: OTel-spec, already in `key=val,key=val` format
|
|
58
|
-
if (process.env.OTEL_EXPORTER_OTLP_HEADERS)
|
|
59
|
-
return process.env.OTEL_EXPORTER_OTLP_HEADERS;
|
|
60
|
-
if (envFile.OTEL_EXPORTER_OTLP_HEADERS)
|
|
61
|
-
return envFile.OTEL_EXPORTER_OTLP_HEADERS;
|
|
62
|
-
// Legacy: raw token → wrap as x-pinta-relay-token header
|
|
63
|
-
if (process.env.PINTA_CODEX_API_KEY) {
|
|
64
|
-
return `x-pinta-relay-token=${process.env.PINTA_CODEX_API_KEY}`;
|
|
65
|
-
}
|
|
66
|
-
if (envFile.PINTA_CODEX_API_KEY) {
|
|
67
|
-
return `x-pinta-relay-token=${envFile.PINTA_CODEX_API_KEY}`;
|
|
68
|
-
}
|
|
69
|
-
// Parity: Claude Code-style userConfig env (raw token, same wrap)
|
|
70
|
-
if (process.env.CLAUDE_PLUGIN_OPTION_API_KEY) {
|
|
71
|
-
return `x-pinta-relay-token=${process.env.CLAUDE_PLUGIN_OPTION_API_KEY}`;
|
|
72
|
-
}
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
function parseHeadersString(raw) {
|
|
76
|
-
const out = {};
|
|
77
|
-
if (!raw)
|
|
78
|
-
return out;
|
|
79
|
-
for (const pair of raw.split(",")) {
|
|
80
|
-
const [k, ...rest] = pair.split("=");
|
|
81
|
-
if (k && rest.length > 0)
|
|
82
|
-
out[k.trim()] = rest.join("=").trim();
|
|
83
|
-
}
|
|
84
|
-
return out;
|
|
85
|
-
}
|
|
86
|
-
function loadConfig() {
|
|
87
|
-
const pluginRoot = process.env.CODEX_PLUGIN_ROOT
|
|
88
|
-
?? process.env.CLAUDE_PLUGIN_ROOT
|
|
89
|
-
?? process.cwd();
|
|
90
|
-
const pluginData = process.env.CODEX_PLUGIN_DATA
|
|
91
|
-
?? process.env.CLAUDE_PLUGIN_DATA
|
|
92
|
-
?? node_path_1.default.join(pluginRoot, ".plugin-data");
|
|
93
|
-
const codexHome = process.env.CODEX_HOME ?? node_path_1.default.join(node_os_1.default.homedir(), ".codex");
|
|
94
|
-
const envFilePath = node_path_1.default.join(codexHome, "pinta-codex.env");
|
|
95
|
-
const envFile = node_fs_1.default.existsSync(envFilePath) ? readEnvFile(envFilePath) : {};
|
|
96
|
-
const endpoint = resolveEndpoint(envFile);
|
|
97
|
-
const headersRaw = resolveHeaders(envFile);
|
|
98
|
-
// Plan 5: expose relay token for guard.ts (~/guard/evaluate auth header).
|
|
99
|
-
// Parse x-pinta-relay-token from the resolved OTEL headers string so guard.ts
|
|
100
|
-
// can read it from process.env.PINTA_RELAY_TOKEN (same as pinta-cc pattern).
|
|
101
|
-
if (headersRaw && !process.env.PINTA_RELAY_TOKEN) {
|
|
102
|
-
const tokenMatch = headersRaw.match(/x-pinta-relay-token=([^,\s]+)/i);
|
|
103
|
-
if (tokenMatch) {
|
|
104
|
-
process.env.PINTA_RELAY_TOKEN = tokenMatch[1];
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// Plan 5 v1.2.4: codex CLI does NOT inject pinta-codex.env into hook
|
|
108
|
-
// subprocess env (unlike Claude Code's settings.json env-prefix). The hook
|
|
109
|
-
// must read PINTA_GUARD_ENDPOINT from envFile too — not just process.env.
|
|
110
|
-
// Same pattern as resolveEndpoint/resolveHeaders above.
|
|
111
|
-
const guardEndpoint = process.env.PINTA_GUARD_ENDPOINT ?? envFile.PINTA_GUARD_ENDPOINT;
|
|
112
|
-
return {
|
|
113
|
-
pluginRoot,
|
|
114
|
-
pluginData,
|
|
115
|
-
tracePath: node_path_1.default.join(pluginData, "trace.json"),
|
|
116
|
-
endpoint: endpoint?.replace(/\/+$/, ""),
|
|
117
|
-
headers: parseHeadersString(headersRaw ?? ""),
|
|
118
|
-
guardEndpoint,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
/** Returns true if OTel endpoint is configured (signal to silently disable telemetry). */
|
|
122
|
-
function hasOtlpEndpoint(config) {
|
|
123
|
-
return Boolean(config.endpoint);
|
|
124
|
-
}
|
|
125
|
-
//# sourceMappingURL=config.js.map
|
package/dist/core/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":";;;;;AAwFA,gCAuCC;AAGD,0CAEC;AApID,sDAAyB;AACzB,sDAAyB;AACzB,0DAA6B;AAY7B,SAAS,WAAW,CAAC,CAAS;IAC5B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG,CAAC;YAAE,SAAS;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,GAAG;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,OAA+B;IACtD,iBAAiB;IACjB,8DAA8D;IAC9D,sEAAsE;IACtE,+EAA+E;IAC/E,MAAM,cAAc,GAClB,OAAO,CAAC,GAAG,CAAC,kCAAkC;QAC9C,OAAO,CAAC,kCAAkC,CAAC;IAC7C,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAC1C,MAAM,YAAY,GAChB,OAAO,CAAC,GAAG,CAAC,2BAA2B;QACvC,OAAO,CAAC,2BAA2B,CAAC;IACtC,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC;IACzE,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAU,oBAAoB;QAC9D,OAAO,CAAC,oBAAoB,IAAc,SAAS;QACnD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,oBAAoB;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAA+B;IACrD,0DAA0D;IAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAC1F,IAAI,OAAO,CAAC,0BAA0B;QAAE,OAAO,OAAO,CAAC,0BAA0B,CAAC;IAClF,yDAAyD;IACzD,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACpC,OAAO,uBAAuB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,OAAO,uBAAuB,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAC9D,CAAC;IACD,kEAAkE;IAClE,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC;QAC7C,OAAO,uBAAuB,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC;IAC3E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB;WAC3C,OAAO,CAAC,GAAG,CAAC,kBAAkB;WAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;IACnB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB;WAC3C,OAAO,CAAC,GAAG,CAAC,kBAAkB;WAC9B,mBAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,iBAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3E,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAE3C,0EAA0E;IAC1E,8EAA8E;IAC9E,6EAA6E;IAC7E,IAAI,UAAU,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACtE,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,2EAA2E;IAC3E,0EAA0E;IAC1E,wDAAwD;IACxD,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAEnE,OAAO;QACL,UAAU;QACV,UAAU;QACV,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;QAC9C,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACvC,OAAO,EAAE,kBAAkB,CAAC,UAAU,IAAI,EAAE,CAAC;QAC7C,aAAa;KACd,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,SAAgB,eAAe,CAAC,MAAwB;IACtD,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
|
package/dist/core/guard.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export interface GuardInput {
|
|
2
|
-
spanId: string;
|
|
3
|
-
toolName?: string;
|
|
4
|
-
toolInput?: unknown;
|
|
5
|
-
rawTextFields?: Record<string, string>;
|
|
6
|
-
}
|
|
7
|
-
export interface GuardResult {
|
|
8
|
-
decision: 'ALLOW' | 'DENY' | 'REVIEW';
|
|
9
|
-
reason: string | null;
|
|
10
|
-
durationMs: number;
|
|
11
|
-
failOpenReason?: 'timeout' | 'refused' | 'error';
|
|
12
|
-
}
|
|
13
|
-
export declare function evaluateGuard(input: GuardInput, endpoint: string | undefined): Promise<GuardResult | null>;
|
package/dist/core/guard.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.evaluateGuard = evaluateGuard;
|
|
4
|
-
const TIMEOUT_MS = 50;
|
|
5
|
-
// Self-identify to the manager's guard route so it can attribute calls to this
|
|
6
|
-
// adaptor (the route parses `pinta-*/<version>` out of the User-Agent). Keep the
|
|
7
|
-
// version in sync with package.json.
|
|
8
|
-
const GUARD_UA = 'pinta-codex/1.3.1';
|
|
9
|
-
function sleep(ms) {
|
|
10
|
-
return new Promise((_, reject) => setTimeout(() => {
|
|
11
|
-
const err = new Error('Guard request timed out');
|
|
12
|
-
err.name = 'TimeoutError';
|
|
13
|
-
reject(err);
|
|
14
|
-
}, ms));
|
|
15
|
-
}
|
|
16
|
-
async function evaluateGuard(input, endpoint) {
|
|
17
|
-
if (!endpoint)
|
|
18
|
-
return null;
|
|
19
|
-
if (process.env.PINTA_GUARD_DISABLED === '1')
|
|
20
|
-
return null;
|
|
21
|
-
const start = Date.now();
|
|
22
|
-
try {
|
|
23
|
-
const res = await Promise.race([
|
|
24
|
-
fetch(endpoint, {
|
|
25
|
-
method: 'POST',
|
|
26
|
-
headers: {
|
|
27
|
-
'content-type': 'application/json',
|
|
28
|
-
'user-agent': GUARD_UA,
|
|
29
|
-
'x-pinta-relay-token': process.env.PINTA_RELAY_TOKEN ?? '',
|
|
30
|
-
},
|
|
31
|
-
body: JSON.stringify({ input }),
|
|
32
|
-
}),
|
|
33
|
-
sleep(TIMEOUT_MS),
|
|
34
|
-
]);
|
|
35
|
-
if (res.status !== 200) {
|
|
36
|
-
return { decision: 'ALLOW', reason: null, durationMs: Date.now() - start, failOpenReason: 'error' };
|
|
37
|
-
}
|
|
38
|
-
const body = (await res.json());
|
|
39
|
-
return { decision: body.decision, reason: body.reason, durationMs: body.durationMs ?? (Date.now() - start) };
|
|
40
|
-
}
|
|
41
|
-
catch (err) {
|
|
42
|
-
const reason = err.name === 'TimeoutError' ? 'timeout' : 'error';
|
|
43
|
-
return { decision: 'ALLOW', reason: null, durationMs: Date.now() - start, failOpenReason: reason };
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=guard.js.map
|
package/dist/core/guard.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/core/guard.ts"],"names":[],"mappings":";;AA+BA,sCA6BC;AA9CD,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,+EAA+E;AAC/E,iFAAiF;AACjF,qCAAqC;AACrC,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AAErC,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CACP,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,KAAiB,EACjB,QAA4B;IAE5B,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC7B,KAAK,CAAC,QAAQ,EAAE;gBACd,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,YAAY,EAAE,QAAQ;oBACtB,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;iBAC3D;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;aAChC,CAAC;YACF,KAAK,CAAC,UAAU,CAAC;SAClB,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;QACtG,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsF,CAAC;QACrH,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IAC/G,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAmC,GAAa,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3G,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IACrG,CAAC;AACH,CAAC"}
|
package/dist/core/identity.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/core/identity.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/core/identity.ts"],"names":[],"mappings":""}
|
package/dist/core/otlp.d.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import type { BaseEvent } from "./types.js";
|
|
2
|
-
import type { GuardResult } from "./guard.js";
|
|
3
|
-
export interface OtlpAttribute {
|
|
4
|
-
key: string;
|
|
5
|
-
value: {
|
|
6
|
-
stringValue: string;
|
|
7
|
-
} | {
|
|
8
|
-
intValue: number;
|
|
9
|
-
} | {
|
|
10
|
-
doubleValue: number;
|
|
11
|
-
} | {
|
|
12
|
-
boolValue: boolean;
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
export interface OtlpSpan {
|
|
16
|
-
traceId: string;
|
|
17
|
-
spanId: string;
|
|
18
|
-
name: string;
|
|
19
|
-
kind: number;
|
|
20
|
-
startTimeUnixNano: string;
|
|
21
|
-
endTimeUnixNano: string;
|
|
22
|
-
attributes: OtlpAttribute[];
|
|
23
|
-
}
|
|
24
|
-
export interface ResourceSpans {
|
|
25
|
-
resource: {
|
|
26
|
-
attributes: OtlpAttribute[];
|
|
27
|
-
};
|
|
28
|
-
scopeSpans: Array<{
|
|
29
|
-
scope: {
|
|
30
|
-
name: string;
|
|
31
|
-
version: string;
|
|
32
|
-
};
|
|
33
|
-
spans: OtlpSpan[];
|
|
34
|
-
}>;
|
|
35
|
-
}
|
|
36
|
-
export interface OtlpPayload {
|
|
37
|
-
resourceSpans: ResourceSpans[];
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Convert a 26-char Crockford ULID into 32 lowercase hex chars (16 bytes)
|
|
41
|
-
* suitable for an OTLP traceId. Decoding is straightforward because each
|
|
42
|
-
* Crockford char carries 5 bits and 26 chars = 130 bits; we keep the low
|
|
43
|
-
* 128 bits (the spec already pads timestamp+randomness into 128 bits).
|
|
44
|
-
*/
|
|
45
|
-
export declare function ulidToTraceId(ulid: string): string;
|
|
46
|
-
/** Generate a fresh 16-hex-char (8-byte) span ID. */
|
|
47
|
-
export declare function newSpanId(): string;
|
|
48
|
-
export declare function buildOtlpPayload(args: {
|
|
49
|
-
event: BaseEvent;
|
|
50
|
-
traceId: string;
|
|
51
|
-
now?: number;
|
|
52
|
-
guard?: GuardResult | null;
|
|
53
|
-
}): OtlpPayload;
|
|
54
|
-
/**
|
|
55
|
-
* Combine multiple per-hook payloads into a single OTLP payload by
|
|
56
|
-
* concatenating their resourceSpans arrays. The Pinta backend's parser
|
|
57
|
-
* iterates over resourceSpans natively.
|
|
58
|
-
*/
|
|
59
|
-
export declare function mergeBatch(payloads: OtlpPayload[]): OtlpPayload;
|