@rayadesu/dsh-llm-billing 0.3.17 → 1.0.0
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/README.i18n.yaml +2 -2
- package/README.md +4 -4
- package/README.zh.md +4 -4
- package/icon.svg +12 -5
- package/lib/index.js +1 -1
- package/lib/types/persistence.d.ts +1 -1
- package/lib/types/persistence.js +1 -1
- package/package.json +17 -17
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# last confirmed-consistent state. Both languages carry equal authority; after
|
|
3
3
|
# editing either side, bring the other along and re-record both hashes with:
|
|
4
4
|
# git hash-object README.md README.zh.md
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: f494f3c1ab67b689b246e0bb729043dbb82d9ca3
|
|
6
|
+
README.zh.md: cfdd8cdbb2e17ae95647365a3753e38f56429017
|
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ Each merged row reports two amounts: `total` is the conversation's whole day (th
|
|
|
41
41
|
|
|
42
42
|
The browser needs the same conversation view for a whole day's or a whole log's worth of spend, and a session's own log cannot price its delegation children — so `getDelegatedSpend(sessionId)` returns that subtree: every subagent session the given session delegated, transitively, summed across every day its log covers, with per-model rows merged so a breakdown still adds up. It is served from the SAME cached pass as today's spend (the scan folds each session's whole-session total anyway, so this costs no second read), and it also reports `isSubagent` — whether the queried session is itself a delegated child, whose spend therefore rides the ranking row of the session that delegated it. A user fork is never counted as a delegated child (it carries `parentSession` but no subagent marker).
|
|
43
43
|
|
|
44
|
-
The
|
|
44
|
+
The composer pill adds that subtree to the session's own live spend, so its amount reads as the **conversation's** amount — the pill is the only surface that shows it; the header badge's second line and the panel behind it both report today's account-level figures instead, and the two read the same state.
|
|
45
45
|
|
|
46
46
|
## Forked sessions
|
|
47
47
|
|
|
@@ -49,9 +49,9 @@ A forked session (DSH's "fork" of a conversation) opens its log with a verbatim
|
|
|
49
49
|
|
|
50
50
|
## Runtime compatibility
|
|
51
51
|
|
|
52
|
-
Since 0.1.2-alpha.4, DSH replaced the live `Session` log surface `Session.events` with `Session.snapshotEvents()` (no args = the full current log) and `Session.ownEvents()`, and moved `SessionHeader.seedLength` to `Session.inheritedEventCount` (live) / `SessionHandle.inheritedEventCount` (the handle the persistence `open(id, 'read')` returns). Every log read in the plugin goes through the structural adapters `liveSessionEvents` / `forkBoundaryOf` / `isSeededSession`: the live surface is the one that kept both shapes — `liveSessionEvents` still accepts the ≤ 0.1.1-rc.2 `events` snapshot and the 0.1.2-alpha.4+ `snapshotEvents()` reader — while `forkBoundaryOf` prefers the exact `inheritedEventCount` (live or handle) and otherwise falls back to the durable `header.seedLength`, so the npm release baseline (`^0.
|
|
52
|
+
Since 0.1.2-alpha.4, DSH replaced the live `Session` log surface `Session.events` with `Session.snapshotEvents()` (no args = the full current log) and `Session.ownEvents()`, and moved `SessionHeader.seedLength` to `Session.inheritedEventCount` (live) / `SessionHandle.inheritedEventCount` (the handle the persistence `open(id, 'read')` returns). Every log read in the plugin goes through the structural adapters `liveSessionEvents` / `forkBoundaryOf` / `isSeededSession`: the live surface is the one that kept both shapes — `liveSessionEvents` still accepts the ≤ 0.1.1-rc.2 `events` snapshot and the 0.1.2-alpha.4+ `snapshotEvents()` reader — while `forkBoundaryOf` prefers the exact `inheritedEventCount` (live or handle) and otherwise falls back to the durable `header.seedLength`, so the npm release baseline (`^0.2.0-rc.1`) and the ahead-of-npm monorepo runtime both work without modification. On an unknown surface that has neither shape the plugin fails loudly rather than silently pricing an empty log. The ranking's lineage read is structural in the same way: a header that carries neither `origin: 'subagent'` nor a non-zero `delegationDepth` (an older log, or a session created without them) simply reads as a top-level session and keeps its own row.
|
|
53
53
|
|
|
54
|
-
The persistence service is handle-based only: it exposes `open(id, 'read')` + `SessionHandle.read()` / `list()` (DSH 0.1.2-alpha.5+, the single family the plugin's `^0.
|
|
54
|
+
The persistence service is handle-based only: it exposes `open(id, 'read')` + `SessionHandle.read()` / `list()` (DSH 0.1.2-alpha.5+, the single family the plugin's `^0.2.0-rc.1` peer targets). The scanner reads this one surface through `persistenceInspect` / `persistenceListSnapshots` — `persistenceListSnapshots` is a thin call to `list()`, and `persistenceInspect` opens the handle, reads, and closes it in a `finally` block (so the handle always closes, including after a failed read). The legacy `inspect(id)` / `listSnapshots()` surface was removed (Item 7), so production now serves only the handle family. `SessionHandle.read()` itself still has two return shapes — the bare event array, and since DSH `9b78f99dec` (0.1.5-alpha.1) `{ eventState, events }`; `handleReadEvents` unwraps both, so a cold read survives that generation change.
|
|
55
55
|
|
|
56
56
|
The projection-cache reader likewise targets the current seam: `cachedSnapshot(header, inheritedEventCount, keys)` (zero I/O, wire rows only). Its predecessor, an async `coldSnapshot(id)` that read the log itself, no longer exists, so the plugin never depends on it.
|
|
57
57
|
|
|
@@ -94,7 +94,7 @@ None; its only provider call is a credential-authenticated `/user/balance` read,
|
|
|
94
94
|
|
|
95
95
|
- **Priced rows only** — the session and today spends only price models that have a `billing.models` row; a model without a rate row is omitted. An `assistant/attempt` is priced with the model of the latest `request/header`, so an attempt before any header contributes nothing.
|
|
96
96
|
- **A merged row can be untitled** — a subagent whose parent session is not part of the scan (a deleted or archived parent log, for instance) is still attributed to the parent id its own header names, but that parent's log is never read, so the merged row reports no title and the browser shows its untitled fallback.
|
|
97
|
-
- **Up-to-60s staleness, never an unasked wait** — `getTodaySpend()` is served from the host-side cache for up to 60 seconds; past that window a plain read gets the last value at once and the scan runs behind it, so a reader never waits for the day's scan unless it asked to. A forced read (the manual refresh, and the badge's post-turn recompute) waits for a fresh recompute — still revision-gated, so an unchanged log costs nothing. The browser reads the live per-session value from the pushed projection instead, so the
|
|
97
|
+
- **Up-to-60s staleness, never an unasked wait** — `getTodaySpend()` is served from the host-side cache for up to 60 seconds; past that window a plain read gets the last value at once and the scan runs behind it, so a reader never waits for the day's scan unless it asked to. A forced read (the manual refresh, and the badge's post-turn recompute) waits for a fresh recompute — still revision-gated, so an unchanged log costs nothing. The browser reads the live per-session value from the pushed projection instead, so the composer pill's amount is never stale; today's figures — the badge's second line and the panel's row — are account-level and have no pushed source behind them, so they move on mount, on the manual refresh, on a panel open, and on the post-turn recompute, and the ranking they can ride (`getTodaySessionsSpend()`, under the same 60-second cache and revision gate) can trail by up to 60 seconds.
|
|
98
98
|
- **Balance is TTL-cached** — one `/user/balance` snapshot is reused for up to 15 seconds and each request aborts after 5 seconds; `force` (the manual refresh) bypasses the TTL.
|
|
99
99
|
- **Projection pricing follows the published revisions** — the projection fold resolves the rate revision per sample timestamp, so published re-pricing needs no refold; a hand-edited `billing.models` change prices only events folded after the change until the state version or the process is reset (the events fallback re-prices the full log).
|
|
100
100
|
- **A cached cold row may trail its log** — a cold session whose cached row covers the queried day is re-read from the log for exactness; a row whose own day is not the queried day is trusted without a read, so a session that crashed between its last checkpoint and its last event can under-report that tail until it is next read.
|
package/README.zh.md
CHANGED
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
浏览器还需要同一套「对话」口径去显示整日/整份日志的花费,而会话自己的日志无法为它的委派子会话计价——所以有了 `getDelegatedSpend(sessionId)`:返回那棵子树的金额,即该会话(递归)委派的每个子代理会话、按其日志覆盖的每一天求和,并把模型行合并(分项仍然加得起来)。它与今日花费**共用同一次缓存扫描**(那一趟本来就会折出每个会话的全会话累计,因此这里不额外读日志),并额外给出 `isSubagent`——被查询的会话自己是不是委派子会话(是的话它的花费落在委派它的那个会话的排行行里)。用户手动分叉永远不会被算作委派子会话(它带 `parentSession`,但不带任何 subagent 标记)。
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
输入框 pill 把这棵子树加到会话自身的实时花费上,因此 pill 的金额读作**整次对话**的金额——pill 是唯一显示它的界面;徽标第二行与它后面的面板报的是账户级的今日口径,两者读的是同一份 state。
|
|
45
45
|
|
|
46
46
|
## 分叉会话
|
|
47
47
|
|
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
|
|
50
50
|
## 运行时兼容性
|
|
51
51
|
|
|
52
|
-
0.1.2-alpha.4 起,DSH 把 live `Session` 的日志读取表面从 `Session.events` 改为 `Session.snapshotEvents()`(无参 = 当前全量日志)与 `Session.ownEvents()`,并把 `SessionHeader.seedLength` 移至 `Session.inheritedEventCount`(live)/`SessionHandle.inheritedEventCount`(持久化侧 `open(id, 'read')` 返回的 handle)。插件的所有日志读取都走结构适配器 `liveSessionEvents` / `forkBoundaryOf` / `isSeededSession`:live 表面是保留两代形状的那一个——`liveSessionEvents` 同时接受 ≤ 0.1.1-rc.2 的 `events` 快照与 0.1.2-alpha.4+ 的 `snapshotEvents()` 读取器——而 `forkBoundaryOf` 优先用精确的 `inheritedEventCount`(live 或 handle),否则回退到持久化的 `header.seedLength`,因此 npm 发布基线(`^0.
|
|
52
|
+
0.1.2-alpha.4 起,DSH 把 live `Session` 的日志读取表面从 `Session.events` 改为 `Session.snapshotEvents()`(无参 = 当前全量日志)与 `Session.ownEvents()`,并把 `SessionHeader.seedLength` 移至 `Session.inheritedEventCount`(live)/`SessionHandle.inheritedEventCount`(持久化侧 `open(id, 'read')` 返回的 handle)。插件的所有日志读取都走结构适配器 `liveSessionEvents` / `forkBoundaryOf` / `isSeededSession`:live 表面是保留两代形状的那一个——`liveSessionEvents` 同时接受 ≤ 0.1.1-rc.2 的 `events` 快照与 0.1.2-alpha.4+ 的 `snapshotEvents()` 读取器——而 `forkBoundaryOf` 优先用精确的 `inheritedEventCount`(live 或 handle),否则回退到持久化的 `header.seedLength`,因此 npm 发布基线(`^0.2.0-rc.1`)与超前于它的 monorepo 运行时代码均无需改动即可工作。遇到两种形状都没有的未知运行时表面时,插件会显式失败而不是静默按零花费计价。排行的血缘读取同样以结构方式完成:header 里既没有 `origin: 'subagent'` 也没有非零 `delegationDepth` 的会话(旧日志,或创建时就没有这两个字段的会话)直接视作顶层会话、保留自己一行。
|
|
53
53
|
|
|
54
|
-
持久化服务现在是「仅 handle」一面:提供 `open(id, 'read')` + `SessionHandle.read()` / `list()`(DSH 0.1.2-alpha.5+,正是插件 `^0.
|
|
54
|
+
持久化服务现在是「仅 handle」一面:提供 `open(id, 'read')` + `SessionHandle.read()` / `list()`(DSH 0.1.2-alpha.5+,正是插件 `^0.2.0-rc.1` peer 目标的那一族)。扫描器只走这一面:`persistenceListSnapshots` 就是对 `list()` 的薄封装,`persistenceInspect` 打开 handle、读取、并在 `finally` 里关闭(因此无论读取成功与否,handle 总会关闭)。旧的 `inspect(id)` / `listSnapshots()` 表面已删除(Item 7),生产现在只服务 handle 这一族。`SessionHandle.read()` 本身仍有两代返回形状——最初返回裸事件数组,DSH `9b78f99dec`(0.1.5-alpha.1)起返回 `{ eventState, events }`;`handleReadEvents` 同时接受两种形状,冷读因此不受该代际变更影响。
|
|
55
55
|
|
|
56
56
|
投影缓存的读取同样对准当前 seam:`cachedSnapshot(header, inheritedEventCount, keys)`(零 I/O,只读 wire 行)。它的前身——自己读日志的异步 `coldSnapshot(id)`——已不存在,插件不再依赖它。
|
|
57
57
|
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
|
|
95
95
|
- **有费率行才计价,且不靠名字猜** —— 会话花费与今日花费只按价目表(`billing.models`)里该模型自己的行计价;没有行就不计价,但用量会记为 `unpriced` 并按模型告警一次(其中写明模型名),而不是无声丢弃。要给它计价,在 `billing.models` 补一行即可。`assistant/attempt` 用最近一条 `request/header` 的模型计价,因此首条 header 之前的 attempt 不计入。
|
|
96
96
|
- **合并行可能没有标题** —— 子代理的父会话不在本次扫描范围内时(例如父日志已被删除或归档),该行仍按其 header 里写的父会话 id 归属,但父会话日志从未被读取,合并行因此没有标题,浏览器显示「未命名」兜底。
|
|
97
|
-
- **最多 60 秒延迟,但不会让人白等** —— `getTodaySpend()` 由宿主侧缓存服务最多 60 秒;过了这个窗口,普通读取直接拿到上一次的值、重扫放到后台,因此读者从不等待当天那次扫描(除非它主动要求等)。带 `force` 的读取(手动刷新,以及徽标在回合结束后的重算)会等一次重算——仍受 revision
|
|
97
|
+
- **最多 60 秒延迟,但不会让人白等** —— `getTodaySpend()` 由宿主侧缓存服务最多 60 秒;过了这个窗口,普通读取直接拿到上一次的值、重扫放到后台,因此读者从不等待当天那次扫描(除非它主动要求等)。带 `force` 的读取(手动刷新,以及徽标在回合结束后的重算)会等一次重算——仍受 revision 门控,日志未变则零成本。浏览器端的输入框 pill 读的是推送的投影值,因此不会滞后;今日口径(徽标第二行与面板那一行)是账户级的、没有推送源,只在挂载、手动刷新、打开面板与回合结束重算时变动,而它可能跟随的今日会话排行(`getTodaySessionsSpend()`,同样受 60 秒缓存与 revision 门控)最多滞后 60 秒。
|
|
98
98
|
- **额度带 TTL 缓存** —— 一份 `/user/balance` 快照最多复用 15 秒,单次请求 5 秒超时;`force`(手动刷新)绕过 TTL。
|
|
99
99
|
- **投影计价跟随官方费率版本** —— 投影折叠按样本时刻解析费率版本,官方调价因此无需重折;手工改 `billing.models` 则只影响变更后折叠的事件,直到状态版本或进程重置(事件路径回退会重算整个日志)。
|
|
100
100
|
- **冷缓存行可能滞后于日志** —— 冷会话若缓存行覆盖查询日,会重读日志以求精确;若缓存行自身的日期不是查询日则直接采信、不读日志,因此进程在最后一次检查点之后、最后一条事件之前崩溃的会话,其尾部可能暂时少算,直到该会话被重新读取。
|
package/icon.svg
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48" height="48" role="img" aria-label="Billing Core">
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="g" x1="24" y1="8.0" x2="24" y2="40.0" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#2f6fed"/>
|
|
5
|
+
<stop offset=".5" stop-color="#35b8f0"/>
|
|
6
|
+
<stop offset="1" stop-color="#3fddbe"/>
|
|
7
|
+
</linearGradient>
|
|
8
|
+
</defs>
|
|
9
|
+
<circle cx="24" cy="24" r="14.53" fill="none" stroke="url(#g)" stroke-width="2.94"/>
|
|
10
|
+
<path d="M33.5 24.0 L32.9 24.4 L32.0 24.7 L31.1 24.9 L30.5 25.1 L30.0 25.3 L29.5 25.5 L29.1 25.6 L28.8 25.7 L28.5 25.9 L28.3 26.0 L28.1 26.1 L27.9 26.3 L27.7 26.4 L27.6 26.5 L27.4 26.6 L27.2 26.7 L27.1 26.8 L26.9 26.9 L26.8 27.1 L26.7 27.2 L26.6 27.4 L26.5 27.6 L26.4 27.7 L26.3 27.9 L26.1 28.1 L26.0 28.3 L25.9 28.6 L25.8 28.9 L25.6 29.2 L25.5 29.6 L25.3 30.1 L25.2 30.6 L25.0 31.2 L24.7 32.1 L24.4 33.0 L24.0 33.5 L24.0 29.5 L24.2 29.2 L24.4 28.7 L24.6 28.3 L24.7 27.9 L24.8 27.4 L24.8 27.1 L24.9 26.8 L25.0 26.6 L25.0 26.5 L25.1 26.3 L25.1 26.1 L25.2 26.0 L25.2 25.9 L25.3 25.8 L25.4 25.8 L25.4 25.7 L25.5 25.6 L25.5 25.5 L25.6 25.5 L25.7 25.4 L25.8 25.4 L25.8 25.3 L26.0 25.3 L26.1 25.2 L26.2 25.2 L26.4 25.1 L26.6 25.1 L26.8 25.0 L27.0 24.9 L27.3 24.9 L27.6 24.8 L27.9 24.7 L28.3 24.6 L28.7 24.4 L29.3 24.2 L29.5 24.0 Z" fill="url(#g)" transform="rotate(0 24 24)"/>
|
|
11
|
+
<path d="M33.5 24.0 L32.9 24.4 L32.0 24.7 L31.1 24.9 L30.5 25.1 L30.0 25.3 L29.5 25.5 L29.1 25.6 L28.8 25.7 L28.5 25.9 L28.3 26.0 L28.1 26.1 L27.9 26.3 L27.7 26.4 L27.6 26.5 L27.4 26.6 L27.2 26.7 L27.1 26.8 L26.9 26.9 L26.8 27.1 L26.7 27.2 L26.6 27.4 L26.5 27.6 L26.4 27.7 L26.3 27.9 L26.1 28.1 L26.0 28.3 L25.9 28.6 L25.8 28.9 L25.6 29.2 L25.5 29.6 L25.3 30.1 L25.2 30.6 L25.0 31.2 L24.7 32.1 L24.4 33.0 L24.0 33.5 L24.0 29.5 L24.2 29.2 L24.4 28.7 L24.6 28.3 L24.7 27.9 L24.8 27.4 L24.8 27.1 L24.9 26.8 L25.0 26.6 L25.0 26.5 L25.1 26.3 L25.1 26.1 L25.2 26.0 L25.2 25.9 L25.3 25.8 L25.4 25.8 L25.4 25.7 L25.5 25.6 L25.5 25.5 L25.6 25.5 L25.7 25.4 L25.8 25.4 L25.8 25.3 L26.0 25.3 L26.1 25.2 L26.2 25.2 L26.4 25.1 L26.6 25.1 L26.8 25.0 L27.0 24.9 L27.3 24.9 L27.6 24.8 L27.9 24.7 L28.3 24.6 L28.7 24.4 L29.3 24.2 L29.5 24.0 Z" fill="url(#g)" transform="rotate(90 24 24)"/>
|
|
12
|
+
<path d="M33.5 24.0 L32.9 24.4 L32.0 24.7 L31.1 24.9 L30.5 25.1 L30.0 25.3 L29.5 25.5 L29.1 25.6 L28.8 25.7 L28.5 25.9 L28.3 26.0 L28.1 26.1 L27.9 26.3 L27.7 26.4 L27.6 26.5 L27.4 26.6 L27.2 26.7 L27.1 26.8 L26.9 26.9 L26.8 27.1 L26.7 27.2 L26.6 27.4 L26.5 27.6 L26.4 27.7 L26.3 27.9 L26.1 28.1 L26.0 28.3 L25.9 28.6 L25.8 28.9 L25.6 29.2 L25.5 29.6 L25.3 30.1 L25.2 30.6 L25.0 31.2 L24.7 32.1 L24.4 33.0 L24.0 33.5 L24.0 29.5 L24.2 29.2 L24.4 28.7 L24.6 28.3 L24.7 27.9 L24.8 27.4 L24.8 27.1 L24.9 26.8 L25.0 26.6 L25.0 26.5 L25.1 26.3 L25.1 26.1 L25.2 26.0 L25.2 25.9 L25.3 25.8 L25.4 25.8 L25.4 25.7 L25.5 25.6 L25.5 25.5 L25.6 25.5 L25.7 25.4 L25.8 25.4 L25.8 25.3 L26.0 25.3 L26.1 25.2 L26.2 25.2 L26.4 25.1 L26.6 25.1 L26.8 25.0 L27.0 24.9 L27.3 24.9 L27.6 24.8 L27.9 24.7 L28.3 24.6 L28.7 24.4 L29.3 24.2 L29.5 24.0 Z" fill="url(#g)" transform="rotate(180 24 24)"/>
|
|
13
|
+
<path d="M33.5 24.0 L32.9 24.4 L32.0 24.7 L31.1 24.9 L30.5 25.1 L30.0 25.3 L29.5 25.5 L29.1 25.6 L28.8 25.7 L28.5 25.9 L28.3 26.0 L28.1 26.1 L27.9 26.3 L27.7 26.4 L27.6 26.5 L27.4 26.6 L27.2 26.7 L27.1 26.8 L26.9 26.9 L26.8 27.1 L26.7 27.2 L26.6 27.4 L26.5 27.6 L26.4 27.7 L26.3 27.9 L26.1 28.1 L26.0 28.3 L25.9 28.6 L25.8 28.9 L25.6 29.2 L25.5 29.6 L25.3 30.1 L25.2 30.6 L25.0 31.2 L24.7 32.1 L24.4 33.0 L24.0 33.5 L24.0 29.5 L24.2 29.2 L24.4 28.7 L24.6 28.3 L24.7 27.9 L24.8 27.4 L24.8 27.1 L24.9 26.8 L25.0 26.6 L25.0 26.5 L25.1 26.3 L25.1 26.1 L25.2 26.0 L25.2 25.9 L25.3 25.8 L25.4 25.8 L25.4 25.7 L25.5 25.6 L25.5 25.5 L25.6 25.5 L25.7 25.4 L25.8 25.4 L25.8 25.3 L26.0 25.3 L26.1 25.2 L26.2 25.2 L26.4 25.1 L26.6 25.1 L26.8 25.0 L27.0 24.9 L27.3 24.9 L27.6 24.8 L27.9 24.7 L28.3 24.6 L28.7 24.4 L29.3 24.2 L29.5 24.0 Z" fill="url(#g)" transform="rotate(270 24 24)"/>
|
|
7
14
|
</svg>
|
package/lib/index.js
CHANGED
|
@@ -1805,7 +1805,7 @@ const COLD_FAILED_CACHE_LIMIT = 1024;
|
|
|
1805
1805
|
* The persistence seams a cold scan reads through. DSH ships a single
|
|
1806
1806
|
* persistence runtime family — the handle-based `list` / `open` +
|
|
1807
1807
|
* `SessionHandle` surface (0.1.2-alpha.5+, the only one the plugin's
|
|
1808
|
-
* `^0.
|
|
1808
|
+
* `^0.2.0-rc.1` peer targets). This module is the only place that knows
|
|
1809
1809
|
* the handle shape. Split out of `today-spend.ts` so the scan strategies read
|
|
1810
1810
|
* one shape.
|
|
1811
1811
|
* @module @rayadesu/dsh-llm-billing/persistence
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* The persistence seams a cold scan reads through. DSH ships a single
|
|
3
3
|
* persistence runtime family — the handle-based `list` / `open` +
|
|
4
4
|
* `SessionHandle` surface (0.1.2-alpha.5+, the only one the plugin's
|
|
5
|
-
* `^0.
|
|
5
|
+
* `^0.2.0-rc.1` peer targets). This module is the only place that knows
|
|
6
6
|
* the handle shape. Split out of `today-spend.ts` so the scan strategies read
|
|
7
7
|
* one shape.
|
|
8
8
|
* @module @rayadesu/dsh-llm-billing/persistence
|
package/lib/types/persistence.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* The persistence seams a cold scan reads through. DSH ships a single
|
|
3
3
|
* persistence runtime family — the handle-based `list` / `open` +
|
|
4
4
|
* `SessionHandle` surface (0.1.2-alpha.5+, the only one the plugin's
|
|
5
|
-
* `^0.
|
|
5
|
+
* `^0.2.0-rc.1` peer targets). This module is the only place that knows
|
|
6
6
|
* the handle shape. Split out of `today-spend.ts` so the scan strategies read
|
|
7
7
|
* one shape.
|
|
8
8
|
* @module @rayadesu/dsh-llm-billing/persistence
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@rayadesu/dsh-llm-billing",
|
|
3
3
|
"description": "Standalone DeepSeek account-balance and session-spend provider exposed through the billing Remote",
|
|
4
4
|
"icon": "./icon.svg",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "1.0.0",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
@@ -60,14 +60,14 @@
|
|
|
60
60
|
},
|
|
61
61
|
"license": "MIT",
|
|
62
62
|
"peerDependencies": {
|
|
63
|
-
"@deepseek-ai/dsh-credentials": "^0.
|
|
64
|
-
"@deepseek-ai/dsh-launch-environment": "^0.
|
|
65
|
-
"@deepseek-ai/dsh-invariants": "^0.
|
|
66
|
-
"@deepseek-ai/dsh-llm": "^0.
|
|
67
|
-
"@deepseek-ai/dsh-session": "^0.
|
|
68
|
-
"@deepseek-ai/dsh-session-persistence": "^0.
|
|
69
|
-
"@deepseek-ai/dsh-session-projection": "^0.
|
|
70
|
-
"@deepseek-ai/dsh-typert-protocol": "^0.
|
|
63
|
+
"@deepseek-ai/dsh-credentials": "^0.2.0-rc.1",
|
|
64
|
+
"@deepseek-ai/dsh-launch-environment": "^0.2.0-rc.1",
|
|
65
|
+
"@deepseek-ai/dsh-invariants": "^0.2.0-rc.1",
|
|
66
|
+
"@deepseek-ai/dsh-llm": "^0.2.0-rc.1",
|
|
67
|
+
"@deepseek-ai/dsh-session": "^0.2.0-rc.1",
|
|
68
|
+
"@deepseek-ai/dsh-session-persistence": "^0.2.0-rc.1",
|
|
69
|
+
"@deepseek-ai/dsh-session-projection": "^0.2.0-rc.1",
|
|
70
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.2.0-rc.1",
|
|
71
71
|
"@deepseek-ai/cordis": "^4.0.4"
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
@@ -75,14 +75,14 @@
|
|
|
75
75
|
"zod": "^4.4.3"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
|
-
"@deepseek-ai/dsh-credentials": "^0.
|
|
79
|
-
"@deepseek-ai/dsh-launch-environment": "^0.
|
|
80
|
-
"@deepseek-ai/dsh-invariants": "^0.
|
|
81
|
-
"@deepseek-ai/dsh-llm": "^0.
|
|
82
|
-
"@deepseek-ai/dsh-session": "^0.
|
|
83
|
-
"@deepseek-ai/dsh-session-persistence": "^0.
|
|
84
|
-
"@deepseek-ai/dsh-session-projection": "^0.
|
|
85
|
-
"@deepseek-ai/dsh-typert-protocol": "^0.
|
|
78
|
+
"@deepseek-ai/dsh-credentials": "^0.2.0-rc.1",
|
|
79
|
+
"@deepseek-ai/dsh-launch-environment": "^0.2.0-rc.1",
|
|
80
|
+
"@deepseek-ai/dsh-invariants": "^0.2.0-rc.1",
|
|
81
|
+
"@deepseek-ai/dsh-llm": "^0.2.0-rc.1",
|
|
82
|
+
"@deepseek-ai/dsh-session": "^0.2.0-rc.1",
|
|
83
|
+
"@deepseek-ai/dsh-session-persistence": "^0.2.0-rc.1",
|
|
84
|
+
"@deepseek-ai/dsh-session-projection": "^0.2.0-rc.1",
|
|
85
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.2.0-rc.1",
|
|
86
86
|
"@deepseek-ai/cordis": "^4.0.4"
|
|
87
87
|
}
|
|
88
88
|
}
|