@2digits/opencode-plugin 0.2.41 → 0.2.42
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/dist/index.mjs +1 -1
- package/package.json +6 -6
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import{PostHog as e}from"posthog-node";import t from"node:path";import{randomUUID as n}from"node:crypto";const r=`@2digits/opencode-plugin`,i=`opencode`,a=/api[-_]?key|token|secret|password|authorization|cookie|session|bearer|x-api-key|credential/i;function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e){if(e!=null)try{return JSON.stringify(e)}catch{return}}function c(e,t){if(t<=0)return``;if(e.length<=t)return e;let n=e.length-t;return`${e.slice(0,t)}...[truncated ${n} chars]`}function l(e,t,n){if(n>8)return`[DepthLimit]`;if(typeof e!=`object`||!e)return e;if(t.has(e))return`[Circular]`;if(t.add(e),Array.isArray(e))return e.map(e=>l(e,t,n+1));let r={};for(let[i,o]of Object.entries(e))r[i]=a.test(i)?`[REDACTED]`:l(o,t,n+1);return r}function u(e,t){if(e==null)return;let n=l(e,/* @__PURE__ */ new WeakSet,0);if(typeof n==`string`)return c(n,t);let r=s(n);return r?c(r,t):void 0}function d(e){return e===`session`?`session`:`message`}function f(e,t){let n=Number.parseInt(e??``,10);return Number.isFinite(n)&&n>0?n:t}function p(e){if(!e)return{};try{let t=JSON.parse(e);return o(t)?t:{}}catch{return{}}}function m(e){if(!e)return!0;try{return o(JSON.parse(e))}catch{return!1}}function h(e){let t=e?.trim();if(t)return t}function g(e){let n=t.basename(e);return n.length>0?n:`opencode-project`}function _(e){if(!e)return;let t=e.replaceAll(/\s+/g,` `).trim();if(t)return t.slice(0,120)}function v(e,t){return e.distinctId??e.gitEmail??t}function y(e,t){return`${e}:${t}`}function b(e,t){return`${e}:${t}`}function x(e,t){if(t)return`error`;if(e)return e===`tool-calls`?`tool_calls`:e}function S(e){if(e){if(o(e)){if(typeof e.message==`string`)return e.message;if(o(e.data)&&typeof e.data.message==`string`)return e.data.message;if(typeof e.name==`string`)return e.name}return s(e)}}function C(e){let t=e.filter(e=>e.type===`text`&&!e.synthetic&&typeof e.text==`string`).map(e=>e.text??``).join(`
|
|
2
2
|
`).trim();return t.length>0?t:void 0}function w(e){if(!e)return;let t=e.order.map(t=>e.parts.get(t)??``).join(`
|
|
3
|
-
`).trim();return t.length>0?t:void 0}function T(e,t){if(!t&&e)return[{role:`user`,content:e}]}function E(e,t,n){if(!n){if(e)return[{role:`assistant`,content:e}];if(t)return[{role:`assistant`,content:t}]}}function D(e,t,n){return{$ai_trace_id:t.traceID,$ai_session_id:t.sessionID,$ai_latency:n,$ai_input_state:e.privacyMode?void 0:u(t.inputState,e.maxAttributeLength),$ai_output_state:e.privacyMode?void 0:u(t.outputState,e.maxAttributeLength),$ai_total_input_tokens:t.totalInputTokens,$ai_total_output_tokens:t.totalOutputTokens,$ai_total_cost_usd:t.totalCostUsd,$ai_is_error:t.hasError,$ai_error:t.errorMessage,$ai_span_name:t.traceName,$ai_lib:r,$ai_framework:i,$ai_project_name:e.projectName,$ai_agent_name:t.agentName,...e.customProperties}}function O(e){let{config:t,errorMessage:n,generation:a,info:o,output:s,pending:c,toolCallCount:l,toolsCalled:u,traceState:d}=e,f=Math.max(0,o.time.completed-o.time.created)/1e3;return{$ai_trace_id:a.traceID,$ai_session_id:o.sessionID,$ai_span_id:a.spanID,$ai_model:o.modelID,$ai_provider:o.providerID,$ai_input:T(c.prompt,t.privacyMode),$ai_output_choices:E(s,n,t.privacyMode),$ai_user_prompt:t.privacyMode?void 0:c.prompt,$ai_input_tokens:o.tokens.input,$ai_output_tokens:o.tokens.output,$ai_total_tokens:o.tokens.input+o.tokens.output+o.tokens.reasoning+o.tokens.cache.read+o.tokens.cache.write,$ai_latency:f,$ai_total_cost_usd:o.cost,$ai_stop_reason:x(o.finish,!!o.error),$ai_is_error:!!o.error,$ai_error:n,$ai_tools_called:u,$ai_tool_call_count:l,cache_read_input_tokens:o.tokens.cache.read,cache_creation_input_tokens:o.tokens.cache.write,$ai_lib:r,$ai_framework:i,$ai_project_name:t.projectName,$ai_agent_name:d.agentName,...t.customProperties}}function k(e){let{config:t,latency:n,output:a,toolCall:o,toolName:s,traceState:c}=e;return{$ai_trace_id:o.traceID,$ai_session_id:o.sessionID,$ai_span_id:crypto.randomUUID(),$ai_parent_id:o.parentSpanID,$ai_span_name:s,$ai_input_state:t.privacyMode?void 0:u(o.args,t.maxAttributeLength),$ai_output_state:t.privacyMode?void 0:u(a,t.maxAttributeLength),$ai_latency:n,$ai_is_error:!1,$ai_error:void 0,$ai_lib:r,$ai_framework:i,$ai_project_name:t.projectName,$ai_agent_name:c?.agentName??t.projectName,...t.customProperties}}function A(t){let n,i=!1;function a(){if(n)return n;try{return n=new e(t.apiKey,{host:t.host,flushAt:20,flushInterval:1e4}),n}catch(e){console.error(`${r}: failed to initialize PostHog client`,e);return}}function o(e,n,r){let i=a();i&&i.capture({distinctId:v(t,n),event:e,properties:r})}async function s(e,n,r){let i=a();i&&await i.captureImmediate({distinctId:v(t,n),event:e,properties:r})}async function c(){n&&=(await n.shutdown(),void 0)}function l(e){i||(i=!0,process.once(`beforeExit`,()=>{e()}),process.once(`SIGINT`,()=>{e()}),process.once(`SIGTERM`,()=>{e()}))}return{capture:o,captureImmediate:s,registerShutdown:l,shutdown:c}}async function j(e){try{return h(await e.$`git config --get user.email`.text())}catch{return}}async function M(e){let t=g(e.worktree||e.directory),n=p(process.env.POSTHOG_LLMA_CUSTOM_PROPERTIES);return m(process.env.POSTHOG_LLMA_CUSTOM_PROPERTIES)||console.warn(`${r}: ignoring invalid POSTHOG_LLMA_CUSTOM_PROPERTIES JSON`),{apiKey:process.env.POSTHOG_OPENCODE_API_KEY??`phc_qAbssQWcjrSz9NutSQsNrWWpQqLsTGo7ZnHchwa5C6Tb`,host:process.env.POSTHOG_OPENCODE_HOST??`https://eu.i.posthog.com`,enabled:process.env.POSTHOG_OPENCODE_ENABLED!==`false`,privacyMode:process.env.POSTHOG_OPENCODE_LLMA_PRIVACY_MODE===`true`,traceGrouping:d(process.env.POSTHOG_OPENCODE_LLMA_TRACE_GROUPING),sessionWindowMinutes:f(process.env.POSTHOG_OPENCODE_LLMA_SESSION_WINDOW_MINUTES,60),maxAttributeLength:f(process.env.POSTHOG_OPENCODE_MAX_ATTRIBUTE_LENGTH,12e3),distinctId:h(process.env.POSTHOG_OPENCODE_LLMA_DISTINCT_ID),gitEmail:await j(e),projectName:t,customProperties:n}}function N(e,t,n){e.agentName=n.mode||t.agentName,e.lastActivityAt=n.time.completed,e.totalCostUsd+=n.cost,e.totalInputTokens+=n.tokens.input,e.totalOutputTokens+=n.tokens.output;let r=S(n.error);return e.outputState=n.output??r??e.outputState,r&&(e.hasError=!0,e.errorMessage=r),r}function P(e){let t=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Map,o=/* @__PURE__ */ new Map,s=/* @__PURE__ */ new Map,c=/* @__PURE__ */ new Map,l=/* @__PURE__ */ new Map,u=/* @__PURE__ */ new Set;function d(e){i.delete(e),r.delete(e),l.delete(e);for(let[n,r]of t)r.sessionID===e&&t.delete(n);let n=/* @__PURE__ */ new Set;for(let[t,r]of c)r.sessionID===e&&(n.add(r.spanID),c.delete(t),s.delete(t),u.delete(t));for(let e of n)o.delete(e);for(let[t,n]of a)n.sessionID===e&&a.delete(t)}function f(e){return i.get(e)}function p(){return i.keys().toArray()}function m(t,r,a){let o=i.get(t)??{agentName:r??e.projectName,errorMessage:void 0,hasError:!1,inputState:void 0,lastActivityAt:a,lastTraceCapturedAt:void 0,outputState:void 0,sessionID:t,startedAt:a,totalCostUsd:0,totalInputTokens:0,totalOutputTokens:0,traceID:n(),traceName:void 0};return o.agentName=r??o.agentName,o.lastActivityAt=a,i.set(t,o),o}function h(i,a){let o=Date.now(),s=m(i.sessionID,i.agent,o),c=C(a.parts),u={agentName:i.agent??e.projectName,prompt:c,sessionID:i.sessionID,traceID:s.traceID,spanID:n(),startedAt:o,userMessageID:a.message.id};s.inputState??=c,s.traceName??=_(c),t.set(y(i.sessionID,a.message.id),u),r.set(i.sessionID,u),l.delete(i.sessionID)}function g(e){let t=s.get(e.messageID)??{order:[],parts:/* @__PURE__ */ new Map};t.parts.has(e.id)||t.order.push(e.id),t.parts.set(e.id,e.text),s.set(e.messageID,t)}function v(e){return w(s.get(e))}function x(e,t){let n=i.get(e);n&&(n.hasError=!0,n.errorMessage=S(t),n.lastActivityAt=Date.now())}function T(e){let n=y(e.sessionID,e.parentID),a=t.get(n)??r.get(e.sessionID),o=i.get(e.sessionID);if(a&&o)return{pending:a,pendingKey:n,traceState:o}}function E(e){let t=T(e);if(!t)return;let r=c.get(e.id);if(r)return{generation:r,...t};let i=l.get(e.sessionID),a=i&&i!==e.id?n():t.pending.spanID,o={assistantMessageID:e.id,pendingKey:t.pendingKey,sessionID:e.sessionID,spanID:a,traceID:t.pending.traceID};return t.pending.spanID=a,c.set(e.id,o),l.set(e.sessionID,e.id),{generation:o,...t}}function D(e){return u.has(e)}function O(e){u.add(e)}function k(e,t){s.delete(e),o.delete(t)}function A(e){return r.get(e)}function j(e,t,n){a.set(b(e,t),n)}function M(e,t){let n=b(e,t),r=a.get(n);if(r)return a.delete(n),r}function P(e,t){let n=o.get(e)??[];n.push(t),o.set(e,n)}function F(e){let t=o.get(e);return!t||t.length===0?{}:{toolsCalled:[...new Set(t)],toolCallCount:t.length}}function I(e){return e.role===`assistant`&&!!e.time.completed&&!u.has(e.id)}return{beginPrompt:h,clearSessionState:d,cleanupAssistantMessage:k,getActiveMessage:A,getAssistantOutputForMessage:v,getGenerationToolProperties:F,getOrCreateGenerationState:E,getTraceState:f,getTraceSessionIDs:p,getOrCreateTraceState:m,hasCompletedAssistantMessage:D,markAssistantMessageCompleted:O,markSessionError:x,recordGenerationToolCall:P,setToolCall:j,shouldCompleteAssistantMessage:I,storeAssistantOutput:g,takeToolCall:M,updateTraceStateFromAssistantMessage:N}}const F=async e=>{let t=await M(e);if(!t.enabled)return{};if(!t.apiKey)return console.warn(`${r}: missing POSTHOG_API_KEY, analytics disabled`),{};let n=P(t),i=A(t);async function a(e){if(e.lastTraceCapturedAt===e.lastActivityAt)return;let n=Math.max(0,e.lastActivityAt-e.startedAt)/1e3;await i.captureImmediate(`$ai_trace`,e.sessionID,D(t,e,n)),e.lastTraceCapturedAt=e.lastActivityAt}async function o(e){let t=n.getTraceState(e);t&&(await a(t),n.clearSessionState(e))}async function s(){await Promise.all(n.getTraceSessionIDs().map(e=>o(e))),await i.shutdown()}i.registerShutdown(s);async function c(e){let r=n.getOrCreateGenerationState(e);if(!r)return;let{generation:o,pending:s,traceState:c}=r,l=n.getAssistantOutputForMessage(e.id),u=n.updateTraceStateFromAssistantMessage(c,s,{mode:e.mode,time:{completed:e.time.completed},cost:e.cost,tokens:{input:e.tokens.input,output:e.tokens.output},output:l,error:e.error}),{toolsCalled:d,toolCallCount:f}=n.getGenerationToolProperties(o.spanID);i.capture(`$ai_generation`,e.sessionID,O({config:t,pending:s,generation:o,traceState:c,info:e,errorMessage:u,output:l,toolsCalled:d,toolCallCount:f})),await a(c),n.cleanupAssistantMessage(e.id,o.spanID)}async function l(e){if(e.type===`message.part.updated`){let{properties:t}=e,{part:r}=t;r.type===`text`&&n.storeAssistantOutput(r);return}if(e.type===`session.deleted`){let{properties:t}=e,{info:n}=t;await o(n.id);return}if(e.type===`session.error`){let{properties:t}=e,{error:r,sessionID:i}=t;i&&n.markSessionError(i,r);return}if(e.type!==`message.updated`)return;let{properties:t}=e,{info:r}=t;r.role===`assistant`&&(n.getOrCreateGenerationState(r),n.shouldCompleteAssistantMessage(r)&&(n.markAssistantMessageCompleted(r.id),await c(r)))}return{"chat.message":async(e,r)=>{let i=Date.now(),a=n.getTraceState(e.sessionID),s=t.sessionWindowMinutes*6e4;a&&t.traceGrouping===`message`&&await o(e.sessionID),a&&t.traceGrouping===`session`&&i-a.lastActivityAt>=s&&await o(e.sessionID),n.beginPrompt(e,r)},"tool.execute.before":(e,t)=>{let r=n.getActiveMessage(e.sessionID);return r
|
|
3
|
+
`).trim();return t.length>0?t:void 0}function T(e,t){if(!t&&e)return[{role:`user`,content:e}]}function E(e,t,n){if(!n){if(e)return[{role:`assistant`,content:e}];if(t)return[{role:`assistant`,content:t}]}}function D(e,t,n){return{$ai_trace_id:t.traceID,$ai_session_id:t.sessionID,$ai_latency:n,$ai_input_state:e.privacyMode?void 0:u(t.inputState,e.maxAttributeLength),$ai_output_state:e.privacyMode?void 0:u(t.outputState,e.maxAttributeLength),$ai_total_input_tokens:t.totalInputTokens,$ai_total_output_tokens:t.totalOutputTokens,$ai_total_cost_usd:t.totalCostUsd,$ai_is_error:t.hasError,$ai_error:t.errorMessage,$ai_span_name:t.traceName,$ai_lib:r,$ai_framework:i,$ai_project_name:e.projectName,$ai_agent_name:t.agentName,...e.customProperties}}function O(e){let{config:t,errorMessage:n,generation:a,info:o,output:s,pending:c,toolCallCount:l,toolsCalled:u,traceState:d}=e,f=Math.max(0,o.time.completed-o.time.created)/1e3;return{$ai_trace_id:a.traceID,$ai_session_id:o.sessionID,$ai_span_id:a.spanID,$ai_model:o.modelID,$ai_provider:o.providerID,$ai_input:T(c.prompt,t.privacyMode),$ai_output_choices:E(s,n,t.privacyMode),$ai_user_prompt:t.privacyMode?void 0:c.prompt,$ai_input_tokens:o.tokens.input,$ai_output_tokens:o.tokens.output,$ai_total_tokens:o.tokens.input+o.tokens.output+o.tokens.reasoning+o.tokens.cache.read+o.tokens.cache.write,$ai_latency:f,$ai_total_cost_usd:o.cost,$ai_stop_reason:x(o.finish,!!o.error),$ai_is_error:!!o.error,$ai_error:n,$ai_tools_called:u,$ai_tool_call_count:l,cache_read_input_tokens:o.tokens.cache.read,cache_creation_input_tokens:o.tokens.cache.write,$ai_lib:r,$ai_framework:i,$ai_project_name:t.projectName,$ai_agent_name:d.agentName,...t.customProperties}}function k(e){let{config:t,latency:n,output:a,toolCall:o,toolName:s,traceState:c}=e;return{$ai_trace_id:o.traceID,$ai_session_id:o.sessionID,$ai_span_id:crypto.randomUUID(),$ai_parent_id:o.parentSpanID,$ai_span_name:s,$ai_input_state:t.privacyMode?void 0:u(o.args,t.maxAttributeLength),$ai_output_state:t.privacyMode?void 0:u(a,t.maxAttributeLength),$ai_latency:n,$ai_is_error:!1,$ai_error:void 0,$ai_lib:r,$ai_framework:i,$ai_project_name:t.projectName,$ai_agent_name:c?.agentName??t.projectName,...t.customProperties}}function A(t){let n,i=!1;function a(){if(n)return n;try{return n=new e(t.apiKey,{host:t.host,flushAt:20,flushInterval:1e4}),n}catch(e){console.error(`${r}: failed to initialize PostHog client`,e);return}}function o(e,n,r){let i=a();i&&i.capture({distinctId:v(t,n),event:e,properties:r})}async function s(e,n,r){let i=a();i&&await i.captureImmediate({distinctId:v(t,n),event:e,properties:r})}async function c(){n&&=(await n.shutdown(),void 0)}function l(e){i||(i=!0,process.once(`beforeExit`,()=>{e()}),process.once(`SIGINT`,()=>{e()}),process.once(`SIGTERM`,()=>{e()}))}return{capture:o,captureImmediate:s,registerShutdown:l,shutdown:c}}async function j(e){try{return h(await e.$`git config --get user.email`.text())}catch{return}}async function M(e){let t=g(e.worktree||e.directory),n=p(process.env.POSTHOG_LLMA_CUSTOM_PROPERTIES);return m(process.env.POSTHOG_LLMA_CUSTOM_PROPERTIES)||console.warn(`${r}: ignoring invalid POSTHOG_LLMA_CUSTOM_PROPERTIES JSON`),{apiKey:process.env.POSTHOG_OPENCODE_API_KEY??`phc_qAbssQWcjrSz9NutSQsNrWWpQqLsTGo7ZnHchwa5C6Tb`,host:process.env.POSTHOG_OPENCODE_HOST??`https://eu.i.posthog.com`,enabled:process.env.POSTHOG_OPENCODE_ENABLED!==`false`,privacyMode:process.env.POSTHOG_OPENCODE_LLMA_PRIVACY_MODE===`true`,traceGrouping:d(process.env.POSTHOG_OPENCODE_LLMA_TRACE_GROUPING),sessionWindowMinutes:f(process.env.POSTHOG_OPENCODE_LLMA_SESSION_WINDOW_MINUTES,60),maxAttributeLength:f(process.env.POSTHOG_OPENCODE_MAX_ATTRIBUTE_LENGTH,12e3),distinctId:h(process.env.POSTHOG_OPENCODE_LLMA_DISTINCT_ID),gitEmail:await j(e),projectName:t,customProperties:n}}function N(e,t,n){e.agentName=n.mode||t.agentName,e.lastActivityAt=n.time.completed,e.totalCostUsd+=n.cost,e.totalInputTokens+=n.tokens.input,e.totalOutputTokens+=n.tokens.output;let r=S(n.error);return e.outputState=n.output??r??e.outputState,r&&(e.hasError=!0,e.errorMessage=r),r}function P(e){let t=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Map,o=/* @__PURE__ */ new Map,s=/* @__PURE__ */ new Map,c=/* @__PURE__ */ new Map,l=/* @__PURE__ */ new Map,u=/* @__PURE__ */ new Set;function d(e){i.delete(e),r.delete(e),l.delete(e);for(let[n,r]of t)r.sessionID===e&&t.delete(n);let n=/* @__PURE__ */ new Set;for(let[t,r]of c)r.sessionID===e&&(n.add(r.spanID),c.delete(t),s.delete(t),u.delete(t));for(let e of n)o.delete(e);for(let[t,n]of a)n.sessionID===e&&a.delete(t)}function f(e){return i.get(e)}function p(){return i.keys().toArray()}function m(t,r,a){let o=i.get(t)??{agentName:r??e.projectName,errorMessage:void 0,hasError:!1,inputState:void 0,lastActivityAt:a,lastTraceCapturedAt:void 0,outputState:void 0,sessionID:t,startedAt:a,totalCostUsd:0,totalInputTokens:0,totalOutputTokens:0,traceID:n(),traceName:void 0};return o.agentName=r??o.agentName,o.lastActivityAt=a,i.set(t,o),o}function h(i,a){let o=Date.now(),s=m(i.sessionID,i.agent,o),c=C(a.parts),u={agentName:i.agent??e.projectName,prompt:c,sessionID:i.sessionID,traceID:s.traceID,spanID:n(),startedAt:o,userMessageID:a.message.id};s.inputState??=c,s.traceName??=_(c),t.set(y(i.sessionID,a.message.id),u),r.set(i.sessionID,u),l.delete(i.sessionID)}function g(e){let t=s.get(e.messageID)??{order:[],parts:/* @__PURE__ */ new Map};t.parts.has(e.id)||t.order.push(e.id),t.parts.set(e.id,e.text),s.set(e.messageID,t)}function v(e){return w(s.get(e))}function x(e,t){let n=i.get(e);n&&(n.hasError=!0,n.errorMessage=S(t),n.lastActivityAt=Date.now())}function T(e){let n=y(e.sessionID,e.parentID),a=t.get(n)??r.get(e.sessionID),o=i.get(e.sessionID);if(a&&o)return{pending:a,pendingKey:n,traceState:o}}function E(e){let t=T(e);if(!t)return;let r=c.get(e.id);if(r)return{generation:r,...t};let i=l.get(e.sessionID),a=i&&i!==e.id?n():t.pending.spanID,o={assistantMessageID:e.id,pendingKey:t.pendingKey,sessionID:e.sessionID,spanID:a,traceID:t.pending.traceID};return t.pending.spanID=a,c.set(e.id,o),l.set(e.sessionID,e.id),{generation:o,...t}}function D(e){return u.has(e)}function O(e){u.add(e)}function k(e,t){s.delete(e),o.delete(t)}function A(e){return r.get(e)}function j(e,t,n){a.set(b(e,t),n)}function M(e,t){let n=b(e,t),r=a.get(n);if(r)return a.delete(n),r}function P(e,t){let n=o.get(e)??[];n.push(t),o.set(e,n)}function F(e){let t=o.get(e);return!t||t.length===0?{}:{toolsCalled:[...new Set(t)],toolCallCount:t.length}}function I(e){return e.role===`assistant`&&!!e.time.completed&&!u.has(e.id)}return{beginPrompt:h,clearSessionState:d,cleanupAssistantMessage:k,getActiveMessage:A,getAssistantOutputForMessage:v,getGenerationToolProperties:F,getOrCreateGenerationState:E,getTraceState:f,getTraceSessionIDs:p,getOrCreateTraceState:m,hasCompletedAssistantMessage:D,markAssistantMessageCompleted:O,markSessionError:x,recordGenerationToolCall:P,setToolCall:j,shouldCompleteAssistantMessage:I,storeAssistantOutput:g,takeToolCall:M,updateTraceStateFromAssistantMessage:N}}const F=async e=>{let t=await M(e);if(!t.enabled)return{};if(!t.apiKey)return console.warn(`${r}: missing POSTHOG_API_KEY, analytics disabled`),{};let n=P(t),i=A(t);async function a(e){if(e.lastTraceCapturedAt===e.lastActivityAt)return;let n=Math.max(0,e.lastActivityAt-e.startedAt)/1e3;await i.captureImmediate(`$ai_trace`,e.sessionID,D(t,e,n)),e.lastTraceCapturedAt=e.lastActivityAt}async function o(e){let t=n.getTraceState(e);t&&(await a(t),n.clearSessionState(e))}async function s(){await Promise.all(n.getTraceSessionIDs().map(e=>o(e))),await i.shutdown()}i.registerShutdown(s);async function c(e){let r=n.getOrCreateGenerationState(e);if(!r)return;let{generation:o,pending:s,traceState:c}=r,l=n.getAssistantOutputForMessage(e.id),u=n.updateTraceStateFromAssistantMessage(c,s,{mode:e.mode,time:{completed:e.time.completed},cost:e.cost,tokens:{input:e.tokens.input,output:e.tokens.output},output:l,error:e.error}),{toolsCalled:d,toolCallCount:f}=n.getGenerationToolProperties(o.spanID);i.capture(`$ai_generation`,e.sessionID,O({config:t,pending:s,generation:o,traceState:c,info:e,errorMessage:u,output:l,toolsCalled:d,toolCallCount:f})),await a(c),n.cleanupAssistantMessage(e.id,o.spanID)}async function l(e){if(e.type===`message.part.updated`){let{properties:t}=e,{part:r}=t;r.type===`text`&&n.storeAssistantOutput(r);return}if(e.type===`session.deleted`){let{properties:t}=e,{info:n}=t;await o(n.id);return}if(e.type===`session.error`){let{properties:t}=e,{error:r,sessionID:i}=t;i&&n.markSessionError(i,r);return}if(e.type!==`message.updated`)return;let{properties:t}=e,{info:r}=t;r.role===`assistant`&&(n.getOrCreateGenerationState(r),n.shouldCompleteAssistantMessage(r)&&(n.markAssistantMessageCompleted(r.id),await c(r)))}return{"chat.message":async(e,r)=>{let i=Date.now(),a=n.getTraceState(e.sessionID),s=t.sessionWindowMinutes*6e4;a&&t.traceGrouping===`message`&&await o(e.sessionID),a&&t.traceGrouping===`session`&&i-a.lastActivityAt>=s&&await o(e.sessionID),n.beginPrompt(e,r)},"tool.execute.before":(e,t)=>{let r=n.getActiveMessage(e.sessionID);return r&&(n.setToolCall(e.sessionID,e.callID,{args:t.args,parentSpanID:r.spanID,sessionID:e.sessionID,startedAt:Date.now(),traceID:r.traceID}),n.recordGenerationToolCall(r.spanID,e.tool)),Promise.resolve()},"tool.execute.after":(e,r)=>{let a=n.takeToolCall(e.sessionID,e.callID);if(!a)return Promise.resolve();let o=n.getTraceState(a.sessionID);return o&&(o.lastActivityAt=Date.now()),i.capture(`$ai_span`,a.sessionID,k({config:t,toolCall:a,traceState:o,toolName:e.tool,output:r,latency:Math.max(0,Date.now()-a.startedAt)/1e3})),Promise.resolve()},event:async({event:e})=>l(e)}};export{F as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@2digits/opencode-plugin",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.42",
|
|
4
4
|
"description": "OpenCode plugin for PostHog LLM analytics integration",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -35,16 +35,16 @@
|
|
|
35
35
|
"access": "public"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@opencode-ai/plugin": "1.19.
|
|
39
|
-
"posthog-node": "5.
|
|
38
|
+
"@opencode-ai/plugin": "1.19.2",
|
|
39
|
+
"posthog-node": "5.56.1"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@2digits/tsconfig": "0.
|
|
42
|
+
"@2digits/tsconfig": "1.0.0",
|
|
43
43
|
"@arethetypeswrong/core": "0.18.5",
|
|
44
44
|
"publint": "0.3.25",
|
|
45
45
|
"typescript": "7.0.2",
|
|
46
|
-
"vite-plus": "1.
|
|
47
|
-
"vitest": "5.0.
|
|
46
|
+
"vite-plus": "1.3.0",
|
|
47
|
+
"vitest": "5.0.5"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"build": "vp pack --minify --config-loader unconfig",
|