@dijkspicy/opencode-stats-reporter 0.1.3 → 0.1.4

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.
@@ -65,7 +65,7 @@ config.json 不存在、JSON 非法、字段缺失或 URL 非法时一律静默
65
65
  {
66
66
  "schema_version": 1,
67
67
  "install_id": "0b3f7e6a-....",
68
- "reporter": { "client": "opencode", "version": "0.1.3" },
68
+ "reporter": { "client": "opencode", "version": "0.1.4" },
69
69
  "sessions": [
70
70
  {
71
71
  "session_id": "ses_...",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-session-reporter",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "opencode 客户端插件:在会话空闲时聚合各会话(含子代理会话)的 token 用量快照,经有界队列 + 指数退避非阻塞上报;载荷不含消费者身份字段。",
@@ -43,7 +43,7 @@ import { dirname, join } from "node:path"
43
43
  // ---------------------------------------------------------------------------
44
44
 
45
45
  const SCHEMA_VERSION = 1
46
- const PLUGIN_VERSION = "0.1.3"
46
+ const PLUGIN_VERSION = "0.1.4"
47
47
  /** 队列容量:最多积压 500 条会话快照,溢出丢最旧 */
48
48
  const QUEUE_CAP = 500
49
49
  /** 单次上报请求超时(AbortSignal.timeout) */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dijkspicy/opencode-stats-reporter",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "本地一体化 MaaS 用量看板:托管静态面板、反代用量接口、本地存储会话用量",
5
5
  "type": "module",
6
6
  "main": "./contrib/opencode-session-reporter/plugin-server.ts",
package/src/store.js CHANGED
@@ -149,7 +149,10 @@ export class Store {
149
149
  let accepted = 0
150
150
  let skipped = 0
151
151
  const find = this.db.prepare(
152
- "SELECT revision, last_activity_at FROM session_usage WHERE consumer_id=? AND install_id=? AND session_id=?",
152
+ "SELECT revision, last_activity_at, session_title, session_directory FROM session_usage WHERE consumer_id=? AND install_id=? AND session_id=?",
153
+ )
154
+ const backfill = this.db.prepare(
155
+ "UPDATE session_usage SET session_title=?, session_directory=?, last_reported_at=? WHERE consumer_id=? AND install_id=? AND session_id=?",
153
156
  )
154
157
  const insert = this.db.prepare(`INSERT INTO session_usage
155
158
  (consumer_id, install_id, session_id, source, schema_version, reporter_version, client_session_header,
@@ -185,11 +188,22 @@ export class Store {
185
188
  consumerId, r.install_id, r.session_id,
186
189
  )
187
190
  } else if (r.revision === prev.revision && r.last_activity_at === prev.last_activity_at) {
188
- status = "unchanged"
191
+ // 单调守卫内(revision 与活动时间均未推进):仅当元数据变化时做「窄更新」回填,
192
+ // 只写 session_title / session_directory / last_reported_at,不触碰 token 类字段、
193
+ // revision、last_activity_at、source、reporter_version 等计量与守卫字段。
194
+ const metaChanged =
195
+ (r.session_title ?? null) !== (prev.session_title ?? null) ||
196
+ (r.session_directory ?? null) !== (prev.session_directory ?? null)
197
+ if (metaChanged) {
198
+ status = "backfilled"
199
+ backfill.run(r.session_title ?? null, r.session_directory ?? null, ts, consumerId, r.install_id, r.session_id)
200
+ } else {
201
+ status = "unchanged"
202
+ }
189
203
  } else {
190
204
  status = "stale"
191
205
  }
192
- if (status === "upserted" || status === "unchanged") accepted += 1
206
+ if (status === "upserted" || status === "unchanged" || status === "backfilled") accepted += 1
193
207
  else skipped += 1
194
208
  results.push({ session_id: r.session_id, install_id: r.install_id, status })
195
209
  }