@2digits/opencode-plugin 0.2.0 → 0.2.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.
Files changed (2) hide show
  1. package/dist/index.js +3 -3
  2. package/package.json +10 -3
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{PostHog as Te}from"posthog-node";var G="https://eu.i.posthog.com",R=12000,L=60,g="@2digits/opencode-plugin",A="opencode",I=/api[-_]?key|token|secret|password|authorization|cookie|session|bearer|x-api-key|credential/i;import ge from"path";function b(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function j(e){if(e===void 0||e===null)return;try{return JSON.stringify(e)}catch{return}}function H(e,t){if(t<=0)return"";if(e.length<=t)return e;let r=e.length-t;return`${e.slice(0,t)}...[truncated ${r} chars]`}function k(e,t,r){if(r>8)return"[DepthLimit]";if(e===null||e===void 0)return e;if(typeof e!=="object")return e;if(t.has(e))return"[Circular]";if(t.add(e),Array.isArray(e))return e.map((u)=>k(u,t,r+1));let p={};for(let[u,_]of Object.entries(e))p[u]=I.test(u)?"[REDACTED]":k(_,t,r+1);return p}function N(e,t){if(e===void 0||e===null)return;let r=k(e,new WeakSet,0);if(typeof r==="string")return H(r,t);let p=j(r);return p?H(p,t):void 0}function U(e){return e==="session"?"session":"message"}function w(e,t){let r=Number.parseInt(e??"",10);return Number.isFinite(r)&&r>0?r:t}function W(e){if(!e)return{};try{let t=JSON.parse(e);return b(t)?t:{}}catch{return{}}}function v(e){if(!e)return!0;try{return b(JSON.parse(e))}catch{return!1}}function C(e){let t=e?.trim();if(!t)return;return t}function B(e){let t=ge.basename(e);return t.length>0?t:"opencode-project"}function F(e){if(!e)return;let t=e.replaceAll(/\s+/g," ").trim();if(!t)return;return t.slice(0,120)}function J(e,t){return e.distinctId??e.gitEmail??t}function M(e,t){return`${e}:${t}`}function h(e,t){return`${e}:${t}`}function z(e,t){if(t)return"error";if(!e)return;if(e==="tool-calls")return"tool_calls";return e}function x(e){if(!e)return;if(b(e)){if(typeof e.message==="string")return e.message;if(b(e.data)&&typeof e.data.message==="string")return e.data.message;if(typeof e.name==="string")return e.name}return j(e)}function K(e){let t=e.filter((r)=>r.type==="text"&&!r.synthetic&&typeof r.text==="string").map((r)=>r.text??"").join(`
3
- `).trim();return t.length>0?t:void 0}function V(e){if(!e)return;let t=e.order.map((r)=>e.parts.get(r)??"").join(`
4
- `).trim();return t.length>0?t:void 0}function Y(e,t){if(t||!e)return;return[{role:"user",content:e}]}function Q(e,t,r){if(r)return;if(e)return[{role:"assistant",content:e}];if(t)return[{role:"assistant",content:t}];return}function X(e,t,r){return{$ai_trace_id:t.traceID,$ai_session_id:t.sessionID,$ai_latency:r,$ai_total_input_tokens:t.totalInputTokens,$ai_total_output_tokens:t.totalOutputTokens,$ai_is_error:t.hasError,$ai_error:t.errorMessage,$ai_span_name:t.traceName,$ai_lib:g,$ai_framework:A,$ai_project_name:e.projectName,$ai_agent_name:t.agentName,...e.customProperties}}function q(e){let{config:t,errorMessage:r,generation:p,info:u,output:_,pending:m,toolCallCount:f,toolsCalled:i,traceState:c}=e,a=Math.max(0,u.time.completed-u.time.created)/1000;return{$ai_trace_id:p.traceID,$ai_session_id:u.sessionID,$ai_span_id:p.spanID,$ai_model:u.modelID,$ai_provider:u.providerID,$ai_input:Y(m.prompt,t.privacyMode),$ai_output_choices:Q(_,r,t.privacyMode),$ai_user_prompt:t.privacyMode?void 0:m.prompt,$ai_input_tokens:u.tokens.input,$ai_output_tokens:u.tokens.output,$ai_total_tokens:u.tokens.input+u.tokens.output+u.tokens.reasoning+u.tokens.cache.read+u.tokens.cache.write,$ai_latency:a,$ai_total_cost_usd:u.cost,$ai_stop_reason:z(u.finish,Boolean(u.error)),$ai_is_error:Boolean(u.error),$ai_error:r,$ai_tools_called:i,$ai_tool_call_count:f,cache_read_input_tokens:u.tokens.cache.read,cache_creation_input_tokens:u.tokens.cache.write,$ai_lib:g,$ai_framework:A,$ai_project_name:t.projectName,$ai_agent_name:c.agentName,...t.customProperties}}function D(e){let{config:t,latency:r,output:p,toolCall:u,toolName:_,traceState:m}=e;return{$ai_trace_id:u.traceID,$ai_session_id:u.sessionID,$ai_span_id:crypto.randomUUID(),$ai_parent_id:u.parentSpanID,$ai_span_name:_,$ai_input_state:t.privacyMode?void 0:N(u.args,t.maxAttributeLength),$ai_output_state:t.privacyMode?void 0:N(p,t.maxAttributeLength),$ai_latency:r,$ai_is_error:!1,$ai_error:void 0,$ai_lib:g,$ai_framework:A,$ai_project_name:t.projectName,$ai_agent_name:m?.agentName??t.projectName,...t.customProperties}}function Z(e){let t,r=!1;function p(){if(t)return t;try{return t=new Te(e.apiKey,{host:e.host,flushAt:20,flushInterval:1e4}),t}catch(f){console.error(`${g}: failed to initialize PostHog client`,f);return}}function u(f,i,c){let a=p();if(!a)return;a.capture({distinctId:J(e,i),event:f,properties:c})}async function _(){if(!t)return;await t.shutdown(),t=void 0}function m(f){if(r)return;r=!0,process.once("beforeExit",()=>{f()}),process.once("SIGINT",()=>{f()}),process.once("SIGTERM",()=>{f()})}return{capture:u,registerShutdown:m,shutdown:_}}async function Pe(e){try{return C(await e.$`git config --get user.email`.text())}catch{return}}async function ee(e){let t=B(e.worktree||e.directory),r=W(process.env.POSTHOG_LLMA_CUSTOM_PROPERTIES);if(!v(process.env.POSTHOG_LLMA_CUSTOM_PROPERTIES))console.warn(`${g}: ignoring invalid POSTHOG_LLMA_CUSTOM_PROPERTIES JSON`);return{apiKey:process.env.POSTHOG_API_KEY??"phc_qAbssQWcjrSz9NutSQsNrWWpQqLsTGo7ZnHchwa5C6Tb",host:process.env.POSTHOG_HOST??G,enabled:process.env.POSTHOG_OPENCODE_ENABLED!=="false",privacyMode:process.env.POSTHOG_LLMA_PRIVACY_MODE==="true",traceGrouping:U(process.env.POSTHOG_LLMA_TRACE_GROUPING),sessionWindowMinutes:w(process.env.POSTHOG_LLMA_SESSION_WINDOW_MINUTES,L),maxAttributeLength:w(process.env.POSTHOG_MAX_ATTRIBUTE_LENGTH,R),distinctId:C(process.env.POSTHOG_LLMA_DISTINCT_ID),gitEmail:await Pe(e),projectName:t,customProperties:r}}import{randomUUID as S}from"crypto";function te(e){let t=new Map,r=new Map,p=new Map,u=new Map,_=new Map,m=new Map,f=new Map,i=new Map,c=new Set;function a(n){p.delete(n),r.delete(n),i.delete(n);for(let[s,d]of t.entries())if(d.sessionID===n)t.delete(s);let o=new Set;for(let[s,d]of f.entries()){if(d.sessionID!==n)continue;o.add(d.spanID),f.delete(s),m.delete(s),c.delete(s)}for(let s of o)_.delete(s);for(let[s,d]of u.entries())if(d.sessionID===n)u.delete(s)}function l(n){return p.get(n)}function T(){return[...p.keys()]}function $(n,o,s){let d=p.get(n)??{agentName:o??e.projectName,errorMessage:void 0,hasError:!1,lastActivityAt:s,sessionID:n,startedAt:s,totalCostUsd:0,totalInputTokens:0,totalOutputTokens:0,traceID:S(),traceName:void 0};return d.agentName=o??d.agentName,d.lastActivityAt=s,p.set(n,d),d}function E(n,o){let s=Date.now(),d=$(n.sessionID,n.agent,s),P=K(o.parts),y={agentName:n.agent??e.projectName,prompt:P,sessionID:n.sessionID,traceID:d.traceID,spanID:S(),startedAt:s,userMessageID:o.message.id};d.traceName??=F(P),t.set(M(n.sessionID,o.message.id),y),r.set(n.sessionID,y),i.delete(n.sessionID)}function O(n){let o=m.get(n.messageID)??{order:[],parts:new Map};if(!o.parts.has(n.id))o.order.push(n.id);o.parts.set(n.id,n.text),m.set(n.messageID,o)}function ne(n){return V(m.get(n))}function re(n,o){let s=p.get(n);if(!s)return;s.hasError=!0,s.errorMessage=x(o),s.lastActivityAt=Date.now()}function ie(n){let o=M(n.sessionID,n.parentID),s=t.get(o)??r.get(n.sessionID),d=p.get(n.sessionID);if(!s||!d)return;return{pending:s,pendingKey:o,traceState:d}}function oe(n){let o=ie(n);if(!o)return;let s=f.get(n.id);if(s)return{generation:s,...o};let d=i.get(n.sessionID),P=d&&d!==n.id?S():o.pending.spanID,y={assistantMessageID:n.id,pendingKey:o.pendingKey,sessionID:n.sessionID,spanID:P,traceID:o.pending.traceID};return o.pending.spanID=P,f.set(n.id,y),i.set(n.sessionID,n.id),{generation:y,...o}}function se(n,o,s){n.agentName=s.mode||o.agentName,n.lastActivityAt=s.time.completed,n.totalCostUsd+=s.cost,n.totalInputTokens+=s.tokens.input,n.totalOutputTokens+=s.tokens.output;let d=x(s.error);if(d)n.hasError=!0,n.errorMessage=d;return d}function ue(n){return c.has(n)}function ae(n){c.add(n)}function ce(n,o){m.delete(n),_.delete(o)}function de(n){return r.get(n)}function pe(n,o,s){u.set(h(n,o),s)}function fe(n,o){let s=h(n,o),d=u.get(s);if(!d)return;return u.delete(s),d}function _e(n,o){let s=_.get(n)??[];s.push(o),_.set(n,s)}function le(n){let o=_.get(n);if(!o||o.length===0)return{};return{toolsCalled:[...new Set(o)],toolCallCount:o.length}}function me(n){return n.role==="assistant"&&Boolean(n.time.completed)&&!c.has(n.id)}return{beginPrompt:E,clearSessionState:a,cleanupAssistantMessage:ce,getActiveMessage:de,getAssistantOutputForMessage:ne,getGenerationToolProperties:le,getOrCreateGenerationState:oe,getTraceState:l,getTraceSessionIDs:T,getOrCreateTraceState:$,hasCompletedAssistantMessage:ue,markAssistantMessageCompleted:ae,markSessionError:re,recordGenerationToolCall:_e,setToolCall:pe,shouldCompleteAssistantMessage:me,storeAssistantOutput:O,takeToolCall:fe,updateTraceStateFromAssistantMessage:se}}var ye=async(e)=>{let t=await ee(e);if(!t.enabled)return{};if(!t.apiKey)return console.warn(`${g}: missing POSTHOG_API_KEY, analytics disabled`),{};let r=te(t),p=Z(t);function u(i){let c=r.getTraceState(i);if(!c)return;let a=Math.max(0,c.lastActivityAt-c.startedAt)/1000;p.capture("$ai_trace",c.sessionID,X(t,c,a)),r.clearSessionState(i)}async function _(){for(let i of r.getTraceSessionIDs())u(i);await p.shutdown()}p.registerShutdown(_);function m(i){let c=r.getOrCreateGenerationState(i);if(!c)return;let{generation:a,pending:l,traceState:T}=c,$=r.updateTraceStateFromAssistantMessage(T,l,{mode:i.mode,time:{completed:i.time.completed},cost:i.cost,tokens:{input:i.tokens.input,output:i.tokens.output},error:i.error}),{toolsCalled:E,toolCallCount:O}=r.getGenerationToolProperties(a.spanID);p.capture("$ai_generation",i.sessionID,q({config:t,pending:l,generation:a,traceState:T,info:i,errorMessage:$,output:r.getAssistantOutputForMessage(i.id),toolsCalled:E,toolCallCount:O})),r.cleanupAssistantMessage(i.id,a.spanID)}async function f(i){if(i.type==="message.part.updated"){let{part:a}=i.properties;if(a.type==="text")r.storeAssistantOutput(a);return}if(i.type==="session.deleted"){u(i.properties.info.id);return}if(i.type==="session.error"){let{error:a,sessionID:l}=i.properties;if(l)r.markSessionError(l,a);return}if(i.type!=="message.updated")return;let{info:c}=i.properties;if(c.role!=="assistant")return;if(r.getOrCreateGenerationState(c),r.shouldCompleteAssistantMessage(c))r.markAssistantMessageCompleted(c.id),m(c)}return{"chat.message":async(i,c)=>{let a=Date.now(),l=r.getTraceState(i.sessionID),T=t.sessionWindowMinutes*60000;if(l&&t.traceGrouping==="message")u(i.sessionID);if(l&&t.traceGrouping==="session"&&a-l.lastActivityAt>=T)u(i.sessionID);r.beginPrompt(i,c)},"tool.execute.before":(i,c)=>{let a=r.getActiveMessage(i.sessionID);if(!a)return Promise.resolve();return r.setToolCall(i.sessionID,i.callID,{args:c.args,parentSpanID:a.spanID,sessionID:i.sessionID,startedAt:Date.now(),traceID:a.traceID}),r.recordGenerationToolCall(a.spanID,i.tool),Promise.resolve()},"tool.execute.after":async(i,c)=>{let a=r.takeToolCall(i.sessionID,i.callID);if(!a)return;let l=r.getTraceState(a.sessionID);if(l)l.lastActivityAt=Date.now();p.capture("$ai_span",a.sessionID,D({config:t,toolCall:a,traceState:l,toolName:i.tool,output:c,latency:Math.max(0,Date.now()-a.startedAt)/1000}))},event:async({event:i})=>f(i)}},Ue=ye;export{Ue as default};
2
+ import{PostHog as Pe}from"posthog-node";var G="https://eu.i.posthog.com",R=12000,L=60,g="@2digits/opencode-plugin",O="opencode",I=/api[-_]?key|token|secret|password|authorization|cookie|session|bearer|x-api-key|credential/i;import ge from"path";function $(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function j(e){if(e===void 0||e===null)return;try{return JSON.stringify(e)}catch{return}}function H(e,t){if(t<=0)return"";if(e.length<=t)return e;let r=e.length-t;return`${e.slice(0,t)}...[truncated ${r} chars]`}function N(e,t,r){if(r>8)return"[DepthLimit]";if(e===null||e===void 0)return e;if(typeof e!=="object")return e;if(t.has(e))return"[Circular]";if(t.add(e),Array.isArray(e))return e.map((u)=>N(u,t,r+1));let p={};for(let[u,f]of Object.entries(e))p[u]=I.test(u)?"[REDACTED]":N(f,t,r+1);return p}function C(e,t){if(e===void 0||e===null)return;let r=N(e,new WeakSet,0);if(typeof r==="string")return H(r,t);let p=j(r);return p?H(p,t):void 0}function U(e){return e==="session"?"session":"message"}function k(e,t){let r=Number.parseInt(e??"",10);return Number.isFinite(r)&&r>0?r:t}function W(e){if(!e)return{};try{let t=JSON.parse(e);return $(t)?t:{}}catch{return{}}}function v(e){if(!e)return!0;try{return $(JSON.parse(e))}catch{return!1}}function w(e){let t=e?.trim();if(!t)return;return t}function B(e){let t=ge.basename(e);return t.length>0?t:"opencode-project"}function F(e){if(!e)return;let t=e.replaceAll(/\s+/g," ").trim();if(!t)return;return t.slice(0,120)}function D(e,t){return e.distinctId??e.gitEmail??t}function M(e,t){return`${e}:${t}`}function h(e,t){return`${e}:${t}`}function J(e,t){if(t)return"error";if(!e)return;if(e==="tool-calls")return"tool_calls";return e}function x(e){if(!e)return;if($(e)){if(typeof e.message==="string")return e.message;if($(e.data)&&typeof e.data.message==="string")return e.data.message;if(typeof e.name==="string")return e.name}return j(e)}function z(e){let t=e.filter((r)=>r.type==="text"&&!r.synthetic&&typeof r.text==="string").map((r)=>r.text??"").join(`
3
+ `).trim();return t.length>0?t:void 0}function K(e){if(!e)return;let t=e.order.map((r)=>e.parts.get(r)??"").join(`
4
+ `).trim();return t.length>0?t:void 0}function V(e,t){if(t||!e)return;return[{role:"user",content:e}]}function Y(e,t,r){if(r)return;if(e)return[{role:"assistant",content:e}];if(t)return[{role:"assistant",content:t}];return}function Q(e,t,r){return{$ai_trace_id:t.traceID,$ai_session_id:t.sessionID,$ai_latency:r,$ai_total_input_tokens:t.totalInputTokens,$ai_total_output_tokens:t.totalOutputTokens,$ai_is_error:t.hasError,$ai_error:t.errorMessage,$ai_span_name:t.traceName,$ai_lib:g,$ai_framework:O,$ai_project_name:e.projectName,$ai_agent_name:t.agentName,...e.customProperties}}function X(e){let{config:t,errorMessage:r,generation:p,info:u,output:f,pending:m,toolCallCount:_,toolsCalled:i,traceState:c}=e,a=Math.max(0,u.time.completed-u.time.created)/1000;return{$ai_trace_id:p.traceID,$ai_session_id:u.sessionID,$ai_span_id:p.spanID,$ai_model:u.modelID,$ai_provider:u.providerID,$ai_input:V(m.prompt,t.privacyMode),$ai_output_choices:Y(f,r,t.privacyMode),$ai_user_prompt:t.privacyMode?void 0:m.prompt,$ai_input_tokens:u.tokens.input,$ai_output_tokens:u.tokens.output,$ai_total_tokens:u.tokens.input+u.tokens.output+u.tokens.reasoning+u.tokens.cache.read+u.tokens.cache.write,$ai_latency:a,$ai_total_cost_usd:u.cost,$ai_stop_reason:J(u.finish,Boolean(u.error)),$ai_is_error:Boolean(u.error),$ai_error:r,$ai_tools_called:i,$ai_tool_call_count:_,cache_read_input_tokens:u.tokens.cache.read,cache_creation_input_tokens:u.tokens.cache.write,$ai_lib:g,$ai_framework:O,$ai_project_name:t.projectName,$ai_agent_name:c.agentName,...t.customProperties}}function q(e){let{config:t,latency:r,output:p,toolCall:u,toolName:f,traceState:m}=e;return{$ai_trace_id:u.traceID,$ai_session_id:u.sessionID,$ai_span_id:crypto.randomUUID(),$ai_parent_id:u.parentSpanID,$ai_span_name:f,$ai_input_state:t.privacyMode?void 0:C(u.args,t.maxAttributeLength),$ai_output_state:t.privacyMode?void 0:C(p,t.maxAttributeLength),$ai_latency:r,$ai_is_error:!1,$ai_error:void 0,$ai_lib:g,$ai_framework:O,$ai_project_name:t.projectName,$ai_agent_name:m?.agentName??t.projectName,...t.customProperties}}function Z(e){let t,r=!1;function p(){if(t)return t;try{return t=new Pe(e.apiKey,{host:e.host,flushAt:20,flushInterval:1e4}),t}catch(_){console.error(`${g}: failed to initialize PostHog client`,_);return}}function u(_,i,c){let a=p();if(!a)return;a.capture({distinctId:D(e,i),event:_,properties:c})}async function f(){if(!t)return;await t.shutdown(),t=void 0}function m(_){if(r)return;r=!0,process.once("beforeExit",()=>{_()}),process.once("SIGINT",()=>{_()}),process.once("SIGTERM",()=>{_()})}return{capture:u,registerShutdown:m,shutdown:f}}async function Te(e){try{return w(await e.$`git config --get user.email`.text())}catch{return}}async function ee(e){let t=B(e.worktree||e.directory),r=W(process.env.POSTHOG_LLMA_CUSTOM_PROPERTIES);if(!v(process.env.POSTHOG_LLMA_CUSTOM_PROPERTIES))console.warn(`${g}: ignoring invalid POSTHOG_LLMA_CUSTOM_PROPERTIES JSON`);return{apiKey:process.env.POSTHOG_OPENCODE_API_KEY??"phc_qAbssQWcjrSz9NutSQsNrWWpQqLsTGo7ZnHchwa5C6Tb",host:process.env.POSTHOG_OPENCODE_HOST??G,enabled:process.env.POSTHOG_OPENCODE_ENABLED!=="false",privacyMode:process.env.POSTHOG_OPENCODE_LLMA_PRIVACY_MODE==="true",traceGrouping:U(process.env.POSTHOG_OPENCODE_LLMA_TRACE_GROUPING),sessionWindowMinutes:k(process.env.POSTHOG_OPENCODE_LLMA_SESSION_WINDOW_MINUTES,L),maxAttributeLength:k(process.env.POSTHOG_OPENCODE_MAX_ATTRIBUTE_LENGTH,R),distinctId:w(process.env.POSTHOG_OPENCODE_LLMA_DISTINCT_ID),gitEmail:await Te(e),projectName:t,customProperties:r}}import{randomUUID as S}from"crypto";function te(e){let t=new Map,r=new Map,p=new Map,u=new Map,f=new Map,m=new Map,_=new Map,i=new Map,c=new Set;function a(n){p.delete(n),r.delete(n),i.delete(n);for(let[s,d]of t.entries())if(d.sessionID===n)t.delete(s);let o=new Set;for(let[s,d]of _.entries()){if(d.sessionID!==n)continue;o.add(d.spanID),_.delete(s),m.delete(s),c.delete(s)}for(let s of o)f.delete(s);for(let[s,d]of u.entries())if(d.sessionID===n)u.delete(s)}function l(n){return p.get(n)}function P(){return[...p.keys()]}function E(n,o,s){let d=p.get(n)??{agentName:o??e.projectName,errorMessage:void 0,hasError:!1,lastActivityAt:s,sessionID:n,startedAt:s,totalCostUsd:0,totalInputTokens:0,totalOutputTokens:0,traceID:S(),traceName:void 0};return d.agentName=o??d.agentName,d.lastActivityAt=s,p.set(n,d),d}function A(n,o){let s=Date.now(),d=E(n.sessionID,n.agent,s),T=z(o.parts),y={agentName:n.agent??e.projectName,prompt:T,sessionID:n.sessionID,traceID:d.traceID,spanID:S(),startedAt:s,userMessageID:o.message.id};d.traceName??=F(T),t.set(M(n.sessionID,o.message.id),y),r.set(n.sessionID,y),i.delete(n.sessionID)}function b(n){let o=m.get(n.messageID)??{order:[],parts:new Map};if(!o.parts.has(n.id))o.order.push(n.id);o.parts.set(n.id,n.text),m.set(n.messageID,o)}function ne(n){return K(m.get(n))}function re(n,o){let s=p.get(n);if(!s)return;s.hasError=!0,s.errorMessage=x(o),s.lastActivityAt=Date.now()}function ie(n){let o=M(n.sessionID,n.parentID),s=t.get(o)??r.get(n.sessionID),d=p.get(n.sessionID);if(!s||!d)return;return{pending:s,pendingKey:o,traceState:d}}function oe(n){let o=ie(n);if(!o)return;let s=_.get(n.id);if(s)return{generation:s,...o};let d=i.get(n.sessionID),T=d&&d!==n.id?S():o.pending.spanID,y={assistantMessageID:n.id,pendingKey:o.pendingKey,sessionID:n.sessionID,spanID:T,traceID:o.pending.traceID};return o.pending.spanID=T,_.set(n.id,y),i.set(n.sessionID,n.id),{generation:y,...o}}function se(n,o,s){n.agentName=s.mode||o.agentName,n.lastActivityAt=s.time.completed,n.totalCostUsd+=s.cost,n.totalInputTokens+=s.tokens.input,n.totalOutputTokens+=s.tokens.output;let d=x(s.error);if(d)n.hasError=!0,n.errorMessage=d;return d}function ue(n){return c.has(n)}function ae(n){c.add(n)}function ce(n,o){m.delete(n),f.delete(o)}function de(n){return r.get(n)}function pe(n,o,s){u.set(h(n,o),s)}function _e(n,o){let s=h(n,o),d=u.get(s);if(!d)return;return u.delete(s),d}function fe(n,o){let s=f.get(n)??[];s.push(o),f.set(n,s)}function le(n){let o=f.get(n);if(!o||o.length===0)return{};return{toolsCalled:[...new Set(o)],toolCallCount:o.length}}function me(n){return n.role==="assistant"&&Boolean(n.time.completed)&&!c.has(n.id)}return{beginPrompt:A,clearSessionState:a,cleanupAssistantMessage:ce,getActiveMessage:de,getAssistantOutputForMessage:ne,getGenerationToolProperties:le,getOrCreateGenerationState:oe,getTraceState:l,getTraceSessionIDs:P,getOrCreateTraceState:E,hasCompletedAssistantMessage:ue,markAssistantMessageCompleted:ae,markSessionError:re,recordGenerationToolCall:fe,setToolCall:pe,shouldCompleteAssistantMessage:me,storeAssistantOutput:b,takeToolCall:_e,updateTraceStateFromAssistantMessage:se}}var ye=async(e)=>{let t=await ee(e);if(!t.enabled)return{};if(!t.apiKey)return console.warn(`${g}: missing POSTHOG_API_KEY, analytics disabled`),{};let r=te(t),p=Z(t);function u(i){let c=r.getTraceState(i);if(!c)return;let a=Math.max(0,c.lastActivityAt-c.startedAt)/1000;p.capture("$ai_trace",c.sessionID,Q(t,c,a)),r.clearSessionState(i)}async function f(){for(let i of r.getTraceSessionIDs())u(i);await p.shutdown()}p.registerShutdown(f);function m(i){let c=r.getOrCreateGenerationState(i);if(!c)return;let{generation:a,pending:l,traceState:P}=c,E=r.updateTraceStateFromAssistantMessage(P,l,{mode:i.mode,time:{completed:i.time.completed},cost:i.cost,tokens:{input:i.tokens.input,output:i.tokens.output},error:i.error}),{toolsCalled:A,toolCallCount:b}=r.getGenerationToolProperties(a.spanID);p.capture("$ai_generation",i.sessionID,X({config:t,pending:l,generation:a,traceState:P,info:i,errorMessage:E,output:r.getAssistantOutputForMessage(i.id),toolsCalled:A,toolCallCount:b})),r.cleanupAssistantMessage(i.id,a.spanID)}async function _(i){if(i.type==="message.part.updated"){let{part:a}=i.properties;if(a.type==="text")r.storeAssistantOutput(a);return}if(i.type==="session.deleted"){u(i.properties.info.id);return}if(i.type==="session.error"){let{error:a,sessionID:l}=i.properties;if(l)r.markSessionError(l,a);return}if(i.type!=="message.updated")return;let{info:c}=i.properties;if(c.role!=="assistant")return;if(r.getOrCreateGenerationState(c),r.shouldCompleteAssistantMessage(c))r.markAssistantMessageCompleted(c.id),m(c)}return{"chat.message":async(i,c)=>{let a=Date.now(),l=r.getTraceState(i.sessionID),P=t.sessionWindowMinutes*60000;if(l&&t.traceGrouping==="message")u(i.sessionID);if(l&&t.traceGrouping==="session"&&a-l.lastActivityAt>=P)u(i.sessionID);r.beginPrompt(i,c)},"tool.execute.before":(i,c)=>{let a=r.getActiveMessage(i.sessionID);if(!a)return Promise.resolve();return r.setToolCall(i.sessionID,i.callID,{args:c.args,parentSpanID:a.spanID,sessionID:i.sessionID,startedAt:Date.now(),traceID:a.traceID}),r.recordGenerationToolCall(a.spanID,i.tool),Promise.resolve()},"tool.execute.after":async(i,c)=>{let a=r.takeToolCall(i.sessionID,i.callID);if(!a)return;let l=r.getTraceState(a.sessionID);if(l)l.lastActivityAt=Date.now();p.capture("$ai_span",a.sessionID,q({config:t,toolCall:a,traceState:l,toolName:i.tool,output:c,latency:Math.max(0,Date.now()-a.startedAt)/1000}))},event:async({event:i})=>_(i)}},Ue=ye;export{Ue as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@2digits/opencode-plugin",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "OpenCode plugin for PostHog LLM analytics integration",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -13,6 +13,7 @@
13
13
  ],
14
14
  "type": "module",
15
15
  "sideEffects": false,
16
+ "main": "./dist/index.js",
16
17
  "module": "./dist/index.js",
17
18
  "types": "./dist/index.d.ts",
18
19
  "exports": {
@@ -22,15 +23,21 @@
22
23
  "default": "./dist/index.js"
23
24
  }
24
25
  },
26
+ "./server": {
27
+ "import": {
28
+ "types": "./dist/index.d.ts",
29
+ "default": "./dist/index.js"
30
+ }
31
+ },
25
32
  "./package.json": "./package.json"
26
33
  },
27
34
  "dependencies": {
28
35
  "@opencode-ai/plugin": "1.14.22",
29
- "posthog-node": "5.30.0"
36
+ "posthog-node": "5.30.1"
30
37
  },
31
38
  "devDependencies": {
32
39
  "@types/bun": "1.3.13",
33
- "@typescript/native-preview": "7.0.0-dev.20260423.1",
40
+ "@typescript/native-preview": "7.0.0-dev.20260424.1",
34
41
  "bunup": "0.16.31",
35
42
  "typescript": "6.0.3",
36
43
  "vite-plus": "0.1.19",