@kapishdima/ai-ledger 0.0.6 → 0.0.8

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/plugin.js +32 -9
  2. package/package.json +1 -1
package/dist/plugin.js CHANGED
@@ -1,4 +1,9 @@
1
1
  // @bun
2
+ // plugin.ts
3
+ import fs2 from "fs";
4
+ import os2 from "os";
5
+ import path2 from "path";
6
+
2
7
  // lib/db.ts
3
8
  import { Database as Database2 } from "bun:sqlite";
4
9
 
@@ -3739,25 +3744,40 @@ async function deductBalance(provider, cost) {
3739
3744
  }
3740
3745
 
3741
3746
  // plugin.ts
3747
+ var DEBUG_LOG = path2.join(os2.homedir(), ".config", "opencode", "ai-ledger", "debug.log");
3748
+ function dbg(msg) {
3749
+ const line = `[${new Date().toISOString()}] ${msg}
3750
+ `;
3751
+ fs2.appendFileSync(DEBUG_LOG, line);
3752
+ }
3742
3753
  var sessions = new Map;
3743
3754
  var plugin_default = async (input) => {
3744
3755
  await initializeDatabase();
3756
+ dbg("plugin initialized");
3745
3757
  async function flushTurn(sessionID, state) {
3746
3758
  sessions.delete(sessionID);
3747
- const balanceSign = state.lastBalance < 0 ? "\u26A0\uFE0F " : "";
3748
- const text2 = `\`ai-ledger\` \xB7 ${state.providerID} \u2014 **-$${state.totalCost.toFixed(4)}** spent | **$${state.lastBalance.toFixed(2)}** remaining`;
3749
- await input.client.session.prompt({
3750
- path: { id: sessionID },
3751
- body: {
3752
- noReply: true,
3753
- parts: [{ type: "text", text: balanceSign + text2, synthetic: true }]
3754
- }
3755
- });
3759
+ const text2 = `ai-ledger \xB7 ${state.providerID} \xB7 -$${state.totalCost.toFixed(4)} spent | $${state.lastBalance.toFixed(2)} remaining`;
3760
+ dbg(`flushing turn for ${sessionID}: ${text2}`);
3761
+ try {
3762
+ const res = await input.client.session.prompt({
3763
+ path: { id: sessionID },
3764
+ query: { directory: input.directory },
3765
+ body: {
3766
+ noReply: true,
3767
+ parts: [{ type: "text", text: text2 }]
3768
+ }
3769
+ });
3770
+ dbg(`session.prompt result: ${JSON.stringify(res)}`);
3771
+ } catch (e) {
3772
+ dbg(`session.prompt error: ${e?.message}`);
3773
+ }
3756
3774
  }
3757
3775
  return {
3758
3776
  event: async ({ event }) => {
3777
+ dbg(`event: ${event.type}`);
3759
3778
  if (event.type === "session.idle") {
3760
3779
  const sessionID = event.properties?.sessionID;
3780
+ dbg(`session.idle for ${sessionID}, accumulated: ${sessions.has(sessionID)}`);
3761
3781
  const state = sessions.get(sessionID);
3762
3782
  if (state)
3763
3783
  await flushTurn(sessionID, state);
@@ -3770,9 +3790,11 @@ var plugin_default = async (input) => {
3770
3790
  return;
3771
3791
  if (msg.role !== "assistant")
3772
3792
  return;
3793
+ dbg(`assistant message: cost=${msg.cost} provider=${msg.providerID}`);
3773
3794
  if (!msg.cost || msg.cost === 0)
3774
3795
  return;
3775
3796
  const wallet = await getWallet(msg.providerID);
3797
+ dbg(`wallet for ${msg.providerID}: ${wallet ? "found" : "NOT FOUND"}`);
3776
3798
  if (!wallet)
3777
3799
  return;
3778
3800
  const newBalance = await deductBalance(msg.providerID, msg.cost);
@@ -3790,6 +3812,7 @@ var plugin_default = async (input) => {
3790
3812
  const existing = sessions.get(msg.sessionID);
3791
3813
  const totalCost = (existing?.totalCost ?? 0) + msg.cost;
3792
3814
  sessions.set(msg.sessionID, { totalCost, lastBalance: newBalance, providerID: msg.providerID });
3815
+ dbg(`accumulated for session ${msg.sessionID}: totalCost=${totalCost}`);
3793
3816
  }
3794
3817
  };
3795
3818
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kapishdima/ai-ledger",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "AI provider balance and spending tracker for OpenCode",
5
5
  "type": "module",
6
6
  "main": "dist/plugin.js",