@2digits/opencode-plugin 0.2.43 → 0.2.44
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 +2 -3
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
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
|
|
2
|
-
`).trim();return t.length>0?t:void 0}function w(e){if(!e)return;let t=e.
|
|
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};
|
|
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=/api[-_]?key|token|secret|password|authorization|cookie|session|bearer|x-api-key|credential/i;function a(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function o(e){if(e!=null)try{return JSON.stringify(e)}catch{return}}function s(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 c(e,t,n){if(n>8)return`[DepthLimit]`;if(typeof e!=`object`||!e)return e;if(t.has(e))return`[Circular]`;t.add(e);let r=Array.isArray(e)?e.map(e=>c(e,t,n+1)):Object.fromEntries(Object.entries(e).map(([e,r])=>[e,i.test(e)?`[REDACTED]`:c(r,t,n+1)]));return t.delete(e),r}function l(e,t){if(e==null)return;let n=c(e,/* @__PURE__ */ new WeakSet,0),r=typeof n==`string`?n:o(n);return r===void 0?void 0:s(r,t)}function u(e){return e===`session`?`session`:`message`}function d(e,t){let n=Number.parseInt(e??``,10);return Number.isFinite(n)&&n>0?n:t}function f(e){if(!e)return{};try{let t=JSON.parse(e);return a(t)?t:void 0}catch{return}}function p(e){let t=e?.trim();return t===``?void 0:t}function m(e){let n=t.basename(e);return n.length>0?n:`opencode-project`}function h(e){let t=e?.replaceAll(/\s+/g,` `).trim().slice(0,120);return t===``?void 0:t}function g(e,t){return e.distinctId??e.gitEmail??t}function _(e,t){return`${e}:${t}`}function v(e,t){return t?`error`:e===`tool-calls`?`tool_calls`:e===``?void 0:e}function y(e){if(e){if(typeof e==`string`)return e;if(a(e)){if(typeof e.message==`string`)return e.message;if(a(e.data)&&typeof e.data.message==`string`)return e.data.message;if(typeof e.name==`string`)return e.name}return o(e)}}function b(e){let t=[...e].join(`
|
|
2
|
+
`).trim();return t.length>0?t:void 0}function x(e){return b(e.filter(e=>e.type===`text`&&!e.synthetic&&typeof e.text==`string`).map(e=>e.text??``))}function S(e){return e&&b(e.parts.values())}function C(e,t){if(!t&&e)return[{role:`user`,content:e}]}function w(e,t,n){if(!n){if(e)return[{role:`assistant`,content:e}];if(t)return[{role:`assistant`,content:t}]}}const T=[`beforeExit`,`SIGINT`,`SIGTERM`];function E(e,t){return e.privacyMode?void 0:l(t,e.maxAttributeLength)}function D(e,t){return{$ai_lib:r,$ai_framework:`opencode`,$ai_project_name:e.projectName,$ai_agent_name:t,...e.customProperties}}function O(e,t,n){return{$ai_trace_id:t.traceID,$ai_session_id:t.sessionID,$ai_latency:n,$ai_input_state:E(e,t.inputState),$ai_output_state:E(e,t.outputState),$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,...D(e,t.agentName)}}function k(e){let{config:t,errorMessage:n,generation:r,info:i,output:a,pending:o,toolCallCount:s,toolsCalled:c,traceState:l}=e,u=Math.max(0,i.time.completed-i.time.created)/1e3,d=!!i.error;return{$ai_trace_id:r.traceID,$ai_session_id:i.sessionID,$ai_span_id:r.spanID,$ai_model:i.modelID,$ai_provider:i.providerID,$ai_input:C(o.prompt,t.privacyMode),$ai_output_choices:w(a,n,t.privacyMode),$ai_user_prompt:t.privacyMode?void 0:o.prompt,$ai_input_tokens:i.tokens.input,$ai_output_tokens:i.tokens.output,$ai_total_tokens:i.tokens.input+i.tokens.output+i.tokens.reasoning+i.tokens.cache.read+i.tokens.cache.write,$ai_latency:u,$ai_total_cost_usd:i.cost,$ai_stop_reason:v(i.finish,d),$ai_is_error:d,$ai_error:n,$ai_tools_called:c,$ai_tool_call_count:s,cache_read_input_tokens:i.tokens.cache.read,cache_creation_input_tokens:i.tokens.cache.write,...D(t,l.agentName)}}function A(e){let{config:t,latency:n,output:r,toolCall:i,toolName:a,traceState:o}=e;return{$ai_trace_id:i.traceID,$ai_session_id:i.sessionID,$ai_span_id:crypto.randomUUID(),$ai_parent_id:i.parentSpanID,$ai_span_name:a,$ai_input_state:E(t,i.args),$ai_output_state:E(t,r),$ai_latency:n,$ai_is_error:!1,$ai_error:void 0,...D(t,o?.agentName??t.projectName)}}function j(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){return{distinctId:g(t,n),event:e,properties:r}}function s(e,t,n){a()?.capture(o(e,t,n))}async function c(e,t,n){await a()?.captureImmediate(o(e,t,n))}async function l(){n&&=(await n.shutdown(),void 0)}function u(e){if(!i){i=!0;for(let t of T)process.once(t,()=>{e()})}}return{capture:s,captureImmediate:c,registerShutdown:u,shutdown:l}}async function M(e){try{return p(await e.$`git config --get user.email`.text())}catch{return}}async function N(e){let t=m(e.worktree||e.directory),n=f(process.env.POSTHOG_LLMA_CUSTOM_PROPERTIES);return n||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:u(process.env.POSTHOG_OPENCODE_LLMA_TRACE_GROUPING),sessionWindowMinutes:d(process.env.POSTHOG_OPENCODE_LLMA_SESSION_WINDOW_MINUTES,60),maxAttributeLength:d(process.env.POSTHOG_OPENCODE_MAX_ATTRIBUTE_LENGTH,12e3),distinctId:p(process.env.POSTHOG_OPENCODE_LLMA_DISTINCT_ID),gitEmail:await M(e),projectName:t,customProperties:n??{}}}function P(e,t){for(let[n,r]of e)r.sessionID===t&&e.delete(n)}function F(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=y(n.error);return e.outputState=n.output??r??e.outputState,r&&(e.hasError=!0,e.errorMessage=r),r}function I(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),P(t,e),P(s,e),P(a,e);for(let[t,n]of c)n.sessionID===e&&(c.delete(t),u.delete(t),o.delete(n.spanID))}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 g(i,a){let o=Date.now(),s=m(i.sessionID,i.agent,o),c=x(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??=h(c),t.set(_(i.sessionID,a.message.id),u),r.set(i.sessionID,u),l.delete(i.sessionID)}function v(e){let t=s.get(e.messageID)??{sessionID:e.sessionID,parts:/* @__PURE__ */ new Map};t.parts.set(e.id,e.text),s.set(e.messageID,t)}function b(e){return S(s.get(e))}function C(e,t){let n=i.get(e);n&&(n.hasError=!0,n.errorMessage=y(t),n.lastActivityAt=Date.now())}function w(e){let n=_(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 T(e){let t=w(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 E(e){u.add(e)}function D(e,t){s.delete(e),o.delete(t)}function O(e){return r.get(e)}function k(e,t,n){a.set(_(e,t),n)}function A(e,t){let n=_(e,t),r=a.get(n);return a.delete(n),r}function j(e,t){let n=o.get(e)??[];n.push(t),o.set(e,n)}function M(e){let t=o.get(e);return!t||t.length===0?{}:{toolsCalled:[...new Set(t)],toolCallCount:t.length}}function N(e){return e.role===`assistant`&&!!e.time.completed&&!u.has(e.id)}return{beginPrompt:g,clearSessionState:d,cleanupAssistantMessage:D,getActiveMessage:O,getAssistantOutputForMessage:b,getGenerationToolProperties:M,getOrCreateGenerationState:T,getTraceState:f,getTraceSessionIDs:p,markAssistantMessageCompleted:E,markSessionError:C,recordGenerationToolCall:j,setToolCall:k,shouldCompleteAssistantMessage:N,storeAssistantOutput:v,takeToolCall:A,updateTraceStateFromAssistantMessage:F}}const L=async e=>{let t=await N(e);if(!t.enabled)return{};if(!t.apiKey)return console.warn(`${r}: missing POSTHOG_API_KEY, analytics disabled`),{};let n=I(t),i=j(t),a=t.sessionWindowMinutes*6e4;async function o(e){if(e.lastTraceCapturedAt===e.lastActivityAt)return;let n=Math.max(0,e.lastActivityAt-e.startedAt)/1e3;await i.captureImmediate(`$ai_trace`,e.sessionID,O(t,e,n)),e.lastTraceCapturedAt=e.lastActivityAt}async function s(e){let t=n.getTraceState(e);t&&(await o(t),n.clearSessionState(e))}async function c(){await Promise.all(n.getTraceSessionIDs().map(e=>s(e))),await i.shutdown()}i.registerShutdown(c);async function l(e){let r=n.getOrCreateGenerationState(e);if(!n.shouldCompleteAssistantMessage(e)||(n.markAssistantMessageCompleted(e.id),!r))return;let{generation:a,pending:s,traceState:c}=r,l=n.getAssistantOutputForMessage(e.id),u=n.updateTraceStateFromAssistantMessage(c,s,{...e,output:l}),{toolsCalled:d,toolCallCount:f}=n.getGenerationToolProperties(a.spanID);i.capture(`$ai_generation`,e.sessionID,k({config:t,pending:s,generation:a,traceState:c,info:e,errorMessage:u,output:l,toolsCalled:d,toolCallCount:f})),await o(c),n.cleanupAssistantMessage(e.id,a.spanID)}async function u(e){switch(e.type){case`message.part.updated`:{let{part:t}=e.properties;t.type===`text`&&n.storeAssistantOutput(t);break}case`session.deleted`:await s(e.properties.info.id);break;case`session.error`:{let{error:t,sessionID:r}=e.properties;r&&n.markSessionError(r,t);break}case`message.updated`:{let{info:t}=e.properties;t.role===`assistant`&&await l(t);break}}}return{"chat.message":async(e,r)=>{let i=n.getTraceState(e.sessionID);i&&(t.traceGrouping===`message`||Date.now()-i.lastActivityAt>=a)&&await s(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=Date.now(),s=n.getTraceState(a.sessionID);return s&&(s.lastActivityAt=o),i.capture(`$ai_span`,a.sessionID,A({config:t,toolCall:a,traceState:s,toolName:e.tool,output:r,latency:Math.max(0,o-a.startedAt)/1e3})),Promise.resolve()},event:async({event:e})=>u(e)}};export{L 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.44",
|
|
4
4
|
"description": "OpenCode plugin for PostHog LLM analytics integration",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"posthog-node": "5.56.2"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@2digits/tsconfig": "1.0.
|
|
42
|
+
"@2digits/tsconfig": "1.0.2",
|
|
43
43
|
"@arethetypeswrong/core": "0.18.5",
|
|
44
44
|
"publint": "0.3.25",
|
|
45
45
|
"typescript": "7.0.2",
|